diff --git a/package-lock.json b/package-lock.json
index 03b989f..d870524 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,6 +8,7 @@
"name": "@reliancy/bface",
"version": "1.0.0",
"dependencies": {
+ "@phosphor-icons/react": "^2.1.10",
"@tamagui/config": "^1.144.2",
"@tamagui/core": "^1.144.2",
"@tamagui/lucide-icons": "^1.144.2",
@@ -27,8 +28,9 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.28.6",
- "dev": true,
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.28.5",
@@ -41,7 +43,6 @@
},
"node_modules/@babel/compat-data": {
"version": "7.28.6",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -49,7 +50,6 @@
},
"node_modules/@babel/core": {
"version": "7.28.6",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.28.6",
@@ -77,12 +77,13 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.28.6",
- "dev": true,
+ "version": "7.29.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.28.6",
- "@babel/types": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
"@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2"
@@ -93,7 +94,6 @@
},
"node_modules/@babel/helper-annotate-as-pure": {
"version": "7.27.3",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.27.3"
@@ -104,7 +104,6 @@
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.28.6",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.28.6",
@@ -117,17 +116,86 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "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",
+ "peer": true,
+ "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.28.6",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/traverse": "^7.28.6",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.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",
+ "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "regexpu-core": "^6.3.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz",
+ "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "debug": "^4.4.3",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.22.11"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
"node_modules/@babel/helper-globals": {
"version": "7.28.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz",
+ "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/traverse": "^7.28.5",
+ "@babel/types": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-module-imports": {
"version": "7.28.6",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/traverse": "^7.28.6",
@@ -139,7 +207,6 @@
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.28.6",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.28.6",
@@ -153,17 +220,78 @@
"@babel/core": "^7.0.0"
}
},
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
+ "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-plugin-utils": {
"version": "7.28.6",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz",
+ "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-wrap-function": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "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",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.28.5",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.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",
+ "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -171,7 +299,6 @@
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.28.5",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -179,15 +306,28 @@
},
"node_modules/@babel/helper-validator-option": {
"version": "7.27.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-wrap-function": {
+ "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",
+ "peer": true,
+ "dependencies": {
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helpers": {
"version": "7.28.6",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.28.6",
@@ -201,7 +341,6 @@
"version": "7.29.2",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
"integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.29.0"
@@ -213,9 +352,69 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@babel/plugin-proposal-export-default-from": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz",
+ "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==",
+ "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/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-default-from": {
+ "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",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-flow": {
+ "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",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-syntax-jsx": {
"version": "7.28.6",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -227,9 +426,341 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz",
+ "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==",
+ "license": "MIT",
+ "peer": true,
+ "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-arrow-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz",
+ "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==",
+ "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/plugin-transform-async-generator-functions": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz",
+ "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-remap-async-to-generator": "^7.27.1",
+ "@babel/traverse": "^7.29.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "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",
+ "peer": true,
+ "dependencies": {
+ "@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"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "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",
+ "peer": true,
+ "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-class-properties": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz",
+ "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@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/plugin-transform-classes": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz",
+ "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-replace-supers": "^7.28.6",
+ "@babel/traverse": "^7.28.6"
+ },
+ "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==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.28.5"
+ },
+ "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==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-syntax-flow": "^7.27.1"
+ },
+ "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==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@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-modules-commonjs": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz",
+ "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^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/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz",
+ "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz",
+ "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==",
+ "license": "MIT",
+ "peer": true,
+ "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-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",
+ "peer": true,
+ "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-optional-chaining": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz",
+ "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==",
+ "license": "MIT",
+ "peer": true,
+ "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-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",
+ "peer": true,
+ "dependencies": {
+ "@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/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",
+ "peer": true,
+ "dependencies": {
+ "@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/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",
+ "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/plugin-transform-react-jsx": {
"version": "7.28.6",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.3",
@@ -247,7 +778,6 @@
},
"node_modules/@babel/plugin-transform-react-jsx-self": {
"version": "7.27.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -261,7 +791,6 @@
},
"node_modules/@babel/plugin-transform-react-jsx-source": {
"version": "7.27.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -273,9 +802,134 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz",
+ "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==",
+ "license": "MIT",
+ "peer": true,
+ "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.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz",
+ "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "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",
+ "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/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",
+ "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/plugin-transform-typescript": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz",
+ "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-syntax-typescript": "^7.28.6"
+ },
+ "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",
+ "peer": true,
+ "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-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",
+ "peer": true,
+ "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.6",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -283,7 +937,6 @@
},
"node_modules/@babel/template": {
"version": "7.28.6",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.28.6",
@@ -295,16 +948,17 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.28.6",
- "dev": true,
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.28.6",
- "@babel/generator": "^7.28.6",
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
"@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.28.6",
+ "@babel/parser": "^7.29.0",
"@babel/template": "^7.28.6",
- "@babel/types": "^7.28.6",
+ "@babel/types": "^7.29.0",
"debug": "^4.3.1"
},
"engines": {
@@ -315,7 +969,6 @@
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
"integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@@ -407,9 +1060,79 @@
"version": "0.2.10",
"license": "MIT"
},
+ "node_modules/@isaacs/ttlcache": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz",
+ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/types/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
- "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
@@ -418,7 +1141,6 @@
},
"node_modules/@jridgewell/remapping": {
"version": "2.3.5",
- "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
@@ -427,20 +1149,28 @@
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.5",
- "dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31",
- "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
@@ -697,6 +1427,271 @@
"node": ">= 8"
}
},
+ "node_modules/@phosphor-icons/react": {
+ "version": "2.1.10",
+ "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.10.tgz",
+ "integrity": "sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8",
+ "react-dom": ">= 16.8"
+ }
+ },
+ "node_modules/@react-native/assets-registry": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.85.2.tgz",
+ "integrity": "sha512-kauC/oPaxklU4Y+u9gBfCBJm51qX6WBZq4xx0USCdimtp+G8+554kpygfSWIjoqCJa2o06bWxBEjesiuCv+LzA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/babel-plugin-codegen": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.85.2.tgz",
+ "integrity": "sha512-5Dqn08kRTUIxPLYju9hExI0cR1ESX+P5tEv5yv0q0UZcisRTw0VB8iUWDIph2LdY1i5Dc8PIvuaWMRNCw3vnKg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/traverse": "^7.29.0",
+ "@react-native/codegen": "0.85.2"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/babel-preset": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.85.2.tgz",
+ "integrity": "sha512-7d2yW23eKkVt0FbbnZLxqO7KybGLtQXOuvvcO1NUOYGtjzVh6ihNKn0TIHrhSNpMyHwYLDoiiuj95wLtcg3IwQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "@babel/plugin-proposal-export-default-from": "^7.24.7",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-default-from": "^7.24.7",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-transform-async-generator-functions": "^7.25.4",
+ "@babel/plugin-transform-async-to-generator": "^7.24.7",
+ "@babel/plugin-transform-block-scoping": "^7.25.0",
+ "@babel/plugin-transform-class-properties": "^7.25.4",
+ "@babel/plugin-transform-classes": "^7.25.4",
+ "@babel/plugin-transform-destructuring": "^7.24.8",
+ "@babel/plugin-transform-flow-strip-types": "^7.25.2",
+ "@babel/plugin-transform-for-of": "^7.24.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.24.8",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+ "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.8",
+ "@babel/plugin-transform-private-methods": "^7.24.7",
+ "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+ "@babel/plugin-transform-react-display-name": "^7.24.7",
+ "@babel/plugin-transform-react-jsx": "^7.25.2",
+ "@babel/plugin-transform-react-jsx-self": "^7.24.7",
+ "@babel/plugin-transform-react-jsx-source": "^7.24.7",
+ "@babel/plugin-transform-regenerator": "^7.24.7",
+ "@babel/plugin-transform-runtime": "^7.24.7",
+ "@babel/plugin-transform-typescript": "^7.25.2",
+ "@babel/plugin-transform-unicode-regex": "^7.24.7",
+ "@react-native/babel-plugin-codegen": "0.85.2",
+ "babel-plugin-syntax-hermes-parser": "0.33.3",
+ "babel-plugin-transform-flow-enums": "^0.0.2",
+ "react-refresh": "^0.14.0"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "*"
+ }
+ },
+ "node_modules/@react-native/babel-preset/node_modules/react-refresh": {
+ "version": "0.14.2",
+ "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"
+ }
+ },
+ "node_modules/@react-native/codegen": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.85.2.tgz",
+ "integrity": "sha512-XCginmxh0//++EXVOEJHBVZxHla294FzLCFF6jXwAUjvXVhqyIKyxhABfz+r4OOmaiuWk4Rtd4arqdAzeHeprg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "@babel/parser": "^7.29.0",
+ "hermes-parser": "0.33.3",
+ "invariant": "^2.2.4",
+ "nullthrows": "^1.1.1",
+ "tinyglobby": "^0.2.15",
+ "yargs": "^17.6.2"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "*"
+ }
+ },
+ "node_modules/@react-native/community-cli-plugin": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.85.2.tgz",
+ "integrity": "sha512-3KLgSg1kHvBpr93zMaQhvfYTgnCw7yZRED+3J4dMcYjfSjtD0Wf8SofU6uBmAw9JaVYvP43lpdwUpI4p0+ABsg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@react-native/dev-middleware": "0.85.2",
+ "debug": "^4.4.0",
+ "invariant": "^2.2.4",
+ "metro": "^0.84.0",
+ "metro-config": "^0.84.0",
+ "metro-core": "^0.84.0",
+ "semver": "^7.1.3"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ },
+ "peerDependencies": {
+ "@react-native-community/cli": "*",
+ "@react-native/metro-config": "0.85.2"
+ },
+ "peerDependenciesMeta": {
+ "@react-native-community/cli": {
+ "optional": true
+ },
+ "@react-native/metro-config": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@react-native/community-cli-plugin/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@react-native/debugger-frontend": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.85.2.tgz",
+ "integrity": "sha512-j+0b9H5f5hGTLQxHIhJU/b/W6ijuxJF+ZTLHB0se2kzUBNxFKd7DkIc6753qk3CJdiv55vxG3XDgmlpbHxOpmA==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/debugger-shell": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.85.2.tgz",
+ "integrity": "sha512-r5BkhqPMfg3LmaZS5zadHmBNVH5h4bhSpv4BEPGfK4gat9HABAMzUzybi+2wpgU3SoHxnyKGdExEJvoqVcjeRg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.4.0",
+ "fb-dotslash": "0.5.8"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/dev-middleware": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.85.2.tgz",
+ "integrity": "sha512-3J+NaDUg+QEfDeLAUzgaWhpaxEg78g+KwbydlDCewh2G6WnHpsty8XooruxNHzyAsqVWywZMrzmbn78Ctc1O9Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@isaacs/ttlcache": "^1.4.1",
+ "@react-native/debugger-frontend": "0.85.2",
+ "@react-native/debugger-shell": "0.85.2",
+ "chrome-launcher": "^0.15.2",
+ "chromium-edge-launcher": "^0.3.0",
+ "connect": "^3.6.5",
+ "debug": "^4.4.0",
+ "invariant": "^2.2.4",
+ "nullthrows": "^1.1.1",
+ "open": "^7.0.3",
+ "serve-static": "^1.16.2",
+ "ws": "^7.5.10"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/gradle-plugin": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.85.2.tgz",
+ "integrity": "sha512-YXBOLeAqFrv7XwUeBPTKZeOV1FIxn4AW7UAEitScf3ibC8bu8+6NpJu4HWgbNQHg7vDbbTZVbcOl8EwGxsSq2w==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/js-polyfills": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.85.2.tgz",
+ "integrity": "sha512-esGEAmKVM40DV/yVmNljCKZTIeUo7qXqc+Hwffkv3TG+b3E24xyFovHrbP98gGxZr2ZsEyx+2sKLdXF5asY5nw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/metro-babel-transformer": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.85.2.tgz",
+ "integrity": "sha512-lU9XOGahpHvQff30H5lnvh9RYbVwC1zpSHpl84E+7BD2zj0FvW+pD7MBh7CWbmbWmegjtAb+U/2bokXcDVA+jA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "@react-native/babel-preset": "0.85.2",
+ "hermes-parser": "0.33.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "*"
+ }
+ },
+ "node_modules/@react-native/metro-config": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.85.2.tgz",
+ "integrity": "sha512-YkTIMfTPeyMUrtpQo/7zd3oybVYJCfTp8626PqoakOvEiWi9PxsUpZ8j44a5GFtOIq8Nc6WWVBiFRn/6qdi1uQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@react-native/js-polyfills": "0.85.2",
+ "@react-native/metro-babel-transformer": "0.85.2",
+ "metro-config": "^0.84.0",
+ "metro-runtime": "^0.84.0"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
"node_modules/@react-native/normalize-color": {
"version": "2.1.0",
"license": "MIT"
@@ -878,6 +1873,13 @@
"sprintf-js": "~1.0.2"
}
},
+ "node_modules/@sinclair/typebox": {
+ "version": "0.27.10",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz",
+ "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/@tamagui/accordion": {
"version": "1.144.3",
"dependencies": {
@@ -2265,11 +3267,65 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
"node_modules/@types/js-yaml": {
"version": "4.0.9",
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/node": {
+ "version": "25.6.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz",
+ "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~7.19.0"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.35",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
+ "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/@vitejs/plugin-react": {
"version": "4.7.0",
"dev": true,
@@ -2425,11 +3481,37 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/acorn": {
"version": "8.16.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
- "dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@@ -2438,6 +3520,16 @@
"node": ">=0.4.0"
}
},
+ "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",
+ "peer": true,
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/ajv": {
"version": "8.18.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
@@ -2488,9 +3580,15 @@
}
}
},
+ "node_modules/anser": {
+ "version": "1.4.10",
+ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz",
+ "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/ansi-regex": {
"version": "5.0.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -2498,7 +3596,6 @@
},
"node_modules/ansi-styles": {
"version": "4.3.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
@@ -2517,7 +3614,6 @@
},
"node_modules/asap": {
"version": "2.0.6",
- "dev": true,
"license": "MIT"
},
"node_modules/astral-regex": {
@@ -2541,6 +3637,68 @@
"@babel/core": "^7.1.2"
}
},
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.17",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz",
+ "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.8",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz",
+ "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.5",
+ "core-js-compat": "^3.43.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz",
+ "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.8"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-syntax-hermes-parser": {
+ "version": "0.33.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.33.3.tgz",
+ "integrity": "sha512-/Z9xYdaJ1lC0pT9do6TqCqhOSLfZ5Ot8D5za1p+feEfWYupCOfGbhhEXN9r2ZgJtDNUNRw/Z+T2CvAGKBqtqWA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "hermes-parser": "0.33.3"
+ }
+ },
+ "node_modules/babel-plugin-transform-flow-enums": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz",
+ "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/plugin-syntax-flow": "^7.12.1"
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2548,17 +3706,43 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/baseline-browser-mapping": {
"version": "2.9.16",
- "dev": true,
"license": "Apache-2.0",
"bin": {
"baseline-browser-mapping": "dist/cli.js"
}
},
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC",
+ "peer": true
+ },
"node_modules/braces": {
"version": "3.0.3",
- "dev": true,
"license": "MIT",
"dependencies": {
"fill-range": "^7.1.1"
@@ -2569,7 +3753,6 @@
},
"node_modules/browserslist": {
"version": "4.28.1",
- "dev": true,
"funding": [
{
"type": "opencollective",
@@ -2599,9 +3782,38 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/caniuse-lite": {
"version": "1.0.30001765",
- "dev": true,
"funding": [
{
"type": "opencollective",
@@ -2662,9 +3874,63 @@
"node": ">=10"
}
},
+ "node_modules/chrome-launcher": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz",
+ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "escape-string-regexp": "^4.0.0",
+ "is-wsl": "^2.2.0",
+ "lighthouse-logger": "^1.0.0"
+ },
+ "bin": {
+ "print-chrome-path": "bin/print-chrome-path.js"
+ },
+ "engines": {
+ "node": ">=12.13.0"
+ }
+ },
+ "node_modules/chromium-edge-launcher": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.3.0.tgz",
+ "integrity": "sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "escape-string-regexp": "^4.0.0",
+ "is-wsl": "^2.2.0",
+ "lighthouse-logger": "^1.0.0",
+ "mkdirp": "^1.0.4"
+ }
+ },
+ "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",
+ "peer": true
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/color-convert": {
"version": "2.0.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
@@ -2675,7 +3941,6 @@
},
"node_modules/color-name": {
"version": "1.1.4",
- "dev": true,
"license": "MIT"
},
"node_modules/color2k": {
@@ -2716,11 +3981,57 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/connect": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+ "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "finalhandler": "1.1.2",
+ "parseurl": "~1.3.3",
+ "utils-merge": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/connect/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/connect/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/convert-source-map": {
"version": "2.0.0",
- "dev": true,
"license": "MIT"
},
+ "node_modules/core-js-compat": {
+ "version": "3.49.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz",
+ "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browserslist": "^4.28.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
"node_modules/cross-fetch": {
"version": "3.2.0",
"dev": true,
@@ -2729,6 +4040,21 @@
"node-fetch": "^2.7.0"
}
},
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/css-in-js-utils": {
"version": "3.1.0",
"dev": true,
@@ -2737,6 +4063,60 @@
"hyphenate-style-name": "^1.0.3"
}
},
+ "node_modules/css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/css-tree/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
"node_modules/de-indent": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
@@ -2746,7 +4126,6 @@
},
"node_modules/debug": {
"version": "4.4.3",
- "dev": true,
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
@@ -2760,6 +4139,27 @@
}
}
},
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
"node_modules/diff": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz",
@@ -2781,6 +4181,65 @@
"node": ">=8"
}
},
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause",
+ "peer": true
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
"node_modules/edit-json-file": {
"version": "1.8.1",
"dev": true,
@@ -2793,21 +4252,58 @@
"w-json": "^1.3.10"
}
},
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/electron-to-chromium": {
"version": "1.5.267",
- "dev": true,
"license": "ISC"
},
"node_modules/emoji-regex": {
"version": "8.0.0",
- "dev": true,
"license": "MIT"
},
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/error-stack-parser": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "stackframe": "^1.3.4"
+ }
+ },
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -2866,12 +4362,31 @@
},
"node_modules/escalade": {
"version": "3.2.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/esm-resolve": {
"version": "1.0.11",
"dev": true,
@@ -2884,6 +4399,33 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/exponential-backoff": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
+ "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==",
+ "license": "Apache-2.0",
+ "peer": true
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"dev": true,
@@ -2927,6 +4469,29 @@
"reusify": "^1.0.4"
}
},
+ "node_modules/fb-dotslash": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz",
+ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==",
+ "license": "(MIT OR Apache-2.0)",
+ "peer": true,
+ "bin": {
+ "dotslash": "bin/dotslash"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
"node_modules/fbjs": {
"version": "3.0.5",
"dev": true,
@@ -2948,7 +4513,6 @@
},
"node_modules/fill-range": {
"version": "7.1.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
@@ -2957,6 +4521,42 @@
"node": ">=8"
}
},
+ "node_modules/finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/find-cache-dir": {
"version": "3.3.2",
"dev": true,
@@ -2995,6 +4595,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/flow-enums-runtime": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz",
+ "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/framer-motion": {
"version": "6.5.1",
"license": "MIT",
@@ -3021,6 +4628,16 @@
"tslib": "^2.1.0"
}
},
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/fs-extra": {
"version": "11.3.3",
"dev": true,
@@ -3053,7 +4670,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -3061,12 +4677,21 @@
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
"node_modules/glob-parent": {
"version": "5.1.2",
"dev": true,
@@ -3098,14 +4723,12 @@
},
"node_modules/graceful-fs": {
"version": "4.2.11",
- "dev": true,
"license": "ISC"
},
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -3115,7 +4738,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
"integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
@@ -3134,10 +4756,79 @@
"he": "bin/he"
}
},
+ "node_modules/hermes-compiler": {
+ "version": "250829098.0.10",
+ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.10.tgz",
+ "integrity": "sha512-TcRlZ0/TlyfJqquRFAWoyElVNnkdYRi/sEp4/Qy8/GYxjg8j2cS9D4MjuaQ+qimkmLN7AmO+44IznRf06mAr0w==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/hermes-estree": {
+ "version": "0.33.3",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.33.3.tgz",
+ "integrity": "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/hermes-parser": {
+ "version": "0.33.3",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.33.3.tgz",
+ "integrity": "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "hermes-estree": "0.33.3"
+ }
+ },
"node_modules/hey-listen": {
"version": "1.0.8",
"license": "MIT"
},
+ "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",
+ "peer": true,
+ "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/http-errors/node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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",
+ "peer": true,
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/hyphenate-style-name": {
"version": "1.1.0",
"dev": true,
@@ -3151,6 +4842,22 @@
"node": ">= 4"
}
},
+ "node_modules/image-size": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz",
+ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "queue": "6.0.2"
+ },
+ "bin": {
+ "image-size": "bin/image-size.js"
+ },
+ "engines": {
+ "node": ">=16.x"
+ }
+ },
"node_modules/import-lazy": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
@@ -3161,6 +4868,13 @@
"node": ">=8"
}
},
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC",
+ "peer": true
+ },
"node_modules/inline-style-prefixer": {
"version": "7.0.1",
"dev": true,
@@ -3171,7 +4885,6 @@
},
"node_modules/invariant": {
"version": "2.2.4",
- "dev": true,
"license": "MIT",
"dependencies": {
"loose-envify": "^1.0.0"
@@ -3181,7 +4894,6 @@
"version": "2.16.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
"integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
- "dev": true,
"license": "MIT",
"dependencies": {
"hasown": "^2.0.2"
@@ -3193,6 +4905,22 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"dev": true,
@@ -3203,7 +4931,6 @@
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -3222,7 +4949,6 @@
},
"node_modules/is-number": {
"version": "7.0.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.12.0"
@@ -3247,6 +4973,26 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC",
+ "peer": true
+ },
"node_modules/isobject": {
"version": "3.0.1",
"dev": true,
@@ -3260,6 +5006,144 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-util/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-util/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-util/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "leven": "^3.1.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-validate/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "jest-util": "^29.7.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
"node_modules/jju": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
@@ -3269,7 +5153,6 @@
},
"node_modules/js-tokens": {
"version": "4.0.0",
- "dev": true,
"license": "MIT"
},
"node_modules/js-yaml": {
@@ -3283,9 +5166,15 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/jsc-safe-url": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz",
+ "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==",
+ "license": "0BSD",
+ "peer": true
+ },
"node_modules/jsesc": {
"version": "3.1.0",
- "dev": true,
"license": "MIT",
"bin": {
"jsesc": "bin/jsesc"
@@ -3301,7 +5190,6 @@
},
"node_modules/json5": {
"version": "2.2.3",
- "dev": true,
"license": "MIT",
"bin": {
"json5": "lib/cli.js"
@@ -3328,6 +5216,44 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lighthouse-logger": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz",
+ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "debug": "^2.6.9",
+ "marky": "^1.2.2"
+ }
+ },
+ "node_modules/lighthouse-logger/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/lighthouse-logger/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/local-pkg": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz",
@@ -3356,6 +5282,20 @@
"node": ">=8"
}
},
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/lodash.throttle": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/lodash.truncate": {
"version": "4.4.2",
"dev": true,
@@ -3363,7 +5303,6 @@
},
"node_modules/loose-envify": {
"version": "1.4.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0"
@@ -3374,7 +5313,6 @@
},
"node_modules/lru-cache": {
"version": "5.1.1",
- "dev": true,
"license": "ISC",
"dependencies": {
"yallist": "^3.0.2"
@@ -3404,11 +5342,42 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/marky": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz",
+ "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==",
+ "license": "Apache-2.0",
+ "peer": true
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "license": "CC0-1.0",
+ "peer": true
+ },
"node_modules/memoize-one": {
"version": "6.0.0",
"dev": true,
"license": "MIT"
},
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/merge2": {
"version": "1.4.1",
"dev": true,
@@ -3417,9 +5386,355 @@
"node": ">= 8"
}
},
+ "node_modules/metro": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro/-/metro-0.84.3.tgz",
+ "integrity": "sha512-1h3lbVrE6hGf1e/764HfhPGg/bGrWMJDDh7G2rc4gFYZboVuI40BlG/y+UhtbhQDNlO/csMvrcnK0YrTlHUVew==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/core": "^7.25.2",
+ "@babel/generator": "^7.29.1",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "accepts": "^2.0.0",
+ "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.35.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.84.3",
+ "metro-cache": "0.84.3",
+ "metro-cache-key": "0.84.3",
+ "metro-config": "0.84.3",
+ "metro-core": "0.84.3",
+ "metro-file-map": "0.84.3",
+ "metro-resolver": "0.84.3",
+ "metro-runtime": "0.84.3",
+ "metro-source-map": "0.84.3",
+ "metro-symbolicate": "0.84.3",
+ "metro-transform-plugins": "0.84.3",
+ "metro-transform-worker": "0.84.3",
+ "mime-types": "^3.0.1",
+ "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": {
+ "metro": "src/cli.js"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-babel-transformer": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.84.3.tgz",
+ "integrity": "sha512-svAA+yMLpeMiGcz/jKJs4oHpIGEx4nBqNEJ5AGj4CYIg1efvK+A0TjR6tgIuc6tKO5e8JmN/1lglpN2+f3/z/w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "flow-enums-runtime": "^0.0.6",
+ "hermes-parser": "0.35.0",
+ "metro-cache-key": "0.84.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-babel-transformer/node_modules/hermes-estree": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz",
+ "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/metro-babel-transformer/node_modules/hermes-parser": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz",
+ "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "hermes-estree": "0.35.0"
+ }
+ },
+ "node_modules/metro-cache": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.84.3.tgz",
+ "integrity": "sha512-0QElxwLaHqLZf+Xqio8QrjVbuXP/8sJfQBGSPiITlKDVXrVLefuzYVSH9Sj+QL6lrPj2gYZd/iwQh1yZuVKnLA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "exponential-backoff": "^3.1.1",
+ "flow-enums-runtime": "^0.0.6",
+ "https-proxy-agent": "^7.0.5",
+ "metro-core": "0.84.3"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-cache-key": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.84.3.tgz",
+ "integrity": "sha512-TnSL1Fdvrw+2glTdBSRmA5TL8l/i16ECjsrUdf3E5HncA+sNx8KcwDG8r+3ct1UhfYcusJypzZqTN55FZZcwGg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "flow-enums-runtime": "^0.0.6"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-config": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.84.3.tgz",
+ "integrity": "sha512-JmCzZWOETR+O22q8oPBWyQppx3roU9EbkbGzD8Gf1jukQ4b5T1fTzqqHruu6K4sTiNq5zVQySmKF6bp4kVARew==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "connect": "^3.6.5",
+ "flow-enums-runtime": "^0.0.6",
+ "jest-validate": "^29.7.0",
+ "metro": "0.84.3",
+ "metro-cache": "0.84.3",
+ "metro-core": "0.84.3",
+ "metro-runtime": "0.84.3",
+ "yaml": "^2.6.1"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-core": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.84.3.tgz",
+ "integrity": "sha512-cc0pvAa80ai1nDmqqz0P59a+0ZqCZ/YHU/3jEekZL6spFnYDfX8iDLdn9FR6kX+67rmzKxHNrbrSRFLX2AYocw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "flow-enums-runtime": "^0.0.6",
+ "lodash.throttle": "^4.1.1",
+ "metro-resolver": "0.84.3"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-file-map": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.84.3.tgz",
+ "integrity": "sha512-1cL4m4Jv1yRUt9RJExZQLfccscdlMNOcRG6LHLtmJhf3BG9j3MujPVc7CIpKYdFl+KUl+sdjge6oO3+meKCHQA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "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 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-minify-terser": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.84.3.tgz",
+ "integrity": "sha512-3ofrG2OQyJbO9RNhCfOcl8QU7EE2WrSsnN5dFkuZaJO5+4Imujr9bUXmspeNlXRsOVk0F/rVRbEFH98lFSCkBQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "flow-enums-runtime": "^0.0.6",
+ "terser": "^5.15.0"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-resolver": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.84.3.tgz",
+ "integrity": "sha512-pjEzGDtoM8DTHAIPK/9u9ZxszEiuRohYUVImWvgbnB91V4gqYJpQcoEYUugf2NIm1lrX5HNu0OvNqWmPBnGYjA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "flow-enums-runtime": "^0.0.6"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-runtime": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.84.3.tgz",
+ "integrity": "sha512-o7HLRfMyVk9N2dUZ9VjQfB6xxUItL9Pi9WcqxURE7MEKOH6wbGt9/E92YdYLluTOtkzYAEVfdC6h6lcxqA+hMQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.25.0",
+ "flow-enums-runtime": "^0.0.6"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-source-map": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.84.3.tgz",
+ "integrity": "sha512-jS48CeSzw78M8y6VE0f9uy3lVmfbOS677j2VCxnlmlYmnahcXuC6IhoN9K6LynNvos9517yUadcfgioju38xYQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "flow-enums-runtime": "^0.0.6",
+ "invariant": "^2.2.4",
+ "metro-symbolicate": "0.84.3",
+ "nullthrows": "^1.1.1",
+ "ob1": "0.84.3",
+ "source-map": "^0.5.6",
+ "vlq": "^1.0.0"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-symbolicate": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.84.3.tgz",
+ "integrity": "sha512-J9Tpo8NCycYrozRvBIUyOwGAu4xkawOsAppmTscFiaegK0WvuDGwIM53GbzVSnytCHjVAF0io5GQxpkrKTuc7g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "flow-enums-runtime": "^0.0.6",
+ "invariant": "^2.2.4",
+ "metro-source-map": "0.84.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 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-transform-plugins": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.84.3.tgz",
+ "integrity": "sha512-8S3baq2XhBaafHEH5Q8sJW6tmzsEJk80qKc3RU/nZV1MsnYq94RdjTUR6AyKjQd6Rfsk1BtBxhtiNnk7mgslCg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "@babel/generator": "^7.29.1",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "flow-enums-runtime": "^0.0.6",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-transform-worker": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.84.3.tgz",
+ "integrity": "sha512-Wjba7PyYktNRsHbPmkx2J2UX32rAzcDXjCu49zPHeF/viJlYJhwRaNePQcHaCRqQ+kmgQT4ThprsnJfDj71ZMA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "@babel/generator": "^7.29.1",
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "flow-enums-runtime": "^0.0.6",
+ "metro": "0.84.3",
+ "metro-babel-transformer": "0.84.3",
+ "metro-cache": "0.84.3",
+ "metro-cache-key": "0.84.3",
+ "metro-minify-terser": "0.84.3",
+ "metro-source-map": "0.84.3",
+ "metro-transform-plugins": "0.84.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/metro/node_modules/hermes-estree": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz",
+ "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/metro/node_modules/hermes-parser": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz",
+ "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "hermes-estree": "0.35.0"
+ }
+ },
+ "node_modules/metro/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/micromatch": {
"version": "4.0.8",
- "dev": true,
"license": "MIT",
"dependencies": {
"braces": "^3.0.3",
@@ -3429,6 +5744,59 @@
"node": ">=8.6"
}
},
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/mlly": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
@@ -3454,7 +5822,6 @@
},
"node_modules/ms": {
"version": "2.1.3",
- "dev": true,
"license": "MIT"
},
"node_modules/muggle-string": {
@@ -3481,6 +5848,16 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/node-fetch": {
"version": "2.7.0",
"dev": true,
@@ -3500,16 +5877,47 @@
}
}
},
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/node-releases": {
"version": "2.0.27",
- "dev": true,
"license": "MIT"
},
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
"node_modules/nullthrows": {
"version": "1.1.1",
- "dev": true,
"license": "MIT"
},
+ "node_modules/ob1": {
+ "version": "0.84.3",
+ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.84.3.tgz",
+ "integrity": "sha512-J7554Ef8bzmKaDY365Afq6PF+qtdnY/d5PKUQFrsKlZHV/N3OGZewVrvDrQDyX5V5NJjTpcAKtlrFZcDr+HvpQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "flow-enums-runtime": "^0.0.6"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"dev": true,
@@ -3518,6 +5926,36 @@
"node": ">=0.10.0"
}
},
+ "node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/open": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-docker": "^2.0.0",
+ "is-wsl": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/outdent": {
"version": "0.8.0",
"dev": true,
@@ -3556,6 +5994,16 @@
"node": ">=6"
}
},
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/path-browserify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
@@ -3571,11 +6019,20 @@
"node": ">=8"
}
},
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true,
"license": "MIT"
},
"node_modules/path-type": {
@@ -3595,12 +6052,10 @@
},
"node_modules/picocolors": {
"version": "1.1.1",
- "dev": true,
"license": "ISC"
},
"node_modules/picomatch": {
"version": "2.3.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
@@ -3682,6 +6137,34 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
"node_modules/promise": {
"version": "7.3.1",
"dev": true,
@@ -3690,6 +6173,16 @@
"asap": "~2.0.3"
}
},
+ "node_modules/queue": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
+ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "inherits": "~2.0.3"
+ }
+ },
"node_modules/queue-microtask": {
"version": "1.2.3",
"dev": true,
@@ -3722,9 +6215,18 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/react": {
"version": "18.3.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0"
@@ -3733,9 +6235,19 @@
"node": ">=0.10.0"
}
},
+ "node_modules/react-devtools-core": {
+ "version": "6.1.5",
+ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz",
+ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "shell-quote": "^1.6.1",
+ "ws": "^7"
+ }
+ },
"node_modules/react-dom": {
"version": "18.3.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0",
@@ -3755,6 +6267,129 @@
"react": ">=17.0.0"
}
},
+ "node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/react-native": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.85.2.tgz",
+ "integrity": "sha512-GFWEPwLYirfj5X8gMtXOWtqX0cqUEURRHETZfFk37VCa4++izrKvGvv24anvuyulXV87NAhVkfNw93rLg3HByw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@react-native/assets-registry": "0.85.2",
+ "@react-native/codegen": "0.85.2",
+ "@react-native/community-cli-plugin": "0.85.2",
+ "@react-native/gradle-plugin": "0.85.2",
+ "@react-native/js-polyfills": "0.85.2",
+ "@react-native/normalize-colors": "0.85.2",
+ "@react-native/virtualized-lists": "0.85.2",
+ "abort-controller": "^3.0.0",
+ "anser": "^1.4.9",
+ "ansi-regex": "^5.0.0",
+ "babel-plugin-syntax-hermes-parser": "0.33.3",
+ "base64-js": "^1.5.1",
+ "commander": "^12.0.0",
+ "flow-enums-runtime": "^0.0.6",
+ "hermes-compiler": "250829098.0.10",
+ "invariant": "^2.2.4",
+ "memoize-one": "^5.0.0",
+ "metro-runtime": "^0.84.0",
+ "metro-source-map": "^0.84.0",
+ "nullthrows": "^1.1.1",
+ "pretty-format": "^29.7.0",
+ "promise": "^8.3.0",
+ "react-devtools-core": "^6.1.5",
+ "react-refresh": "^0.14.0",
+ "regenerator-runtime": "^0.13.2",
+ "scheduler": "0.27.0",
+ "semver": "^7.1.3",
+ "stacktrace-parser": "^0.1.10",
+ "tinyglobby": "^0.2.15",
+ "whatwg-fetch": "^3.0.0",
+ "ws": "^7.5.10",
+ "yargs": "^17.6.2"
+ },
+ "bin": {
+ "react-native": "cli.js"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ },
+ "peerDependencies": {
+ "@react-native/jest-preset": "0.85.2",
+ "@types/react": "^19.1.1",
+ "react": "^19.2.3"
+ },
+ "peerDependenciesMeta": {
+ "@react-native/jest-preset": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-native-is-edge-to-edge": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.3.1.tgz",
+ "integrity": "sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA==",
+ "license": "MIT",
+ "peer": true,
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/react-native-reanimated": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.3.0.tgz",
+ "integrity": "sha512-HOTTPdKtddXTOsmQxDASXEwLS3lqEHrKERD3XOgzSqWJ7L3x81Pnx7mTcKx1FKdkgomMug/XSmm1C6Z7GIowxA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "react-native-is-edge-to-edge": "^1.3.1",
+ "semver": "^7.7.3"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "0.81 - 0.85",
+ "react-native-worklets": "0.8.x"
+ }
+ },
+ "node_modules/react-native-reanimated/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/react-native-svg": {
+ "version": "15.15.4",
+ "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.15.4.tgz",
+ "integrity": "sha512-boT/vIRgj6zZKBpfTPJJiYWMbZE9duBMOwPK6kCSTgxsS947IFMOq9OgIFkpWZTB7t229H24pDRkh3W9ZK/J1A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "css-select": "^5.1.0",
+ "css-tree": "^1.1.3",
+ "warn-once": "0.1.1"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/react-native-web": {
"version": "0.21.2",
"dev": true,
@@ -3774,6 +6409,133 @@
"react-dom": "^18.0.0 || ^19.0.0"
}
},
+ "node_modules/react-native-worklets": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.8.1.tgz",
+ "integrity": "sha512-oWP/lStsAHU6oYCaWDXrda/wOHVdhusQJz1e6x9gPnXdFf4ndNDAOtWCmk2zGrAnlapfyA3rM6PCQq94mPg9cw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/plugin-transform-arrow-functions": "^7.27.1",
+ "@babel/plugin-transform-class-properties": "^7.27.1",
+ "@babel/plugin-transform-classes": "^7.28.4",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
+ "@babel/plugin-transform-optional-chaining": "^7.27.1",
+ "@babel/plugin-transform-shorthand-properties": "^7.27.1",
+ "@babel/plugin-transform-template-literals": "^7.27.1",
+ "@babel/plugin-transform-unicode-regex": "^7.27.1",
+ "@babel/preset-typescript": "^7.27.1",
+ "convert-source-map": "^2.0.0",
+ "semver": "^7.7.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "*",
+ "@react-native/metro-config": "*",
+ "react": "*",
+ "react-native": "0.81 - 0.85"
+ }
+ },
+ "node_modules/react-native-worklets/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/react-native/node_modules/@react-native/normalize-colors": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.85.2.tgz",
+ "integrity": "sha512-svuOLtjbFGXDdHsriHXuND5FgHg7XlkOXCbH/8+X4t76YLH6qSTffSIQQrKLDL5mn4EFU+Oh/PNO0/FfpnTOTg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/react-native/node_modules/@react-native/virtualized-lists": {
+ "version": "0.85.2",
+ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.85.2.tgz",
+ "integrity": "sha512-wmVKpAlcr+UB0L5SpbrV865EdleUP7I5+X+48e1aRsQK8q+wsTRBXeUwWVip/1l+HZwlZFeO8iOILJ16VRu0Cw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "invariant": "^2.2.4",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^19.2.0",
+ "react": "*",
+ "react-native": "0.85.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-native/node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-native/node_modules/memoize-one": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
+ "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/react-native/node_modules/promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "asap": "~2.0.6"
+ }
+ },
+ "node_modules/react-native/node_modules/react-refresh": {
+ "version": "0.14.2",
+ "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"
+ }
+ },
+ "node_modules/react-native/node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/react-native/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/react-refresh": {
"version": "0.17.0",
"dev": true,
@@ -3782,6 +6544,81 @@
"node": ">=0.10.0"
}
},
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
+ "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
+ "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.2",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.13.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/regjsparser": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz",
+ "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "jsesc": "~3.1.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/require-from-string": {
"version": "2.0.2",
"dev": true,
@@ -3794,7 +6631,6 @@
"version": "1.22.12",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
"integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -3888,7 +6724,6 @@
},
"node_modules/scheduler": {
"version": "0.23.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0"
@@ -3896,12 +6731,122 @@
},
"node_modules/semver": {
"version": "6.3.1",
- "dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
+ "node_modules/send": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
+ "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.1",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "~2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "~2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/send/node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/send/node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/send/node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/serialize-error": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz",
+ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.3",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
+ "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "~0.19.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-static/node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/set-value": {
"version": "4.1.0",
"dev": true,
@@ -3924,6 +6869,49 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
+ "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/slash": {
"version": "4.0.0",
"dev": true,
@@ -3951,6 +6939,16 @@
"url": "https://github.com/chalk/slice-ansi?sponsor=1"
}
},
+ "node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/source-map-js": {
"version": "1.2.1",
"dev": true,
@@ -3959,6 +6957,27 @@
"node": ">=0.10.0"
}
},
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -3966,6 +6985,46 @@
"dev": true,
"license": "BSD-3-Clause"
},
+ "node_modules/stackframe": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/stacktrace-parser": {
+ "version": "0.1.11",
+ "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz",
+ "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "type-fest": "^0.7.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/stacktrace-parser/node_modules/type-fest": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
+ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==",
+ "license": "(MIT OR CC0-1.0)",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/string-argv": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
@@ -3978,7 +7037,6 @@
},
"node_modules/string-width": {
"version": "4.2.3",
- "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
@@ -3991,7 +7049,6 @@
},
"node_modules/strip-ansi": {
"version": "6.0.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
@@ -4017,7 +7074,6 @@
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
@@ -4033,7 +7089,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -4123,9 +7178,96 @@
"react-native": "*"
}
},
+ "node_modules/terser": {
+ "version": "5.46.2",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz",
+ "integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.15.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/throat": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/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",
+ "peer": true,
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "license": "MIT",
+ "peer": true,
+ "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",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
@@ -4134,6 +7276,16 @@
"node": ">=8.0"
}
},
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
"node_modules/tr46": {
"version": "0.0.3",
"dev": true,
@@ -4200,6 +7352,57 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/undici-types": {
+ "version": "7.19.2",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz",
+ "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
+ "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/universalify": {
"version": "2.0.1",
"dev": true,
@@ -4208,9 +7411,18 @@
"node": ">= 10.0.0"
}
},
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/update-browserslist-db": {
"version": "1.2.3",
- "dev": true,
"funding": [
{
"type": "opencollective",
@@ -4237,6 +7449,16 @@
"browserslist": ">= 4.21.0"
}
},
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
"node_modules/vite": {
"version": "5.4.21",
"dev": true,
@@ -4377,6 +7599,13 @@
"@esbuild/win32-x64": "0.21.5"
}
},
+ "node_modules/vlq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz",
+ "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/vscode-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
@@ -4389,11 +7618,35 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/warn-once": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.1.tgz",
+ "integrity": "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/webidl-conversions": {
"version": "3.0.1",
"dev": true,
"license": "BSD-2-Clause"
},
+ "node_modules/whatwg-fetch": {
+ "version": "3.6.20",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
+ "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/whatwg-url": {
"version": "5.0.0",
"dev": true,
@@ -4403,10 +7656,120 @@
"webidl-conversions": "^3.0.0"
}
},
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "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",
+ "peer": true,
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yallist": {
"version": "3.1.1",
- "dev": true,
"license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
+ "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
}
}
}
diff --git a/package.json b/package.json
index e4b4cf5..ff761bf 100644
--- a/package.json
+++ b/package.json
@@ -32,6 +32,7 @@
"test:watch": "node --localstorage-file=.node-localstorage --test --watch test/**/*.test.js"
},
"dependencies": {
+ "@phosphor-icons/react": "^2.1.10",
"@tamagui/config": "^1.144.2",
"@tamagui/core": "^1.144.2",
"@tamagui/lucide-icons": "^1.144.2",
diff --git a/src/index.js b/src/index.js
index 49603a9..cbceb82 100644
--- a/src/index.js
+++ b/src/index.js
@@ -16,6 +16,7 @@ export * from './data/index.js';
export * from './ui/App.jsx';
export * from './ui/components/index.js';
export * from './ui/runtime/general-settings.js';
+export * from './ui/styles/index.js';
// Re-export security modules
export * from './security/index.js';
diff --git a/src/security/pages/LoginPage.jsx b/src/security/pages/LoginPage.jsx
index a002c46..fbe6c5d 100644
--- a/src/security/pages/LoginPage.jsx
+++ b/src/security/pages/LoginPage.jsx
@@ -4,13 +4,20 @@ import { getRouterPath, setRouterPath } from '../../platform/compat.js';
import { securityService, useSecurityState } from '../runtime/security-service.js';
import { Panel } from '../../ui/components/Panel.jsx';
-const LoginField = forwardRef(function LoginField({ id, label, ...props }, ref) {
+const LoginField = forwardRef(function LoginField({ id, label, error, ...props }, ref) {
return (
-
);
});
@@ -64,8 +71,8 @@ export function LoginPage({ compact = false, title = 'Login', subtitle = 'Sign i
icon="login"
title={title}
width="100%"
- headerFront={{ color: '$accentColor' }}
- headerBack={{ backgroundColor: '$accentSurface' }}
+ headerFront={{ color: '$textPrimary' }}
+ headerBack={{ backgroundColor: '$bgPanel' }}
>
{!security.enabled ? (
-
+
Identity is currently disabled in the active app profile.
) : null}
{security.enabled && !security.initialized ? (
-
+
Security is still initializing.
) : null}
-
+
Demo credentials: admin / admin or demo / demo
@@ -153,7 +160,7 @@ export function LoginPage({ compact = false, title = 'Login', subtitle = 'Sign i
alignItems="center"
justifyContent="center"
padding="$6"
- backgroundColor="$background"
+ backgroundColor="$bgPage"
>
{content}
diff --git a/src/ui/components/AppInfo.jsx b/src/ui/components/AppInfo.jsx
index e42c698..bbf6f62 100644
--- a/src/ui/components/AppInfo.jsx
+++ b/src/ui/components/AppInfo.jsx
@@ -36,22 +36,22 @@ export function AppInfo({ appName, swStatus, storageBackend, menuItems = [], ini
App:
- {appName || 'Loading...'}
+ {appName || 'Loading...'}
Service Worker:
- {swStatus}
+ {swStatus}
Storage Backend:
- {storageBackend}
+ {storageBackend}
{initialized && menuItems.length > 0 && (
- Menu Items:
+ Menu Items:
{menuItems.map((item) => (
• {item.label}
diff --git a/src/ui/components/DirView.jsx b/src/ui/components/DirView.jsx
index d3c5caf..d216d71 100644
--- a/src/ui/components/DirView.jsx
+++ b/src/ui/components/DirView.jsx
@@ -2,6 +2,7 @@ import React, { useEffect, useMemo, useState } from 'react';
import { Button, Input, Paragraph, ScrollView, Separator, Spinner, Text, XStack, YStack } from 'tamagui';
import { getIcon } from './IconMapper.jsx';
import { normalizeColumnsArray } from './grid/utils.js';
+import { getTypographyRoleProps } from '../styles/index.js';
const EMPTY_COLUMNS = [];
const EMPTY_ACTIONS = [];
@@ -43,15 +44,15 @@ function SummaryCards({ summary }) {
minWidth={140}
padding="$3"
borderWidth={1}
- borderColor="$borderColor"
- borderRadius="$4"
- backgroundColor="$accentSurface"
+ borderColor="$lineSubtle"
+ borderRadius="$radiusMd"
+ backgroundColor="$bgPanel"
gap="$1"
>
-
+
{item.label}
-
+
{normalizeSummaryValue(item.value)}
@@ -63,7 +64,8 @@ function SummaryCards({ summary }) {
function HeaderCell({ column, orderBy, order, onSort }) {
const sortable = column.sortable !== false;
const isActive = orderBy === column.id;
- const arrow = isActive ? (order === 'asc' ? '↑' : '↓') : '';
+ const CaretUp = getIcon('caret-up');
+ const CaretDown = getIcon('caret-down');
const justifyContent = getColumnJustify(column.align);
return (
@@ -81,10 +83,23 @@ function HeaderCell({ column, orderBy, order, onSort }) {
padding={0}
justifyContent={justifyContent}
width="100%"
+ hoverStyle={sortable ? { backgroundColor: '$bgPage' } : undefined}
+ pressStyle={sortable ? { backgroundColor: '$bgPanelElev' } : undefined}
>
-
- {column.label}{arrow ? ` ${arrow}` : ''}
-
+
+
+ {column.label}
+
+ {sortable ? (
+ isActive ? (
+ order === 'asc'
+ ? (CaretUp ? : null)
+ : (CaretDown ? : null)
+ ) : (
+ CaretDown ? : null
+ )
+ ) : null}
+
);
@@ -133,7 +148,11 @@ export function DirView({
bodyMaxHeight = 480,
onRowClick = null,
onRowPress = null,
- onRefresh = null
+ onRefresh = null,
+ showHeader = true,
+ showSummary = true,
+ density = 'comfortable',
+ striped = false
}) {
const [dataVersion, setDataVersion] = useState(0);
const [records, setRecords] = useState([]);
@@ -155,6 +174,7 @@ export function DirView({
const PreviousPageIcon = getIcon('chevron-left');
const NextPageIcon = getIcon('chevron-right');
const LastPageIcon = getIcon('last-page');
+ const paddingRow = density === 'compact' ? '$2' : density === 'spacious' ? '$4' : '$3';
useEffect(() => {
if (!dataModel?.subscribe) {
@@ -275,49 +295,54 @@ export function DirView({
return (
-
-
-
- {title}
-
- {topLeftContent}
-
+ {showHeader ? (
+
+
+
+ {title}
+
+ {topLeftContent}
+
-
- {searchConfig?.enabled ? (
-
+ {searchConfig?.enabled ? (
+
+ ) : null}
+ {effectiveToolbarItems.map(renderToolbarButton)}
+ : undefined}
+ onPress={handleRefresh}
+ disabled={loading}
/>
- ) : null}
- {effectiveToolbarItems.map(renderToolbarButton)}
- : undefined}
- onPress={handleRefresh}
- disabled={loading}
- />
- {topRightContent}
+ {topRightContent}
+
-
+ ) : null}
{error ? (
-
- {error}
+
+ {error}
) : null}
-
+ {showSummary ? : null}
{bodyHeaderContent}
-
-
+
+
{resolvedColumns.map((column) => (
-
+
{loading ? (
-
+
) : records.length === 0 ? (
-
-
- No records found.
+
+
+ No records found
+ Try adjusting your search or filters.
) : (
records.map((record, index) => (
effectiveRowPress?.(record)}
>
@@ -362,7 +389,7 @@ export function DirView({
))}
- {index < records.length - 1 ? : null}
+ {index < records.length - 1 ? : null}
))
)}
@@ -373,15 +400,15 @@ export function DirView({
{bodyFooterContent}
-
+
Rows: {totalRecords}
-
+
: undefined}
+ icon={FirstPageIcon ? : undefined}
onPress={() => setCurrentPage(1)}
disabled={currentPage === 1 || loading}
/>
@@ -389,18 +416,18 @@ export function DirView({
size="$3"
chromeless
aria-label="Previous page"
- icon={PreviousPageIcon ? : undefined}
+ icon={PreviousPageIcon ? : undefined}
onPress={() => setCurrentPage((value) => Math.max(1, value - 1))}
disabled={currentPage === 1 || loading}
/>
-
+
Page {currentPage} of {totalPages}
: undefined}
+ icon={NextPageIcon ? : undefined}
onPress={() => setCurrentPage((value) => Math.min(totalPages, value + 1))}
disabled={currentPage >= totalPages || loading}
/>
@@ -408,7 +435,7 @@ export function DirView({
size="$3"
chromeless
aria-label="Last page"
- icon={LastPageIcon ? : undefined}
+ icon={LastPageIcon ? : undefined}
onPress={() => setCurrentPage(totalPages)}
disabled={currentPage >= totalPages || loading}
/>
diff --git a/src/ui/components/FormField.jsx b/src/ui/components/FormField.jsx
index d89a082..97a7d8b 100644
--- a/src/ui/components/FormField.jsx
+++ b/src/ui/components/FormField.jsx
@@ -1,19 +1,43 @@
import React from 'react';
-import { Adapt, Button, Input, Label, Paragraph, Select, Separator, Sheet, Text, TextArea, XStack, YStack } from 'tamagui';
-import { Check, ChevronDown, ChevronUp } from '@tamagui/lucide-icons';
+import {
+ Adapt,
+ Button,
+ Input,
+ Label,
+ Paragraph,
+ Select,
+ Separator,
+ Sheet,
+ Switch,
+ Text,
+ TextArea,
+ XStack,
+ YStack,
+} from 'tamagui';
+import { getIcon } from './IconMapper.jsx';
import { pickFile } from '../../platform/compat.js';
+import { getTypographyRoleProps } from '../styles/index.js';
+const ChevronDown = getIcon('chevron-down');
+const ChevronUp = getIcon('chevron-up');
+const CheckIcon = getIcon('check');
+
+/**
+ * Wrapper that renders a label, the field's children, and either a helper
+ * line or an error line below. Error styling reads from the semantic
+ * `$danger` token so it follows the active theme.
+ */
function FieldShell({ label, helperText, error, children }) {
return (
{label ? (
-
+
{label}
) : null}
{children}
{error || helperText ? (
-
+
{error || helperText}
) : null}
@@ -21,29 +45,61 @@ function FieldShell({ label, helperText, error, children }) {
);
}
+/**
+ * Style fragment shared by all chip-like buttons (multiselect, radio).
+ * Selected: tinted accent background, accent text + border.
+ * Unselected: panel background, hairline border, primary text.
+ */
+function chipProps(selected, disabled) {
+ return selected
+ ? {
+ backgroundColor: '$accentBg',
+ color: '$accent',
+ borderColor: '$accent',
+ borderWidth: 1,
+ hoverStyle: { backgroundColor: '$accentBgHover' },
+ pressStyle: { backgroundColor: '$accentBgHover' },
+ disabled,
+ }
+ : {
+ backgroundColor: '$bgPanel',
+ color: '$textPrimary',
+ borderColor: '$lineSubtle',
+ borderWidth: 1,
+ hoverStyle: { backgroundColor: '$bgPage', borderColor: '$lineStrong' },
+ pressStyle: { backgroundColor: '$bgPage' },
+ disabled,
+ };
+}
+
function SelectField({ label, value, options = [], placeholder, onValueChange, error, helperText, disabled = false }) {
return (
);
@@ -275,6 +340,9 @@ export function FormField({
type={type === 'datetime' ? 'datetime-local' : type}
keyboardType={type === 'number' ? 'numeric' : undefined}
autoCapitalize={type === 'email' || type === 'password' ? 'none' : undefined}
+ backgroundColor="$bgPanel"
+ borderColor={error ? '$danger' : '$lineSubtle'}
+ focusStyle={{ borderColor: error ? '$danger' : '$accent' }}
/>
);
diff --git a/src/ui/components/FormView.jsx b/src/ui/components/FormView.jsx
index 1366197..bb6696e 100644
--- a/src/ui/components/FormView.jsx
+++ b/src/ui/components/FormView.jsx
@@ -134,7 +134,9 @@ export function FormView({
) : null}
{loading ? (
- Saving...
+
+ Saving...
+
) : null}
diff --git a/src/ui/components/IconMapper.jsx b/src/ui/components/IconMapper.jsx
index 8731bf4..618eec2 100644
--- a/src/ui/components/IconMapper.jsx
+++ b/src/ui/components/IconMapper.jsx
@@ -1,324 +1,484 @@
/**
- * IconMapper - Maps icon names to Lucide icons from @tamagui/lucide-icons
- * Cross-platform compatible (web + React Native)
+ * IconMapper - Phosphor-backed icon system with Tamagui theme integration.
+ *
+ * Why a wrapper layer:
+ * - Lets us swap icon families without touching call sites.
+ * - Each style preset declares an `iconWeight` (regular / light / bold /
+ * duotone ...). The wrapper reads the active preset and applies that
+ * weight, so themes feel cohesive without per-call configuration.
+ * - Lets callers pass Tamagui token strings like `"$accent"` or
+ * `"$textPrimary"` for `color`. Phosphor itself only accepts CSS
+ * colors; the wrapper resolves tokens against the live theme.
+ *
+ * Call-site contract (back-compatible with Lucide era):
+ * const Icon = getIcon('home');
+ * // semantic size
+ * // numeric size
+ * // override weight
+ *
+ * Semantic sizes (px):
+ * xs:14 sm:16 md:20 lg:24 xl:32
*/
import React from 'react';
+import { useTheme } from '@tamagui/core';
+import { SizableText } from 'tamagui';
import {
- AlertCircle,
- AlertTriangle,
- ArrowDown,
- ArrowLeft,
- ArrowRight,
- ArrowUp,
- ArrowUpDown,
- BarChart3,
+ // navigation & shell
+ House,
+ Gear,
+ List as MenuList,
+ MagnifyingGlass,
Bell,
- Bold,
- Bookmark,
- Book,
- Calendar,
- Camera,
- Check,
- CheckCircle,
- ChevronDown,
- ChevronLeft,
- ChevronRight,
- ChevronsLeft,
- ChevronsRight,
- ChevronUp,
- Clock,
- Cloud,
- CloudDownload,
- CloudUpload,
- Clipboard,
- Code,
- Copy,
- Crop,
- DollarSign,
- Download,
- Eye,
- EyeOff,
- File,
- FileText,
- Filter,
- Folder,
- FolderOpen,
- Globe,
- HardDrive,
- Heart,
- HelpCircle,
- Home,
- Image,
- Info,
- Italic,
- LayoutDashboard,
- Library,
- Link,
- Lock,
- LogIn,
- LogOut,
- Mail,
- Map,
- MapPin,
- Menu,
- MessageCircle,
- MessageSquare,
- Minus,
- MoreHorizontal,
- MoreVertical,
- Navigation,
- Network,
- Paperclip,
- Pause,
- Phone,
- Play,
- Plus,
- Power,
- Printer,
- RefreshCw,
- RotateCw,
- Save,
- Scissors,
- Search,
- Send,
- Settings,
- Share2,
- Signal,
- SkipBack,
- SkipForward,
- Square,
- SquarePen,
- Star,
- SlidersHorizontal,
- Sun,
- Trash2,
- TrendingUp,
- Underline,
- Unlock,
- Upload,
User,
UserCircle,
Users,
- Video,
- Volume1,
- Volume2,
- VolumeX,
- Wifi,
- WifiOff,
+ Envelope,
+ // files
+ File,
+ FileText,
+ Folder,
+ FolderOpen,
+ Article,
+ Book,
+ Books,
+ // actions
+ PencilSimple,
+ Trash,
+ FloppyDisk,
X,
- ZoomIn,
- ZoomOut
-} from '@tamagui/lucide-icons';
+ Check,
+ Plus,
+ Minus,
+ // arrows / chevrons
+ ArrowRight,
+ ArrowLeft,
+ ArrowUp,
+ ArrowDown,
+ CaretRight,
+ CaretLeft,
+ CaretUp,
+ CaretDown,
+ CaretDoubleRight,
+ CaretDoubleLeft,
+ DotsThreeVertical,
+ DotsThree,
+ // auth
+ SignIn,
+ SignOut,
+ Lock,
+ LockOpen,
+ // dashboards
+ SquaresFour,
+ ChartBar,
+ TrendUp,
+ CurrencyDollar,
+ // status
+ Info,
+ Warning,
+ WarningCircle,
+ CheckCircle,
+ Question,
+ // visibility
+ Eye,
+ EyeSlash,
+ // media
+ Image as ImageIcon,
+ Camera,
+ VideoCamera,
+ Play,
+ Pause,
+ Square,
+ // communication
+ ChatCircle,
+ ChatText,
+ PaperPlaneTilt,
+ Phone,
+ // content
+ Copy,
+ Scissors,
+ Clipboard,
+ Link,
+ Paperclip,
+ // controls
+ FunnelSimple,
+ ArrowsDownUp,
+ ArrowClockwise,
+ Download,
+ Upload,
+ ShareNetwork,
+ Globe,
+ Sliders,
+ SkipBack,
+ SkipForward,
+ // favorites
+ Heart,
+ Star,
+ BookmarkSimple,
+ // time / location
+ Calendar,
+ Clock,
+ MapPin,
+ MapTrifold,
+ NavigationArrow,
+ // system
+ Power,
+ Sun,
+ WifiHigh,
+ WifiSlash,
+ // volume
+ SpeakerHigh,
+ SpeakerLow,
+ SpeakerSlash,
+ // editing
+ MagnifyingGlassPlus,
+ MagnifyingGlassMinus,
+ Crop,
+ ArrowsClockwise,
+ // formatting
+ TextB,
+ TextItalic,
+ TextUnderline,
+ Code,
+ // cloud / storage
+ Cloud,
+ CloudArrowUp,
+ CloudArrowDown,
+ HardDrive,
+ // network
+ Network,
+ CellSignalHigh,
+ // print / misc
+ Printer,
+ Circle,
+ Lightning,
+} from '@phosphor-icons/react';
+
+import { themeManager } from '../theme-controller.js';
+import { getIconWeight, ICON_WEIGHTS } from '../styles/index.js';
+
+/* -------------------------------------------------------------------------- */
+/* Sizing */
+/* -------------------------------------------------------------------------- */
+
+const SIZE_PX = Object.freeze({
+ xs: 14,
+ sm: 16,
+ md: 20,
+ lg: 24,
+ xl: 32,
+});
+
+const DEFAULT_SIZE = 'sm';
+
+function resolveSize(size) {
+ if (typeof size === 'number' && Number.isFinite(size)) return size;
+ if (typeof size === 'string' && SIZE_PX[size] != null) return SIZE_PX[size];
+ // numeric string ('20', '24px') — best-effort parse
+ if (typeof size === 'string') {
+ const n = parseFloat(size);
+ if (!Number.isNaN(n)) return n;
+ }
+ return SIZE_PX[DEFAULT_SIZE];
+}
+
+/* -------------------------------------------------------------------------- */
+/* Color resolution */
+/* -------------------------------------------------------------------------- */
/**
- * Icon name to Lucide icon component mapping
- * Maps Material Design icon names to Lucide equivalents
+ * Phosphor's `color` prop only accepts plain CSS colors. Callers often pass
+ * Tamagui token strings like `"$accent"`. We resolve those against the live
+ * theme via Tamagui's `useTheme()`. Anything else is passed through.
*/
+function resolveColor(color, theme) {
+ if (color == null) return undefined;
+ if (typeof color !== 'string') return color;
+ if (color === 'currentColor') return 'currentColor';
+ if (!color.startsWith('$')) return color;
+
+ const key = color.slice(1);
+ const token = theme?.[key];
+ if (!token) return undefined;
+ if (typeof token.val !== 'undefined') return token.val;
+ if (typeof token.get === 'function') return token.get();
+ return String(token);
+}
+
+/* -------------------------------------------------------------------------- */
+/* Active icon weight (subscribes to themeManager) */
+/* -------------------------------------------------------------------------- */
+
+function useActiveIconWeight() {
+ const [name, setName] = React.useState(() => themeManager.getStyleThemeName());
+ React.useEffect(() => {
+ return themeManager.subscribe((s) => setName(s.styleThemeName));
+ }, []);
+ return getIconWeight(name);
+}
+
+/* -------------------------------------------------------------------------- */
+/* Wrapper factory */
+/* -------------------------------------------------------------------------- */
+
+function wrap(Icon, displayName) {
+ const Wrapped = React.forwardRef(function PhosphorIcon(
+ { size = DEFAULT_SIZE, color = '$textPrimary', weight, ...rest },
+ ref,
+ ) {
+ const theme = useTheme();
+ const presetWeight = useActiveIconWeight();
+ const finalWeight = ICON_WEIGHTS.includes(weight) ? weight : presetWeight;
+ return (
+
+ );
+ });
+ Wrapped.displayName = `Icon(${displayName})`;
+ return Wrapped;
+}
+
+/* -------------------------------------------------------------------------- */
+/* Name → Phosphor wrapper map */
+/* */
+/* Keys preserve every Lucide-era alias used in the codebase so existing */
+/* call sites work without changes. Add new aliases freely — keep the */
+/* vocabulary stable. */
+/* -------------------------------------------------------------------------- */
+
const iconMap = {
- // Navigation & UI
- 'home': Home,
- 'settings': Settings,
- 'user': User,
- 'person': User,
- 'account': UserCircle,
- 'menu': Menu,
- 'hamburger': Menu,
- 'search': Search,
- 'bell': Bell,
- 'notifications': Bell,
- 'mail': Mail,
- 'email': Mail,
-
- // Files & Folders
- 'file': File,
- 'folder': Folder,
- 'folder-open': FolderOpen,
-
- // Actions
- 'edit': SquarePen,
- 'delete': Trash2,
- 'save': Save,
- 'close': X,
- 'x': X,
- 'check': Check,
- 'plus': Plus,
- 'minus': Minus,
-
- // Arrows & Navigation
- 'arrow-right': ArrowRight,
- 'arrow-left': ArrowLeft,
- 'arrow-up': ArrowUp,
- 'arrow-down': ArrowDown,
- 'chevron-right': ChevronRight,
- 'chevron-down': ChevronDown,
- 'chevron-up': ChevronUp,
- 'chevron-left': ChevronLeft,
- 'chevrons-right': ChevronsRight,
- 'chevrons-left': ChevronsLeft,
- 'more-vert': MoreVertical,
- 'more-horiz': MoreHorizontal,
-
- // Auth
- 'logout': LogOut,
- 'login': LogIn,
- 'lock': Lock,
- 'unlock': Unlock,
-
- // Dashboard & Analytics
- 'dashboard': LayoutDashboard,
- 'chart': BarChart3,
- 'analytics': TrendingUp,
- 'money': DollarSign,
- 'group': Users,
- 'report': FileText,
-
- // Status & Feedback
- 'info': Info,
- 'warning': AlertTriangle,
- 'error': AlertCircle,
- 'success': CheckCircle,
- 'help': HelpCircle,
-
- // Visibility
- 'visibility': Eye,
- 'visibility-off': EyeOff,
-
- // Media
- 'image': Image,
- 'photo': Camera,
- 'video': Video,
- 'play': Play,
- 'pause': Pause,
- 'stop': Square,
-
- // Communication
- 'chat': MessageCircle,
- 'message': MessageSquare,
- 'comment': MessageSquare,
- 'send': Send,
- 'phone': Phone,
-
- // Content
- 'copy': Copy,
- 'cut': Scissors,
- 'paste': Clipboard,
- 'link': Link,
- 'attach': Paperclip,
-
- // UI Controls
- 'filter': Filter,
- 'sort': ArrowUpDown,
- 'refresh': RefreshCw,
- 'download': Download,
- 'upload': Upload,
- 'share': Share2,
- 'language': Globe,
- 'locale': Globe,
- 'tune': SlidersHorizontal,
- 'first-page': SkipBack,
- 'last-page': SkipForward,
-
- // Favorites & Bookmarks
- 'favorite': Heart,
- 'favorite-border': Heart,
- 'star': Star,
- 'star-border': Star,
- 'bookmark': Bookmark,
-
- // Time & Calendar
- 'calendar': Calendar,
- 'time': Clock,
-
- // Location
- 'location': MapPin,
- 'location-on': MapPin,
- 'map': Map,
- 'navigation': Navigation,
-
- // System
- 'power': Power,
- 'brightness': Sun,
- 'wifi': Wifi,
- 'wifi-off': WifiOff,
-
- // Media Controls
- 'volume-up': Volume2,
- 'volume-down': Volume1,
- 'volume-off': VolumeX,
- 'mute': VolumeX,
-
- // Editing
- 'zoom-in': ZoomIn,
- 'zoom-out': ZoomOut,
- 'crop': Crop,
- 'rotate': RotateCw,
-
- // Formatting
- 'format-bold': Bold,
- 'format-italic': Italic,
- 'format-underline': Underline,
- 'code': Code,
-
- // Files & Documents
- 'document': FileText,
- 'article': FileText,
- 'book': Book,
- 'library': Library,
-
- // Cloud & Storage
- 'cloud': Cloud,
- 'cloud-upload': CloudUpload,
- 'cloud-download': CloudDownload,
- 'drive': HardDrive,
-
- // Network
- 'network': Network,
- 'signal': Signal,
-
- // Print
- 'print': Printer,
-
- // Add more mappings as needed
+ // ── Navigation & UI ────────────────────────────────────────────────────
+ 'home': wrap(House, 'House'),
+ 'settings': wrap(Gear, 'Gear'),
+ 'gear': wrap(Gear, 'Gear'),
+ 'user': wrap(User, 'User'),
+ 'person': wrap(User, 'User'),
+ 'account': wrap(UserCircle, 'UserCircle'),
+ 'menu': wrap(MenuList, 'List'),
+ 'hamburger': wrap(MenuList, 'List'),
+ 'list': wrap(MenuList, 'List'),
+ 'search': wrap(MagnifyingGlass, 'MagnifyingGlass'),
+ 'bell': wrap(Bell, 'Bell'),
+ 'notifications': wrap(Bell, 'Bell'),
+ 'mail': wrap(Envelope, 'Envelope'),
+ 'email': wrap(Envelope, 'Envelope'),
+
+ // ── Files & Folders ────────────────────────────────────────────────────
+ 'file': wrap(File, 'File'),
+ 'folder': wrap(Folder, 'Folder'),
+ 'folder-open': wrap(FolderOpen, 'FolderOpen'),
+
+ // ── Actions ────────────────────────────────────────────────────────────
+ 'edit': wrap(PencilSimple, 'PencilSimple'),
+ 'pencil': wrap(PencilSimple, 'PencilSimple'),
+ 'delete': wrap(Trash, 'Trash'),
+ 'trash': wrap(Trash, 'Trash'),
+ 'save': wrap(FloppyDisk, 'FloppyDisk'),
+ 'close': wrap(X, 'X'),
+ 'x': wrap(X, 'X'),
+ 'check': wrap(Check, 'Check'),
+ 'plus': wrap(Plus, 'Plus'),
+ 'add': wrap(Plus, 'Plus'),
+ 'minus': wrap(Minus, 'Minus'),
+
+ // ── Arrows & Chevrons ──────────────────────────────────────────────────
+ 'arrow-right': wrap(ArrowRight, 'ArrowRight'),
+ 'arrow-left': wrap(ArrowLeft, 'ArrowLeft'),
+ 'arrow-up': wrap(ArrowUp, 'ArrowUp'),
+ 'arrow-down': wrap(ArrowDown, 'ArrowDown'),
+ 'chevron-right': wrap(CaretRight, 'CaretRight'),
+ 'chevron-down': wrap(CaretDown, 'CaretDown'),
+ 'chevron-up': wrap(CaretUp, 'CaretUp'),
+ 'chevron-left': wrap(CaretLeft, 'CaretLeft'),
+ 'chevrons-right': wrap(CaretDoubleRight, 'CaretDoubleRight'),
+ 'chevrons-left': wrap(CaretDoubleLeft, 'CaretDoubleLeft'),
+ 'caret-up': wrap(CaretUp, 'CaretUp'),
+ 'caret-down': wrap(CaretDown, 'CaretDown'),
+ 'caret-left': wrap(CaretLeft, 'CaretLeft'),
+ 'caret-right': wrap(CaretRight, 'CaretRight'),
+ 'more-vert': wrap(DotsThreeVertical, 'DotsThreeVertical'),
+ 'more-horiz': wrap(DotsThree, 'DotsThree'),
+
+ // ── Auth ───────────────────────────────────────────────────────────────
+ 'logout': wrap(SignOut, 'SignOut'),
+ 'login': wrap(SignIn, 'SignIn'),
+ 'lock': wrap(Lock, 'Lock'),
+ 'unlock': wrap(LockOpen, 'LockOpen'),
+
+ // ── Dashboards & Analytics ─────────────────────────────────────────────
+ 'dashboard': wrap(SquaresFour, 'SquaresFour'),
+ 'chart': wrap(ChartBar, 'ChartBar'),
+ 'analytics': wrap(TrendUp, 'TrendUp'),
+ 'money': wrap(CurrencyDollar, 'CurrencyDollar'),
+ 'group': wrap(Users, 'Users'),
+ 'users': wrap(Users, 'Users'),
+ 'report': wrap(FileText, 'FileText'),
+
+ // ── Status ─────────────────────────────────────────────────────────────
+ 'info': wrap(Info, 'Info'),
+ 'warning': wrap(Warning, 'Warning'),
+ 'error': wrap(WarningCircle, 'WarningCircle'),
+ 'success': wrap(CheckCircle, 'CheckCircle'),
+ 'help': wrap(Question, 'Question'),
+
+ // ── Visibility ─────────────────────────────────────────────────────────
+ 'visibility': wrap(Eye, 'Eye'),
+ 'visibility-off': wrap(EyeSlash, 'EyeSlash'),
+ 'eye': wrap(Eye, 'Eye'),
+ 'eye-off': wrap(EyeSlash, 'EyeSlash'),
+
+ // ── Media ──────────────────────────────────────────────────────────────
+ 'image': wrap(ImageIcon, 'Image'),
+ 'photo': wrap(Camera, 'Camera'),
+ 'video': wrap(VideoCamera, 'VideoCamera'),
+ 'play': wrap(Play, 'Play'),
+ 'pause': wrap(Pause, 'Pause'),
+ 'stop': wrap(Square, 'Square'),
+ 'square': wrap(Square, 'Square'),
+ 'circle': wrap(Circle, 'Circle'),
+
+ // ── Communication ──────────────────────────────────────────────────────
+ 'chat': wrap(ChatCircle, 'ChatCircle'),
+ 'message': wrap(ChatText, 'ChatText'),
+ 'comment': wrap(ChatText, 'ChatText'),
+ 'send': wrap(PaperPlaneTilt, 'PaperPlaneTilt'),
+ 'phone': wrap(Phone, 'Phone'),
+
+ // ── Content ────────────────────────────────────────────────────────────
+ 'copy': wrap(Copy, 'Copy'),
+ 'cut': wrap(Scissors, 'Scissors'),
+ 'paste': wrap(Clipboard, 'Clipboard'),
+ 'link': wrap(Link, 'Link'),
+ 'attach': wrap(Paperclip, 'Paperclip'),
+
+ // ── UI Controls ────────────────────────────────────────────────────────
+ 'filter': wrap(FunnelSimple, 'FunnelSimple'),
+ 'sort': wrap(ArrowsDownUp, 'ArrowsDownUp'),
+ 'refresh': wrap(ArrowClockwise, 'ArrowClockwise'),
+ 'download': wrap(Download, 'Download'),
+ 'upload': wrap(Upload, 'Upload'),
+ 'share': wrap(ShareNetwork, 'ShareNetwork'),
+ 'language': wrap(Globe, 'Globe'),
+ 'locale': wrap(Globe, 'Globe'),
+ 'tune': wrap(Sliders, 'Sliders'),
+ 'first-page': wrap(SkipBack, 'SkipBack'),
+ 'last-page': wrap(SkipForward, 'SkipForward'),
+
+ // ── Favorites & Bookmarks ──────────────────────────────────────────────
+ 'favorite': wrap(Heart, 'Heart'),
+ 'favorite-border': wrap(Heart, 'Heart'),
+ 'star': wrap(Star, 'Star'),
+ 'star-border': wrap(Star, 'Star'),
+ 'bookmark': wrap(BookmarkSimple, 'BookmarkSimple'),
+
+ // ── Time & Calendar ────────────────────────────────────────────────────
+ 'calendar': wrap(Calendar, 'Calendar'),
+ 'time': wrap(Clock, 'Clock'),
+ 'clock': wrap(Clock, 'Clock'),
+
+ // ── Location ───────────────────────────────────────────────────────────
+ 'location': wrap(MapPin, 'MapPin'),
+ 'location-on': wrap(MapPin, 'MapPin'),
+ 'map': wrap(MapTrifold, 'MapTrifold'),
+ 'navigation': wrap(NavigationArrow, 'NavigationArrow'),
+
+ // ── System ─────────────────────────────────────────────────────────────
+ 'power': wrap(Power, 'Power'),
+ 'brightness': wrap(Sun, 'Sun'),
+ 'sun': wrap(Sun, 'Sun'),
+ 'wifi': wrap(WifiHigh, 'WifiHigh'),
+ 'wifi-off': wrap(WifiSlash, 'WifiSlash'),
+ 'lightning': wrap(Lightning, 'Lightning'),
+
+ // ── Volume ─────────────────────────────────────────────────────────────
+ 'volume-up': wrap(SpeakerHigh, 'SpeakerHigh'),
+ 'volume-down': wrap(SpeakerLow, 'SpeakerLow'),
+ 'volume-off': wrap(SpeakerSlash, 'SpeakerSlash'),
+ 'mute': wrap(SpeakerSlash, 'SpeakerSlash'),
+
+ // ── Editing ────────────────────────────────────────────────────────────
+ 'zoom-in': wrap(MagnifyingGlassPlus, 'MagnifyingGlassPlus'),
+ 'zoom-out': wrap(MagnifyingGlassMinus, 'MagnifyingGlassMinus'),
+ 'crop': wrap(Crop, 'Crop'),
+ 'rotate': wrap(ArrowsClockwise, 'ArrowsClockwise'),
+
+ // ── Text formatting ────────────────────────────────────────────────────
+ 'format-bold': wrap(TextB, 'TextB'),
+ 'format-italic': wrap(TextItalic, 'TextItalic'),
+ 'format-underline': wrap(TextUnderline, 'TextUnderline'),
+ 'code': wrap(Code, 'Code'),
+
+ // ── Documents ──────────────────────────────────────────────────────────
+ 'document': wrap(FileText, 'FileText'),
+ 'article': wrap(Article, 'Article'),
+ 'book': wrap(Book, 'Book'),
+ 'library': wrap(Books, 'Books'),
+
+ // ── Cloud & Storage ────────────────────────────────────────────────────
+ 'cloud': wrap(Cloud, 'Cloud'),
+ 'cloud-upload': wrap(CloudArrowUp, 'CloudArrowUp'),
+ 'cloud-download': wrap(CloudArrowDown, 'CloudArrowDown'),
+ 'drive': wrap(HardDrive, 'HardDrive'),
+
+ // ── Network ────────────────────────────────────────────────────────────
+ 'network': wrap(Network, 'Network'),
+ 'signal': wrap(CellSignalHigh, 'CellSignalHigh'),
+
+ // ── Print ──────────────────────────────────────────────────────────────
+ 'print': wrap(Printer, 'Printer'),
};
+/* -------------------------------------------------------------------------- */
+/* Public API */
+/* -------------------------------------------------------------------------- */
+
/**
- * Get Lucide icon component by name
- * @param {string} iconName - Name of the icon (e.g., 'home', 'settings')
- * @returns {React.Component|null} Lucide icon component or null
+ * Look up a wrapped Phosphor icon by name. Returns a React component (the
+ * wrapper handles theme-aware color, sizing, and weight) or `null` if the
+ * name is unknown.
+ *
+ * @param {string} iconName - canonical alias from {@link iconMap}
+ * @returns {React.ComponentType<{size?:string|number,color?:string,weight?:string}>|null}
*/
export function getIcon(iconName) {
- if (!iconName || typeof iconName !== 'string') {
- return null;
- }
-
- const normalizedName = iconName.toLowerCase().trim();
- return iconMap[normalizedName] || null;
+ if (typeof iconName !== 'string' || !iconName) return null;
+ return iconMap[iconName.toLowerCase().trim()] || null;
}
/**
- * IconMapper Component
- * Renders a Lucide icon by name with Tamagui theme support
- * @param {string} iconName - Name of the icon
- * @param {number|string} size - Size of the icon (number or Tamagui token like '$4')
- * @param {string} color - Color of the icon (CSS color or Tamagui token like '$color')
- * @returns {React.ReactElement|null} Rendered icon or null
+ * Convenience component: ``.
+ * Falls back to a small Tamagui Text node when the input is an emoji or
+ * single character (e.g. user-entered avatar glyphs).
*/
-export function IconMapper({ iconName, size = 24, color = 'currentColor', ...props }) {
- const IconComponent = getIcon(iconName);
-
- if (!IconComponent) {
- // Fallback for emojis or unknown icons
- if (iconName && (iconName.length <= 2 || /[\u{1F300}-\u{1F9FF}]/u.test(iconName))) {
- return {iconName};
- }
- return null;
+export function IconMapper({ iconName, size = DEFAULT_SIZE, color = '$textPrimary', ...props }) {
+ const Icon = getIcon(iconName);
+ if (Icon) {
+ return ;
}
-
- // Convert size if it's a number to a reasonable default
- const iconSize = typeof size === 'string' ? size : size;
-
- return ;
+ if (typeof iconName === 'string' && (iconName.length <= 2 || /[\u{1F300}-\u{1F9FF}]/u.test(iconName))) {
+ return {iconName};
+ }
+ return null;
+}
+
+/**
+ * Get the px value for a semantic size token. Useful when laying out
+ * non-icon children (avatars, badges) alongside icons.
+ */
+export function getIconSize(size) {
+ return resolveSize(size);
+}
+
+/**
+ * List of every registered alias. Handy for validation / docs.
+ */
+export function getIconNames() {
+ return Object.keys(iconMap);
}
export default IconMapper;
diff --git a/src/ui/components/MenuItemButton.jsx b/src/ui/components/MenuItemButton.jsx
index b324d92..4e38237 100644
--- a/src/ui/components/MenuItemButton.jsx
+++ b/src/ui/components/MenuItemButton.jsx
@@ -258,41 +258,34 @@ export function MenuItemButton({
}
}
- // Determine background color based on state
+ // Static state colors. Hover treatments live in `hoverStyle`/`pressStyle`
+ // below so they animate via Tamagui's pseudo-state machinery instead of
+ // being baked into the resting style.
const getBackgroundColor = () => {
- if (selected) {
- return '$accentBackground';
- }
- if (hovered) {
- return '$backgroundPress';
- }
+ if (selected) return '$accentBg';
+ if (hovered) return '$bgPage';
return 'transparent';
};
const getIconColor = () => {
- if (selected) {
- return '$accentColor';
- }
- if (menuItem.style === 'icon_only') {
- return '$accentColor';
- }
- return '$color';
+ if (selected) return '$accent';
+ if (menuItem.style === 'icon_only') return '$accent';
+ return '$textPrimary';
};
const getLabelColor = () => {
- if (selected) {
- return '$accentColor';
- }
- return '$color';
+ if (selected) return '$accent';
+ return '$textPrimary';
};
const getArrowColor = () => {
- if (selected) {
- return '$accentColor';
- }
- return '$colorSecondary';
+ if (selected) return '$accent';
+ return '$textMuted';
};
+ const ICON_SIZE = 'sm';
+ const CHEVRON_SIZE = 'sm';
+
// Determine display style (both, label_only, icon_only)
// Use displayStyle prop if provided, otherwise fall back to menuItem.style
const effectiveDisplayStyle = displayStyle !== undefined ? displayStyle : (menuItem.style || 'both');
@@ -325,11 +318,9 @@ export function MenuItemButton({
width="100%"
alignItems="center"
backgroundColor={getBackgroundColor()}
- borderWidth={selected ? 1 : 0}
- borderColor={selected ? '$accentBorder' : 'transparent'}
- borderRadius="$2"
+ borderRadius="$radiusSm"
padding={padding}
- opacity={menuItem.is_active !== false ? 1 : 0.5}
+ opacity={menuItem.is_active !== false ? 1 : 0.55}
>
{/* Icon + Label (clickable main area) */}
@@ -348,18 +339,16 @@ export function MenuItemButton({
{showIcon && (
{typeof IconComponent === 'string' ? (
- // Emoji fallback
{IconComponent}
) : IconComponent ? (
- // Material Design icon component
-
+
) : null}
)}
-
+
{/* Label */}
{showLabel && (
-
+
{menuItem.label}
)}
@@ -372,16 +361,17 @@ export function MenuItemButton({
alignItems="center"
justifyContent="center"
padding="$1"
+ borderRadius="$radiusSm"
hoverStyle={{
- backgroundColor: '$backgroundHover'
+ backgroundColor: '$bgPage'
}}
pressStyle={{
- backgroundColor: selected ? '$accentHover' : '$backgroundPress'
+ backgroundColor: '$bgPanelElev'
}}
onPress={handleToggleExpand}
>
-
@@ -394,15 +384,15 @@ export function MenuItemButton({
{/* Icon + Label (clickable main area) */}
@@ -480,18 +468,16 @@ export function MenuItemButton({
{showIcon && (
{typeof IconComponent === 'string' ? (
- // Emoji fallback
{IconComponent}
) : IconComponent ? (
- // Material Design icon component
-
+
) : null}
)}
-
+
{/* Label */}
{showLabel && (
-
+
{menuItem.label}
)}
@@ -504,16 +490,17 @@ export function MenuItemButton({
alignItems="center"
justifyContent="center"
padding="$1"
+ borderRadius="$radiusSm"
hoverStyle={{
- backgroundColor: '$backgroundHover'
+ backgroundColor: '$bgPage'
}}
pressStyle={{
- backgroundColor: selected ? '$accentHover' : '$backgroundPress'
+ backgroundColor: '$bgPanelElev'
}}
onPress={handleToggleExpand}
>
-
@@ -553,15 +540,15 @@ export function MenuItemButton({
-
+
);
}
}
-
+
if (title) {
headerLeftItems.push(
-
+
{title}
);
@@ -66,8 +67,8 @@ export function Page({
width="100%"
padding="$4"
borderBottomWidth={1}
- borderBottomColor="$accentBorder"
- backgroundColor="$accentSurface"
+ borderBottomColor="$lineSubtle"
+ backgroundColor="$bgPanel"
alignItems="center"
gap="$3"
minHeight={64}
diff --git a/src/ui/components/Panel.jsx b/src/ui/components/Panel.jsx
index 320fea7..688ec2a 100644
--- a/src/ui/components/Panel.jsx
+++ b/src/ui/components/Panel.jsx
@@ -7,6 +7,7 @@
import React from 'react';
import { XStack, YStack, Text } from 'tamagui';
import { getIcon } from './IconMapper.jsx';
+import { getTypographyRoleProps } from '../styles/index.js';
/**
* Header size mapping function
@@ -19,29 +20,21 @@ import { getIcon } from './IconMapper.jsx';
function getHeaderSizeStyles(headerSize) {
const sizeMap = {
1: {
- iconSize: 24,
- titleFontSize: '$6',
padding: '$3',
borderRadius: '$4',
minHeight: 64
},
2: {
- iconSize: 20,
- titleFontSize: '$5',
padding: '$2',
borderRadius: '$3',
minHeight: 48
},
3: {
- iconSize: 18,
- titleFontSize: '$4',
padding: '$1.5',
borderRadius: '$2',
minHeight: 44
},
4: {
- iconSize: 16,
- titleFontSize: '$3',
padding: '$1',
borderRadius: '$2',
minHeight: 36
@@ -83,13 +76,16 @@ export function Panel({
height = null,
headerSize = 2,
headerFront = null,
- headerBack = null
+ headerBack = null,
+ density = 'comfortable',
+ bodyOverflow = 'auto'
}) {
// Get size-specific styles
const sizeStyles = getHeaderSizeStyles(headerSize);
// Set default headerBack if not provided
- const effectiveHeaderBack = headerBack || { backgroundColor: '$backgroundHover' };
+ const effectiveHeaderBack = headerBack || { backgroundColor: '$bgPanel' };
+ const paddingByDensity = density === 'compact' ? '$2' : density === 'spacious' ? '$4' : sizeStyles.padding;
// Build headerLeft array: icon, title, then custom components
const headerLeftItems = [];
@@ -99,7 +95,7 @@ export function Panel({
if (IconComponent) {
headerLeftItems.push(
-
+
);
}
@@ -107,11 +103,17 @@ export function Panel({
if (title) {
headerLeftItems.push(
-
{title}
@@ -142,19 +144,19 @@ export function Panel({
{...(Object.keys(containerStyle).length > 0 ? containerStyle : {})}
{...(border ? {
borderWidth: 1,
- borderColor: '$borderColor',
- borderRadius: sizeStyles.borderRadius
+ borderColor: '$lineSubtle',
+ borderRadius: '$radiusMd'
} : {})}
- backgroundColor="$background"
+ backgroundColor="$bgPanel"
overflow="hidden"
>
{/* Header */}
{/* Body */}
-
+
{children}
diff --git a/src/ui/components/ProgressBar.jsx b/src/ui/components/ProgressBar.jsx
index 70ed0be..90941f6 100644
--- a/src/ui/components/ProgressBar.jsx
+++ b/src/ui/components/ProgressBar.jsx
@@ -91,8 +91,7 @@ export function ProgressBar({
width="100%"
height={trackHeight}
borderRadius="$1"
- backgroundColor="$borderColor"
- opacity={0.55}
+ backgroundColor="$lineSubtle"
overflow="hidden"
>
{mode === 'determinate' ? (
@@ -103,7 +102,7 @@ export function ProgressBar({
height="100%"
width={determinateWidth}
borderRadius="$1"
- backgroundColor="$accentColor"
+ backgroundColor="$accent"
/>
) : (
)}
@@ -123,7 +122,7 @@ export function ProgressBar({
{label !== null && label !== undefined && label !== '' ? (
typeof label === 'string' ? (
-
+
{label}
) : (
diff --git a/src/ui/components/SettingsPanel.jsx b/src/ui/components/SettingsPanel.jsx
index 4c42dbb..8b0521e 100644
--- a/src/ui/components/SettingsPanel.jsx
+++ b/src/ui/components/SettingsPanel.jsx
@@ -11,13 +11,13 @@ function normalizeVariant(variant, styleVariant) {
return styleVariant || variant || 'accordion';
}
-function renderHeaderIcon(icon, color = '$color') {
+function renderHeaderIcon(icon, color = '$textPrimary') {
const IconComponent = getIcon(icon);
if (!IconComponent) {
return null;
}
- return ;
+ return ;
}
function normalizeContentStyle(contentStyle) {
@@ -188,7 +188,7 @@ export function SettingsPanel({
size="$3"
aria-label={expanded ? `Collapse ${title}` : `Expand ${title}`}
onPress={handleToggle}
- icon={ToggleIcon ? : undefined}
+ icon={ToggleIcon ? : undefined}
/>
);
@@ -208,15 +208,15 @@ export function SettingsPanel({
justifyContent="center"
flexShrink={0}
>
- {renderHeaderIcon(icon, effectiveVariant === 'panel' ? '$accentColor' : '$color')}
+ {renderHeaderIcon(icon, '$textPrimary')}
) : null}
-
+
{title}
{description ? (
-
+
{description}
) : null}
@@ -240,8 +240,8 @@ export function SettingsPanel({
>
- {item.icon ? renderHeaderIcon(item.icon, '$accentColor') : null}
-
+ {item.icon ? renderHeaderIcon(item.icon, '$textSecondary') : null}
+
{item.label || item.title}
@@ -269,9 +269,9 @@ export function SettingsPanel({
@@ -306,18 +306,18 @@ export function SettingsPanel({
return (
{headerContent}
@@ -339,8 +339,8 @@ export function SettingsPanel({
borderWidth={0}
padding={0}
justifyContent="flex-start"
- hoverStyle={{ opacity: 0.9, backgroundColor: 'transparent' }}
- pressStyle={{ opacity: 0.75, backgroundColor: 'transparent' }}
+ hoverStyle={{ backgroundColor: '$bgPage' }}
+ pressStyle={{ backgroundColor: '$bgPanelElev' }}
>
{headerContent}
@@ -351,7 +351,7 @@ export function SettingsPanel({
{renderedBody}
) : null}
-
+
);
}
diff --git a/src/ui/components/Shell.jsx b/src/ui/components/Shell.jsx
index c8b6807..120ce8c 100644
--- a/src/ui/components/Shell.jsx
+++ b/src/ui/components/Shell.jsx
@@ -572,7 +572,7 @@ function Toast({ toast, onClose, onPause, onResume }) {
>
{Icon ? (
-
+
) : null}
@@ -582,7 +582,7 @@ function Toast({ toast, onClose, onPause, onResume }) {
)}
{toast.message && (
-
+
{toast.message}
)}
@@ -596,7 +596,7 @@ function Toast({ toast, onClose, onPause, onResume }) {
>
{(() => {
const CloseIcon = getIcon('close');
- return CloseIcon ? : ×;
+ return CloseIcon ? : ×;
})()}
diff --git a/src/ui/components/SideBar.jsx b/src/ui/components/SideBar.jsx
index 87ad076..3c5c545 100644
--- a/src/ui/components/SideBar.jsx
+++ b/src/ui/components/SideBar.jsx
@@ -229,9 +229,9 @@ function SideBarWide({
height="100%"
gap="$2"
padding="$2"
- backgroundColor="$accentSurface"
+ backgroundColor="$bgPanel"
borderRightWidth={1}
- borderRightColor="$accentBorder"
+ borderRightColor="$lineSubtle"
animation="quick"
animateOnly={['width']}
>
@@ -266,7 +266,7 @@ function SideBarWide({
)}
{appName && !isCollapsed && (
-
+
{appName}
)}
@@ -278,10 +278,10 @@ function SideBarWide({
justifyContent="center"
padding="$1"
hoverStyle={{
- backgroundColor: '$accentBackground'
+ backgroundColor: '$bgPage'
}}
pressStyle={{
- backgroundColor: '$accentHover'
+ backgroundColor: '$bgPanelElev'
}}
onPress={handleToggle}
aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}
@@ -291,8 +291,8 @@ function SideBarWide({
if (!ChevronIcon) return null;
return (
);
@@ -366,17 +366,16 @@ function SideBarNarrow({ children }) {
alignItems="center"
gap="$2"
padding="$2"
- backgroundColor="$accentSurface"
+ backgroundColor="$bgPanel"
borderBottomWidth={1}
- borderBottomColor="$accentBorder"
+ borderBottomColor="$lineSubtle"
>
{/* Hamburger Menu Button */}
setMenuOpen(true)}
/>
@@ -392,7 +391,7 @@ function SideBarNarrow({ children }) {
{/* App Name - takes remaining space */}
{appName && (
-
+
{appName}
)}
@@ -420,9 +419,9 @@ function SideBarNarrow({ children }) {
snapPoints={[85]}
dismissOnSnapToBottom
>
-
+
-
+
{/* Primary Menu Items */}
{organizedChildren.primaryMenuItems.map((item) => (
diff --git a/src/ui/components/SidePanelShell.jsx b/src/ui/components/SidePanelShell.jsx
index cbffd77..5270773 100644
--- a/src/ui/components/SidePanelShell.jsx
+++ b/src/ui/components/SidePanelShell.jsx
@@ -2,6 +2,11 @@ import React, { useEffect, useState } from 'react';
import { Button, ScrollView, Text, XStack, YStack } from 'tamagui';
import { getIcon } from './IconMapper.jsx';
+/**
+ * Toolbar / footer action button.
+ * Pass `theme="accent"` on a single primary action; everything else stays
+ * chromeless to keep the action hierarchy clear.
+ */
function ActionButton({ action }) {
const IconComponent = action?.icon ? getIcon(action.icon) : null;
return (
@@ -11,7 +16,7 @@ function ActionButton({ action }) {
chromeless={action?.chromeless}
disabled={action?.disabled}
onPress={action?.onPress}
- icon={IconComponent ? : undefined}
+ icon={IconComponent ? : undefined}
>
{action?.label}
@@ -61,7 +66,7 @@ export function SidePanelShell({
right={0}
bottom={0}
left={0}
- backgroundColor="rgba(15,23,42,0.26)"
+ backgroundColor="$scrim"
opacity={open ? 1 : 0}
animation="quick"
onPress={onClose}
@@ -74,13 +79,13 @@ export function SidePanelShell({
bottom={0}
width={width}
maxWidth="96vw"
- backgroundColor="$background"
+ backgroundColor="$bgPanelElev"
borderLeftWidth={1}
- borderLeftColor="$borderColor"
+ borderLeftColor="$lineSubtle"
shadowColor="$shadowColor"
- shadowOpacity={0.18}
- shadowRadius={20}
- shadowOffset={{ width: -4, height: 0 }}
+ shadowOpacity={0.12}
+ shadowRadius={24}
+ shadowOffset={{ width: -6, height: 0 }}
style={{
transform: open ? 'translateX(0)' : 'translateX(100%)',
transition: 'transform 220ms ease'
@@ -92,10 +97,10 @@ export function SidePanelShell({
padding="$4"
gap="$3"
borderBottomWidth={1}
- borderBottomColor="$borderColor"
- backgroundColor="$accentSurface"
+ borderBottomColor="$lineSubtle"
+ backgroundColor="$bgPanel"
>
-
+
{title}
@@ -107,7 +112,7 @@ export function SidePanelShell({
circular
chromeless
onPress={onClose}
- icon={CloseIcon ? : undefined}
+ icon={CloseIcon ? : undefined}
aria-label="Close panel"
/>
@@ -125,8 +130,8 @@ export function SidePanelShell({
gap="$2"
padding="$4"
borderTopWidth={1}
- borderTopColor="$borderColor"
- backgroundColor="$accentSurface"
+ borderTopColor="$lineSubtle"
+ backgroundColor="$bgPanel"
flexWrap="wrap"
>
{footerActions.map((action, index) => (
diff --git a/src/ui/components/TopBar.jsx b/src/ui/components/TopBar.jsx
index a2232ce..aa52b2b 100644
--- a/src/ui/components/TopBar.jsx
+++ b/src/ui/components/TopBar.jsx
@@ -195,9 +195,9 @@ function TopBarWide({
alignItems="center"
gap="$2"
padding="$2"
- backgroundColor="$accentSurface"
+ backgroundColor="$bgPanel"
borderBottomWidth={1}
- borderBottomColor="$accentBorder"
+ borderBottomColor="$lineSubtle"
>
{/* Left Side */}
)}
-
+
{/* App Name */}
{appName && (
-
+
{appName}
)}
-
+
{/* Left Side Items */}
{organizedChildren.sections.leftSide}
@@ -242,7 +242,7 @@ function TopBarWide({
)}
- {/* Right Side */}
+ {/* Right Side — secondary actions get a hairline separator + tighter gap */}
{(effectiveRightWidth > 0 || effectiveRightWidth === 'auto') && (
{organizedChildren.sections.rightSide}
@@ -289,20 +292,19 @@ function TopBarNarrow({ children }) {
alignItems="center"
gap="$2"
padding="$2"
- backgroundColor="$accentSurface"
+ backgroundColor="$bgPanel"
borderBottomWidth={1}
- borderBottomColor="$accentBorder"
+ borderBottomColor="$lineSubtle"
>
- {/* Hamburger Menu Button */}
+ {/* Hamburger Menu Button — chromeless to avoid pulling the eye */}
setMenuOpen(true)}
/>
-
+
{/* Brand Logo */}
{brandLogo && (
)}
-
+
{/* App Name - takes remaining space */}
{appName && (
-
+
{appName}
)}
@@ -359,9 +361,9 @@ function TopBarNarrow({ children }) {
snapPoints={[85]}
dismissOnSnapToBottom
>
-
+
-
+
{/* Primary Menu Items - render with vertical orientation in Sheet */}
{organizedChildren.primaryMenuItems.map((item) => (
diff --git a/src/ui/components/grid/GridView.jsx b/src/ui/components/grid/GridView.jsx
index 85d5bef..b6b4b4f 100644
--- a/src/ui/components/grid/GridView.jsx
+++ b/src/ui/components/grid/GridView.jsx
@@ -24,6 +24,7 @@ export function GridView({
statusText = '',
selectable = false,
nested = false,
+ closeable = true,
onClose = undefined,
onReload = undefined,
initialPageSize = 6,
@@ -197,8 +198,10 @@ export function GridView({
resolvedColumns,
visibleColumns,
selectedIds,
+ setSelectedIds,
selectable,
nested,
+ closeable,
isLoading,
error,
tableViewportWidth,
@@ -236,6 +239,15 @@ export function GridView({
return next;
});
},
+ toggleSelectAll: () => {
+ setSelectedIds((current) => {
+ const allIds = (rows || []).map((row) => row?.id).filter((id) => id != null);
+ if (!allIds.length) return new Set();
+ const allSelected = allIds.every((id) => current.has(id));
+ return allSelected ? new Set() : new Set(allIds);
+ });
+ },
+ clearSelection: () => setSelectedIds(new Set()),
setFilterValue: (key, value) => {
setOffset(0);
setFilterBy((current) => ({
@@ -260,6 +272,7 @@ export function GridView({
resolvedStatusText,
rows,
selectable,
+ closeable,
selectedIds,
sortBy,
structure,
diff --git a/src/ui/components/grid/panel.jsx b/src/ui/components/grid/panel.jsx
index 4f4c593..0288e99 100644
--- a/src/ui/components/grid/panel.jsx
+++ b/src/ui/components/grid/panel.jsx
@@ -3,6 +3,7 @@ import { Button, Checkbox, Input, Paragraph, ScrollView, Text, XStack, YStack }
import { getIcon } from '../IconMapper.jsx';
import { useGridView } from './context.js';
import { formatValueByColumn } from './utils.js';
+import { getTypographyRoleProps } from '../../styles/index.js';
function renderToolbarItem(item) {
if (!item) {
@@ -22,7 +23,7 @@ function renderToolbarItem(item) {
theme={item.theme}
chromeless={item.chromeless}
disabled={item.disabled}
- icon={IconComponent ? : undefined}
+ icon={IconComponent ? : undefined}
onPress={item.onClick || item.onPress}
>
{item.label}
@@ -32,21 +33,27 @@ function renderToolbarItem(item) {
if (item.kind === 'text') {
return (
-
+
{item.text}
);
}
if (item.kind === 'search') {
+ const SearchIcon = getIcon('search');
return (
- item.onChange?.(value)}
- />
+
+ {SearchIcon ? : null}
+ item.onChange?.(value)}
+ backgroundColor="$bgPanel"
+ borderColor="$lineSubtle"
+ focusStyle={{ borderColor: '$accent' }}
+ />
+
);
}
@@ -75,14 +82,14 @@ function DefaultPanelRecordRenderer({ row }) {
return (
-
+
Record Summary
-
+
{titleColumn ? row?.[titleColumn.field] : row?.id}
{subtitleColumn ? (
-
+
{row?.[subtitleColumn.field] || ''}
) : null}
@@ -94,15 +101,15 @@ function DefaultPanelRecordRenderer({ row }) {
key={`${row.id}-${column.field}-chip`}
paddingHorizontal="$3"
paddingVertical="$2"
- borderRadius="$6"
- backgroundColor="$accentSurface"
+ borderRadius="$radiusMd"
+ backgroundColor="$bgPanel"
borderWidth={1}
- borderColor="$accentBorder"
+ borderColor="$lineSubtle"
>
-
+
{column.label}
-
+
{formatValueByColumn(row?.[column.field], column)}
@@ -116,16 +123,16 @@ function DefaultPanelRecordRenderer({ row }) {
minWidth={160}
flex={1}
padding="$3"
- borderRadius="$4"
+ borderRadius="$radiusMd"
borderWidth={1}
- borderColor="$borderColor"
- backgroundColor="$background"
+ borderColor="$lineSubtle"
+ backgroundColor="$bgPanel"
gap="$1"
>
-
+
{column.label}
- {formatValueByColumn(row?.[column.field], column)}
+ {formatValueByColumn(row?.[column.field], column)}
))}
@@ -156,7 +163,7 @@ export function PanelFooterStatusBar({ text, visible = true }) {
}
return (
-
+
{text || grid.statusText}
);
@@ -179,10 +186,10 @@ export function PanelHeader({ title, toolbarItems = [], visible = true, showDivi
padding="$3"
minHeight={64}
borderBottomWidth={showDivider ? 1 : 0}
- borderBottomColor="$borderColor"
- backgroundColor="$accentSurface"
+ borderBottomColor="$lineSubtle"
+ backgroundColor="$bgPanel"
>
-
+
{title}
@@ -192,17 +199,19 @@ export function PanelHeader({ title, toolbarItems = [], visible = true, showDivi
size="$3"
chromeless
circular
- icon={RefreshIcon ? : undefined}
+ icon={RefreshIcon ? : undefined}
onPress={grid.reload}
/>
- : undefined}
- onPress={grid.close}
- />
+ {grid.closeable !== false ? (
+ : undefined}
+ onPress={grid.close}
+ />
+ ) : null}
);
@@ -221,8 +230,8 @@ export function PanelFooter({ toolbarItems = [], visible = true }) {
padding="$3"
minHeight={56}
borderTopWidth={1}
- borderTopColor="$borderColor"
- backgroundColor="$background"
+ borderTopColor="$lineSubtle"
+ backgroundColor="$bgPanel"
flexWrap="wrap"
>
@@ -243,9 +252,11 @@ export function PanelBodyView({
}
if (grid.error) {
+ const ErrorIcon = getIcon('error');
return (
-
- {grid.error}
+
+ {ErrorIcon ? : null}
+ {grid.error}
);
}
@@ -253,15 +264,18 @@ export function PanelBodyView({
if (grid.isLoading && !grid.rows.length) {
return (
- Loading cards...
+ Loading cards...
);
}
if (!grid.rows.length) {
+ const EmptyIcon = getIcon('folder');
return (
-
- No records available.
+
+ {EmptyIcon ? : null}
+ No records available
+ There's nothing to show here yet.
);
}
@@ -272,37 +286,49 @@ export function PanelBodyView({
- {grid.rows.map((row) => (
- 1 ? 320 : 240}
- flex={1}
- flexBasis={responsiveColumns > 1 ? '48%' : '100%'}
- padding="$4"
- borderWidth={1}
- borderColor={grid.selectedIds.has(row.id) ? '$accentBorder' : '$borderColor'}
- backgroundColor={grid.selectedIds.has(row.id) ? '$accentSurface' : '$background'}
- borderRadius="$5"
- gap="$3"
- >
- {grid.selectable ? (
-
- grid.toggleSelectRow(row.id)}
- >
-
-
-
- ) : null}
+ {grid.rows.map((row) => {
+ const isSelected = grid.selectedIds.has(row.id);
+ return (
+ 1 ? 320 : 240}
+ flex={1}
+ flexBasis={responsiveColumns > 1 ? '48%' : '100%'}
+ padding="$4"
+ borderWidth={1}
+ borderColor={isSelected ? '$accent' : '$lineSubtle'}
+ backgroundColor={isSelected ? '$accentBg' : '$bgPanel'}
+ borderRadius="$radiusLg"
+ gap="$3"
+ hoverStyle={isSelected ? undefined : { borderColor: '$lineStrong' }}
+ >
+ {grid.selectable ? (
+
+ grid.toggleSelectRow(row.id)}
+ borderColor="$lineStrong"
+ backgroundColor="$bgPanel"
+ focusStyle={{ borderColor: '$accent' }}
+ >
+
+ {(() => {
+ const Check = getIcon('check');
+ return Check ? : null;
+ })()}
+
+
+
+ ) : null}
-
-
- ))}
+
+
+ );
+ })}
{grid.isLoading ? (
-
+
Refreshing records...
) : null}
@@ -310,4 +336,3 @@ export function PanelBodyView({
);
}
-
diff --git a/src/ui/components/grid/table.jsx b/src/ui/components/grid/table.jsx
index 2326cbf..9992a12 100644
--- a/src/ui/components/grid/table.jsx
+++ b/src/ui/components/grid/table.jsx
@@ -2,6 +2,7 @@ import React, { useEffect, useRef } from 'react';
import { Button, Checkbox, ScrollView, Separator, Text, XStack, YStack } from 'tamagui';
import { getIcon } from '../IconMapper.jsx';
import { useGridView } from './context.js';
+import { getTypographyRoleProps } from '../../styles/index.js';
import {
formatValueByColumn,
getColumnJustify,
@@ -12,7 +13,7 @@ import {
function DefaultGridCellRenderer({ value, column }) {
return (
-
+
{formatValueByColumn(value, column)}
);
@@ -29,15 +30,26 @@ function UtilityCell({ rowId }) {
if (grid.nested) {
return (
- {ChevronRightIcon ? : {'>'}}
+ {ChevronRightIcon ? : {'>'}}
);
}
return (
- grid.toggleSelectRow(rowId)}>
-
+ grid.toggleSelectRow(rowId)}
+ borderColor="$lineStrong"
+ backgroundColor="$bgPanel"
+ focusStyle={{ borderColor: '$accent' }}
+ >
+
+ {(() => {
+ const Check = getIcon('check');
+ return Check ? : null;
+ })()}
+
);
@@ -80,21 +92,46 @@ export function TableHeader({ visible = true, showTopBorder = true }) {
}
const activeColumns = grid.visibleColumns?.length ? grid.visibleColumns : grid.resolvedColumns;
+ const CaretUp = getIcon('caret-up');
+ const CaretDown = getIcon('caret-down');
+ const allIds = (grid.rows || []).map((row) => row?.id).filter((id) => id != null);
+ const selectedCount = allIds.filter((id) => grid.selectedIds.has(id)).length;
+ const allSelected = allIds.length > 0 && selectedCount === allIds.length;
+ const someSelected = selectedCount > 0 && !allSelected;
return (
- {grid.selectable || grid.nested ? : null}
+ {grid.selectable || grid.nested ? (
+
+ {grid.selectable ? (
+ grid.toggleSelectAll?.()}
+ borderColor="$lineStrong"
+ backgroundColor="$bgPanel"
+ focusStyle={{ borderColor: '$accent' }}
+ >
+
+ {(() => {
+ const Check = getIcon('check');
+ return Check ? : null;
+ })()}
+
+
+ ) : null}
+
+ ) : null}
{activeColumns.map((column) => {
const activeSort = grid.sortBy.find((entry) => entry.field === column.field);
- const sortLabel =
- activeSort?.direction === 'asc' ? '↑' : activeSort?.direction === 'desc' ? '↓' : '';
+ const isActive = Boolean(activeSort);
+ const direction = activeSort?.direction;
return (
-
- {column.label}{sortLabel ? ` ${sortLabel}` : ''}
-
+
+
+ {column.label}
+
+ {column.sortable ? (
+ isActive ? (
+ direction === 'asc'
+ ? (CaretUp ? : null)
+ : (CaretDown ? : null)
+ ) : (
+ CaretDown ? : null
+ )
+ ) : null}
+
);
})}
@@ -131,7 +186,7 @@ export function TableBodyView({ visible = true }) {
if (grid.error) {
return (
- {grid.error}
+ {grid.error}
);
}
@@ -144,7 +199,8 @@ export function TableBodyView({ visible = true }) {
{grid.selectable || grid.nested ? : null}
{activeColumns.map((column) => {
@@ -166,19 +222,22 @@ export function TableBodyView({ visible = true }) {
);
})}
-
+
))}
{!grid.rows.length && !grid.isLoading ? (
- No records available.
+ No records available
+ There's nothing to show here yet.
) : null}
- {grid.isLoading ? (
-
- Loading...
+ {grid.isLoading && !grid.rows.length ? (
+
+ {[0, 1, 2].map((i) => (
+
+ ))}
) : null}
@@ -205,21 +264,21 @@ export function TableFooter({ visible = true }) {
padding="$3"
minHeight={56}
borderTopWidth={1}
- borderTopColor="$borderColor"
- backgroundColor="$background"
+ borderTopColor="$lineSubtle"
+ backgroundColor="$bgPanel"
flexWrap="wrap"
>
-
+
{grid.total} records
-
+
: undefined}
+ icon={FirstPageIcon ? : undefined}
onPress={() => grid.setPage(1)}
/>
: undefined}
+ icon={PreviousPageIcon ? : undefined}
onPress={() => grid.setPage(grid.currentPage - 1)}
/>
-
+
Page {grid.currentPage} of {grid.pageCount}
= grid.pageCount}
- icon={NextPageIcon ? : undefined}
+ icon={NextPageIcon ? : undefined}
onPress={() => grid.setPage(grid.currentPage + 1)}
/>
= grid.pageCount}
- icon={LastPageIcon ? : undefined}
+ icon={LastPageIcon ? : undefined}
onPress={() => grid.setPage(grid.pageCount)}
/>
);
}
-
diff --git a/src/ui/components/index.js b/src/ui/components/index.js
index 2261914..22dcf18 100644
--- a/src/ui/components/index.js
+++ b/src/ui/components/index.js
@@ -24,6 +24,7 @@ export { SettingsPanel, default as SettingsPanelDefault } from './SettingsPanel.
export { GeneralConfig, default as GeneralConfigDefault } from './GeneralConfig.jsx';
export { IdentityConfig, default as IdentityConfigDefault } from './IdentityConfig.jsx';
export * from './grid/index.js';
+export { getTypographyRoleProps, getStyleTypography, TYPOGRAPHY_ROLE_KEYS } from '../styles/index.js';
// Re-export App helpers for convenience.
// The App component itself is exported from src/index.js and src/ui/App.jsx.
diff --git a/src/ui/styles/AppleTheme.js b/src/ui/styles/AppleTheme.js
new file mode 100644
index 0000000..7ade284
--- /dev/null
+++ b/src/ui/styles/AppleTheme.js
@@ -0,0 +1,193 @@
+/**
+ * Apple Theme
+ * Warm, glassy look inspired by macOS / iOS Human Interface Guidelines.
+ *
+ * Aesthetic intent
+ * ----------------
+ * - Warm neutral surfaces (slightly off-white page, pure white panels)
+ * - Subtle but visible shadows on raised surfaces
+ * - Generous radii (8 / 12 / 16) — pill controls, rounded cards
+ * - System-blue accent for primary actions
+ * - Slightly larger typography, comfortable density
+ * - Phosphor icons at "duotone" weight for a friendly, premium feel
+ *
+ * Implements the semantic token contract documented in styles/index.js.
+ */
+
+import { config as configBase } from '@tamagui/config/v3';
+
+export const AppleTheme = {
+ ...configBase,
+ name: 'apple',
+ displayName: 'Apple',
+ iconWeight: 'duotone',
+ typography: {
+ fieldLabel: { fontSize: '$4', fontWeight: '500', color: '$textPrimary' },
+ detailLabel: { fontSize: '$4', fontWeight: '500', color: '$textPrimary' },
+ pageTitle: { fontSize: '$6', fontWeight: '600', color: '$textPrimary' },
+ panelTitle: { fontWeight: '600', color: '$textPrimary' },
+ tableHeader: { fontSize: '$4', fontWeight: '500', color: '$textSecondary' },
+ sectionTitle: { fontSize: '$6', fontWeight: '600', color: '$textPrimary' },
+ },
+ tokens: {
+ ...configBase.tokens,
+ radius: {
+ ...configBase.tokens.radius,
+ radiusSm: 8,
+ radiusMd: 12,
+ radiusLg: 16,
+ },
+ color: {
+ ...configBase.tokens.color,
+ // System blue
+ primary: '#0a84ff',
+ primaryLight: '#5ea8ff',
+ primaryDark: '#0066cc',
+ // Secondary system gray
+ secondary: '#8e8e93',
+ secondaryLight: '#aeaeb2',
+ secondaryDark: '#636366',
+ // System status colors
+ error: '#ff3b30',
+ warning: '#ff9500',
+ info: '#0a84ff',
+ success: '#34c759',
+ },
+ space: {
+ ...configBase.tokens.space,
+ 0: 0,
+ 1: 4,
+ 2: 8,
+ 3: 12,
+ 4: 16,
+ 5: 20,
+ 6: 28,
+ 7: 36,
+ 8: 48,
+ },
+ size: {
+ ...configBase.tokens.size,
+ xs: 11,
+ sm: 13,
+ md: 15,
+ base: 15,
+ lg: 17,
+ xl: 19,
+ '2xl': 22,
+ '3xl': 26,
+ '4xl': 32,
+ '5xl': 40,
+ '6xl': 56,
+ },
+ // Soft, visible shadows
+ shadowColor: {
+ ...configBase.tokens.shadowColor,
+ elevation0: 'transparent',
+ elevation1: 'rgba(0, 0, 0, 0.04)',
+ elevation2: 'rgba(0, 0, 0, 0.06)',
+ elevation4: 'rgba(0, 0, 0, 0.08)',
+ elevation8: 'rgba(0, 0, 0, 0.12)',
+ elevation12: 'rgba(0, 0, 0, 0.14)',
+ elevation16: 'rgba(0, 0, 0, 0.16)',
+ },
+ },
+ themes: {
+ ...configBase.themes,
+ light: {
+ ...configBase.themes.light,
+ // ---- Legacy keys ----
+ background: '#ffffff',
+ backgroundHover: '#f2f2f7',
+ backgroundPress: '#e5e5ea',
+ backgroundFocus: '#e8f1ff',
+ surface: '#ffffff',
+ surfaceVariant: '#fbfbfd',
+ accentBackground: '#d6e8ff',
+ accentSurface: '#eaf3ff',
+ accentColor: '#0a84ff',
+ accentBorder: 'rgba(10, 132, 255, 0.28)',
+ accentHover: '#cee0ff',
+ accentPress: '#bcd3ff',
+ color: '#1d1d1f',
+ colorHover: '#1d1d1f',
+ colorSecondary: '#6e6e73',
+ colorDisabled: '#aeaeb2',
+ borderColor: '#e5e5ea',
+ borderColorHover: '#d1d1d6',
+ // ---- Contract tokens ----
+ bgPage: '#fbfbfd',
+ bgPanel: '#ffffff',
+ bgPanelElev: '#ffffff',
+ bgInverse: '#1d1d1f',
+ scrim: 'rgba(0, 0, 0, 0.32)',
+ lineSubtle: '#e5e5ea',
+ lineStrong: '#d1d1d6',
+ textPrimary: '#1d1d1f',
+ textSecondary: '#6e6e73',
+ textMuted: '#8e8e93',
+ textOnAccent: '#ffffff',
+ accent: '#0a84ff',
+ accentBg: '#eaf3ff',
+ accentBgHover: '#d6e8ff',
+ danger: '#ff3b30',
+ dangerBg: '#ffe5e3',
+ warning: '#ff9500',
+ warningBg: '#fff1de',
+ success: '#34c759',
+ successBg: '#e2f7e6',
+ info: '#0a84ff',
+ infoBg: '#eaf3ff',
+ },
+ dark: {
+ ...configBase.themes.dark,
+ // ---- Legacy keys ----
+ background: '#000000',
+ backgroundHover: '#1c1c1e',
+ backgroundPress: '#2c2c2e',
+ backgroundFocus: '#1a3a66',
+ surface: '#1c1c1e',
+ surfaceVariant: '#2c2c2e',
+ accentBackground: '#0b3866',
+ accentSurface: '#0a2a4d',
+ accentColor: '#5ea8ff',
+ accentBorder: 'rgba(94, 168, 255, 0.32)',
+ accentHover: '#11437a',
+ accentPress: '#0e3868',
+ color: '#f5f5f7',
+ colorHover: '#f5f5f7',
+ colorSecondary: '#aeaeb2',
+ colorDisabled: '#636366',
+ borderColor: '#2c2c2e',
+ borderColorHover: '#3a3a3c',
+ // ---- Contract tokens ----
+ bgPage: '#000000',
+ bgPanel: '#1c1c1e',
+ bgPanelElev: '#2c2c2e',
+ bgInverse: '#f5f5f7',
+ scrim: 'rgba(0, 0, 0, 0.6)',
+ lineSubtle: '#2c2c2e',
+ lineStrong: '#3a3a3c',
+ textPrimary: '#f5f5f7',
+ textSecondary: '#aeaeb2',
+ textMuted: '#8e8e93',
+ textOnAccent: '#0b1f3d',
+ accent: '#5ea8ff',
+ accentBg: '#0a2a4d',
+ accentBgHover: '#0b3866',
+ danger: '#ff6961',
+ dangerBg: 'rgba(255, 105, 97, 0.14)',
+ warning: '#ffb340',
+ warningBg: 'rgba(255, 179, 64, 0.14)',
+ success: '#5fd66f',
+ successBg: 'rgba(95, 214, 111, 0.14)',
+ info: '#5ea8ff',
+ infoBg: 'rgba(94, 168, 255, 0.14)',
+ },
+ },
+ settings: {
+ ...configBase.settings,
+ styleCompat: 'web',
+ },
+};
+
+export default AppleTheme;
diff --git a/src/ui/styles/AzureTheme.js b/src/ui/styles/AzureTheme.js
new file mode 100644
index 0000000..7592399
--- /dev/null
+++ b/src/ui/styles/AzureTheme.js
@@ -0,0 +1,193 @@
+/**
+ * Azure Theme
+ * Clean enterprise look inspired by Microsoft Azure / Fluent UI.
+ *
+ * Aesthetic intent
+ * ----------------
+ * - Cool neutral surfaces (very subtle gray page, pure white panels)
+ * - Hairline borders, shadows reserved for popovers / modals only
+ * - Tight radii (4 / 6 / 8) — confident rectangles, not pills
+ * - Neutral blue accent reserved for primary action and selected state
+ * - Compact typography weights (400 body, 600 titles, no 700 bold)
+ * - Phosphor icons at "regular" weight, 1.5px stroke
+ *
+ * Implements the semantic token contract documented in styles/index.js.
+ */
+
+import { config as configBase } from '@tamagui/config/v3';
+
+export const AzureTheme = {
+ ...configBase,
+ name: 'azure',
+ displayName: 'Azure',
+ iconWeight: 'regular',
+ typography: {
+ fieldLabel: { fontSize: '$4', fontWeight: '500', color: '$textPrimary' },
+ detailLabel: { fontSize: '$4', fontWeight: '500', color: '$textPrimary' },
+ pageTitle: { fontSize: '$6', fontWeight: '600', color: '$textPrimary' },
+ panelTitle: { fontWeight: '600', color: '$textPrimary' },
+ tableHeader: { fontSize: '$4', fontWeight: '600', color: '$textSecondary' },
+ sectionTitle: { fontSize: '$6', fontWeight: '600', color: '$textPrimary' },
+ },
+ tokens: {
+ ...configBase.tokens,
+ radius: {
+ ...configBase.tokens.radius,
+ radiusSm: 4,
+ radiusMd: 6,
+ radiusLg: 8,
+ },
+ color: {
+ ...configBase.tokens.color,
+ // Neutral-blue accent (Microsoft brand-adjacent, not exact)
+ primary: '#2563eb',
+ primaryLight: '#3b82f6',
+ primaryDark: '#1d4ed8',
+ // Secondary kept as a quiet teal-ish neutral
+ secondary: '#475569',
+ secondaryLight: '#64748b',
+ secondaryDark: '#334155',
+ // Status (Fluent-inspired)
+ error: '#c5221f',
+ warning: '#bf6900',
+ info: '#0078d4',
+ success: '#0f7b3a',
+ },
+ space: {
+ ...configBase.tokens.space,
+ 0: 0,
+ 1: 4,
+ 2: 8,
+ 3: 12,
+ 4: 16,
+ 5: 20,
+ 6: 24,
+ 7: 32,
+ 8: 40,
+ },
+ size: {
+ ...configBase.tokens.size,
+ xs: 11,
+ sm: 12,
+ md: 14,
+ base: 14,
+ lg: 16,
+ xl: 18,
+ '2xl': 20,
+ '3xl': 24,
+ '4xl': 28,
+ '5xl': 36,
+ '6xl': 48,
+ },
+ // Near-zero shadows — surfaces are defined by border, not depth
+ shadowColor: {
+ ...configBase.tokens.shadowColor,
+ elevation0: 'transparent',
+ elevation1: 'rgba(15, 23, 42, 0.04)',
+ elevation2: 'rgba(15, 23, 42, 0.06)',
+ elevation4: 'rgba(15, 23, 42, 0.08)',
+ elevation8: 'rgba(15, 23, 42, 0.10)',
+ elevation12: 'rgba(15, 23, 42, 0.12)',
+ elevation16: 'rgba(15, 23, 42, 0.14)',
+ },
+ },
+ themes: {
+ ...configBase.themes,
+ light: {
+ ...configBase.themes.light,
+ // ---- Legacy Tamagui keys (kept for backward compat) ----
+ background: '#ffffff',
+ backgroundHover: '#f3f4f6',
+ backgroundPress: '#e5e7eb',
+ backgroundFocus: '#eef4ff',
+ surface: '#ffffff',
+ surfaceVariant: '#f7f8fa',
+ accentBackground: '#dbeafe',
+ accentSurface: '#eef4ff',
+ accentColor: '#2563eb',
+ accentBorder: 'rgba(37, 99, 235, 0.28)',
+ accentHover: '#dbe6ff',
+ accentPress: '#c7d8ff',
+ color: '#0f172a',
+ colorHover: '#0f172a',
+ colorSecondary: '#475569',
+ colorDisabled: '#94a3b8',
+ borderColor: '#e5e7eb',
+ borderColorHover: '#cbd5e1',
+ // ---- Contract tokens ----
+ bgPage: '#f7f8fa',
+ bgPanel: '#ffffff',
+ bgPanelElev: '#ffffff',
+ bgInverse: '#0f172a',
+ scrim: 'rgba(15, 23, 42, 0.32)',
+ lineSubtle: '#e5e7eb',
+ lineStrong: '#cbd5e1',
+ textPrimary: '#0f172a',
+ textSecondary: '#475569',
+ textMuted: '#64748b',
+ textOnAccent: '#ffffff',
+ accent: '#2563eb',
+ accentBg: '#eef4ff',
+ accentBgHover: '#dbeafe',
+ danger: '#c5221f',
+ dangerBg: '#fdecea',
+ warning: '#bf6900',
+ warningBg: '#fdf3e2',
+ success: '#0f7b3a',
+ successBg: '#e6f4ea',
+ info: '#0078d4',
+ infoBg: '#deecf9',
+ },
+ dark: {
+ ...configBase.themes.dark,
+ // ---- Legacy keys ----
+ background: '#0b1220',
+ backgroundHover: '#111827',
+ backgroundPress: '#1f2937',
+ backgroundFocus: '#1e3a8a',
+ surface: '#111827',
+ surfaceVariant: '#1f2937',
+ accentBackground: '#1e3a8a',
+ accentSurface: '#1e293b',
+ accentColor: '#60a5fa',
+ accentBorder: 'rgba(96, 165, 250, 0.32)',
+ accentHover: '#243763',
+ accentPress: '#2a4079',
+ color: '#f1f5f9',
+ colorHover: '#f1f5f9',
+ colorSecondary: '#cbd5e1',
+ colorDisabled: '#64748b',
+ borderColor: '#1f2937',
+ borderColorHover: '#334155',
+ // ---- Contract tokens ----
+ bgPage: '#0b1220',
+ bgPanel: '#111827',
+ bgPanelElev: '#1f2937',
+ bgInverse: '#f1f5f9',
+ scrim: 'rgba(0, 0, 0, 0.6)',
+ lineSubtle: '#1f2937',
+ lineStrong: '#334155',
+ textPrimary: '#f1f5f9',
+ textSecondary: '#cbd5e1',
+ textMuted: '#94a3b8',
+ textOnAccent: '#0b1220',
+ accent: '#60a5fa',
+ accentBg: '#1e293b',
+ accentBgHover: '#1e3a8a',
+ danger: '#f87171',
+ dangerBg: 'rgba(248, 113, 113, 0.14)',
+ warning: '#fbbf24',
+ warningBg: 'rgba(251, 191, 36, 0.14)',
+ success: '#4ade80',
+ successBg: 'rgba(74, 222, 128, 0.14)',
+ info: '#60a5fa',
+ infoBg: 'rgba(96, 165, 250, 0.14)',
+ },
+ },
+ settings: {
+ ...configBase.settings,
+ styleCompat: 'web',
+ },
+};
+
+export default AzureTheme;
diff --git a/src/ui/styles/ColorfulTheme.js b/src/ui/styles/ColorfulTheme.js
index a242749..5f978f7 100644
--- a/src/ui/styles/ColorfulTheme.js
+++ b/src/ui/styles/ColorfulTheme.js
@@ -9,8 +9,23 @@ export const ColorfulTheme = {
...configBase,
name: 'colorful',
displayName: 'Colorful',
+ iconWeight: 'bold',
+ typography: {
+ fieldLabel: { fontSize: '$4', fontWeight: '600', color: '$textPrimary' },
+ detailLabel: { fontSize: '$4', fontWeight: '600', color: '$textPrimary' },
+ pageTitle: { fontSize: '$6', fontWeight: '700', color: '$textPrimary' },
+ panelTitle: { fontWeight: '600', color: '$textPrimary' },
+ tableHeader: { fontSize: '$4', fontWeight: '600', color: '$textSecondary' },
+ sectionTitle: { fontSize: '$6', fontWeight: '700', color: '$textPrimary' },
+ },
tokens: {
...configBase.tokens,
+ radius: {
+ ...configBase.tokens.radius,
+ radiusSm: 8,
+ radiusMd: 12,
+ radiusLg: 16,
+ },
// Colorful palette (vibrant colors)
color: {
...configBase.tokens.color,
@@ -90,6 +105,29 @@ export const ColorfulTheme = {
colorDisabled: '#94a3b8',
borderColor: '#cbd5e1',
borderColorHover: '#94a3b8',
+ // ---- Contract tokens (mapped to Colorful palette) ----
+ bgPage: '#f8fafc',
+ bgPanel: '#ffffff',
+ bgPanelElev: '#ffffff',
+ bgInverse: '#0f172a',
+ scrim: 'rgba(15, 23, 42, 0.45)',
+ lineSubtle: '#e2e8f0',
+ lineStrong: '#cbd5e1',
+ textPrimary: '#0f172a',
+ textSecondary: '#475569',
+ textMuted: '#94a3b8',
+ textOnAccent: '#ffffff',
+ accent: '#2563eb',
+ accentBg: '#eef4ff',
+ accentBgHover: '#dbeafe',
+ danger: '#ef4444',
+ dangerBg: '#fee2e2',
+ warning: '#f59e0b',
+ warningBg: '#fef3c7',
+ success: '#10b981',
+ successBg: '#d1fae5',
+ info: '#06b6d4',
+ infoBg: '#cffafe',
},
dark: {
...configBase.themes.dark,
@@ -111,6 +149,29 @@ export const ColorfulTheme = {
colorDisabled: '#64748b',
borderColor: '#334155',
borderColorHover: '#475569',
+ // ---- Contract tokens ----
+ bgPage: '#0f172a',
+ bgPanel: '#1e293b',
+ bgPanelElev: '#334155',
+ bgInverse: '#f1f5f9',
+ scrim: 'rgba(0, 0, 0, 0.6)',
+ lineSubtle: '#334155',
+ lineStrong: '#475569',
+ textPrimary: '#f1f5f9',
+ textSecondary: '#cbd5e1',
+ textMuted: '#64748b',
+ textOnAccent: '#0a1929',
+ accent: '#bfdbfe',
+ accentBg: '#1e3a8a',
+ accentBgHover: '#1d4ed8',
+ danger: '#fca5a5',
+ dangerBg: 'rgba(252, 165, 165, 0.14)',
+ warning: '#fbbf24',
+ warningBg: 'rgba(251, 191, 36, 0.14)',
+ success: '#6ee7b7',
+ successBg: 'rgba(110, 231, 183, 0.14)',
+ info: '#67e8f9',
+ infoBg: 'rgba(103, 232, 249, 0.14)',
},
},
settings: {
diff --git a/src/ui/styles/MaterialTheme.js b/src/ui/styles/MaterialTheme.js
index b9a126b..0d0a887 100644
--- a/src/ui/styles/MaterialTheme.js
+++ b/src/ui/styles/MaterialTheme.js
@@ -9,8 +9,24 @@ export const MaterialTheme = {
...configBase,
name: 'material',
displayName: 'Material Design',
+ // Preset-level metadata (consumed by IconMapper)
+ iconWeight: 'regular',
+ typography: {
+ fieldLabel: { fontSize: '$4', fontWeight: '500', color: '$textPrimary' },
+ detailLabel: { fontSize: '$4', fontWeight: '500', color: '$textPrimary' },
+ pageTitle: { fontSize: '$6', fontWeight: '500', color: '$textPrimary' },
+ panelTitle: { fontWeight: '500', color: '$textPrimary' },
+ tableHeader: { fontSize: '$4', fontWeight: '500', color: '$textSecondary' },
+ sectionTitle: { fontSize: '$6', fontWeight: '500', color: '$textPrimary' },
+ },
tokens: {
...configBase.tokens,
+ radius: {
+ ...configBase.tokens.radius,
+ radiusSm: 4,
+ radiusMd: 6,
+ radiusLg: 8,
+ },
// Material UI color palette (base tokens - theme-agnostic)
color: {
...configBase.tokens.color,
@@ -90,6 +106,29 @@ export const MaterialTheme = {
colorDisabled: 'rgba(0, 0, 0, 0.38)',
borderColor: 'rgba(0, 0, 0, 0.12)',
borderColorHover: 'rgba(0, 0, 0, 0.23)',
+ // ---- Contract tokens (mapped to Material palette) ----
+ bgPage: '#fafafa',
+ bgPanel: '#ffffff',
+ bgPanelElev: '#ffffff',
+ bgInverse: '#323232',
+ scrim: 'rgba(0, 0, 0, 0.32)',
+ lineSubtle: 'rgba(0, 0, 0, 0.12)',
+ lineStrong: 'rgba(0, 0, 0, 0.23)',
+ textPrimary: 'rgba(0, 0, 0, 0.87)',
+ textSecondary: 'rgba(0, 0, 0, 0.6)',
+ textMuted: 'rgba(0, 0, 0, 0.38)',
+ textOnAccent: '#ffffff',
+ accent: '#1976d2',
+ accentBg: '#f4f8ff',
+ accentBgHover: '#e3f2fd',
+ danger: '#d32f2f',
+ dangerBg: 'rgba(211, 47, 47, 0.08)',
+ warning: '#ed6c02',
+ warningBg: 'rgba(237, 108, 2, 0.08)',
+ success: '#2e7d32',
+ successBg: 'rgba(46, 125, 50, 0.08)',
+ info: '#0288d1',
+ infoBg: 'rgba(2, 136, 209, 0.08)',
},
dark: {
...configBase.themes.dark,
@@ -111,6 +150,29 @@ export const MaterialTheme = {
colorDisabled: 'rgba(255, 255, 255, 0.38)',
borderColor: 'rgba(255, 255, 255, 0.12)',
borderColorHover: 'rgba(255, 255, 255, 0.23)',
+ // ---- Contract tokens ----
+ bgPage: '#121212',
+ bgPanel: '#1e1e1e',
+ bgPanelElev: '#2c2c2c',
+ bgInverse: '#f0f0f0',
+ scrim: 'rgba(0, 0, 0, 0.6)',
+ lineSubtle: 'rgba(255, 255, 255, 0.12)',
+ lineStrong: 'rgba(255, 255, 255, 0.23)',
+ textPrimary: 'rgba(255, 255, 255, 0.87)',
+ textSecondary: 'rgba(255, 255, 255, 0.6)',
+ textMuted: 'rgba(255, 255, 255, 0.38)',
+ textOnAccent: '#0a1929',
+ accent: '#90caf9',
+ accentBg: '#1b3c5b',
+ accentBgHover: '#17324d',
+ danger: '#ef9a9a',
+ dangerBg: 'rgba(239, 154, 154, 0.12)',
+ warning: '#ffb74d',
+ warningBg: 'rgba(255, 183, 77, 0.12)',
+ success: '#81c784',
+ successBg: 'rgba(129, 199, 132, 0.12)',
+ info: '#4fc3f7',
+ infoBg: 'rgba(79, 195, 247, 0.12)',
},
},
settings: {
diff --git a/src/ui/styles/MinimalTheme.js b/src/ui/styles/MinimalTheme.js
index 1a934f1..840c7e6 100644
--- a/src/ui/styles/MinimalTheme.js
+++ b/src/ui/styles/MinimalTheme.js
@@ -9,8 +9,23 @@ export const MinimalTheme = {
...configBase,
name: 'minimal',
displayName: 'Minimal',
+ iconWeight: 'light',
+ typography: {
+ fieldLabel: { fontSize: '$4', fontWeight: '500', color: '$textPrimary' },
+ detailLabel: { fontSize: '$4', fontWeight: '500', color: '$textPrimary' },
+ pageTitle: { fontSize: '$6', fontWeight: '600', color: '$textPrimary' },
+ panelTitle: { fontWeight: '500', color: '$textPrimary' },
+ tableHeader: { fontSize: '$4', fontWeight: '500', color: '$textSecondary' },
+ sectionTitle: { fontSize: '$6', fontWeight: '600', color: '$textPrimary' },
+ },
tokens: {
...configBase.tokens,
+ radius: {
+ ...configBase.tokens.radius,
+ radiusSm: 2,
+ radiusMd: 4,
+ radiusLg: 6,
+ },
// Minimal color palette (neutral, monochromatic)
color: {
...configBase.tokens.color,
@@ -90,6 +105,29 @@ export const MinimalTheme = {
colorDisabled: '#a0aec0',
borderColor: '#e2e8f0',
borderColorHover: '#cbd5e0',
+ // ---- Contract tokens (mapped to Minimal palette) ----
+ bgPage: '#fafafa',
+ bgPanel: '#ffffff',
+ bgPanelElev: '#ffffff',
+ bgInverse: '#1a202c',
+ scrim: 'rgba(26, 32, 44, 0.42)',
+ lineSubtle: '#e2e8f0',
+ lineStrong: '#cbd5e0',
+ textPrimary: '#1a202c',
+ textSecondary: '#4a5568',
+ textMuted: '#a0aec0',
+ textOnAccent: '#ffffff',
+ accent: '#4f46e5',
+ accentBg: '#f5f7fb',
+ accentBgHover: '#eceff4',
+ danger: '#e53e3e',
+ dangerBg: 'rgba(229, 62, 62, 0.08)',
+ warning: '#dd6b20',
+ warningBg: 'rgba(221, 107, 32, 0.08)',
+ success: '#38a169',
+ successBg: 'rgba(56, 161, 105, 0.08)',
+ info: '#3182ce',
+ infoBg: 'rgba(49, 130, 206, 0.08)',
},
dark: {
...configBase.themes.dark,
@@ -111,6 +149,29 @@ export const MinimalTheme = {
colorDisabled: '#718096',
borderColor: '#2d3748',
borderColorHover: '#4a5568',
+ // ---- Contract tokens ----
+ bgPage: '#0f1419',
+ bgPanel: '#1a202c',
+ bgPanelElev: '#2d3748',
+ bgInverse: '#f7fafc',
+ scrim: 'rgba(0, 0, 0, 0.6)',
+ lineSubtle: '#2d3748',
+ lineStrong: '#4a5568',
+ textPrimary: '#f7fafc',
+ textSecondary: '#cbd5e0',
+ textMuted: '#718096',
+ textOnAccent: '#0f1419',
+ accent: '#c7d2fe',
+ accentBg: '#333f5d',
+ accentBgHover: '#2c3650',
+ danger: '#feb2b2',
+ dangerBg: 'rgba(254, 178, 178, 0.12)',
+ warning: '#fbd38d',
+ warningBg: 'rgba(251, 211, 141, 0.12)',
+ success: '#9ae6b4',
+ successBg: 'rgba(154, 230, 180, 0.12)',
+ info: '#90cdf4',
+ infoBg: 'rgba(144, 205, 244, 0.12)',
},
},
settings: {
diff --git a/src/ui/styles/index.js b/src/ui/styles/index.js
index 0df46df..12d92ba 100644
--- a/src/ui/styles/index.js
+++ b/src/ui/styles/index.js
@@ -1,19 +1,202 @@
/**
* Style Themes Index
- * Exports all available style themes
+ * Exports all available style themes and the semantic token contract.
+ *
+ * ============================================================================
+ * SEMANTIC TOKEN CONTRACT
+ * ============================================================================
+ * Every style theme MUST expose this set of tokens in `themes.light` and
+ * `themes.dark`. Component code should read ONLY these contract tokens —
+ * never raw colors, and never interaction tokens (`$accentSurface`,
+ * `$backgroundHover`, etc.) for static surfaces.
+ *
+ * Surfaces
+ * --------
+ * bgPage page background (subtly off-white in light)
+ * bgPanel card / panel surface (usually pure white in light)
+ * bgPanelElev raised panel (shadow OR slightly different bg)
+ * bgInverse inverted surface (toasts, popovers on dark)
+ * scrim modal/drawer overlay (semi-transparent backdrop)
+ *
+ * Lines
+ * -----
+ * lineSubtle panel borders, hairline (~6-10% black equivalent)
+ * lineStrong separators, dividers (~14-20% black equivalent)
+ *
+ * Text
+ * ----
+ * textPrimary body text (high contrast)
+ * textSecondary supporting text (medium contrast)
+ * textMuted hints, disabled, captions (low contrast)
+ * textOnAccent text on accent-colored backgrounds (usually white)
+ *
+ * Accent
+ * ------
+ * accent brand / primary action color
+ * accentBg ~6% accent tint (selected backgrounds)
+ * accentBgHover ~12% accent tint
+ * accentBorder accent-colored border
+ *
+ * Status (each + Bg variant)
+ * --------------------------
+ * danger / dangerBg
+ * warning / warningBg
+ * success / successBg
+ * info / infoBg
+ *
+ * Radii (preset overrides via tokens.radius)
+ * ------------------------------------------
+ * radiusSm tight controls (4-8)
+ * radiusMd cards, inputs (6-12)
+ * radiusLg large containers (8-16)
+ *
+ * Font weights (preset overrides via tokens.weight)
+ * -------------------------------------------------
+ * weightRegular 400
+ * weightMedium 500
+ * weightSemibold 600
+ * weightBold 700
+ *
+ * Preset-level metadata (NOT theme tokens — top-level preset properties)
+ * -----------------------------------------------------------------------
+ * iconWeight Phosphor weight: 'thin' | 'light' | 'regular' |
+ * 'bold' | 'fill' | 'duotone'
+ *
+ * Typography roles (preset-level contract)
+ * ----------------------------------------
+ * typography.fieldLabel
+ * typography.detailLabel
+ * typography.pageTitle
+ * typography.panelTitle
+ * typography.tableHeader
+ * typography.sectionTitle
+ * ============================================================================
*/
import { MaterialTheme } from './MaterialTheme.js';
import { MinimalTheme } from './MinimalTheme.js';
import { ColorfulTheme } from './ColorfulTheme.js';
+import { AzureTheme } from './AzureTheme.js';
+import { AppleTheme } from './AppleTheme.js';
+
+/**
+ * Theme keys that every preset MUST define in both light and dark variants.
+ * Used by `validateStyleTheme` for diagnostics.
+ */
+export const CONTRACT_KEYS = Object.freeze([
+ // surfaces
+ 'bgPage', 'bgPanel', 'bgPanelElev', 'bgInverse', 'scrim',
+ // lines
+ 'lineSubtle', 'lineStrong',
+ // text
+ 'textPrimary', 'textSecondary', 'textMuted', 'textOnAccent',
+ // accent
+ 'accent', 'accentBg', 'accentBgHover', 'accentBorder',
+ // status
+ 'danger', 'dangerBg',
+ 'warning', 'warningBg',
+ 'success', 'successBg',
+ 'info', 'infoBg',
+]);
+
+/**
+ * Valid Phosphor icon weights.
+ */
+export const ICON_WEIGHTS = Object.freeze([
+ 'thin', 'light', 'regular', 'bold', 'fill', 'duotone',
+]);
export const STYLE_THEMES = {
+ azure: AzureTheme,
+ apple: AppleTheme,
material: MaterialTheme,
minimal: MinimalTheme,
colorful: ColorfulTheme,
};
-export const DEFAULT_STYLE_THEME = 'material';
+export const DEFAULT_STYLE_THEME = 'azure';
+
+export const TYPOGRAPHY_ROLE_KEYS = Object.freeze([
+ 'fieldLabel',
+ 'detailLabel',
+ 'pageTitle',
+ 'panelTitle',
+ 'tableHeader',
+ 'sectionTitle',
+]);
+
+const DEFAULT_TYPOGRAPHY_ROLES = Object.freeze({
+ fieldLabel: Object.freeze({
+ fontSize: '$4',
+ fontWeight: '500',
+ color: '$textPrimary',
+ }),
+ detailLabel: Object.freeze({
+ fontSize: '$4',
+ fontWeight: '500',
+ color: '$textPrimary',
+ }),
+ pageTitle: Object.freeze({
+ fontSize: '$6',
+ fontWeight: '600',
+ color: '$textPrimary',
+ }),
+ panelTitle: Object.freeze({
+ fontWeight: '600',
+ color: '$textPrimary',
+ }),
+ tableHeader: Object.freeze({
+ fontSize: '$4',
+ fontWeight: '600',
+ color: '$textSecondary',
+ }),
+ sectionTitle: Object.freeze({
+ fontSize: '$6',
+ fontWeight: '600',
+ color: '$textPrimary',
+ }),
+});
+
+let activeStyleThemeName = DEFAULT_STYLE_THEME;
+
+/**
+ * Validate that a preset implements the contract.
+ * Logs a warning per missing key per variant; never throws.
+ * Useful while authoring presets — silent in production.
+ * @param {Object} preset
+ * @returns {{ ok: boolean, missing: string[] }}
+ */
+export function validateStyleTheme(preset) {
+ if (!preset || !preset.themes) {
+ return { ok: false, missing: ['themes'] };
+ }
+ const missing = [];
+ for (const variant of ['light', 'dark']) {
+ const theme = preset.themes[variant];
+ if (!theme) {
+ missing.push(`themes.${variant}`);
+ continue;
+ }
+ for (const key of CONTRACT_KEYS) {
+ if (theme[key] == null) {
+ missing.push(`themes.${variant}.${key}`);
+ }
+ }
+ }
+ if (!preset.typography) {
+ missing.push('typography');
+ } else {
+ for (const key of TYPOGRAPHY_ROLE_KEYS) {
+ if (!preset.typography[key]) {
+ missing.push(`typography.${key}`);
+ }
+ }
+ }
+ if (missing.length && typeof console !== 'undefined') {
+ console.warn(`[styles] Preset "${preset.name || 'unknown'}" is missing contract tokens:`, missing);
+ }
+ return { ok: missing.length === 0, missing };
+}
/**
* Map arbitrary input (storage, profile, UI) to a registered style theme id.
@@ -30,8 +213,8 @@ export function normalizeStyleThemeName(name) {
}
/**
- * Get a style theme by name
- * @param {string} themeName - Theme name ('material', 'minimal', 'colorful')
+ * Get a style theme by name.
+ * @param {string} themeName - Theme name ('azure', 'apple', 'material', 'minimal', 'colorful')
* @returns {Object} Theme configuration
*/
export function getStyleTheme(themeName = DEFAULT_STYLE_THEME) {
@@ -39,13 +222,52 @@ export function getStyleTheme(themeName = DEFAULT_STYLE_THEME) {
return STYLE_THEMES[key];
}
+export function setActiveStyleThemeName(themeName) {
+ activeStyleThemeName = normalizeStyleThemeName(themeName);
+ return activeStyleThemeName;
+}
+
+export function getActiveStyleThemeName() {
+ return activeStyleThemeName;
+}
+
+export function getStyleTypography(themeName = activeStyleThemeName) {
+ const preset = getStyleTheme(themeName);
+ const typography = preset?.typography || {};
+ const resolved = {};
+ for (const key of TYPOGRAPHY_ROLE_KEYS) {
+ resolved[key] = {
+ ...(DEFAULT_TYPOGRAPHY_ROLES[key] || {}),
+ ...(typography[key] || {}),
+ };
+ }
+ return resolved;
+}
+
+export function getTypographyRoleProps(role, overrides = null, themeName = activeStyleThemeName) {
+ const typography = getStyleTypography(themeName);
+ const base = typography[role] || {};
+ return overrides ? { ...base, ...overrides } : { ...base };
+}
+
/**
- * Get all available style theme names
+ * Get all available style theme names.
* @returns {string[]} Array of theme names
*/
export function getStyleThemeNames() {
return Object.keys(STYLE_THEMES);
}
-export { MaterialTheme, MinimalTheme, ColorfulTheme };
+/**
+ * Get the active preset's icon weight (for Phosphor).
+ * Falls back to 'regular'.
+ * @param {string} [themeName]
+ * @returns {string}
+ */
+export function getIconWeight(themeName = DEFAULT_STYLE_THEME) {
+ const preset = getStyleTheme(themeName);
+ const weight = preset?.iconWeight;
+ return ICON_WEIGHTS.includes(weight) ? weight : 'regular';
+}
+export { MaterialTheme, MinimalTheme, ColorfulTheme, AzureTheme, AppleTheme };