From ef31ea82be44e2e410e2962e4c23c12d8f958fbd Mon Sep 17 00:00:00 2001 From: Harshit Kamani Date: Sun, 1 Feb 2026 22:15:40 +0530 Subject: [PATCH 1/7] utsav feedback form --- package-lock.json | 3945 ++++++++++++++++++++++--------- package.json | 2 +- src/app/(tabs)/index.tsx | 13 + src/app/utsav/feedback/[id].tsx | 328 +++ 4 files changed, 3167 insertions(+), 1121 deletions(-) create mode 100644 src/app/utsav/feedback/[id].tsx diff --git a/package-lock.json b/package-lock.json index 9fc4d58..e4ae950 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@shopify/flash-list": "2.0.2", "@tanstack/react-query": "^5.54.1", "axios": "^1.6.8", - "expo": "^54.0.9", + "expo": "^54.0.31", "expo-application": "~7.0.7", "expo-blur": "~15.0.7", "expo-build-properties": "~1.0.9", @@ -116,9 +116,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -199,17 +199,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", - "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.5", + "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "engines": { @@ -219,6 +219,96 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", @@ -317,9 +407,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -343,14 +433,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -359,6 +449,96 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", @@ -400,14 +580,104 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -528,14 +798,14 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", - "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.6.tgz", + "integrity": "sha512-RVdFPPyY9fCRAX68haPmOk2iyKW8PKJFthmm8NeSI3paNxKWGZIn99+VbIf0FrtCpFnPgnpF/L48tadi617ULg==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-decorators": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -611,12 +881,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", - "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -638,12 +908,12 @@ } }, "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", - "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.28.6.tgz", + "integrity": "sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -653,12 +923,12 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", - "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.28.6.tgz", + "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -707,12 +977,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -854,14 +1124,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz", + "integrity": "sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -870,114 +1140,105 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", - "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/types": "^7.28.6" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "parser": "bin/babel-parser.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -986,138 +1247,131 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", - "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-flow": "^7.27.1" + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/types": "^7.28.6" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "parser": "bin/babel-parser.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", - "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "node_modules/@babel/plugin-transform-class-properties": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "license": "MIT", "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -1127,31 +1381,33 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { + "node_modules/@babel/plugin-transform-classes": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "license": "MIT", "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", - "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.28.4" }, "engines": { @@ -1161,13 +1417,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1176,62 +1433,70 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", - "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1240,10 +1505,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", - "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1255,17 +1520,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx": { + "node_modules/@babel/plugin-transform-flow-strip-types": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/plugin-syntax-flow": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1274,13 +1536,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-development": { + "node_modules/@babel/plugin-transform-for-of": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1289,13 +1552,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { + "node_modules/@babel/plugin-transform-function-name": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1304,10 +1569,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-source": { + "node_modules/@babel/plugin-transform-literals": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1319,14 +1584,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1335,12 +1599,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "license": "MIT", "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -1350,30 +1615,26 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", - "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "semver": "^6.3.1" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1385,14 +1646,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1401,13 +1661,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1416,68 +1680,119 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "node_modules/@babel/plugin-transform-object-rest-spread/node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", - "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", + "node_modules/@babel/plugin-transform-object-rest-spread/node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread/node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "node_modules/@babel/plugin-transform-object-rest-spread/node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread/node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread/node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/preset-react": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", - "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "node_modules/@babel/plugin-transform-object-rest-spread/node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.28.0", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1486,17 +1801,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-typescript": { + "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", - "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.5" + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1505,201 +1817,616 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "license": "MIT", - "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse--for-generate-function-map": { - "name": "@babel/traverse", - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@egjs/hammerjs": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", - "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "license": "MIT", "dependencies": { - "@types/hammerjs": "^2.0.36" + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@expo/cli": { - "version": "54.0.14", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.14.tgz", - "integrity": "sha512-M7QW/GHx1FJg+CGgChGKerYXmCGWDskJ8S6w+8m49IBZ41CMDeWRH5snQkFoGCttF8WnzhGiX+nu69AFnEuDHQ==", + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "license": "MIT", "dependencies": { - "@0no-co/graphql.web": "^1.0.8", - "@expo/code-signing-certificates": "^0.0.5", - "@expo/config": "~12.0.10", - "@expo/config-plugins": "~54.0.2", - "@expo/devcert": "^1.1.2", - "@expo/env": "~2.0.7", - "@expo/image-utils": "^0.8.7", - "@expo/json-file": "^10.0.7", - "@expo/mcp-tunnel": "~0.0.7", - "@expo/metro": "~54.1.0", - "@expo/metro-config": "~54.0.8", - "@expo/osascript": "^2.3.7", - "@expo/package-manager": "^1.9.8", - "@expo/plist": "^0.4.7", - "@expo/prebuild-config": "^54.0.6", - "@expo/schema-utils": "^0.1.7", + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz", + "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", + "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse--for-generate-function-map": { + "name": "@babel/traverse", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@egjs/hammerjs": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", + "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", + "license": "MIT", + "dependencies": { + "@types/hammerjs": "^2.0.36" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@expo/cli": { + "version": "54.0.21", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.21.tgz", + "integrity": "sha512-L/FdpyZDsg/Nq6xW6kfiyF9DUzKfLZCKFXEVZcDqCNar6bXxQVotQyvgexRvtUF5nLinuT/UafLOdC3FUALUmA==", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.8", + "@expo/code-signing-certificates": "^0.0.6", + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/devcert": "^1.2.1", + "@expo/env": "~2.0.8", + "@expo/image-utils": "^0.8.8", + "@expo/json-file": "^10.0.8", + "@expo/metro": "~54.2.0", + "@expo/metro-config": "~54.0.13", + "@expo/osascript": "^2.3.8", + "@expo/package-manager": "^1.9.9", + "@expo/plist": "^0.4.8", + "@expo/prebuild-config": "^54.0.8", + "@expo/schema-utils": "^0.1.8", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", "@expo/xcpretty": "^4.3.0", @@ -1717,13 +2444,13 @@ "connect": "^3.7.0", "debug": "^4.3.4", "env-editor": "^0.4.1", - "expo-server": "^1.0.3", + "expo-server": "^1.0.5", "freeport-async": "^2.0.0", "getenv": "^2.0.0", - "glob": "^10.4.2", + "glob": "^13.0.0", "lan-network": "^0.1.6", "minimatch": "^9.0.0", - "node-forge": "^1.3.1", + "node-forge": "^1.3.3", "npm-package-arg": "^11.0.0", "ora": "^3.4.0", "picomatch": "^3.0.1", @@ -1743,22 +2470,367 @@ "source-map-support": "~0.5.21", "stacktrace-parser": "^0.1.10", "structured-headers": "^0.4.1", - "tar": "^7.4.3", + "tar": "^7.5.2", "terminal-link": "^2.1.1", "undici": "^6.18.2", "wrap-ansi": "^7.0.0", "ws": "^8.12.1" }, "bin": { - "expo-internal": "build/bin/cli" + "expo-internal": "build/bin/cli" + }, + "peerDependencies": { + "expo": "*", + "expo-router": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo-router": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@expo/cli/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/cli/node_modules/@expo/code-signing-certificates": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", + "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", + "license": "MIT", + "dependencies": { + "node-forge": "^1.3.3" + } + }, + "node_modules/@expo/cli/node_modules/@expo/config": { + "version": "12.0.13", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", + "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~54.0.4", + "@expo/config-types": "^54.0.10", + "@expo/json-file": "^10.0.8", + "deepmerge": "^4.3.1", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "resolve-workspace-root": "^2.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4", + "sucrase": "~3.35.1" + } + }, + "node_modules/@expo/cli/node_modules/@expo/config-plugins": { + "version": "54.0.4", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", + "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", + "license": "MIT", + "dependencies": { + "@expo/config-types": "^54.0.10", + "@expo/json-file": "~10.0.8", + "@expo/plist": "^0.4.8", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/@expo/cli/node_modules/@expo/config-types": { + "version": "54.0.10", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", + "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", + "license": "MIT" + }, + "node_modules/@expo/cli/node_modules/@expo/json-file": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", + "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.3" + } + }, + "node_modules/@expo/cli/node_modules/@expo/plist": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", + "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.2.3", + "xmlbuilder": "^15.1.1" + } + }, + "node_modules/@expo/cli/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@expo/cli/node_modules/getenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@expo/cli/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/cli/node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/cli/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@expo/cli/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/cli/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/cli/node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@expo/code-signing-certificates": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", + "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", + "license": "MIT", + "dependencies": { + "node-forge": "^1.2.1", + "nullthrows": "^1.1.1" + } + }, + "node_modules/@expo/config": { + "version": "11.0.10", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-11.0.10.tgz", + "integrity": "sha512-8S8Krr/c5lnl0eF03tA2UGY9rGBhZcbWKz2UWw5dpL/+zstwUmog8oyuuC8aRcn7GiTQLlbBkxcMeT8sOGlhbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~10.0.2", + "@expo/config-types": "^53.0.4", + "@expo/json-file": "^9.1.4", + "deepmerge": "^4.3.1", + "getenv": "^1.0.0", + "glob": "^10.4.2", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "resolve-workspace-root": "^2.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4", + "sucrase": "3.35.0" + } + }, + "node_modules/@expo/config-plugins": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-10.0.3.tgz", + "integrity": "sha512-fjCckkde67pSDf48x7wRuPsgQVIqlDwN7NlOk9/DFgQ1hCH0L5pGqoSmikA1vtAyiA83MOTpkGl3F3wyATyUog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expo/config-types": "^53.0.4", + "@expo/json-file": "~9.1.4", + "@expo/plist": "^0.3.4", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^10.4.2", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/@expo/config-plugins/node_modules/getenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@expo/config-plugins/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config-types": { + "version": "53.0.5", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-53.0.5.tgz", + "integrity": "sha512-kqZ0w44E+HEGBjy+Lpyn0BVL5UANg/tmNixxaRMLS6nf37YsDrLk2VMAmeKMMk5CKG0NmOdVv3ngeUjRQMsy9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@expo/config/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/config/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/devcert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", + "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", + "license": "MIT", + "dependencies": { + "@expo/sudo-prompt": "^9.3.1", + "debug": "^3.1.0" + } + }, + "node_modules/@expo/devcert/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@expo/devtools": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", + "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" }, "peerDependencies": { - "expo": "*", - "expo-router": "*", + "react": "*", "react-native": "*" }, "peerDependenciesMeta": { - "expo-router": { + "react": { "optional": true }, "react-native": { @@ -1766,50 +2838,282 @@ } } }, - "node_modules/@expo/cli/node_modules/@babel/code-frame": { + "node_modules/@expo/env": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", + "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "debug": "^4.3.4", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^2.0.0" + } + }, + "node_modules/@expo/env/node_modules/getenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@expo/fingerprint": { + "version": "0.15.4", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", + "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "arg": "^5.0.2", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "ignore": "^5.3.1", + "minimatch": "^9.0.0", + "p-limit": "^3.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.6.0" + }, + "bin": { + "fingerprint": "bin/cli.js" + } + }, + "node_modules/@expo/fingerprint/node_modules/getenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@expo/fingerprint/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/fingerprint/node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/fingerprint/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@expo/fingerprint/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/fingerprint/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/image-utils": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", + "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "getenv": "^2.0.0", + "jimp-compact": "0.16.1", + "parse-png": "^2.1.0", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0", + "semver": "^7.6.0", + "temp-dir": "~2.0.0", + "unique-string": "~2.0.0" + } + }, + "node_modules/@expo/image-utils/node_modules/getenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@expo/image-utils/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/json-file": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-9.1.5.tgz", + "integrity": "sha512-prWBhLUlmcQtvN6Y7BpW2k9zXGd3ySa3R6rAguMJkp1z22nunLN64KYTUWfijFlprFoxm9r2VNnGkcbndAlgKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.3" + } + }, + "node_modules/@expo/json-file/node_modules/@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/highlight": "^7.10.4" } }, - "node_modules/@expo/cli/node_modules/@expo/config": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.10.tgz", - "integrity": "sha512-lJMof5Nqakq1DxGYlghYB/ogSBjmv4Fxn1ovyDmcjlRsQdFCXgu06gEUogkhPtc9wBt9WlTTfqENln5HHyLW6w==", + "node_modules/@expo/metro": { + "version": "54.2.0", + "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", + "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", + "license": "MIT", + "dependencies": { + "metro": "0.83.3", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-config": "0.83.3", + "metro-core": "0.83.3", + "metro-file-map": "0.83.3", + "metro-minify-terser": "0.83.3", + "metro-resolver": "0.83.3", + "metro-runtime": "0.83.3", + "metro-source-map": "0.83.3", + "metro-symbolicate": "0.83.3", + "metro-transform-plugins": "0.83.3", + "metro-transform-worker": "0.83.3" + } + }, + "node_modules/@expo/metro-config": { + "version": "54.0.13", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.13.tgz", + "integrity": "sha512-RRufMCgLR2Za1WGsh02OatIJo5qZFt31yCnIOSfoubNc3Qqe92Z41pVsbrFnmw5CIaisv1NgdBy05DHe7pEyuw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~12.0.13", + "@expo/env": "~2.0.8", + "@expo/json-file": "~10.0.8", + "@expo/metro": "~54.2.0", + "@expo/spawn-async": "^1.7.2", + "browserslist": "^4.25.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "hermes-parser": "^0.29.1", + "jsc-safe-url": "^0.2.4", + "lightningcss": "^1.30.1", + "minimatch": "^9.0.0", + "postcss": "~8.4.32", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@expo/metro-config/node_modules/@expo/config": { + "version": "12.0.13", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", + "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~54.0.2", - "@expo/config-types": "^54.0.8", - "@expo/json-file": "^10.0.7", + "@expo/config-plugins": "~54.0.4", + "@expo/config-types": "^54.0.10", + "@expo/json-file": "^10.0.8", "deepmerge": "^4.3.1", "getenv": "^2.0.0", - "glob": "^10.4.2", + "glob": "^13.0.0", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0", "resolve-workspace-root": "^2.0.0", "semver": "^7.6.0", "slugify": "^1.3.4", - "sucrase": "3.35.0" - } - }, - "node_modules/@expo/cli/node_modules/@expo/config-plugins": { - "version": "54.0.2", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.2.tgz", - "integrity": "sha512-jD4qxFcURQUVsUFGMcbo63a/AnviK8WUGard+yrdQE3ZrB/aurn68SlApjirQQLEizhjI5Ar2ufqflOBlNpyPg==", + "sucrase": "~3.35.1" + } + }, + "node_modules/@expo/metro-config/node_modules/@expo/config-plugins": { + "version": "54.0.4", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", + "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "license": "MIT", "dependencies": { - "@expo/config-types": "^54.0.8", - "@expo/json-file": "~10.0.7", - "@expo/plist": "^0.4.7", + "@expo/config-types": "^54.0.10", + "@expo/json-file": "~10.0.8", + "@expo/plist": "^0.4.8", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", "getenv": "^2.0.0", - "glob": "^10.4.2", + "glob": "^13.0.0", "resolve-from": "^5.0.0", "semver": "^7.5.4", "slash": "^3.0.0", @@ -1818,26 +3122,44 @@ "xml2js": "0.6.0" } }, - "node_modules/@expo/cli/node_modules/@expo/config-types": { - "version": "54.0.8", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.8.tgz", - "integrity": "sha512-lyIn/x/Yz0SgHL7IGWtgTLg6TJWC9vL7489++0hzCHZ4iGjVcfZmPTUfiragZ3HycFFj899qN0jlhl49IHa94A==", + "node_modules/@expo/metro-config/node_modules/@expo/config-types": { + "version": "54.0.10", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", + "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", "license": "MIT" }, - "node_modules/@expo/cli/node_modules/@expo/json-file": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.7.tgz", - "integrity": "sha512-z2OTC0XNO6riZu98EjdNHC05l51ySeTto6GP7oSQrCvQgG9ARBwD1YvMQaVZ9wU7p/4LzSf1O7tckL3B45fPpw==", + "node_modules/@expo/metro-config/node_modules/@expo/config/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/metro-config/node_modules/@expo/json-file": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", + "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" } }, - "node_modules/@expo/cli/node_modules/@expo/plist": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.7.tgz", - "integrity": "sha512-dGxqHPvCZKeRKDU1sJZMmuyVtcASuSYh1LPFVaM1DuffqPL36n6FMEL0iUqq2Tx3xhWk8wCnWl34IKplUjJDdA==", + "node_modules/@expo/metro-config/node_modules/@expo/json-file/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/metro-config/node_modules/@expo/plist": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", + "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", @@ -1845,7 +3167,16 @@ "xmlbuilder": "^15.1.1" } }, - "node_modules/@expo/cli/node_modules/getenv": { + "node_modules/@expo/metro-config/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@expo/metro-config/node_modules/getenv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", @@ -1854,88 +3185,67 @@ "node": ">=6" } }, - "node_modules/@expo/cli/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/@expo/metro-config/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" }, "engines": { - "node": ">=10" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/code-signing-certificates": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", - "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", - "license": "MIT", + "node_modules/@expo/metro-config/node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "node-forge": "^1.2.1", - "nullthrows": "^1.1.1" + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/config": { - "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-11.0.10.tgz", - "integrity": "sha512-8S8Krr/c5lnl0eF03tA2UGY9rGBhZcbWKz2UWw5dpL/+zstwUmog8oyuuC8aRcn7GiTQLlbBkxcMeT8sOGlhbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~10.0.2", - "@expo/config-types": "^53.0.4", - "@expo/json-file": "^9.1.4", - "deepmerge": "^4.3.1", - "getenv": "^1.0.0", - "glob": "^10.4.2", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0", - "resolve-workspace-root": "^2.0.0", - "semver": "^7.6.0", - "slugify": "^1.3.4", - "sucrase": "3.35.0" + "node_modules/@expo/metro-config/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" } }, - "node_modules/@expo/config-plugins": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-10.0.3.tgz", - "integrity": "sha512-fjCckkde67pSDf48x7wRuPsgQVIqlDwN7NlOk9/DFgQ1hCH0L5pGqoSmikA1vtAyiA83MOTpkGl3F3wyATyUog==", - "dev": true, - "license": "MIT", + "node_modules/@expo/metro-config/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "license": "BlueOak-1.0.0", "dependencies": { - "@expo/config-types": "^53.0.4", - "@expo/json-file": "~9.1.4", - "@expo/plist": "^0.3.4", - "@expo/sdk-runtime-versions": "^1.0.0", - "chalk": "^4.1.2", - "debug": "^4.3.5", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "resolve-from": "^5.0.0", - "semver": "^7.5.4", - "slash": "^3.0.0", - "slugify": "^1.6.6", - "xcode": "^3.0.1", - "xml2js": "0.6.0" - } - }, - "node_modules/@expo/config-plugins/node_modules/getenv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", - "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "dev": true, - "license": "MIT", + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, "engines": { - "node": ">=6" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/config-plugins/node_modules/semver": { + "node_modules/@expo/metro-config/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -1944,410 +3254,411 @@ "node": ">=10" } }, - "node_modules/@expo/config-types": { - "version": "53.0.5", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-53.0.5.tgz", - "integrity": "sha512-kqZ0w44E+HEGBjy+Lpyn0BVL5UANg/tmNixxaRMLS6nf37YsDrLk2VMAmeKMMk5CKG0NmOdVv3ngeUjRQMsy9g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@expo/config/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, + "node_modules/@expo/metro-config/node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@expo/config/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, "bin": { - "semver": "bin/semver.js" + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/devcert": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.0.tgz", - "integrity": "sha512-Uilcv3xGELD5t/b0eM4cxBFEKQRIivB3v7i+VhWLV/gL98aw810unLKKJbGAxAIhY6Ipyz8ChWibFsKFXYwstA==", - "license": "MIT", - "dependencies": { - "@expo/sudo-prompt": "^9.3.1", - "debug": "^3.1.0", - "glob": "^10.4.2" - } - }, - "node_modules/@expo/devcert/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/@expo/devtools": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.7.tgz", - "integrity": "sha512-dfIa9qMyXN+0RfU6SN4rKeXZyzKWsnz6xBSDccjL4IRiE+fQ0t84zg0yxgN4t/WK2JU5v6v4fby7W7Crv9gJvA==", + "node_modules/@expo/metro-runtime": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-6.1.2.tgz", + "integrity": "sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g==", "license": "MIT", "dependencies": { - "chalk": "^4.1.2" + "anser": "^1.4.9", + "pretty-format": "^29.7.0", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0" }, "peerDependencies": { + "expo": "*", "react": "*", + "react-dom": "*", "react-native": "*" }, "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@expo/env": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.7.tgz", - "integrity": "sha512-BNETbLEohk3HQ2LxwwezpG8pq+h7Fs7/vAMP3eAtFT1BCpprLYoBBFZH7gW4aqGfqOcVP4Lc91j014verrYNGg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "debug": "^4.3.4", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0" - } - }, - "node_modules/@expo/env/node_modules/getenv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", - "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@expo/fingerprint": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.2.tgz", - "integrity": "sha512-mA3weHEOd9B3mbDLNDKmAcFWo3kqsAJqPne7uMJndheKXPbRw15bV+ajAGBYZh2SS37xixLJ5eDpuc+Wr6jJtw==", - "license": "MIT", - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "arg": "^5.0.2", - "chalk": "^4.1.2", - "debug": "^4.3.4", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "ignore": "^5.3.1", - "minimatch": "^9.0.0", - "p-limit": "^3.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0" - }, - "bin": { - "fingerprint": "bin/cli.js" - } - }, - "node_modules/@expo/fingerprint/node_modules/getenv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", - "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "license": "MIT", - "engines": { - "node": ">=6" + "react-dom": { + "optional": true + } } }, - "node_modules/@expo/fingerprint/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/@expo/metro/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 14" } }, - "node_modules/@expo/image-utils": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.7.tgz", - "integrity": "sha512-SXOww4Wq3RVXLyOaXiCCuQFguCDh8mmaHBv54h/R29wGl4jRY8GEyQEx8SypV/iHt1FbzsU/X3Qbcd9afm2W2w==", + "node_modules/@expo/metro/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT" + }, + "node_modules/@expo/metro/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/@expo/metro/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "license": "MIT", "dependencies": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", - "getenv": "^2.0.0", - "jimp-compact": "0.16.1", - "parse-png": "^2.1.0", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0", - "semver": "^7.6.0", - "temp-dir": "~2.0.0", - "unique-string": "~2.0.0" + "hermes-estree": "0.32.0" } }, - "node_modules/@expo/image-utils/node_modules/getenv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", - "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "node_modules/@expo/metro/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, "engines": { - "node": ">=6" + "node": ">= 14" } }, - "node_modules/@expo/image-utils/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", + "node_modules/@expo/metro/node_modules/metro": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", + "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "@babel/types": "^7.25.2", + "accepts": "^1.3.7", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "error-stack-parser": "^2.0.6", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.32.0", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-config": "0.83.3", + "metro-core": "0.83.3", + "metro-file-map": "0.83.3", + "metro-resolver": "0.83.3", + "metro-runtime": "0.83.3", + "metro-source-map": "0.83.3", + "metro-symbolicate": "0.83.3", + "metro-transform-plugins": "0.83.3", + "metro-transform-worker": "0.83.3", + "mime-types": "^2.1.27", + "nullthrows": "^1.1.1", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "throat": "^5.0.0", + "ws": "^7.5.10", + "yargs": "^17.6.2" + }, "bin": { - "semver": "bin/semver.js" + "metro": "src/cli.js" }, "engines": { - "node": ">=10" + "node": ">=20.19.4" } }, - "node_modules/@expo/json-file": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-9.1.5.tgz", - "integrity": "sha512-prWBhLUlmcQtvN6Y7BpW2k9zXGd3ySa3R6rAguMJkp1z22nunLN64KYTUWfijFlprFoxm9r2VNnGkcbndAlgKA==", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-babel-transformer": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", + "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "license": "MIT", "dependencies": { - "@babel/code-frame": "~7.10.4", - "json5": "^2.2.3" + "@babel/core": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.32.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@expo/json-file/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-cache": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", + "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.10.4" + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "https-proxy-agent": "^7.0.5", + "metro-core": "0.83.3" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@expo/mcp-tunnel": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@expo/mcp-tunnel/-/mcp-tunnel-0.0.8.tgz", - "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", + "node_modules/@expo/metro/node_modules/metro-cache-key": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", + "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "license": "MIT", "dependencies": { - "ws": "^8.18.3", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.24.6" - }, - "peerDependencies": { - "@modelcontextprotocol/sdk": "^1.13.2" + "flow-enums-runtime": "^0.0.6" }, - "peerDependenciesMeta": { - "@modelcontextprotocol/sdk": { - "optional": true - } + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@expo/metro": { - "version": "54.1.0", - "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.1.0.tgz", - "integrity": "sha512-MgdeRNT/LH0v1wcO0TZp9Qn8zEF0X2ACI0wliPtv5kXVbXWI+yK9GyrstwLAiTXlULKVIg3HVSCCvmLu0M3tnw==", + "node_modules/@expo/metro/node_modules/metro-config": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", + "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "license": "MIT", "dependencies": { - "metro": "0.83.2", - "metro-babel-transformer": "0.83.2", - "metro-cache": "0.83.2", - "metro-cache-key": "0.83.2", - "metro-config": "0.83.2", - "metro-core": "0.83.2", - "metro-file-map": "0.83.2", - "metro-resolver": "0.83.2", - "metro-runtime": "0.83.2", - "metro-source-map": "0.83.2", - "metro-transform-plugins": "0.83.2", - "metro-transform-worker": "0.83.2" + "connect": "^3.6.5", + "flow-enums-runtime": "^0.0.6", + "jest-validate": "^29.7.0", + "metro": "0.83.3", + "metro-cache": "0.83.3", + "metro-core": "0.83.3", + "metro-runtime": "0.83.3", + "yaml": "^2.6.1" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@expo/metro-config": { - "version": "54.0.8", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.8.tgz", - "integrity": "sha512-rCkDQ8IT6sgcGNy48O2cTE4NlazCAgAIsD5qBsNPJLZSS0XbaILvAgGsFt/4nrx0GMGj6iQcOn5ifwV4NssTmw==", + "node_modules/@expo/metro/node_modules/metro-core": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", + "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.20.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@expo/config": "~12.0.10", - "@expo/env": "~2.0.7", - "@expo/json-file": "~10.0.7", - "@expo/metro": "~54.1.0", - "@expo/spawn-async": "^1.7.2", - "browserslist": "^4.25.0", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "hermes-parser": "^0.29.1", - "jsc-safe-url": "^0.2.4", - "lightningcss": "^1.30.1", - "minimatch": "^9.0.0", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "expo": "*" + "flow-enums-runtime": "^0.0.6", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.83.3" }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@expo/metro-config/node_modules/@expo/config": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.10.tgz", - "integrity": "sha512-lJMof5Nqakq1DxGYlghYB/ogSBjmv4Fxn1ovyDmcjlRsQdFCXgu06gEUogkhPtc9wBt9WlTTfqENln5HHyLW6w==", + "node_modules/@expo/metro/node_modules/metro-file-map": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", + "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~54.0.2", - "@expo/config-types": "^54.0.8", - "@expo/json-file": "^10.0.7", - "deepmerge": "^4.3.1", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0", - "resolve-workspace-root": "^2.0.0", - "semver": "^7.6.0", - "slugify": "^1.3.4", - "sucrase": "3.35.0" + "debug": "^4.4.0", + "fb-watchman": "^2.0.0", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@expo/metro-config/node_modules/@expo/config-plugins": { - "version": "54.0.2", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.2.tgz", - "integrity": "sha512-jD4qxFcURQUVsUFGMcbo63a/AnviK8WUGard+yrdQE3ZrB/aurn68SlApjirQQLEizhjI5Ar2ufqflOBlNpyPg==", + "node_modules/@expo/metro/node_modules/metro-minify-terser": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", + "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "license": "MIT", "dependencies": { - "@expo/config-types": "^54.0.8", - "@expo/json-file": "~10.0.7", - "@expo/plist": "^0.4.7", - "@expo/sdk-runtime-versions": "^1.0.0", - "chalk": "^4.1.2", - "debug": "^4.3.5", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "resolve-from": "^5.0.0", - "semver": "^7.5.4", - "slash": "^3.0.0", - "slugify": "^1.6.6", - "xcode": "^3.0.1", - "xml2js": "0.6.0" + "flow-enums-runtime": "^0.0.6", + "terser": "^5.15.0" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@expo/metro-config/node_modules/@expo/config-types": { - "version": "54.0.8", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.8.tgz", - "integrity": "sha512-lyIn/x/Yz0SgHL7IGWtgTLg6TJWC9vL7489++0hzCHZ4iGjVcfZmPTUfiragZ3HycFFj899qN0jlhl49IHa94A==", - "license": "MIT" - }, - "node_modules/@expo/metro-config/node_modules/@expo/config/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "node_modules/@expo/metro/node_modules/metro-resolver": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", + "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.10.4" + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@expo/metro-config/node_modules/@expo/json-file": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.7.tgz", - "integrity": "sha512-z2OTC0XNO6riZu98EjdNHC05l51ySeTto6GP7oSQrCvQgG9ARBwD1YvMQaVZ9wU7p/4LzSf1O7tckL3B45fPpw==", + "node_modules/@expo/metro/node_modules/metro-runtime": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", + "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@expo/metro/node_modules/metro-source-map": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", + "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "~7.10.4", - "json5": "^2.2.3" + "@babel/traverse": "^7.25.3", + "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", + "@babel/types": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-symbolicate": "0.83.3", + "nullthrows": "^1.1.1", + "ob1": "0.83.3", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@expo/metro-config/node_modules/@expo/json-file/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "node_modules/@expo/metro/node_modules/metro-symbolicate": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", + "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.10.4" + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-source-map": "0.83.3", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@expo/metro-config/node_modules/@expo/plist": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.7.tgz", - "integrity": "sha512-dGxqHPvCZKeRKDU1sJZMmuyVtcASuSYh1LPFVaM1DuffqPL36n6FMEL0iUqq2Tx3xhWk8wCnWl34IKplUjJDdA==", + "node_modules/@expo/metro/node_modules/metro-transform-plugins": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", + "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "license": "MIT", "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.2.3", - "xmlbuilder": "^15.1.1" + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "flow-enums-runtime": "^0.0.6", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@expo/metro-config/node_modules/getenv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", - "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "node_modules/@expo/metro/node_modules/metro-transform-worker": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", + "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/types": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "metro": "0.83.3", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-minify-terser": "0.83.3", + "metro-source-map": "0.83.3", + "metro-transform-plugins": "0.83.3", + "nullthrows": "^1.1.1" + }, "engines": { - "node": ">=6" + "node": ">=20.19.4" } }, - "node_modules/@expo/metro-config/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/@expo/metro/node_modules/ob1": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", + "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=10" + "node": ">=20.19.4" } }, - "node_modules/@expo/metro-runtime": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-6.1.2.tgz", - "integrity": "sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g==", + "node_modules/@expo/metro/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", - "dependencies": { - "anser": "^1.4.9", - "pretty-format": "^29.7.0", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0" + "engines": { + "node": ">=8.3.0" }, "peerDependencies": { - "expo": "*", - "react": "*", - "react-dom": "*", - "react-native": "*" + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { - "react-dom": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { "optional": true } } }, + "node_modules/@expo/metro/node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/@expo/ngrok": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/@expo/ngrok/-/ngrok-4.1.3.tgz", @@ -2530,9 +3841,9 @@ ] }, "node_modules/@expo/osascript": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.7.tgz", - "integrity": "sha512-IClSOXxR0YUFxIriUJVqyYki7lLMIHrrzOaP01yxAL1G8pj2DWV5eW1y5jSzIcIfSCNhtGsshGd1tU/AYup5iQ==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", + "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -2543,12 +3854,12 @@ } }, "node_modules/@expo/package-manager": { - "version": "1.9.8", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.8.tgz", - "integrity": "sha512-4/I6OWquKXYnzo38pkISHCOCOXxfeEmu4uDoERq1Ei/9Ur/s9y3kLbAamEkitUkDC7gHk1INxRWEfFNzGbmOrA==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", + "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", "license": "MIT", "dependencies": { - "@expo/json-file": "^10.0.7", + "@expo/json-file": "^10.0.8", "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", "npm-package-arg": "^11.0.0", @@ -2566,9 +3877,9 @@ } }, "node_modules/@expo/package-manager/node_modules/@expo/json-file": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.7.tgz", - "integrity": "sha512-z2OTC0XNO6riZu98EjdNHC05l51ySeTto6GP7oSQrCvQgG9ARBwD1YvMQaVZ9wU7p/4LzSf1O7tckL3B45fPpw==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", + "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", @@ -2588,16 +3899,16 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "54.0.6", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.6.tgz", - "integrity": "sha512-xowuMmyPNy+WTNq+YX0m0EFO/Knc68swjThk4dKivgZa8zI1UjvFXOBIOp8RX4ljCXLzwxQJM5oBBTvyn+59ZA==", + "version": "54.0.8", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", + "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", "license": "MIT", "dependencies": { - "@expo/config": "~12.0.10", - "@expo/config-plugins": "~54.0.2", - "@expo/config-types": "^54.0.8", - "@expo/image-utils": "^0.8.7", - "@expo/json-file": "^10.0.7", + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/config-types": "^54.0.10", + "@expo/image-utils": "^0.8.8", + "@expo/json-file": "^10.0.8", "@react-native/normalize-colors": "0.81.5", "debug": "^4.3.1", "resolve-from": "^5.0.0", @@ -2618,40 +3929,40 @@ } }, "node_modules/@expo/prebuild-config/node_modules/@expo/config": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.10.tgz", - "integrity": "sha512-lJMof5Nqakq1DxGYlghYB/ogSBjmv4Fxn1ovyDmcjlRsQdFCXgu06gEUogkhPtc9wBt9WlTTfqENln5HHyLW6w==", + "version": "12.0.13", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", + "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~54.0.2", - "@expo/config-types": "^54.0.8", - "@expo/json-file": "^10.0.7", + "@expo/config-plugins": "~54.0.4", + "@expo/config-types": "^54.0.10", + "@expo/json-file": "^10.0.8", "deepmerge": "^4.3.1", "getenv": "^2.0.0", - "glob": "^10.4.2", + "glob": "^13.0.0", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0", "resolve-workspace-root": "^2.0.0", "semver": "^7.6.0", "slugify": "^1.3.4", - "sucrase": "3.35.0" + "sucrase": "~3.35.1" } }, "node_modules/@expo/prebuild-config/node_modules/@expo/config-plugins": { - "version": "54.0.2", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.2.tgz", - "integrity": "sha512-jD4qxFcURQUVsUFGMcbo63a/AnviK8WUGard+yrdQE3ZrB/aurn68SlApjirQQLEizhjI5Ar2ufqflOBlNpyPg==", + "version": "54.0.4", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", + "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "license": "MIT", "dependencies": { - "@expo/config-types": "^54.0.8", - "@expo/json-file": "~10.0.7", - "@expo/plist": "^0.4.7", + "@expo/config-types": "^54.0.10", + "@expo/json-file": "~10.0.8", + "@expo/plist": "^0.4.8", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", "getenv": "^2.0.0", - "glob": "^10.4.2", + "glob": "^13.0.0", "resolve-from": "^5.0.0", "semver": "^7.5.4", "slash": "^3.0.0", @@ -2661,15 +3972,15 @@ } }, "node_modules/@expo/prebuild-config/node_modules/@expo/config-types": { - "version": "54.0.8", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.8.tgz", - "integrity": "sha512-lyIn/x/Yz0SgHL7IGWtgTLg6TJWC9vL7489++0hzCHZ4iGjVcfZmPTUfiragZ3HycFFj899qN0jlhl49IHa94A==", + "version": "54.0.10", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", + "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", "license": "MIT" }, "node_modules/@expo/prebuild-config/node_modules/@expo/json-file": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.7.tgz", - "integrity": "sha512-z2OTC0XNO6riZu98EjdNHC05l51ySeTto6GP7oSQrCvQgG9ARBwD1YvMQaVZ9wU7p/4LzSf1O7tckL3B45fPpw==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", + "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", @@ -2677,9 +3988,9 @@ } }, "node_modules/@expo/prebuild-config/node_modules/@expo/plist": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.7.tgz", - "integrity": "sha512-dGxqHPvCZKeRKDU1sJZMmuyVtcASuSYh1LPFVaM1DuffqPL36n6FMEL0iUqq2Tx3xhWk8wCnWl34IKplUjJDdA==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", + "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", @@ -2687,6 +3998,15 @@ "xmlbuilder": "^15.1.1" } }, + "node_modules/@expo/prebuild-config/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/@expo/prebuild-config/node_modules/getenv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", @@ -2696,6 +4016,63 @@ "node": ">=6" } }, + "node_modules/@expo/prebuild-config/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/prebuild-config/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@expo/prebuild-config/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/prebuild-config/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@expo/prebuild-config/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -2708,10 +4085,32 @@ "node": ">=10" } }, + "node_modules/@expo/prebuild-config/node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/@expo/schema-utils": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.7.tgz", - "integrity": "sha512-jWHoSuwRb5ZczjahrychMJ3GWZu54jK9ulNdh1d4OzAEq672K9E5yOlnlBsfIHWHGzUAT+0CL7Yt1INiXTz68g==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", + "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", "license": "MIT" }, "node_modules/@expo/sdk-runtime-versions": { @@ -3542,6 +4941,27 @@ "integrity": "sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==", "license": "MIT" }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -6105,9 +7525,9 @@ } }, "node_modules/babel-preset-expo": { - "version": "54.0.6", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.6.tgz", - "integrity": "sha512-GxJfwnuOPQJbzDe5WASJZdNQiukLw7i9z+Lh6JQWkUHXsShHyQrqgiKE55MD/KaP9VqJ70yZm7bYqOu8zwcWqQ==", + "version": "54.0.10", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", + "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", @@ -6196,9 +7616,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.21.tgz", - "integrity": "sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==", + "version": "2.9.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.16.tgz", + "integrity": "sha512-KeUZdBuxngy825i8xvzaK1Ncnkx0tBmb3k8DkEuqjKRkmtvNTjey2ZsNeh8Dw4lfKvbCOu9oeNx2TKm2vHqcRw==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -6567,9 +7987,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001751", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", - "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "version": "1.0.30001765", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz", + "integrity": "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==", "funding": [ { "type": "opencollective", @@ -6993,16 +8413,80 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", - "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/core-js-compat/node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "browserslist": "^4.26.3" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, "node_modules/core-util-is": { @@ -7665,9 +9149,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.244", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz", - "integrity": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==", + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -8761,30 +10245,30 @@ "license": "MIT" }, "node_modules/expo": { - "version": "54.0.21", - "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.21.tgz", - "integrity": "sha512-I3kzMNW/43a71pt6hT0Zebd2zAPIMMeucUDDEdfUKYrzzTRwISZfVAv0dp8GWKHHDjZsy+FjE4RQCMdyKmiDeQ==", + "version": "54.0.31", + "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.31.tgz", + "integrity": "sha512-kQ3RDqA/a59I7y+oqQGyrPbbYlgPMUdKBOgvFLpoHbD2bCM+F75i4N0mUijy7dG5F/CUCu2qHmGGUCXBbMDkCg==", "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "54.0.14", - "@expo/config": "~12.0.10", - "@expo/config-plugins": "~54.0.2", - "@expo/devtools": "0.1.7", - "@expo/fingerprint": "0.15.2", - "@expo/metro": "~54.1.0", - "@expo/metro-config": "54.0.8", + "@expo/cli": "54.0.21", + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/devtools": "0.1.8", + "@expo/fingerprint": "0.15.4", + "@expo/metro": "~54.2.0", + "@expo/metro-config": "54.0.13", "@expo/vector-icons": "^15.0.3", "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~54.0.6", - "expo-asset": "~12.0.9", - "expo-constants": "~18.0.10", - "expo-file-system": "~19.0.17", - "expo-font": "~14.0.9", - "expo-keep-awake": "~15.0.7", - "expo-modules-autolinking": "3.0.19", - "expo-modules-core": "3.0.23", + "babel-preset-expo": "~54.0.9", + "expo-asset": "~12.0.12", + "expo-constants": "~18.0.13", + "expo-file-system": "~19.0.21", + "expo-font": "~14.0.10", + "expo-keep-awake": "~15.0.8", + "expo-modules-autolinking": "3.0.24", + "expo-modules-core": "3.0.29", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", "whatwg-url-without-unicode": "8.0.0-3" @@ -8823,13 +10307,13 @@ } }, "node_modules/expo-asset": { - "version": "12.0.9", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.9.tgz", - "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", + "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", "license": "MIT", "dependencies": { - "@expo/image-utils": "^0.8.7", - "expo-constants": "~18.0.9" + "@expo/image-utils": "^0.8.8", + "expo-constants": "~18.0.12" }, "peerDependencies": { "expo": "*", @@ -8962,14 +10446,14 @@ } }, "node_modules/expo-constants": { - "version": "18.0.10", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.10.tgz", - "integrity": "sha512-Rhtv+X974k0Cahmvx6p7ER5+pNhBC0XbP1lRviL2J1Xl4sT2FBaIuIxF/0I0CbhOsySf0ksqc5caFweAy9Ewiw==", + "version": "18.0.13", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", + "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "license": "MIT", "peer": true, "dependencies": { - "@expo/config": "~12.0.10", - "@expo/env": "~2.0.7" + "@expo/config": "~12.0.13", + "@expo/env": "~2.0.8" }, "peerDependencies": { "expo": "*", @@ -8986,40 +10470,40 @@ } }, "node_modules/expo-constants/node_modules/@expo/config": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.10.tgz", - "integrity": "sha512-lJMof5Nqakq1DxGYlghYB/ogSBjmv4Fxn1ovyDmcjlRsQdFCXgu06gEUogkhPtc9wBt9WlTTfqENln5HHyLW6w==", + "version": "12.0.13", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", + "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~54.0.2", - "@expo/config-types": "^54.0.8", - "@expo/json-file": "^10.0.7", + "@expo/config-plugins": "~54.0.4", + "@expo/config-types": "^54.0.10", + "@expo/json-file": "^10.0.8", "deepmerge": "^4.3.1", "getenv": "^2.0.0", - "glob": "^10.4.2", + "glob": "^13.0.0", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0", "resolve-workspace-root": "^2.0.0", "semver": "^7.6.0", "slugify": "^1.3.4", - "sucrase": "3.35.0" + "sucrase": "~3.35.1" } }, "node_modules/expo-constants/node_modules/@expo/config-plugins": { - "version": "54.0.2", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.2.tgz", - "integrity": "sha512-jD4qxFcURQUVsUFGMcbo63a/AnviK8WUGard+yrdQE3ZrB/aurn68SlApjirQQLEizhjI5Ar2ufqflOBlNpyPg==", + "version": "54.0.4", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", + "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "license": "MIT", "dependencies": { - "@expo/config-types": "^54.0.8", - "@expo/json-file": "~10.0.7", - "@expo/plist": "^0.4.7", + "@expo/config-types": "^54.0.10", + "@expo/json-file": "~10.0.8", + "@expo/plist": "^0.4.8", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", "getenv": "^2.0.0", - "glob": "^10.4.2", + "glob": "^13.0.0", "resolve-from": "^5.0.0", "semver": "^7.5.4", "slash": "^3.0.0", @@ -9029,15 +10513,15 @@ } }, "node_modules/expo-constants/node_modules/@expo/config-types": { - "version": "54.0.8", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.8.tgz", - "integrity": "sha512-lyIn/x/Yz0SgHL7IGWtgTLg6TJWC9vL7489++0hzCHZ4iGjVcfZmPTUfiragZ3HycFFj899qN0jlhl49IHa94A==", + "version": "54.0.10", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", + "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", "license": "MIT" }, "node_modules/expo-constants/node_modules/@expo/json-file": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.7.tgz", - "integrity": "sha512-z2OTC0XNO6riZu98EjdNHC05l51ySeTto6GP7oSQrCvQgG9ARBwD1YvMQaVZ9wU7p/4LzSf1O7tckL3B45fPpw==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", + "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", @@ -9045,9 +10529,9 @@ } }, "node_modules/expo-constants/node_modules/@expo/plist": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.7.tgz", - "integrity": "sha512-dGxqHPvCZKeRKDU1sJZMmuyVtcASuSYh1LPFVaM1DuffqPL36n6FMEL0iUqq2Tx3xhWk8wCnWl34IKplUjJDdA==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", + "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", @@ -9055,6 +10539,15 @@ "xmlbuilder": "^15.1.1" } }, + "node_modules/expo-constants/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/expo-constants/node_modules/getenv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", @@ -9064,6 +10557,63 @@ "node": ">=6" } }, + "node_modules/expo-constants/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo-constants/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/expo-constants/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo-constants/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/expo-constants/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -9076,6 +10626,28 @@ "node": ">=10" } }, + "node_modules/expo-constants/node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/expo-dev-client": { "version": "6.0.16", "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-6.0.16.tgz", @@ -9145,9 +10717,9 @@ "license": "MIT" }, "node_modules/expo-file-system": { - "version": "19.0.17", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.17.tgz", - "integrity": "sha512-WwaS01SUFrxBnExn87pg0sCTJjZpf2KAOzfImG0o8yhkU7fbYpihpl/oocXBEsNbj58a8hVt1Y4CVV5c1tzu/g==", + "version": "19.0.21", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", + "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -9155,9 +10727,9 @@ } }, "node_modules/expo-font": { - "version": "14.0.9", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.9.tgz", - "integrity": "sha512-xCoQbR/36qqB6tew/LQ6GWICpaBmHLhg/Loix5Rku/0ZtNaXMJv08M9o1AcrdiGTn/Xf/BnLu6DgS45cWQEHZg==", + "version": "14.0.11", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.11.tgz", + "integrity": "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==", "license": "MIT", "peer": true, "dependencies": { @@ -9206,9 +10778,9 @@ "license": "MIT" }, "node_modules/expo-keep-awake": { - "version": "15.0.7", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.7.tgz", - "integrity": "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA==", + "version": "15.0.8", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", + "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -9344,15 +10916,14 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.19.tgz", - "integrity": "sha512-tSMYGnfZmAaN77X8iMLiaSgbCFnA7eh6s2ac09J2N2N0Rcf2RCE27jg0c0XenTMTWUcM4QvLhsNHof/WtlKqPw==", + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", + "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "commander": "^7.2.0", - "glob": "^10.4.2", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0" }, @@ -9361,9 +10932,9 @@ } }, "node_modules/expo-modules-core": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.23.tgz", - "integrity": "sha512-NYHi5LK/cdIyOjK9ZQAgfDPCOqER26cIbU3gzsce7YdnsmlNFR0qMfWOj9zAmaFBviC2kCkCOmitwk4357Td3Q==", + "version": "3.0.29", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", + "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", "license": "MIT", "dependencies": { "invariant": "^2.2.4" @@ -9647,9 +11218,9 @@ } }, "node_modules/expo-server": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.3.tgz", - "integrity": "sha512-SOwdzM/BFAL+vTFlUDJG6ljhyk6TyTl+LRK3ubGmN+Pf18ENRqKj37U8krc5vH926sAsB3IFcE8kJEYf4dG7PA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", + "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", "license": "MIT", "engines": { "node": ">=20.16.0" @@ -9748,40 +11319,40 @@ } }, "node_modules/expo/node_modules/@expo/config": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.10.tgz", - "integrity": "sha512-lJMof5Nqakq1DxGYlghYB/ogSBjmv4Fxn1ovyDmcjlRsQdFCXgu06gEUogkhPtc9wBt9WlTTfqENln5HHyLW6w==", + "version": "12.0.13", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", + "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~54.0.2", - "@expo/config-types": "^54.0.8", - "@expo/json-file": "^10.0.7", + "@expo/config-plugins": "~54.0.4", + "@expo/config-types": "^54.0.10", + "@expo/json-file": "^10.0.8", "deepmerge": "^4.3.1", "getenv": "^2.0.0", - "glob": "^10.4.2", + "glob": "^13.0.0", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0", "resolve-workspace-root": "^2.0.0", "semver": "^7.6.0", "slugify": "^1.3.4", - "sucrase": "3.35.0" + "sucrase": "~3.35.1" } }, "node_modules/expo/node_modules/@expo/config-plugins": { - "version": "54.0.2", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.2.tgz", - "integrity": "sha512-jD4qxFcURQUVsUFGMcbo63a/AnviK8WUGard+yrdQE3ZrB/aurn68SlApjirQQLEizhjI5Ar2ufqflOBlNpyPg==", + "version": "54.0.4", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", + "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", "license": "MIT", "dependencies": { - "@expo/config-types": "^54.0.8", - "@expo/json-file": "~10.0.7", - "@expo/plist": "^0.4.7", + "@expo/config-types": "^54.0.10", + "@expo/json-file": "~10.0.8", + "@expo/plist": "^0.4.8", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", "getenv": "^2.0.0", - "glob": "^10.4.2", + "glob": "^13.0.0", "resolve-from": "^5.0.0", "semver": "^7.5.4", "slash": "^3.0.0", @@ -9791,15 +11362,15 @@ } }, "node_modules/expo/node_modules/@expo/config-types": { - "version": "54.0.8", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.8.tgz", - "integrity": "sha512-lyIn/x/Yz0SgHL7IGWtgTLg6TJWC9vL7489++0hzCHZ4iGjVcfZmPTUfiragZ3HycFFj899qN0jlhl49IHa94A==", + "version": "54.0.10", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", + "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", "license": "MIT" }, "node_modules/expo/node_modules/@expo/json-file": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.7.tgz", - "integrity": "sha512-z2OTC0XNO6riZu98EjdNHC05l51ySeTto6GP7oSQrCvQgG9ARBwD1YvMQaVZ9wU7p/4LzSf1O7tckL3B45fPpw==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", + "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", @@ -9807,9 +11378,9 @@ } }, "node_modules/expo/node_modules/@expo/plist": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.7.tgz", - "integrity": "sha512-dGxqHPvCZKeRKDU1sJZMmuyVtcASuSYh1LPFVaM1DuffqPL36n6FMEL0iUqq2Tx3xhWk8wCnWl34IKplUjJDdA==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", + "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", @@ -9817,6 +11388,15 @@ "xmlbuilder": "^15.1.1" } }, + "node_modules/expo/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/expo/node_modules/getenv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", @@ -9826,6 +11406,63 @@ "node": ">=6" } }, + "node_modules/expo/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/expo/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/expo/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -9838,6 +11475,28 @@ "node": ">=10" } }, + "node_modules/expo/node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", @@ -10095,6 +11754,23 @@ "bser": "2.1.1" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -12002,9 +13678,9 @@ "license": "MIT" }, "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -12017,23 +13693,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", "cpu": [ "arm64" ], @@ -12051,9 +13727,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", "cpu": [ "arm64" ], @@ -12071,9 +13747,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", "cpu": [ "x64" ], @@ -12091,9 +13767,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", "cpu": [ "x64" ], @@ -12111,9 +13787,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", "cpu": [ "arm" ], @@ -12131,9 +13807,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", "cpu": [ "arm64" ], @@ -12151,9 +13827,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", "cpu": [ "arm64" ], @@ -12171,9 +13847,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", "cpu": [ "x64" ], @@ -12191,9 +13867,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", "cpu": [ "x64" ], @@ -12211,9 +13887,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", "cpu": [ "arm64" ], @@ -12231,9 +13907,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", "cpu": [ "x64" ], @@ -13090,9 +14766,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" @@ -15824,9 +17500,9 @@ } }, "node_modules/send": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", - "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -15835,13 +17511,13 @@ "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -15871,6 +17547,26 @@ "node": ">= 0.8" } }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/send/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -15884,9 +17580,9 @@ } }, "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -16792,9 +18488,9 @@ } }, "node_modules/tar": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", - "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", + "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -16956,6 +18652,34 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -17998,9 +19722,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -18161,25 +19885,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.24.1" - } - }, "node_modules/zustand": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.8.tgz", diff --git a/package.json b/package.json index b163e88..0cdc332 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@shopify/flash-list": "2.0.2", "@tanstack/react-query": "^5.54.1", "axios": "^1.6.8", - "expo": "^54.0.9", + "expo": "^54.0.31", "expo-application": "~7.0.7", "expo-blur": "~15.0.7", "expo-build-properties": "~1.0.9", diff --git a/src/app/(tabs)/index.tsx b/src/app/(tabs)/index.tsx index 894a875..2fa2bad 100644 --- a/src/app/(tabs)/index.tsx +++ b/src/app/(tabs)/index.tsx @@ -9,6 +9,7 @@ import { ImageSourcePropType, ActivityIndicator, Platform, + TouchableOpacity } from 'react-native'; import { useRouter } from 'expo-router'; import { SafeAreaView } from 'react-native-safe-area-context'; @@ -91,6 +92,18 @@ const Home: React.FC = () => { Quick Access + + router.push('/utsav/feedback/20')} + activeOpacity={0.8} + className="bg-orange-500 rounded-xl py-4 items-center" + > + + DEV: Open Utsav Feedback + + + + ({ + mumukshu_name: '', + accommodation_type: '', + room_number: '', + + accommodation_rating: null, + qr_rating: null, + food_rating: null, + program_rating: null, + volunteer_rating: null, + infrastructure_rating: null, + decor_rating: null, + internal_transport_rating: null, + raj_pravas_rating: null, + sparsh_rating: null, + av_rating: null, + + loved_most: '', + improvement_suggestions: '', +}); + +/* -------------------------------------------------------------------------- */ +/* REUSABLE COMPONENTS */ +/* -------------------------------------------------------------------------- */ + +const StarRating: React.FC<{ + value: number | null; + onChange: (n: number) => void; + size?: number; +}> = ({ value, onChange, size = 26 }) => { + const current = value || 0; + return ( + + {[1, 2, 3, 4, 5].map((n) => ( + onChange(n)}> + + + ))} + + ); +}; + +const FieldLabel: React.FC<{ label: string }> = ({ label }) => ( + {label} +); + +/* -------------------------------------------------------------------------- */ +/* FORM COMPONENT */ +/* -------------------------------------------------------------------------- */ + +const UtsavFeedbackForm: React.FC<{ + value: UtsavFeedbackData; + onChange: (data: UtsavFeedbackData) => void; + onSubmit: () => void; + isSubmitting?: boolean; + showValidation?: boolean; +}> = ({ value, onChange, onSubmit, isSubmitting, showValidation }) => { + const err = (c: boolean) => showValidation && c; + + return ( + + + onChange({ ...value, mumukshu_name: t })} + error={err(!value.mumukshu_name)} + errorMessage="Required" + useNeomorphic + /> + + onChange({ ...value, accommodation_type: t })} + error={err(!value.accommodation_type)} + errorMessage="Required" + useNeomorphic + /> + + onChange({ ...value, room_number: t })} + error={err(!value.room_number)} + errorMessage="Required" + useNeomorphic + /> + + + onChange({ ...value, accommodation_rating: n })} + /> + + + + onChange({ ...value, qr_rating: n })} + /> + + + onChange({ ...value, food_rating: n })} + /> + + + onChange({ ...value, program_rating: n })} + /> + + + onChange({ ...value, volunteer_rating: n })} + /> + + + onChange({ ...value, infrastructure_rating: n })} + /> + + + onChange({ ...value, decor_rating: n })} + /> + + + onChange({ ...value, internal_transport_rating: n })} + /> + + + onChange({ ...value, raj_pravas_rating: n })} + /> + + + onChange({ ...value, sparsh_rating: n })} + /> + + + onChange({ ...value, av_rating: n })} + /> + + onChange({ ...value, loved_most: t })} + error={err(!value.loved_most)} + errorMessage="Required" + useNeomorphic + /> + + + onChange({ ...value, improvement_suggestions: t }) + } + error={err(!value.improvement_suggestions)} + errorMessage="Required" + useNeomorphic + /> + + + + ); +}; + +/* -------------------------------------------------------------------------- */ +/* SCREEN WRAPPER */ +/* -------------------------------------------------------------------------- */ + +const UtsavFeedbackScreen: React.FC = () => { + const router = useRouter(); + const { id } = useLocalSearchParams(); + const user = useAuthStore((s) => s.user); + + const [form, setForm] = useState(getInitialUtsavFeedbackForm()); + const [submitting, setSubmitting] = useState(false); + const [showValidation, setShowValidation] = useState(false); + const [isValidating, setIsValidating] = useState(true); + const [validationError, setValidationError] = useState(null); + + const utsavId = useMemo(() => { + const parsed = parseInt(Array.isArray(id) ? id[0] : (id as string), 10); + return Number.isFinite(parsed) ? parsed : null; + }, [id]); + + useEffect(() => { + if (!user?.cardno || utsavId === null) { + setValidationError('Invalid utsav or user'); + setIsValidating(false); + return; + } + + handleAPICall( + 'GET', + '/feedback/validate', + { utsavid: utsavId, cardno: user.cardno }, + null, + () => setIsValidating(false), + () => setIsValidating(false), + (err) => + setValidationError(err?.message || 'Not authorized to submit feedback'), + false + ); + }, [utsavId, user?.cardno]); + + const valid = useMemo(() => { + return Object.values(form).every((v) => v !== '' && v !== null); + }, [form]); + + const submit = async () => { + if (!valid) { + setShowValidation(true); + return; + } + + setSubmitting(true); + + handleAPICall( + 'POST', + '/feedback', + null, + { ...form, utsav_id: utsavId, cardno: user!.cardno }, + () => { + CustomAlert.alert('Thank you!', 'Your feedback has been submitted.'); + router.back(); + }, + () => setSubmitting(false), + () => setSubmitting(false) + ); + }; + + return ( + + router.back()} /> + + {isValidating && } + + {validationError && ( + + )} + + {!isValidating && !validationError && ( + + + + )} + + ); +}; + +export default UtsavFeedbackScreen; From 863d85d08c6826eb40b08da2a1b8b54b82c5f1f6 Mon Sep 17 00:00:00 2001 From: vendz Date: Tue, 3 Feb 2026 21:41:37 -0800 Subject: [PATCH 2/7] fix: utsav feedback form --- src/app/utsav/_layout.tsx | 4 + src/app/utsav/feedback/[id].tsx | 297 +++++++++++++++++++------------- 2 files changed, 177 insertions(+), 124 deletions(-) diff --git a/src/app/utsav/_layout.tsx b/src/app/utsav/_layout.tsx index 317b2ba..f879a66 100644 --- a/src/app/utsav/_layout.tsx +++ b/src/app/utsav/_layout.tsx @@ -14,6 +14,10 @@ const UtsavDetailsLayout = () => { name="utsavGuidelines" options={{ headerShown: false, presentation: 'modal' }} /> + ); diff --git a/src/app/utsav/feedback/[id].tsx b/src/app/utsav/feedback/[id].tsx index 7e87e37..e0b2a5a 100644 --- a/src/app/utsav/feedback/[id].tsx +++ b/src/app/utsav/feedback/[id].tsx @@ -4,10 +4,8 @@ import { useLocalSearchParams, useRouter } from 'expo-router'; import { SafeAreaView } from 'react-native-safe-area-context'; import { KeyboardAwareScrollView } from 'react-native-keyboard-controller'; import { Ionicons } from '@expo/vector-icons'; - import { useAuthStore } from '@/src/stores'; import { colors } from '@/src/constants'; -import { ShadowBox } from '@/src/components/ShadowBox'; import PageHeader from '@/src/components/PageHeader'; import FormField from '@/src/components/FormField'; import CustomButton from '@/src/components/CustomButton'; @@ -17,15 +15,7 @@ import CustomAlert from '@/src/components/CustomAlert'; import CustomErrorMessage from '@/src/components/CustomErrorMessage'; import Shimmer from '@/src/components/Shimmer'; -/* -------------------------------------------------------------------------- */ -/* TYPES */ -/* -------------------------------------------------------------------------- */ - export type UtsavFeedbackData = { - mumukshu_name: string; - accommodation_type: string; - room_number: string; - accommodation_rating: number | null; qr_rating: number | null; food_rating: number | null; @@ -37,16 +27,11 @@ export type UtsavFeedbackData = { raj_pravas_rating: number | null; sparsh_rating: number | null; av_rating: number | null; - loved_most: string; improvement_suggestions: string; }; export const getInitialUtsavFeedbackForm = (): UtsavFeedbackData => ({ - mumukshu_name: '', - accommodation_type: '', - room_number: '', - accommodation_rating: null, qr_rating: null, food_rating: null, @@ -58,15 +43,10 @@ export const getInitialUtsavFeedbackForm = (): UtsavFeedbackData => ({ raj_pravas_rating: null, sparsh_rating: null, av_rating: null, - loved_most: '', improvement_suggestions: '', }); -/* -------------------------------------------------------------------------- */ -/* REUSABLE COMPONENTS */ -/* -------------------------------------------------------------------------- */ - const StarRating: React.FC<{ value: number | null; onChange: (n: number) => void; @@ -74,9 +54,9 @@ const StarRating: React.FC<{ }> = ({ value, onChange, size = 26 }) => { const current = value || 0; return ( - + {[1, 2, 3, 4, 5].map((n) => ( - onChange(n)}> + onChange(n)} activeOpacity={0.8}> = ({ label }) => ( - {label} +const FieldLabel: React.FC<{ label: string; helper?: string }> = ({ label, helper }) => ( + + + {label} + + {helper ? {helper} : null} + ); -/* -------------------------------------------------------------------------- */ -/* FORM COMPONENT */ -/* -------------------------------------------------------------------------- */ - const UtsavFeedbackForm: React.FC<{ value: UtsavFeedbackData; onChange: (data: UtsavFeedbackData) => void; onSubmit: () => void; isSubmitting?: boolean; + containerStyles?: string; showValidation?: boolean; -}> = ({ value, onChange, onSubmit, isSubmitting, showValidation }) => { - const err = (c: boolean) => showValidation && c; +}> = ({ + value, + onChange, + onSubmit, + isSubmitting = false, + containerStyles = '', + showValidation = false, +}) => { + const fieldError = (cond: boolean) => showValidation && cond; return ( - - - onChange({ ...value, mumukshu_name: t })} - error={err(!value.mumukshu_name)} - errorMessage="Required" - useNeomorphic - /> - - onChange({ ...value, accommodation_type: t })} - error={err(!value.accommodation_type)} - errorMessage="Required" - useNeomorphic - /> - - onChange({ ...value, room_number: t })} - error={err(!value.room_number)} - errorMessage="Required" - useNeomorphic - /> - - + + onChange({ ...value, accommodation_rating: n })} /> - - - - onChange({ ...value, qr_rating: n })} + - + + onChange({ ...value, qr_rating: n })} /> + + + onChange({ ...value, food_rating: n })} /> + - + onChange({ ...value, program_rating: n })} /> + - + onChange({ ...value, volunteer_rating: n })} /> + - + onChange({ ...value, infrastructure_rating: n })} /> + - + onChange({ ...value, decor_rating: n })} /> + - + onChange({ ...value, internal_transport_rating: n })} /> + - + onChange({ ...value, raj_pravas_rating: n })} /> + - + onChange({ ...value, sparsh_rating: n })} /> + - - onChange({ ...value, av_rating: n })} - /> + + onChange({ ...value, av_rating: n })} /> + onChange({ ...value, loved_most: t })} - error={err(!value.loved_most)} + handleChangeText={(t: string) => onChange({ ...value, loved_most: t })} + otherStyles="mt-5" + inputStyles="font-pmedium text-base" + error={fieldError(!value.loved_most)} errorMessage="Required" useNeomorphic /> - onChange({ ...value, improvement_suggestions: t }) - } - error={err(!value.improvement_suggestions)} + handleChangeText={(t: string) => onChange({ ...value, improvement_suggestions: t })} + otherStyles="mt-5" + inputStyles="font-pmedium text-base" + error={fieldError(!value.improvement_suggestions)} errorMessage="Required" useNeomorphic /> @@ -226,24 +209,22 @@ const UtsavFeedbackForm: React.FC<{ ); }; -/* -------------------------------------------------------------------------- */ -/* SCREEN WRAPPER */ -/* -------------------------------------------------------------------------- */ - const UtsavFeedbackScreen: React.FC = () => { const router = useRouter(); const { id } = useLocalSearchParams(); const user = useAuthStore((s) => s.user); - const [form, setForm] = useState(getInitialUtsavFeedbackForm()); + const [form, setForm] = useState(getInitialUtsavFeedbackForm()); const [submitting, setSubmitting] = useState(false); const [showValidation, setShowValidation] = useState(false); const [isValidating, setIsValidating] = useState(true); @@ -256,27 +237,56 @@ const UtsavFeedbackScreen: React.FC = () => { useEffect(() => { if (!user?.cardno || utsavId === null) { - setValidationError('Invalid utsav or user'); + setValidationError('Invalid utsav or user information'); setIsValidating(false); return; } - handleAPICall( - 'GET', - '/feedback/validate', - { utsavid: utsavId, cardno: user.cardno }, - null, - () => setIsValidating(false), - () => setIsValidating(false), - (err) => - setValidationError(err?.message || 'Not authorized to submit feedback'), - false - ); - }, [utsavId, user?.cardno]); + const validateFeedbackAccess = async () => { + setIsValidating(true); + await new Promise((resolve, reject) => { + handleAPICall( + 'GET', + '/utsav/feedback/validate', + { utsav_id: utsavId, cardno: user.cardno }, + null, + () => resolve(true), + () => { + setIsValidating(false); + } + // (err) => { + // setValidationError( + // err?.message || 'You are not authorized to submit feedback for this utsav' + // ); + // }, + // false + ); + }); + setValidationError(null); + }; + + validateFeedbackAccess(); + }, [utsavId, user?.cardno, router]); const valid = useMemo(() => { - return Object.values(form).every((v) => v !== '' && v !== null); - }, [form]); + return ( + !!user?.cardno && + utsavId !== null && + !!form.accommodation_rating && + !!form.qr_rating && + !!form.food_rating && + !!form.program_rating && + !!form.volunteer_rating && + !!form.infrastructure_rating && + !!form.decor_rating && + !!form.internal_transport_rating && + !!form.raj_pravas_rating && + !!form.sparsh_rating && + !!form.av_rating && + !!form.loved_most && + !!form.improvement_suggestions + ); + }, [form, utsavId, user?.cardno]); const submit = async () => { if (!valid) { @@ -286,38 +296,77 @@ const UtsavFeedbackScreen: React.FC = () => { setSubmitting(true); - handleAPICall( - 'POST', - '/feedback', - null, - { ...form, utsav_id: utsavId, cardno: user!.cardno }, - () => { - CustomAlert.alert('Thank you!', 'Your feedback has been submitted.'); - router.back(); - }, - () => setSubmitting(false), - () => setSubmitting(false) - ); + await new Promise((resolve, reject) => { + handleAPICall( + 'POST', + '/feedback', + null, + { + cardno: user!.cardno, + utsav_id: utsavId, + accommodation_rating: form.accommodation_rating, + qr_rating: form.qr_rating, + food_rating: form.food_rating, + program_rating: form.program_rating, + volunteer_rating: form.volunteer_rating, + infrastructure_rating: form.infrastructure_rating, + decor_rating: form.decor_rating, + internal_transport_rating: form.internal_transport_rating, + raj_pravas_rating: form.raj_pravas_rating, + sparsh_rating: form.sparsh_rating, + av_rating: form.av_rating, + loved_most: form.loved_most, + improvement_suggestions: form.improvement_suggestions, + }, + () => resolve(true), + () => {}, + (err) => reject(err) + ); + }); + + CustomAlert.alert('Thank you!', 'Your feedback has been submitted successfully.'); + router.back(); + setSubmitting(false); }; return ( - router.back()} /> + (router.canGoBack() ? router.back() : router.replace('/'))} + /> + + {isValidating && ( + + + + + - {isValidating && } + {[1, 2, 3, 4].map((n) => ( + + ))} + + + + )} {validationError && ( )} {!isValidating && !validationError && ( - + )} From ca4c6724ad5c05665e48a3ae2f1ebf86793f1dea Mon Sep 17 00:00:00 2001 From: Harshit Kamani Date: Fri, 20 Feb 2026 00:21:59 +0530 Subject: [PATCH 3/7] utsav feedback button --- .../.EventBookingCancellation.tsx.swp | Bin 0 -> 16384 bytes .../EventBookingCancellation.tsx | 63 +++++++++++++----- 2 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 src/components/cancel booking/.EventBookingCancellation.tsx.swp diff --git a/src/components/cancel booking/.EventBookingCancellation.tsx.swp b/src/components/cancel booking/.EventBookingCancellation.tsx.swp new file mode 100644 index 0000000000000000000000000000000000000000..a2aeb0f92b781cd3cb8e386b87078a880ac8bf78 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/src/components/cancel booking/EventBookingCancellation.tsx b/src/components/cancel booking/EventBookingCancellation.tsx index 7a3076a..0286025 100644 --- a/src/components/cancel booking/EventBookingCancellation.tsx +++ b/src/components/cancel booking/EventBookingCancellation.tsx @@ -20,6 +20,8 @@ import HorizontalSeparator from '../HorizontalSeparator'; import CustomEmptyMessage from '../CustomEmptyMessage'; import BookingStatusDisplay from '../BookingStatusDisplay'; import moment from 'moment'; +import { useRouter } from 'expo-router'; + const EventBookingCancellation = () => { const { user } = useAuthStore(); @@ -28,6 +30,8 @@ const EventBookingCancellation = () => { const [showCancelModal, setShowCancelModal] = useState(false); const [selectedBooking, setSelectedBooking] = useState(null); const tabBarPadding = useTabBarPadding(); + const router = useRouter(); + const fetchUtsavs = async ({ pageParam = 1 }) => { return new Promise((resolve, reject) => { @@ -40,8 +44,10 @@ const EventBookingCancellation = () => { }, null, (res: any) => { - resolve(Array.isArray(res.data) ? res.data : []); - }, + console.log('UTSAV BOOKINGS RESPONSE:', res.data); + resolve(Array.isArray(res.data) ? res.data : []); +}, + () => reject(new Error('Failed to fetch utsavs')) ); }); @@ -162,20 +168,45 @@ const EventBookingCancellation = () => { ₹ {item.amount} )} - - {moment(item.date).diff(moment().format('YYYY-MM-DD')) > 0 && - ![status.STATUS_CANCELLED, status.STATUS_ADMIN_CANCELLED].includes(item.status) && ( - { - setSelectedBooking(item); - setShowCancelModal(true); - }} - /> - )} - + {/* Actions Row */} +{( + ( + moment(item.utsav_start_date).isAfter(moment(), 'day') && + ![status.STATUS_CANCELLED, status.STATUS_ADMIN_CANCELLED].includes(item.status) + ) || + item?.showFeedback +) && ( + + {/* Cancel Booking — only BEFORE event */} + {moment(item.utsav_start_date).isAfter(moment(), 'day') && + ![status.STATUS_CANCELLED, status.STATUS_ADMIN_CANCELLED].includes(item.status) && ( + { + setSelectedBooking(item); + setShowCancelModal(true); + }} + /> + )} + + {/* Give Feedback */} + {item?.showFeedback && ( + { + const utsavId = item.utsavid ?? item.id; + router.push(`/utsav/feedback/${utsavId}`); + }} + /> + )} + +)} + ); From 544beef84f196b2464095261311858be57c22ccd Mon Sep 17 00:00:00 2001 From: Harshit Kamani Date: Fri, 20 Feb 2026 01:20:45 +0530 Subject: [PATCH 4/7] utsav feedback final baseurl to be changed --- src/app/(tabs)/index.tsx | 13 +------------ src/app/utsav/feedback/[id].tsx | 2 +- .../cancel booking/EventBookingCancellation.tsx | 2 +- src/utils/HandleApiCall.js | 2 +- 4 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/app/(tabs)/index.tsx b/src/app/(tabs)/index.tsx index 2fa2bad..4c66bbc 100644 --- a/src/app/(tabs)/index.tsx +++ b/src/app/(tabs)/index.tsx @@ -92,18 +92,7 @@ const Home: React.FC = () => { Quick Access - - router.push('/utsav/feedback/20')} - activeOpacity={0.8} - className="bg-orange-500 rounded-xl py-4 items-center" - > - - DEV: Open Utsav Feedback - - - - + { await new Promise((resolve, reject) => { handleAPICall( 'POST', - '/feedback', + '/utsav/feedback', null, { cardno: user!.cardno, diff --git a/src/components/cancel booking/EventBookingCancellation.tsx b/src/components/cancel booking/EventBookingCancellation.tsx index 0286025..6b1ec3b 100644 --- a/src/components/cancel booking/EventBookingCancellation.tsx +++ b/src/components/cancel booking/EventBookingCancellation.tsx @@ -161,7 +161,7 @@ const EventBookingCancellation = () => { {item.stay} )} - {item.amount && ( + {item.amount > 0 && ( Charge: diff --git a/src/utils/HandleApiCall.js b/src/utils/HandleApiCall.js index 03d121b..971e66c 100644 --- a/src/utils/HandleApiCall.js +++ b/src/utils/HandleApiCall.js @@ -20,7 +20,7 @@ const handleAPICall = async ( if (useDevBackend) { if (devPrNumber) { - currentBaseUrl = `https://aashray-backend-pr-${devPrNumber}.onrender.com/api/v1`; + currentBaseUrl = `http://10.0.2.2:3000/api/v1`; } else { currentBaseUrl = DEV_URL; } From 4ce35e9a04065fa99e56bc00a1f6f6689fa05f87 Mon Sep 17 00:00:00 2001 From: Harshit Kamani Date: Fri, 20 Feb 2026 22:29:26 +0530 Subject: [PATCH 5/7] changed base url to onrender one --- .../.EventBookingCancellation.tsx.swp | Bin 16384 -> 0 bytes src/utils/HandleApiCall.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 src/components/cancel booking/.EventBookingCancellation.tsx.swp diff --git a/src/components/cancel booking/.EventBookingCancellation.tsx.swp b/src/components/cancel booking/.EventBookingCancellation.tsx.swp deleted file mode 100644 index a2aeb0f92b781cd3cb8e386b87078a880ac8bf78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 diff --git a/src/utils/HandleApiCall.js b/src/utils/HandleApiCall.js index 971e66c..03d121b 100644 --- a/src/utils/HandleApiCall.js +++ b/src/utils/HandleApiCall.js @@ -20,7 +20,7 @@ const handleAPICall = async ( if (useDevBackend) { if (devPrNumber) { - currentBaseUrl = `http://10.0.2.2:3000/api/v1`; + currentBaseUrl = `https://aashray-backend-pr-${devPrNumber}.onrender.com/api/v1`; } else { currentBaseUrl = DEV_URL; } From 8b2cb77e5f0752d646ee150d7b55c2223932f7db Mon Sep 17 00:00:00 2001 From: vendz Date: Tue, 24 Feb 2026 11:22:53 -0800 Subject: [PATCH 6/7] feat: implement a generic stepped feedback component and refactor Utsav and Adhyayan feedback forms to use it. --- app.config.js | 2 +- package-lock.json | 36 +- src/app/(tabs)/index.tsx | 3 +- src/app/_layout.tsx | 4 + src/app/adhyayan/feedback/[id].tsx | 368 +++-------------- src/app/utsav/feedback/[id].tsx | 379 ++++-------------- src/assets/fonts/DMSans-Light.ttf | Bin 0 -> 33340 bytes src/assets/fonts/DMSans-Medium.ttf | Bin 0 -> 33328 bytes src/assets/fonts/DMSans-Regular.ttf | Bin 0 -> 33384 bytes src/assets/fonts/DMSerifDisplay-Regular.ttf | Bin 0 -> 72212 bytes .../SteppedFeedback/BooleanInput.tsx | 82 ++++ .../SteppedFeedback/ProgressBar.tsx | 36 ++ .../SteppedFeedback/RatingInput.tsx | 100 +++++ .../SteppedFeedbackShimmer.tsx | 32 ++ .../SteppedFeedback/SuccessScreen.tsx | 83 ++++ src/components/SteppedFeedback/TextInput.tsx | 62 +++ src/components/SteppedFeedback/index.tsx | 293 ++++++++++++++ src/components/SteppedFeedback/types.ts | 24 ++ .../SteppedFeedback/useSteppedFeedback.ts | 197 +++++++++ src/questions/adhyayanFeedback.ts | 58 +++ src/questions/utsavFeedback.ts | 33 ++ 21 files changed, 1128 insertions(+), 664 deletions(-) create mode 100644 src/assets/fonts/DMSans-Light.ttf create mode 100644 src/assets/fonts/DMSans-Medium.ttf create mode 100644 src/assets/fonts/DMSans-Regular.ttf create mode 100644 src/assets/fonts/DMSerifDisplay-Regular.ttf create mode 100644 src/components/SteppedFeedback/BooleanInput.tsx create mode 100644 src/components/SteppedFeedback/ProgressBar.tsx create mode 100644 src/components/SteppedFeedback/RatingInput.tsx create mode 100644 src/components/SteppedFeedback/SteppedFeedbackShimmer.tsx create mode 100644 src/components/SteppedFeedback/SuccessScreen.tsx create mode 100644 src/components/SteppedFeedback/TextInput.tsx create mode 100644 src/components/SteppedFeedback/index.tsx create mode 100644 src/components/SteppedFeedback/types.ts create mode 100644 src/components/SteppedFeedback/useSteppedFeedback.ts create mode 100644 src/questions/adhyayanFeedback.ts create mode 100644 src/questions/utsavFeedback.ts diff --git a/app.config.js b/app.config.js index 1fac30b..926cd47 100644 --- a/app.config.js +++ b/app.config.js @@ -3,7 +3,7 @@ export default { name: 'Aashray', scheme: 'aashray', slug: 'aashray', - version: '1.1.46', + version: '1.1.48', orientation: 'portrait', icon: './src/assets/images/icon.png', userInterfaceStyle: 'automatic', diff --git a/package-lock.json b/package-lock.json index e4ae950..50b9ea9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2238,7 +2238,6 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -4254,7 +4253,6 @@ "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.13.2.tgz", "integrity": "sha512-jwtMmJa1BXXDCiDx1vC6SFN/+HfYG53UkfJa6qeN5ogvOunzbFDO3wISZy5n9xgYFUrEP6M7e8EG++riHNTv9w==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.18", "@firebase/logger": "0.4.4", @@ -4321,7 +4319,6 @@ "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.4.2.tgz", "integrity": "sha512-LssbyKHlwLeiV8GBATyOyjmHcMpX/tFjzRUCS1jnwGAew1VsBB4fJowyS5Ud5LdFbYpJeS+IQoC+RQxpK7eH3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/app": "0.13.2", "@firebase/component": "0.6.18", @@ -4337,8 +4334,7 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@firebase/auth": { "version": "1.10.8", @@ -4789,7 +4785,6 @@ "integrity": "sha512-zGlBn/9Dnya5ta9bX/fgEoNC3Cp8s6h+uYPYaDieZsFOAdHP/ExzQ/eaDgxD3GOROdPkLKpvKY0iIzr9adle0w==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" }, @@ -5632,7 +5627,6 @@ "resolved": "https://registry.npmjs.org/@react-native-community/datetimepicker/-/datetimepicker-8.4.4.tgz", "integrity": "sha512-bc4ZixEHxZC9/qf5gbdYvIJiLZ5CLmEsC3j+Yhe1D1KC/3QhaIfGDVdUcid0PdlSoGOSEq4VlB93AWyetEyBSQ==", "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -5656,7 +5650,6 @@ "resolved": "https://registry.npmjs.org/@react-native-firebase/app/-/app-22.4.0.tgz", "integrity": "sha512-mW49qYioddRZjCRiF4XMpt7pyPoh84pqU2obnFY0pWD9K0aFRv6+BfLBYrsAFY3xqA5cqf0uj+Nne0vrvmuAyw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "firebase": "11.10.0" }, @@ -6065,7 +6058,6 @@ "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.1.19.tgz", "integrity": "sha512-fM7q8di4Q8sp2WUhiUWOe7bEDRyRhbzsKQOd5N2k+lHeCx3UncsRYuw4Q/KN0EovM3wWKqMMmhy/YWuEO04kgw==", "license": "MIT", - "peer": true, "dependencies": { "@react-navigation/core": "^7.13.0", "escape-string-regexp": "^4.0.0", @@ -6647,7 +6639,6 @@ "integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -6730,7 +6721,6 @@ "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", @@ -6965,7 +6955,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7816,7 +7805,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", @@ -8444,7 +8432,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -9416,7 +9403,6 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -9473,7 +9459,6 @@ "integrity": "sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -9549,7 +9534,6 @@ "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", @@ -10249,7 +10233,6 @@ "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.31.tgz", "integrity": "sha512-kQ3RDqA/a59I7y+oqQGyrPbbYlgPMUdKBOgvFLpoHbD2bCM+F75i4N0mUijy7dG5F/CUCu2qHmGGUCXBbMDkCg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", "@expo/cli": "54.0.21", @@ -10450,7 +10433,6 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "license": "MIT", - "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -10731,7 +10713,6 @@ "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.11.tgz", "integrity": "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==", "license": "MIT", - "peer": true, "dependencies": { "fontfaceobserver": "^2.1.0" }, @@ -10792,7 +10773,6 @@ "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-8.0.8.tgz", "integrity": "sha512-MyeMcbFDKhXh4sDD1EHwd0uxFQNAc6VCrwBkNvvvufUsTYFq3glTA9Y8a+x78CPpjNqwNAamu74yIaIz7IEJyg==", "license": "MIT", - "peer": true, "dependencies": { "expo-constants": "~18.0.8", "invariant": "^2.2.4" @@ -13498,7 +13478,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -15473,7 +15452,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -15585,7 +15563,6 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -16160,7 +16137,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -16238,7 +16214,6 @@ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.4.tgz", "integrity": "sha512-bt5bz3A/+Cv46KcjV0VQa+fo7MKxs17RCcpzjftINlen4ZDUl0I6Ut+brQ2FToa5oD0IB0xvQHfmsg2EDqsZdQ==", "license": "MIT", - "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.81.4", @@ -16611,7 +16586,6 @@ "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.28.0.tgz", "integrity": "sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==", "license": "MIT", - "peer": true, "dependencies": { "@egjs/hammerjs": "^2.0.17", "hoist-non-react-statics": "^3.3.0", @@ -16702,7 +16676,6 @@ "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.1.3.tgz", "integrity": "sha512-GP8wsi1u3nqvC1fMab/m8gfFwFyldawElCcUSBJQgfrXeLmsPPUOpDw44lbLeCpcwUuLa05WTVePdTEwCLTUZg==", "license": "MIT", - "peer": true, "dependencies": { "react-native-is-edge-to-edge": "^1.2.1", "semver": "7.7.2" @@ -16731,7 +16704,6 @@ "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.1.tgz", "integrity": "sha512-/wJE58HLEAkATzhhX1xSr+fostLsK8Q97EfpfMDKo8jlOc1QKESSX/FQrhk7HhQH/2uSaox4Y86sNaI02kteiA==", "license": "MIT", - "peer": true, "peerDependencies": { "react": "*", "react-native": "*" @@ -16742,7 +16714,6 @@ "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.16.0.tgz", "integrity": "sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==", "license": "MIT", - "peer": true, "dependencies": { "react-freeze": "^1.0.0", "react-native-is-edge-to-edge": "^1.2.1", @@ -16758,7 +16729,6 @@ "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.12.1.tgz", "integrity": "sha512-vCuZJDf8a5aNC2dlMovEv4Z0jjEUET53lm/iILFnFewa15b4atjVxU6Wirm6O9y6dEsdjDZVD7Q3QM4T1wlI8g==", "license": "MIT", - "peer": true, "dependencies": { "css-select": "^5.1.0", "css-tree": "^1.1.3", @@ -16926,7 +16896,6 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -18412,7 +18381,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", "license": "MIT", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -18903,7 +18871,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19140,7 +19107,6 @@ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", "license": "MIT", - "peer": true, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } diff --git a/src/app/(tabs)/index.tsx b/src/app/(tabs)/index.tsx index 4c66bbc..2db942f 100644 --- a/src/app/(tabs)/index.tsx +++ b/src/app/(tabs)/index.tsx @@ -9,7 +9,7 @@ import { ImageSourcePropType, ActivityIndicator, Platform, - TouchableOpacity + TouchableOpacity, } from 'react-native'; import { useRouter } from 'expo-router'; import { SafeAreaView } from 'react-native-safe-area-context'; @@ -92,7 +92,6 @@ const Home: React.FC = () => { Quick Access - { 'Poppins-Regular': require('@/src/assets/fonts/Poppins-Regular.ttf'), 'Poppins-SemiBold': require('@/src/assets/fonts/Poppins-SemiBold.ttf'), 'Poppins-Thin': require('@/src/assets/fonts/Poppins-Thin.ttf'), + 'DMSerifDisplay-Regular': require('@/src/assets/fonts/DMSerifDisplay-Regular.ttf'), + 'DMSans-Regular': require('@/src/assets/fonts/DMSans-Regular.ttf'), + 'DMSans-Medium': require('@/src/assets/fonts/DMSans-Medium.ttf'), + 'DMSans-Light': require('@/src/assets/fonts/DMSans-Light.ttf'), }); const [isAuthReady, setIsAuthReady] = useState(false); diff --git a/src/app/adhyayan/feedback/[id].tsx b/src/app/adhyayan/feedback/[id].tsx index 330b23a..f689f1b 100644 --- a/src/app/adhyayan/feedback/[id].tsx +++ b/src/app/adhyayan/feedback/[id].tsx @@ -1,248 +1,19 @@ import React, { useMemo, useState, useEffect } from 'react'; -import { Alert, View, Text, TouchableOpacity, Platform } from 'react-native'; +import { View } from 'react-native'; import { useLocalSearchParams, useRouter } from 'expo-router'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { KeyboardAwareScrollView } from 'react-native-keyboard-controller'; -import { Ionicons } from '@expo/vector-icons'; import { useAuthStore } from '@/src/stores'; -import { colors } from '@/src/constants'; -import { ShadowBox } from '@/src/components/ShadowBox'; -import PageHeader from '@/src/components/PageHeader'; -import FormField from '@/src/components/FormField'; -import CustomButton from '@/src/components/CustomButton'; +import { SteppedFeedback, SteppedFeedbackShimmer } from '@/src/components/SteppedFeedback'; +import type { AnswerValue } from '@/src/components/SteppedFeedback'; +import { ADHYAYAN_QUESTIONS } from '@/src/questions/adhyayanFeedback'; import handleAPICall from '@/src/utils/HandleApiCall'; -import ErrorText from '@/src/components/ErrorText'; import CustomAlert from '@/src/components/CustomAlert'; import CustomErrorMessage from '@/src/components/CustomErrorMessage'; -import Shimmer from '@/src/components/Shimmer'; -export type AdhyayanFeedbackData = { - swadhay_karta_rating: number | null; - personal_interaction_rating: number | null; - swadhay_karta_suggestions: string; - raj_adhyayan_interest: boolean | null; - future_topics: string; - loved_most: string; - improvement_suggestions: string; - food_rating: number | null; - stay_rating: number | null; -}; - -export const getInitialFeedbackForm = (): AdhyayanFeedbackData => ({ - swadhay_karta_rating: null, - personal_interaction_rating: null, - swadhay_karta_suggestions: '', - raj_adhyayan_interest: null, - future_topics: '', - loved_most: '', - improvement_suggestions: '', - food_rating: null, - stay_rating: null, -}); - -const StarRating: React.FC<{ - value: number | null; - onChange: (n: number) => void; - size?: number; -}> = ({ value, onChange, size = 26 }) => { - const current = value || 0; - return ( - - {[1, 2, 3, 4, 5].map((n) => ( - onChange(n)} activeOpacity={0.8}> - - - ))} - - ); -}; - -const FieldLabel: React.FC<{ label: string; helper?: string }> = ({ label, helper }) => ( - - - {label} - - {helper ? {helper} : null} - -); - -const AdhyayanFeedbackForm: React.FC<{ - value: AdhyayanFeedbackData; - onChange: (data: AdhyayanFeedbackData) => void; - onSubmit: () => void; - isSubmitting?: boolean; - containerStyles?: string; - showValidation?: boolean; -}> = ({ - value, - onChange, - onSubmit, - isSubmitting = false, - containerStyles = '', - showValidation = false, -}) => { - const fieldError = (cond: boolean) => showValidation && cond; - - return ( - - - onChange({ ...value, swadhay_karta_rating: n })} - /> - - - - onChange({ ...value, personal_interaction_rating: n })} - /> - - - onChange({ ...value, swadhay_karta_suggestions: t })} - otherStyles="mt-5" - inputStyles="font-pmedium text-base" - error={fieldError(!value.swadhay_karta_suggestions)} - errorMessage="Required" - useNeomorphic - /> - - - - onChange({ ...value, raj_adhyayan_interest: true })}> - - - - I'm In! - - - - - onChange({ ...value, raj_adhyayan_interest: false })}> - - - - Not Now - - - - - - - onChange({ ...value, future_topics: t })} - otherStyles="mt-5" - inputStyles="font-pmedium text-base" - error={fieldError(!value.future_topics)} - errorMessage="Required" - useNeomorphic - /> - - onChange({ ...value, loved_most: t })} - otherStyles="mt-5" - inputStyles="font-pmedium text-base" - error={fieldError(!value.loved_most)} - errorMessage="Required" - useNeomorphic - /> - - onChange({ ...value, improvement_suggestions: t })} - otherStyles="mt-5" - inputStyles="font-pmedium text-base" - error={fieldError(!value.improvement_suggestions)} - errorMessage="Required" - useNeomorphic - /> - - - onChange({ ...value, food_rating: n })} - /> - - - - onChange({ ...value, stay_rating: n })} - /> - - - - - ); -}; - -const FeedbackScreen: React.FC = () => { +const AdhyayanFeedbackScreen: React.FC = () => { const router = useRouter(); const { id } = useLocalSearchParams(); const user = useAuthStore((s) => s.user); - const [form, setForm] = useState(getInitialFeedbackForm()); - const [submitting, setSubmitting] = useState(false); - const [showValidation, setShowValidation] = useState(false); const [isValidating, setIsValidating] = useState(true); const [validationError, setValidationError] = useState(null); @@ -251,7 +22,6 @@ const FeedbackScreen: React.FC = () => { return Number.isFinite(parsed) ? parsed : null; }, [id]); - // Validate feedback access on mount useEffect(() => { if (!user?.cardno || shibirId === null) { setValidationError('Invalid shibir or user information'); @@ -261,7 +31,7 @@ const FeedbackScreen: React.FC = () => { const validateFeedbackAccess = async () => { setIsValidating(true); - await new Promise((resolve, reject) => { + await new Promise((resolve) => { handleAPICall( 'GET', '/adhyayan/feedback/validate', @@ -271,7 +41,7 @@ const FeedbackScreen: React.FC = () => { () => { setIsValidating(false); }, - (err) => { + (err: any) => { setValidationError( err?.message || 'You are not authorized to submit feedback for this shibir' ); @@ -283,104 +53,70 @@ const FeedbackScreen: React.FC = () => { }; validateFeedbackAccess(); - }, [shibirId, user?.cardno, router]); - - const valid = useMemo(() => { - return ( - !!user?.cardno && - shibirId !== null && - !!form.swadhay_karta_rating && - !!form.personal_interaction_rating && - form.raj_adhyayan_interest !== null && - !!form.swadhay_karta_suggestions && - !!form.future_topics && - !!form.loved_most && - !!form.improvement_suggestions && - !!form.food_rating && - !!form.stay_rating - ); - }, [form, shibirId, user?.cardno]); + }, [shibirId, user?.cardno]); - const submit = async () => { - if (!valid) { - setShowValidation(true); - return; - } + const handleSubmit = async (answers: Record) => { + if (!user?.cardno || shibirId === null) return; - setSubmitting(true); - - await new Promise((resolve, reject) => { + await new Promise((resolve, reject) => { handleAPICall( 'POST', '/adhyayan/feedback', null, { - cardno: user!.cardno, + cardno: user.cardno, shibir_id: shibirId, - swadhay_karta_rating: form.swadhay_karta_rating, - personal_interaction_rating: form.personal_interaction_rating, - swadhay_karta_suggestions: form.swadhay_karta_suggestions, - raj_adhyayan_interest: form.raj_adhyayan_interest, - future_topics: form.future_topics, - loved_most: form.loved_most, - improvement_suggestions: form.improvement_suggestions, - food_rating: form.food_rating, - stay_rating: form.stay_rating, + ...answers, }, - () => resolve(true), + () => resolve(), () => {}, - (err) => reject(err) + (err: unknown) => reject(err) ); }); - - CustomAlert.alert('Thank you!', 'Your feedback has been submitted successfully.'); - router.back(); - setSubmitting(false); }; - return ( - - (router.canGoBack() ? router.back() : router.replace('/'))} - /> - - {isValidating && ( - - - - - + const handleDismiss = () => { + if (router.canGoBack()) { + router.back(); + } else { + router.replace('/'); + } + }; - {[1, 2, 3, 4].map((n) => ( - - ))} + const handleClose = () => { + CustomAlert.alert( + 'Exit Feedback?', + 'Your responses have not been saved. Are you sure you want to exit?', + [ + { text: 'Cancel', style: 'cancel' }, + { text: 'Exit', style: 'destructive', onPress: handleDismiss }, + ] + ); + }; - - - )} + if (isValidating) { + return ; + } - {validationError && ( + if (validationError) { + return ( + - )} + + ); + } - {!isValidating && !validationError && ( - - - - )} - + return ( + ); }; -export default FeedbackScreen; +export default AdhyayanFeedbackScreen; diff --git a/src/app/utsav/feedback/[id].tsx b/src/app/utsav/feedback/[id].tsx index 7cb6366..1c34cc4 100644 --- a/src/app/utsav/feedback/[id].tsx +++ b/src/app/utsav/feedback/[id].tsx @@ -1,232 +1,41 @@ import React, { useMemo, useState, useEffect } from 'react'; -import { View, Text, TouchableOpacity } from 'react-native'; +import { View } from 'react-native'; import { useLocalSearchParams, useRouter } from 'expo-router'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { KeyboardAwareScrollView } from 'react-native-keyboard-controller'; -import { Ionicons } from '@expo/vector-icons'; import { useAuthStore } from '@/src/stores'; -import { colors } from '@/src/constants'; -import PageHeader from '@/src/components/PageHeader'; -import FormField from '@/src/components/FormField'; -import CustomButton from '@/src/components/CustomButton'; +import { SteppedFeedback, SteppedFeedbackShimmer } from '@/src/components/SteppedFeedback'; +import type { AnswerValue } from '@/src/components/SteppedFeedback'; +import { UTSAV_QUESTIONS } from '@/src/questions/utsavFeedback'; import handleAPICall from '@/src/utils/HandleApiCall'; -import ErrorText from '@/src/components/ErrorText'; import CustomAlert from '@/src/components/CustomAlert'; import CustomErrorMessage from '@/src/components/CustomErrorMessage'; -import Shimmer from '@/src/components/Shimmer'; -export type UtsavFeedbackData = { - accommodation_rating: number | null; - qr_rating: number | null; - food_rating: number | null; - program_rating: number | null; - volunteer_rating: number | null; - infrastructure_rating: number | null; - decor_rating: number | null; - internal_transport_rating: number | null; - raj_pravas_rating: number | null; - sparsh_rating: number | null; - av_rating: number | null; - loved_most: string; - improvement_suggestions: string; -}; - -export const getInitialUtsavFeedbackForm = (): UtsavFeedbackData => ({ - accommodation_rating: null, - qr_rating: null, - food_rating: null, - program_rating: null, - volunteer_rating: null, - infrastructure_rating: null, - decor_rating: null, - internal_transport_rating: null, - raj_pravas_rating: null, - sparsh_rating: null, - av_rating: null, - loved_most: '', - improvement_suggestions: '', +const mapAnswersToPayload = ( + answers: Record, + cardno: string, + utsavId: number +) => ({ + cardno, + utsav_id: utsavId, + accommodation_rating: answers.accommodation, + qr_rating: answers.qr_system, + food_rating: answers.food, + program_rating: answers.program, + volunteer_rating: answers.volunteers, + infrastructure_rating: answers.infrastructure, + decor_rating: answers.decor, + internal_transport_rating: answers.transport_int, + raj_pravas_rating: answers.transport_raj, + sparsh_rating: answers.sparsh, + av_rating: answers.av_setup, + loved_most: answers.loved, + improvement_suggestions: answers.suggestions, }); -const StarRating: React.FC<{ - value: number | null; - onChange: (n: number) => void; - size?: number; -}> = ({ value, onChange, size = 26 }) => { - const current = value || 0; - return ( - - {[1, 2, 3, 4, 5].map((n) => ( - onChange(n)} activeOpacity={0.8}> - - - ))} - - ); -}; - -const FieldLabel: React.FC<{ label: string; helper?: string }> = ({ label, helper }) => ( - - - {label} - - {helper ? {helper} : null} - -); - -const UtsavFeedbackForm: React.FC<{ - value: UtsavFeedbackData; - onChange: (data: UtsavFeedbackData) => void; - onSubmit: () => void; - isSubmitting?: boolean; - containerStyles?: string; - showValidation?: boolean; -}> = ({ - value, - onChange, - onSubmit, - isSubmitting = false, - containerStyles = '', - showValidation = false, -}) => { - const fieldError = (cond: boolean) => showValidation && cond; - - return ( - - - onChange({ ...value, accommodation_rating: n })} - /> - - - - onChange({ ...value, qr_rating: n })} /> - - - - onChange({ ...value, food_rating: n })} - /> - - - - onChange({ ...value, program_rating: n })} - /> - - - - onChange({ ...value, volunteer_rating: n })} - /> - - - - onChange({ ...value, infrastructure_rating: n })} - /> - - - - onChange({ ...value, decor_rating: n })} - /> - - - - onChange({ ...value, internal_transport_rating: n })} - /> - - - - onChange({ ...value, raj_pravas_rating: n })} - /> - - - - onChange({ ...value, sparsh_rating: n })} - /> - - - - onChange({ ...value, av_rating: n })} /> - - - onChange({ ...value, loved_most: t })} - otherStyles="mt-5" - inputStyles="font-pmedium text-base" - error={fieldError(!value.loved_most)} - errorMessage="Required" - useNeomorphic - /> - - onChange({ ...value, improvement_suggestions: t })} - otherStyles="mt-5" - inputStyles="font-pmedium text-base" - error={fieldError(!value.improvement_suggestions)} - errorMessage="Required" - useNeomorphic - /> - - - - ); -}; - const UtsavFeedbackScreen: React.FC = () => { const router = useRouter(); const { id } = useLocalSearchParams(); const user = useAuthStore((s) => s.user); - const [form, setForm] = useState(getInitialUtsavFeedbackForm()); - const [submitting, setSubmitting] = useState(false); - const [showValidation, setShowValidation] = useState(false); const [isValidating, setIsValidating] = useState(true); const [validationError, setValidationError] = useState(null); @@ -244,7 +53,7 @@ const UtsavFeedbackScreen: React.FC = () => { const validateFeedbackAccess = async () => { setIsValidating(true); - await new Promise((resolve, reject) => { + await new Promise((resolve) => { handleAPICall( 'GET', '/utsav/feedback/validate', @@ -254,123 +63,73 @@ const UtsavFeedbackScreen: React.FC = () => { () => { setIsValidating(false); } - // (err) => { - // setValidationError( - // err?.message || 'You are not authorized to submit feedback for this utsav' - // ); - // }, - // false ); }); setValidationError(null); }; validateFeedbackAccess(); - }, [utsavId, user?.cardno, router]); + }, [utsavId, user?.cardno]); - const valid = useMemo(() => { - return ( - !!user?.cardno && - utsavId !== null && - !!form.accommodation_rating && - !!form.qr_rating && - !!form.food_rating && - !!form.program_rating && - !!form.volunteer_rating && - !!form.infrastructure_rating && - !!form.decor_rating && - !!form.internal_transport_rating && - !!form.raj_pravas_rating && - !!form.sparsh_rating && - !!form.av_rating && - !!form.loved_most && - !!form.improvement_suggestions - ); - }, [form, utsavId, user?.cardno]); - - const submit = async () => { - if (!valid) { - setShowValidation(true); - return; - } + const handleSubmit = async (answers: Record) => { + if (!user?.cardno || utsavId === null) return; - setSubmitting(true); + const payload = mapAnswersToPayload(answers, user.cardno, utsavId); - await new Promise((resolve, reject) => { + await new Promise((resolve, reject) => { handleAPICall( 'POST', '/utsav/feedback', null, - { - cardno: user!.cardno, - utsav_id: utsavId, - accommodation_rating: form.accommodation_rating, - qr_rating: form.qr_rating, - food_rating: form.food_rating, - program_rating: form.program_rating, - volunteer_rating: form.volunteer_rating, - infrastructure_rating: form.infrastructure_rating, - decor_rating: form.decor_rating, - internal_transport_rating: form.internal_transport_rating, - raj_pravas_rating: form.raj_pravas_rating, - sparsh_rating: form.sparsh_rating, - av_rating: form.av_rating, - loved_most: form.loved_most, - improvement_suggestions: form.improvement_suggestions, - }, - () => resolve(true), + payload, + () => resolve(), () => {}, - (err) => reject(err) + (err: unknown) => reject(err) ); }); - - CustomAlert.alert('Thank you!', 'Your feedback has been submitted successfully.'); - router.back(); - setSubmitting(false); }; - return ( - - (router.canGoBack() ? router.back() : router.replace('/'))} - /> - - {isValidating && ( - - - - - + const handleDismiss = () => { + if (router.canGoBack()) { + router.back(); + } else { + router.replace('/'); + } + }; - {[1, 2, 3, 4].map((n) => ( - - ))} + const handleClose = () => { + CustomAlert.alert( + 'Exit Feedback?', + 'Your responses have not been saved. Are you sure you want to exit?', + [ + { text: 'Cancel', style: 'cancel' }, + { text: 'Exit', style: 'destructive', onPress: handleDismiss }, + ] + ); + }; - - - )} + if (isValidating) { + return ; + } - {validationError && ( + if (validationError) { + return ( + - )} + + ); + } - {!isValidating && !validationError && ( - - - - )} - + return ( + ); }; diff --git a/src/assets/fonts/DMSans-Light.ttf b/src/assets/fonts/DMSans-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1b5e37659d470aa38188bf3934e486dda658f484 GIT binary patch literal 33340 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%0Dkn!Q>XV2#RIe0a90~IJHE~5$wRTNHdDmP`T)~tF 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/DMSans-Medium.ttf b/src/assets/fonts/DMSans-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b84c01ca78051fba48e6f35515f277aae07fdd90 GIT binary patch literal 33328 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/DMSans-Regular.ttf b/src/assets/fonts/DMSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1f3bcd76d82d4cb5868be74cd0ed37f15ed678cc GIT binary patch literal 33384 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

$c`=%&StRtQI-^+~@x&8d8#Z=4@kGbQ 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 ILtL`|2m5Uf_y7O^ literal 0 HcmV?d00001 diff --git a/src/assets/fonts/DMSerifDisplay-Regular.ttf b/src/assets/fonts/DMSerifDisplay-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..72f19b49a704f2a10b1844a0f711f22144d50fe1 GIT binary patch literal 72212 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 void; + accentColor: string; + accentForeground: string; + labels: [string, string]; // [trueLabel, falseLabel] + pillScales: Animated.Value[]; + onPillPress: (index: number) => void; +}; + +export const BooleanInput: React.FC = ({ + value, + onSelect, + accentColor, + accentForeground, + labels, + pillScales, + onPillPress, +}) => { + const options: { val: boolean; label: string; index: number }[] = [ + { val: true, label: labels[0], index: 0 }, + { val: false, label: labels[1], index: 1 }, + ]; + + return ( + + {options.map(({ val, label, index }) => { + const isSelected = value === val; + return ( + + { + onSelect(val); + onPillPress(index); + }} + style={[ + styles.pill, + isSelected ? { backgroundColor: accentColor } : { backgroundColor: '#F2F2F2' }, + ]}> + + {label} + + + + ); + })} + + ); +}; + +const styles = StyleSheet.create({ + row: { + flexDirection: 'row', + gap: 12, + }, + pillWrapper: { + flex: 1, + }, + pill: { + height: 58, + borderRadius: 16, + alignItems: 'center', + justifyContent: 'center', + }, + pillLabel: { + fontSize: 17, + fontFamily: 'DMSans-Medium', + }, + pillLabelDefault: { + color: colors.black, + }, +}); diff --git a/src/components/SteppedFeedback/ProgressBar.tsx b/src/components/SteppedFeedback/ProgressBar.tsx new file mode 100644 index 0000000..d51ffa5 --- /dev/null +++ b/src/components/SteppedFeedback/ProgressBar.tsx @@ -0,0 +1,36 @@ +import { colors } from '@/src/constants'; +import React from 'react'; +import { Animated, StyleSheet, View } from 'react-native'; + +type ProgressBarProps = { + progressAnim: Animated.Value; + accentColor: string; + topOffset: number; +}; + +export const ProgressBar: React.FC = ({ + progressAnim, + accentColor, + topOffset, +}) => { + return ( + + + + ); +}; + +const styles = StyleSheet.create({ + track: { + height: 3, + width: '100%', + backgroundColor: colors.gray_200, + position: 'absolute', + left: 0, + right: 0, + zIndex: 10, + }, + fill: { + height: 3, + }, +}); diff --git a/src/components/SteppedFeedback/RatingInput.tsx b/src/components/SteppedFeedback/RatingInput.tsx new file mode 100644 index 0000000..c0ddf96 --- /dev/null +++ b/src/components/SteppedFeedback/RatingInput.tsx @@ -0,0 +1,100 @@ +import { colors } from '@/src/constants'; +import React from 'react'; +import { Animated, Pressable, StyleSheet, Text, View } from 'react-native'; + +type RatingInputProps = { + value: number | undefined; + onSelect: (value: number) => void; + accentColor: string; + accentForeground: string; + ratingLabels: [string, string]; + pillScales: Animated.Value[]; + onPillPress: (index: number) => void; +}; + +const RATINGS = [1, 2, 3, 4, 5]; + +export const RatingInput: React.FC = ({ + value, + onSelect, + accentColor, + accentForeground, + ratingLabels, + pillScales, + onPillPress, +}) => { + return ( + + + {RATINGS.map((rating, index) => { + const isSelected = value === rating; + return ( + + { + onSelect(rating); + onPillPress(index); + }} + style={[ + styles.pill, + isSelected ? { backgroundColor: accentColor } : { backgroundColor: '#F2F2F2' }, + ]}> + + {rating} + + + + ); + })} + + + {ratingLabels[0].toUpperCase()} + {ratingLabels[1].toUpperCase()} + + + ); +}; + +const styles = StyleSheet.create({ + container: { + width: '100%', + }, + row: { + flexDirection: 'row', + gap: 8, + }, + pillWrapper: { + flex: 1, + }, + pill: { + height: 58, + borderRadius: 16, + alignItems: 'center', + justifyContent: 'center', + }, + pillLabel: { + fontSize: 17, + fontFamily: 'DMSans-Medium', + }, + pillLabelDefault: { + color: colors.black, + }, + labelsRow: { + flexDirection: 'row', + justifyContent: 'space-between', + marginTop: 10, + paddingHorizontal: 4, + }, + endLabel: { + fontSize: 11, + fontFamily: 'DMSans-Light', + color: colors.gray_400, + letterSpacing: 0.5, + }, +}); diff --git a/src/components/SteppedFeedback/SteppedFeedbackShimmer.tsx b/src/components/SteppedFeedback/SteppedFeedbackShimmer.tsx new file mode 100644 index 0000000..67fabcf --- /dev/null +++ b/src/components/SteppedFeedback/SteppedFeedbackShimmer.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { View } from 'react-native'; +import Shimmer from '@/src/components/Shimmer'; + +export const SteppedFeedbackShimmer: React.FC = () => ( + + + + + + + + + + + + + {[1, 2, 3, 4, 5].map((n) => ( + + + + ))} + + + + + + + + + +); diff --git a/src/components/SteppedFeedback/SuccessScreen.tsx b/src/components/SteppedFeedback/SuccessScreen.tsx new file mode 100644 index 0000000..706e98b --- /dev/null +++ b/src/components/SteppedFeedback/SuccessScreen.tsx @@ -0,0 +1,83 @@ +import { colors } from '@/src/constants'; +import React, { useEffect, useRef } from 'react'; +import { Animated, Pressable, StyleSheet, Text, View } from 'react-native'; + +type SuccessScreenProps = { + opacity: Animated.Value; + title: string; + subtitle: string; + backgroundColor: string; + onDismiss?: () => void; + autoDismissMs?: number; +}; + +export const SuccessScreen: React.FC = ({ + opacity, + title, + subtitle, + backgroundColor, + onDismiss, + autoDismissMs = 3000, +}) => { + const dismissed = useRef(false); + + const handleDismiss = () => { + if (dismissed.current || !onDismiss) return; + dismissed.current = true; + onDismiss(); + }; + + useEffect(() => { + if (!onDismiss) return; + const timer = setTimeout(handleDismiss, autoDismissMs); + return () => clearTimeout(timer); + }, [onDismiss, autoDismissMs]); + + return ( + + + + {title} + {subtitle} + {onDismiss && Tap to continue} + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + ...StyleSheet.absoluteFillObject, + zIndex: 100, + }, + pressable: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + content: { + alignItems: 'center', + paddingHorizontal: 32, + }, + title: { + fontSize: 38, + fontFamily: 'DMSerifDisplay-Regular', + color: colors.black, + textAlign: 'center', + }, + subtitle: { + fontSize: 15, + fontFamily: 'DMSans-Light', + color: colors.gray_600, + marginTop: 12, + textAlign: 'center', + }, + hint: { + fontSize: 13, + fontFamily: 'DMSans-Regular', + color: colors.gray_400, + marginTop: 32, + textAlign: 'center', + }, +}); diff --git a/src/components/SteppedFeedback/TextInput.tsx b/src/components/SteppedFeedback/TextInput.tsx new file mode 100644 index 0000000..8c8c8cb --- /dev/null +++ b/src/components/SteppedFeedback/TextInput.tsx @@ -0,0 +1,62 @@ +import { colors } from '@/src/constants'; +import React from 'react'; +import { StyleSheet, Text, TextInput as RNTextInput, View } from 'react-native'; + +type FeedbackTextInputProps = { + value: string; + onChangeText: (text: string) => void; + placeholder?: string; +}; + +const MAX_LENGTH = 300; + +export const FeedbackTextInput: React.FC = ({ + value, + onChangeText, + placeholder, +}) => { + return ( + + + {value.length > 0 && ( + + {value.length}/{MAX_LENGTH} + + )} + + ); +}; + +const styles = StyleSheet.create({ + container: { + width: '100%', + position: 'relative', + }, + input: { + backgroundColor: colors.white_100, + borderRadius: 16, + padding: 16, + fontSize: 18, + fontFamily: 'DMSerifDisplay-Regular', + color: colors.black, + minHeight: 120, + maxHeight: 180, + }, + charCount: { + position: 'absolute', + bottom: 12, + right: 14, + fontSize: 12, + fontFamily: 'DMSans-Regular', + color: colors.gray_400, + }, +}); diff --git a/src/components/SteppedFeedback/index.tsx b/src/components/SteppedFeedback/index.tsx new file mode 100644 index 0000000..be1a7da --- /dev/null +++ b/src/components/SteppedFeedback/index.tsx @@ -0,0 +1,293 @@ +import React, { useEffect } from 'react'; +import { Animated, Pressable, StyleSheet, Text, View } from 'react-native'; +import { KeyboardAvoidingView } from 'react-native-keyboard-controller'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import { useSteppedFeedback } from './useSteppedFeedback'; +import { ProgressBar } from './ProgressBar'; +import { RatingInput } from './RatingInput'; +import { BooleanInput } from './BooleanInput'; +import { FeedbackTextInput } from './TextInput'; +import { SuccessScreen } from './SuccessScreen'; +import type { SteppedFeedbackProps } from './types'; +import { colors } from '@/src/constants'; + +const DEFAULTS = { + accentColor: colors.orange, + accentForeground: colors.white, + backgroundColor: colors.white, + ratingLabels: ['Poor', 'Excellent'] as [string, string], + successTitle: 'Thank you.', + successSubtitle: 'See you next time.', +}; + +export const SteppedFeedback: React.FC = ({ + questions, + onSubmit, + onBack, + onClose, + onDismiss, + accentColor = DEFAULTS.accentColor, + accentForeground = DEFAULTS.accentForeground, + backgroundColor = DEFAULTS.backgroundColor, + ratingLabels = DEFAULTS.ratingLabels, + successTitle = DEFAULTS.successTitle, + successSubtitle = DEFAULTS.successSubtitle, +}) => { + const insets = useSafeAreaInsets(); + + const { + currentIndex, + currentQuestion, + currentAnswer, + answers, + isAnswered, + isFirst, + isLast, + submitted, + total, + setAnswer, + goForward, + goBack, + skip, + fadeToSuccess, + isOptional, + progressAnim, + translateX, + contentOpacity, + buttonOpacity, + animateButtonOpacity, + successOpacity, + pillScales, + animatePillPress, + } = useSteppedFeedback(questions); + + // Sync button opacity with answered state + useEffect(() => { + animateButtonOpacity(isAnswered); + }, [isAnswered, animateButtonOpacity]); + + const handleContinue = () => { + if (!isAnswered) return; + if (isLast) { + onSubmit(answers); + fadeToSuccess(); + } else { + goForward(); + } + }; + + const handleSkip = () => { + if (isLast) { + onSubmit(answers); + fadeToSuccess(); + } else { + skip(); + } + }; + + const handleBack = () => { + if (isFirst) { + onBack?.(); + } else { + goBack(); + } + }; + + return ( + + + + {/* Back chevron */} + {(onBack || !isFirst) && ( + + {'<'} + + )} + + {/* Close button */} + {onClose && ( + + {'✕'} + + )} + + + {/* Reading zone */} + + + {currentIndex + 1} / {total} + + {currentQuestion.text} + + + {/* Thumb zone */} + + {currentQuestion.type === 'rating' ? ( + setAnswer(v)} + accentColor={accentColor} + accentForeground={accentForeground} + ratingLabels={ratingLabels} + pillScales={pillScales} + onPillPress={animatePillPress} + /> + ) : currentQuestion.type === 'boolean' ? ( + setAnswer(v)} + accentColor={accentColor} + accentForeground={accentForeground} + labels={currentQuestion.booleanLabels ?? ['Yes', 'No']} + pillScales={pillScales} + onPillPress={animatePillPress} + /> + ) : ( + setAnswer(text)} + placeholder={currentQuestion.placeholder} + /> + )} + + {/* Continue / Submit button */} + + + + {isLast ? 'Submit' : 'Continue'} + + + + + {/* Skip button */} + {isOptional && !isAnswered && ( + + Skip + + )} + + + + {/* Success overlay */} + {submitted && ( + + )} + + ); +}; + +export type { Question, AnswerValue, SteppedFeedbackProps } from './types'; +export { SteppedFeedbackShimmer } from './SteppedFeedbackShimmer'; + +const styles = StyleSheet.create({ + root: { + flex: 1, + }, + flex: { + flex: 1, + }, + readingZone: { + flex: 1, + justifyContent: 'center', + paddingHorizontal: 28, + }, + questionCounter: { + fontSize: 13, + fontFamily: 'DMSans-Regular', + color: colors.gray_400, + marginBottom: 14, + }, + questionText: { + fontSize: 28, + fontFamily: 'DMSerifDisplay-Regular', + color: colors.black, + lineHeight: 38, + }, + thumbZone: { + flexShrink: 0, + paddingHorizontal: 28, + paddingTop: 8, + }, + buttonWrapper: { + marginTop: 20, + }, + button: { + height: 56, + borderRadius: 28, + alignItems: 'center', + justifyContent: 'center', + }, + buttonLabel: { + fontSize: 15, + fontFamily: 'DMSans-Medium', + }, + backButton: { + position: 'absolute', + left: 20, + zIndex: 20, + width: 36, + height: 36, + alignItems: 'center', + justifyContent: 'center', + }, + backChevron: { + fontSize: 22, + color: colors.gray_400, + fontFamily: 'DMSans-Medium', + }, + closeButton: { + position: 'absolute', + right: 20, + zIndex: 20, + width: 36, + height: 36, + alignItems: 'center', + justifyContent: 'center', + }, + closeIcon: { + fontSize: 18, + color: colors.gray_400, + }, + skipButton: { + alignSelf: 'center', + marginTop: 14, + paddingVertical: 4, + paddingHorizontal: 12, + }, + skipLabel: { + fontSize: 14, + fontFamily: 'DMSans-Regular', + color: colors.gray_400, + }, +}); diff --git a/src/components/SteppedFeedback/types.ts b/src/components/SteppedFeedback/types.ts new file mode 100644 index 0000000..f190c3a --- /dev/null +++ b/src/components/SteppedFeedback/types.ts @@ -0,0 +1,24 @@ +export type Question = { + id: string | number; + type: 'rating' | 'text' | 'boolean'; + text: string; + placeholder?: string; + booleanLabels?: [string, string]; // [trueLabel, falseLabel] — defaults to ["Yes", "No"] + optional?: boolean; // when true, a "Skip" link appears below Continue +}; + +export type AnswerValue = number | string | boolean; + +export type SteppedFeedbackProps = { + questions: Question[]; + onSubmit: (answers: Record) => void; + onBack?: () => void; + onClose?: () => void; // quit the feedback flow at any time + onDismiss?: () => void; // called on tap or auto-dismiss of success screen + accentColor?: string; + accentForeground?: string; // text color on accent backgrounds (pills, button) + backgroundColor?: string; + ratingLabels?: [string, string]; + successTitle?: string; + successSubtitle?: string; +}; diff --git a/src/components/SteppedFeedback/useSteppedFeedback.ts b/src/components/SteppedFeedback/useSteppedFeedback.ts new file mode 100644 index 0000000..07049e9 --- /dev/null +++ b/src/components/SteppedFeedback/useSteppedFeedback.ts @@ -0,0 +1,197 @@ +import { useCallback, useRef, useState } from 'react'; +import { Animated, Dimensions, Easing } from 'react-native'; +import type { Question, AnswerValue } from './types'; + +const SCREEN_WIDTH = Dimensions.get('window').width; + +type Answers = Record; + +export function useSteppedFeedback(questions: Question[]) { + const total = questions.length; + + const [currentIndex, setCurrentIndex] = useState(0); + const [answers, setAnswers] = useState({}); + const [submitted, setSubmitted] = useState(false); + + const progressAnim = useRef(new Animated.Value(0)).current; + + const animateProgress = useCallback( + (toIndex: number) => { + Animated.timing(progressAnim, { + toValue: ((toIndex + 1) / total) * SCREEN_WIDTH, + duration: 280, + easing: Easing.inOut(Easing.ease), + useNativeDriver: false, + }).start(); + }, + [progressAnim, total] + ); + + // Slide transition + const translateX = useRef(new Animated.Value(0)).current; + const contentOpacity = useRef(new Animated.Value(1)).current; + + const slideTransition = useCallback( + (direction: 1 | -1, nextIndex: number) => { + // Exit + Animated.parallel([ + Animated.timing(translateX, { + toValue: -direction * SCREEN_WIDTH * 0.3, + duration: 220, + easing: Easing.inOut(Easing.ease), + useNativeDriver: true, + }), + Animated.timing(contentOpacity, { + toValue: 0, + duration: 220, + easing: Easing.inOut(Easing.ease), + useNativeDriver: true, + }), + ]).start(() => { + setCurrentIndex(nextIndex); + + // Position incoming content on opposite side + translateX.setValue(direction * SCREEN_WIDTH * 0.3); + + // Enter + Animated.parallel([ + Animated.timing(translateX, { + toValue: 0, + duration: 260, + easing: Easing.inOut(Easing.ease), + useNativeDriver: true, + }), + Animated.timing(contentOpacity, { + toValue: 1, + duration: 260, + easing: Easing.inOut(Easing.ease), + useNativeDriver: true, + }), + ]).start(); + }); + }, + [translateX, contentOpacity] + ); + + // Continue / Submit button opacity + const buttonOpacity = useRef(new Animated.Value(0.26)).current; + + const animateButtonOpacity = useCallback( + (enabled: boolean) => { + Animated.timing(buttonOpacity, { + toValue: enabled ? 1 : 0.26, + duration: 200, + easing: Easing.inOut(Easing.ease), + useNativeDriver: true, + }).start(); + }, + [buttonOpacity] + ); + + // Success screen fade + const successOpacity = useRef(new Animated.Value(0)).current; + + const fadeToSuccess = useCallback(() => { + setSubmitted(true); + Animated.timing(successOpacity, { + toValue: 1, + duration: 400, + easing: Easing.inOut(Easing.ease), + useNativeDriver: true, + }).start(); + }, [successOpacity]); + + // Rating pill scale anims + const pillScales = useRef([1, 2, 3, 4, 5].map(() => new Animated.Value(1))).current; + + const animatePillPress = useCallback( + (index: number) => { + // Reset all + pillScales.forEach((s, i) => { + if (i !== index) { + Animated.spring(s, { + toValue: 1, + useNativeDriver: true, + }).start(); + } + }); + // Animate selected + Animated.spring(pillScales[index], { + toValue: 1.08, + useNativeDriver: true, + }).start(); + }, + [pillScales] + ); + + // Derived state + const currentQuestion = questions[currentIndex]; + const currentAnswer = answers[currentQuestion?.id]; + const isAnswered = currentAnswer !== undefined && currentAnswer !== null && currentAnswer !== ''; + const isFirst = currentIndex === 0; + const isLast = currentIndex === total - 1; + + // Actions + const setAnswer = useCallback( + (value: AnswerValue) => { + setAnswers((prev) => ({ ...prev, [currentQuestion.id]: value })); + }, + [currentQuestion] + ); + + const goForward = useCallback(() => { + if (!isAnswered) return; + if (isLast) return; // handled by submit + const nextIndex = currentIndex + 1; + animateProgress(nextIndex); + slideTransition(1, nextIndex); + }, [isAnswered, isLast, currentIndex, animateProgress, slideTransition]); + + const skip = useCallback(() => { + if (isLast) return; // skip on last question handled by the view (submit with current answers) + const nextIndex = currentIndex + 1; + animateProgress(nextIndex); + slideTransition(1, nextIndex); + }, [isLast, currentIndex, animateProgress, slideTransition]); + + const goBack = useCallback(() => { + if (isFirst) return; + const prevIndex = currentIndex - 1; + animateProgress(prevIndex); + slideTransition(-1, prevIndex); + }, [isFirst, currentIndex, animateProgress, slideTransition]); + + // is current question optional? + const isOptional = currentQuestion?.optional === true; + + return { + // State + currentIndex, + currentQuestion, + currentAnswer, + answers, + isAnswered, + isFirst, + isLast, + submitted, + total, + + // Actions + setAnswer, + goForward, + goBack, + skip, + fadeToSuccess, + isOptional, + + // Animation values + progressAnim, + translateX, + contentOpacity, + buttonOpacity, + animateButtonOpacity, + successOpacity, + pillScales, + animatePillPress, + }; +} diff --git a/src/questions/adhyayanFeedback.ts b/src/questions/adhyayanFeedback.ts new file mode 100644 index 0000000..eb80b31 --- /dev/null +++ b/src/questions/adhyayanFeedback.ts @@ -0,0 +1,58 @@ +import type { Question } from '@/src/components/SteppedFeedback/types'; + +export const ADHYAYAN_QUESTIONS: Question[] = [ + { + id: 'swadhay_karta_rating', + type: 'rating', + text: "How would you rate the Swadhyay Karta's session?", + }, + { + id: 'personal_interaction_rating', + type: 'rating', + text: 'How was your personal interaction with the Swadhyay Karta?', + }, + { + id: 'swadhay_karta_suggestions', + type: 'text', + text: 'Any suggestions for the Swadhyay Karta to improve?', + placeholder: 'Share your suggestions\u2026', + optional: true, + }, + { + id: 'raj_adhyayan_interest', + type: 'boolean', + text: 'Would you attend Raj Adhyayan in the future?', + booleanLabels: ["I'm In!", 'Not Now'], + }, + { + id: 'future_topics', + type: 'text', + text: 'What topics would you like for future Raj Adhyayan?', + placeholder: 'Topics that interest you\u2026', + optional: true, + }, + { + id: 'loved_most', + type: 'text', + text: 'What did you love the most about this Raj Adhyayan?', + placeholder: 'Write freely\u2026', + optional: true, + }, + { + id: 'improvement_suggestions', + type: 'text', + text: 'Any other scope of improvement?', + placeholder: 'Every thought counts\u2026', + optional: true, + }, + { + id: 'food_rating', + type: 'rating', + text: 'How was the food at the bhojanalay?', + }, + { + id: 'stay_rating', + type: 'rating', + text: 'How was your stay at Research Centre?', + }, +]; diff --git a/src/questions/utsavFeedback.ts b/src/questions/utsavFeedback.ts new file mode 100644 index 0000000..09fbccd --- /dev/null +++ b/src/questions/utsavFeedback.ts @@ -0,0 +1,33 @@ +import type { Question } from '@/src/components/SteppedFeedback/types'; + +export const UTSAV_QUESTIONS: Question[] = [ + { id: 'accommodation', type: 'rating', text: 'How would you rate the accommodation?' }, + { id: 'qr_system', type: 'rating', text: 'How convenient was the QR code system?' }, + { id: 'food', type: 'rating', text: 'How was the food quality & variety?' }, + { id: 'program', type: 'rating', text: 'How was the program structure & engagement?' }, + { id: 'volunteers', type: 'rating', text: 'How would you rate the volunteer performance?' }, + { id: 'infrastructure', type: 'rating', text: 'How was the infrastructure?' }, + { id: 'decor', type: 'rating', text: 'How was the decor?' }, + { id: 'transport_int', type: 'rating', text: 'How was the internal transport coordination?' }, + { + id: 'transport_raj', + type: 'rating', + text: 'How was the Raj Pravas transport (Mumbai \u2192 Venue)?', + }, + { id: 'sparsh', type: 'rating', text: 'How was the Sparsh performance?' }, + { id: 'av_setup', type: 'rating', text: 'How was the audio-visual setup?' }, + { + id: 'loved', + type: 'text', + text: 'What did you love the most about this Utsav?', + placeholder: 'Write freely\u2026', + optional: true, + }, + { + id: 'suggestions', + type: 'text', + text: 'Any suggestions for improvement?', + placeholder: 'Every thought counts\u2026', + optional: true, + }, +]; From 695c298d3a8eca45011aad5398cec7db99c9eb20 Mon Sep 17 00:00:00 2001 From: vendz Date: Tue, 24 Feb 2026 13:39:17 -0800 Subject: [PATCH 7/7] feat: Revamp sign-in UI with new fonts, colors, and improved keyboard handling, and update button and form field components. --- src/app/(auth)/sign-in.tsx | 263 +++++++++++++------------------- src/components/CustomButton.tsx | 19 ++- src/components/FormField.tsx | 58 ++++++- tailwind.config.js | 4 + 4 files changed, 174 insertions(+), 170 deletions(-) diff --git a/src/app/(auth)/sign-in.tsx b/src/app/(auth)/sign-in.tsx index a75cc9b..845acdd 100644 --- a/src/app/(auth)/sign-in.tsx +++ b/src/app/(auth)/sign-in.tsx @@ -1,92 +1,75 @@ import React, { useState } from 'react'; -import { View, Text, Image, Alert, TouchableOpacity, Modal } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { KeyboardAwareScrollView } from 'react-native-keyboard-controller'; +import { Image, Keyboard, Modal, Pressable, Text, View } from 'react-native'; +import Reanimated, { useAnimatedStyle } from 'react-native-reanimated'; +import { useReanimatedKeyboardAnimation } from 'react-native-keyboard-controller'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { images } from '@/src/constants'; import { useAuthStore } from '@/src/stores'; import { useNotification } from '@/src/context/NotificationContext'; -import FormField from '@/src/components/FormField'; -import CustomButton from '@/src/components/CustomButton'; import handleAPICall from '@/src/utils/HandleApiCall'; import CustomAlert from '@/src/components/CustomAlert'; +import FormField from '@/src/components/FormField'; +import CustomButton from '@/src/components/CustomButton'; -const PasswordResetModal = ({ visible, onClose, email }: any) => { - return ( - - - - - - - - Check Your Email - - - We've sent a temporary password to: - - - - {email} - - - - Please use it to sign in and then change your password from your profile. - - - +const PasswordResetModal = ({ visible, onClose, email }: any) => ( + + + + + + + Check Your Email + + We've sent a temporary password to: + + {email} + + Please use it to sign in and then change your password from your profile. + + + - - ); -}; + + +); const SignIn = () => { - const [form, setForm] = useState({ - phone: '', - password: '', - }); + const insets = useSafeAreaInsets(); + const [form, setForm] = useState({ phone: '', password: '' }); const [isSubmitting, setIsSubmitting] = useState(false); const [resetEmail, setResetEmail] = useState(''); const [modalVisible, setModalVisible] = useState(false); - const setUser = useAuthStore((state) => state.setUser); + const setUser = useAuthStore((state: any) => state.setUser); const { expoPushToken } = useNotification(); - const submit = async () => { - setIsSubmitting(true); + const isReady = form.phone.length === 10 && !!form.password; - if (!form.phone || form.phone.length < 10 || !form.password) { - CustomAlert.alert('Error', 'Please fill the fields correctly'); - setIsSubmitting(false); - return; - } + // Tracks OS keyboard spring curve exactly — runs on UI thread + const { height: keyboardHeight } = useReanimatedKeyboardAnimation(); - const onSuccess = async (data: any) => { - const updatedUser = data.data; - setUser(updatedUser); - }; - - const onFinally = () => { - setIsSubmitting(false); - }; + // Translates the block upward by the keyboard height, keeping it anchored to the bottom + const blockStyle = useAnimatedStyle(() => ({ + transform: [{ translateY: keyboardHeight.value }], + })); + const submit = async () => { + if (!isReady) return; + setIsSubmitting(true); await handleAPICall( 'POST', '/client/verifyAndLogin', null, - { - mobno: form.phone, - password: form.password, - token: expoPushToken, - }, - onSuccess, - onFinally + { mobno: form.phone, password: form.password, token: expoPushToken }, + async (data: any) => setUser(data.data), + () => setIsSubmitting(false) ); }; @@ -103,24 +86,16 @@ const SignIn = () => { style: 'default', onPress: async () => { setIsSubmitting(true); - const onSuccess = async (data: any) => { - setResetEmail(data?.data.email); - setModalVisible(true); - }; - - const onFinally = () => { - setIsSubmitting(false); - }; - await handleAPICall( 'POST', '/client/forgotPassword', null, - { - mobno: form.phone, + { mobno: form.phone }, + async (data: any) => { + setResetEmail(data?.data.email); + setModalVisible(true); }, - onSuccess, - onFinally + () => setIsSubmitting(false) ); }, }, @@ -128,93 +103,59 @@ const SignIn = () => { }; return ( - - - - - + + + + + + Jai Sadgurudev{'\n'}Vandan! + + + Sign in to continue your journey + + + setForm({ ...form, phone: e })} + placeholder="10-digit phone number" + keyboardType="number-pad" + maxLength={10} + otherStyles="mb-3" + variant="clean" + /> - - - - Jai Sadgurudev Vandan! - - - Sign in to your account - - - - - setForm({ ...form, phone: e })} - otherStyles="mb-5" - inputStyles="font-pmedium text-base text-black" - keyboardType="number-pad" - placeholder="10-digit phone number" - maxLength={10} - useNeomorphic={true} - /> - - setForm({ ...form, password: e })} - placeholder="Enter your password" - otherStyles="mb-3" - inputStyles="font-pmedium text-base text-black" - keyboardType="default" - isPassword={true} - useNeomorphic={true} - /> - - - - Forgot password? - - - - - - {/* Divider - Closer to button */} - {/* - - or - - */} - - {/* Sign Up CTA */} - {/* - New to SRATRC? - - Create account - - */} - - + setForm({ ...form, password: e })} + placeholder="Enter your password" + isPassword + otherStyles="mb-2" + variant="clean" + /> + + + Forgot password? + - setModalVisible(false)} - email={resetEmail} + - - + + + setModalVisible(false)} + email={resetEmail} + /> + ); }; diff --git a/src/components/CustomButton.tsx b/src/components/CustomButton.tsx index bca3758..9f64fc0 100644 --- a/src/components/CustomButton.tsx +++ b/src/components/CustomButton.tsx @@ -9,7 +9,7 @@ interface CustomButtonProps { isLoading?: boolean; isDisabled?: boolean; bgcolor?: string; - variant?: 'solid' | 'outline'; + variant?: 'solid' | 'outline' | 'pill'; } const CustomButton: FC = ({ @@ -22,6 +22,23 @@ const CustomButton: FC = ({ bgcolor = 'bg-secondary', variant = 'solid', }) => { + // pill variant — full-rounded, DM Sans medium, used by login page + if (variant === 'pill') { + return ( + + {text} + {isLoading && } + + ); + } + + // default variants (solid / outline) const getStyles = () => { if (variant === 'outline') { return { diff --git a/src/components/FormField.tsx b/src/components/FormField.tsx index 8997410..48e9660 100644 --- a/src/components/FormField.tsx +++ b/src/components/FormField.tsx @@ -1,6 +1,6 @@ import { View, Text, TextInput, TouchableOpacity, Image, Platform } from 'react-native'; import React, { useState } from 'react'; -import { icons } from '../constants'; +import { colors, icons } from '../constants'; interface FormFieldProps { text: any; @@ -23,7 +23,8 @@ interface FormFieldProps { error?: boolean; errorMessage?: string; isLoading?: boolean; - useNeomorphic?: boolean; // NEW PROP + useNeomorphic?: boolean; + variant?: 'default' | 'clean'; } const FormField: React.FC = ({ @@ -47,11 +48,56 @@ const FormField: React.FC = ({ error = false, errorMessage, isLoading = false, - useNeomorphic = false, // NEW PROP - defaults to false for backward compatibility + useNeomorphic = false, + variant = 'default', }) => { const [showPassword, setShowPassword] = useState(false); - // Dynamic container styles based on error state + // clean variant + if (variant === 'clean') { + return ( + + {text} + + {prefix && {prefix}} + + {isPassword && ( + setShowPassword(!showPassword)}> + + + )} + + {error && errorMessage && ( + {errorMessage} + )} + + ); + } + + // default variant const getContainerStyles = () => { let baseStyles = `w-full flex-row items-center gap-x-2 rounded-2xl px-4 focus:border-2 ${ multiline ? 'h-auto py-3' : 'h-16' @@ -66,13 +112,11 @@ const FormField: React.FC = ({ if (containerStyles) { baseStyles += ` ${containerStyles}`; } else if (useNeomorphic) { - // NEOMORPHIC STYLING baseStyles += Platform.OS === 'ios' ? ' bg-white border border-gray-200 shadow-md shadow-gray-300' : ' bg-white border border-gray-200 shadow-lg shadow-gray-400'; } else { - // ORIGINAL STYLING - UPDATED FOR CLEANER LOOK baseStyles += Platform.OS === 'ios' ? ' bg-white border border-gray-100 shadow-sm shadow-gray-200' @@ -121,12 +165,10 @@ const FormField: React.FC = ({ )} - {/* Error message */} {error && errorMessage && ( {errorMessage} )} - {/* Additional text (success state) */} {additionalText && !error && ( Name: {additionalText} diff --git a/tailwind.config.js b/tailwind.config.js index a1aa0bd..13efcbc 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -52,6 +52,10 @@ module.exports = { pbold: ['Poppins-Bold', 'sans-serif'], pextrabold: ['Poppins-ExtraBold', 'sans-serif'], pblack: ['Poppins-Black', 'sans-serif'], + dmlight: ['DMSans-Light', 'sans-serif'], + dmregular: ['DMSans-Regular', 'sans-serif'], + dmmedium: ['DMSans-Medium', 'sans-serif'], + dmserif: ['DMSerifDisplay-Regular', 'serif'], }, }, },