Ryan Christian D. Deniega Claude Sonnet 4.6 commited on
Commit
a0f748d
·
1 Parent(s): 28ffef1

refactor: remove Firebase dependency — use REST API for history

Browse files

Firestore was only used in HistoryPage for real-time updates.
Replaced with simple 30s polling via existing REST /history endpoint.
Removes firebase SDK (-256KB bundle), firebase.js, and all Firestore
references. Stack is now just Vercel (frontend) + HuggingFace (backend).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

frontend/package-lock.json CHANGED
@@ -10,7 +10,6 @@
10
  "dependencies": {
11
  "@tailwindcss/vite": "^4.2.1",
12
  "clsx": "^2.1.1",
13
- "firebase": "^12.9.0",
14
  "lucide-react": "^0.575.0",
15
  "react": "^19.2.0",
16
  "react-dom": "^19.2.0",
@@ -886,645 +885,6 @@
886
  "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
887
  }
888
  },
889
- "node_modules/@firebase/ai": {
890
- "version": "2.8.0",
891
- "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-2.8.0.tgz",
892
- "integrity": "sha512-grWYGFPsSo+pt+6CYeKR0kWnUfoLLS3xgWPvNrhAS5EPxl6xWq7+HjDZqX24yLneETyl45AVgDsTbVgxeWeRfg==",
893
- "license": "Apache-2.0",
894
- "dependencies": {
895
- "@firebase/app-check-interop-types": "0.3.3",
896
- "@firebase/component": "0.7.0",
897
- "@firebase/logger": "0.5.0",
898
- "@firebase/util": "1.13.0",
899
- "tslib": "^2.1.0"
900
- },
901
- "engines": {
902
- "node": ">=20.0.0"
903
- },
904
- "peerDependencies": {
905
- "@firebase/app": "0.x",
906
- "@firebase/app-types": "0.x"
907
- }
908
- },
909
- "node_modules/@firebase/analytics": {
910
- "version": "0.10.19",
911
- "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.19.tgz",
912
- "integrity": "sha512-3wU676fh60gaiVYQEEXsbGS4HbF2XsiBphyvvqDbtC1U4/dO4coshbYktcCHq+HFaGIK07iHOh4pME0hEq1fcg==",
913
- "license": "Apache-2.0",
914
- "dependencies": {
915
- "@firebase/component": "0.7.0",
916
- "@firebase/installations": "0.6.19",
917
- "@firebase/logger": "0.5.0",
918
- "@firebase/util": "1.13.0",
919
- "tslib": "^2.1.0"
920
- },
921
- "peerDependencies": {
922
- "@firebase/app": "0.x"
923
- }
924
- },
925
- "node_modules/@firebase/analytics-compat": {
926
- "version": "0.2.25",
927
- "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.25.tgz",
928
- "integrity": "sha512-fdzoaG0BEKbqksRDhmf4JoyZf16Wosrl0Y7tbZtJyVDOOwziE0vrFjmZuTdviL0yhak+Nco6rMsUUbkbD+qb6Q==",
929
- "license": "Apache-2.0",
930
- "dependencies": {
931
- "@firebase/analytics": "0.10.19",
932
- "@firebase/analytics-types": "0.8.3",
933
- "@firebase/component": "0.7.0",
934
- "@firebase/util": "1.13.0",
935
- "tslib": "^2.1.0"
936
- },
937
- "peerDependencies": {
938
- "@firebase/app-compat": "0.x"
939
- }
940
- },
941
- "node_modules/@firebase/analytics-types": {
942
- "version": "0.8.3",
943
- "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.3.tgz",
944
- "integrity": "sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==",
945
- "license": "Apache-2.0"
946
- },
947
- "node_modules/@firebase/app": {
948
- "version": "0.14.8",
949
- "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.8.tgz",
950
- "integrity": "sha512-WiE9uCGRLUnShdjb9iP20sA3ToWrBbNXr14/N5mow7Nls9dmKgfGaGX5cynLvrltxq2OrDLh1VDNaUgsnS/k/g==",
951
- "license": "Apache-2.0",
952
- "dependencies": {
953
- "@firebase/component": "0.7.0",
954
- "@firebase/logger": "0.5.0",
955
- "@firebase/util": "1.13.0",
956
- "idb": "7.1.1",
957
- "tslib": "^2.1.0"
958
- },
959
- "engines": {
960
- "node": ">=20.0.0"
961
- }
962
- },
963
- "node_modules/@firebase/app-check": {
964
- "version": "0.11.0",
965
- "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.11.0.tgz",
966
- "integrity": "sha512-XAvALQayUMBJo58U/rxW02IhsesaxxfWVmVkauZvGEz3vOAjMEQnzFlyblqkc2iAaO82uJ2ZVyZv9XzPfxjJ6w==",
967
- "license": "Apache-2.0",
968
- "dependencies": {
969
- "@firebase/component": "0.7.0",
970
- "@firebase/logger": "0.5.0",
971
- "@firebase/util": "1.13.0",
972
- "tslib": "^2.1.0"
973
- },
974
- "engines": {
975
- "node": ">=20.0.0"
976
- },
977
- "peerDependencies": {
978
- "@firebase/app": "0.x"
979
- }
980
- },
981
- "node_modules/@firebase/app-check-compat": {
982
- "version": "0.4.0",
983
- "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.4.0.tgz",
984
- "integrity": "sha512-UfK2Q8RJNjYM/8MFORltZRG9lJj11k0nW84rrffiKvcJxLf1jf6IEjCIkCamykHE73C6BwqhVfhIBs69GXQV0g==",
985
- "license": "Apache-2.0",
986
- "dependencies": {
987
- "@firebase/app-check": "0.11.0",
988
- "@firebase/app-check-types": "0.5.3",
989
- "@firebase/component": "0.7.0",
990
- "@firebase/logger": "0.5.0",
991
- "@firebase/util": "1.13.0",
992
- "tslib": "^2.1.0"
993
- },
994
- "engines": {
995
- "node": ">=20.0.0"
996
- },
997
- "peerDependencies": {
998
- "@firebase/app-compat": "0.x"
999
- }
1000
- },
1001
- "node_modules/@firebase/app-check-interop-types": {
1002
- "version": "0.3.3",
1003
- "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz",
1004
- "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==",
1005
- "license": "Apache-2.0"
1006
- },
1007
- "node_modules/@firebase/app-check-types": {
1008
- "version": "0.5.3",
1009
- "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.3.tgz",
1010
- "integrity": "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==",
1011
- "license": "Apache-2.0"
1012
- },
1013
- "node_modules/@firebase/app-compat": {
1014
- "version": "0.5.8",
1015
- "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.5.8.tgz",
1016
- "integrity": "sha512-4De6SUZ36zozl9kh5rZSxKWULpgty27rMzZ6x+xkoo7+NWyhWyFdsdvhFsWhTw/9GGj0wXIcbTjwHYCUIUuHyg==",
1017
- "license": "Apache-2.0",
1018
- "dependencies": {
1019
- "@firebase/app": "0.14.8",
1020
- "@firebase/component": "0.7.0",
1021
- "@firebase/logger": "0.5.0",
1022
- "@firebase/util": "1.13.0",
1023
- "tslib": "^2.1.0"
1024
- },
1025
- "engines": {
1026
- "node": ">=20.0.0"
1027
- }
1028
- },
1029
- "node_modules/@firebase/app-types": {
1030
- "version": "0.9.3",
1031
- "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz",
1032
- "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==",
1033
- "license": "Apache-2.0"
1034
- },
1035
- "node_modules/@firebase/auth": {
1036
- "version": "1.12.0",
1037
- "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.12.0.tgz",
1038
- "integrity": "sha512-zkvLpsrxynWHk07qGrUDfCSqKf4AvfZGEqJ7mVCtYGjNNDbGE71k0Yn84rg8QEZu4hQw1BC0qDEHzpNVBcSVmA==",
1039
- "license": "Apache-2.0",
1040
- "dependencies": {
1041
- "@firebase/component": "0.7.0",
1042
- "@firebase/logger": "0.5.0",
1043
- "@firebase/util": "1.13.0",
1044
- "tslib": "^2.1.0"
1045
- },
1046
- "engines": {
1047
- "node": ">=20.0.0"
1048
- },
1049
- "peerDependencies": {
1050
- "@firebase/app": "0.x",
1051
- "@react-native-async-storage/async-storage": "^2.2.0"
1052
- },
1053
- "peerDependenciesMeta": {
1054
- "@react-native-async-storage/async-storage": {
1055
- "optional": true
1056
- }
1057
- }
1058
- },
1059
- "node_modules/@firebase/auth-compat": {
1060
- "version": "0.6.2",
1061
- "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.6.2.tgz",
1062
- "integrity": "sha512-8UhCzF6pav9bw/eXA8Zy1QAKssPRYEYXaWagie1ewLTwHkXv6bKp/j6/IwzSYQP67sy/BMFXIFaCCsoXzFLr7A==",
1063
- "license": "Apache-2.0",
1064
- "dependencies": {
1065
- "@firebase/auth": "1.12.0",
1066
- "@firebase/auth-types": "0.13.0",
1067
- "@firebase/component": "0.7.0",
1068
- "@firebase/util": "1.13.0",
1069
- "tslib": "^2.1.0"
1070
- },
1071
- "engines": {
1072
- "node": ">=20.0.0"
1073
- },
1074
- "peerDependencies": {
1075
- "@firebase/app-compat": "0.x"
1076
- }
1077
- },
1078
- "node_modules/@firebase/auth-interop-types": {
1079
- "version": "0.2.4",
1080
- "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz",
1081
- "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==",
1082
- "license": "Apache-2.0"
1083
- },
1084
- "node_modules/@firebase/auth-types": {
1085
- "version": "0.13.0",
1086
- "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.0.tgz",
1087
- "integrity": "sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==",
1088
- "license": "Apache-2.0",
1089
- "peerDependencies": {
1090
- "@firebase/app-types": "0.x",
1091
- "@firebase/util": "1.x"
1092
- }
1093
- },
1094
- "node_modules/@firebase/component": {
1095
- "version": "0.7.0",
1096
- "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.0.tgz",
1097
- "integrity": "sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==",
1098
- "license": "Apache-2.0",
1099
- "dependencies": {
1100
- "@firebase/util": "1.13.0",
1101
- "tslib": "^2.1.0"
1102
- },
1103
- "engines": {
1104
- "node": ">=20.0.0"
1105
- }
1106
- },
1107
- "node_modules/@firebase/data-connect": {
1108
- "version": "0.3.12",
1109
- "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.3.12.tgz",
1110
- "integrity": "sha512-baPddcoNLj/+vYo+HSJidJUdr5W4OkhT109c5qhR8T1dJoZcyJpkv/dFpYlw/VJ3dV66vI8GHQFrmAZw/xUS4g==",
1111
- "license": "Apache-2.0",
1112
- "dependencies": {
1113
- "@firebase/auth-interop-types": "0.2.4",
1114
- "@firebase/component": "0.7.0",
1115
- "@firebase/logger": "0.5.0",
1116
- "@firebase/util": "1.13.0",
1117
- "tslib": "^2.1.0"
1118
- },
1119
- "peerDependencies": {
1120
- "@firebase/app": "0.x"
1121
- }
1122
- },
1123
- "node_modules/@firebase/database": {
1124
- "version": "1.1.0",
1125
- "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.0.tgz",
1126
- "integrity": "sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==",
1127
- "license": "Apache-2.0",
1128
- "dependencies": {
1129
- "@firebase/app-check-interop-types": "0.3.3",
1130
- "@firebase/auth-interop-types": "0.2.4",
1131
- "@firebase/component": "0.7.0",
1132
- "@firebase/logger": "0.5.0",
1133
- "@firebase/util": "1.13.0",
1134
- "faye-websocket": "0.11.4",
1135
- "tslib": "^2.1.0"
1136
- },
1137
- "engines": {
1138
- "node": ">=20.0.0"
1139
- }
1140
- },
1141
- "node_modules/@firebase/database-compat": {
1142
- "version": "2.1.0",
1143
- "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.0.tgz",
1144
- "integrity": "sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==",
1145
- "license": "Apache-2.0",
1146
- "dependencies": {
1147
- "@firebase/component": "0.7.0",
1148
- "@firebase/database": "1.1.0",
1149
- "@firebase/database-types": "1.0.16",
1150
- "@firebase/logger": "0.5.0",
1151
- "@firebase/util": "1.13.0",
1152
- "tslib": "^2.1.0"
1153
- },
1154
- "engines": {
1155
- "node": ">=20.0.0"
1156
- }
1157
- },
1158
- "node_modules/@firebase/database-types": {
1159
- "version": "1.0.16",
1160
- "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.16.tgz",
1161
- "integrity": "sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==",
1162
- "license": "Apache-2.0",
1163
- "dependencies": {
1164
- "@firebase/app-types": "0.9.3",
1165
- "@firebase/util": "1.13.0"
1166
- }
1167
- },
1168
- "node_modules/@firebase/firestore": {
1169
- "version": "4.11.0",
1170
- "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.11.0.tgz",
1171
- "integrity": "sha512-Zb88s8rssBd0J2Tt+NUXMPt2sf+Dq7meatKiJf5t9oto1kZ8w9gK59Koe1uPVbaKfdgBp++N/z0I4G/HamyEhg==",
1172
- "license": "Apache-2.0",
1173
- "dependencies": {
1174
- "@firebase/component": "0.7.0",
1175
- "@firebase/logger": "0.5.0",
1176
- "@firebase/util": "1.13.0",
1177
- "@firebase/webchannel-wrapper": "1.0.5",
1178
- "@grpc/grpc-js": "~1.9.0",
1179
- "@grpc/proto-loader": "^0.7.8",
1180
- "tslib": "^2.1.0"
1181
- },
1182
- "engines": {
1183
- "node": ">=20.0.0"
1184
- },
1185
- "peerDependencies": {
1186
- "@firebase/app": "0.x"
1187
- }
1188
- },
1189
- "node_modules/@firebase/firestore-compat": {
1190
- "version": "0.4.5",
1191
- "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.4.5.tgz",
1192
- "integrity": "sha512-yVX1CkVvqBI4qbA56uZo42xFA4TNU0ICQ+9AFDvYq9U9Xu6iAx9lFDAk/tN+NGereQQXXCSnpISwc/oxsQqPLA==",
1193
- "license": "Apache-2.0",
1194
- "dependencies": {
1195
- "@firebase/component": "0.7.0",
1196
- "@firebase/firestore": "4.11.0",
1197
- "@firebase/firestore-types": "3.0.3",
1198
- "@firebase/util": "1.13.0",
1199
- "tslib": "^2.1.0"
1200
- },
1201
- "engines": {
1202
- "node": ">=20.0.0"
1203
- },
1204
- "peerDependencies": {
1205
- "@firebase/app-compat": "0.x"
1206
- }
1207
- },
1208
- "node_modules/@firebase/firestore-types": {
1209
- "version": "3.0.3",
1210
- "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.3.tgz",
1211
- "integrity": "sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==",
1212
- "license": "Apache-2.0",
1213
- "peerDependencies": {
1214
- "@firebase/app-types": "0.x",
1215
- "@firebase/util": "1.x"
1216
- }
1217
- },
1218
- "node_modules/@firebase/functions": {
1219
- "version": "0.13.1",
1220
- "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.13.1.tgz",
1221
- "integrity": "sha512-sUeWSb0rw5T+6wuV2o9XNmh9yHxjFI9zVGFnjFi+n7drTEWpl7ZTz1nROgGrSu472r+LAaj+2YaSicD4R8wfbw==",
1222
- "license": "Apache-2.0",
1223
- "dependencies": {
1224
- "@firebase/app-check-interop-types": "0.3.3",
1225
- "@firebase/auth-interop-types": "0.2.4",
1226
- "@firebase/component": "0.7.0",
1227
- "@firebase/messaging-interop-types": "0.2.3",
1228
- "@firebase/util": "1.13.0",
1229
- "tslib": "^2.1.0"
1230
- },
1231
- "engines": {
1232
- "node": ">=20.0.0"
1233
- },
1234
- "peerDependencies": {
1235
- "@firebase/app": "0.x"
1236
- }
1237
- },
1238
- "node_modules/@firebase/functions-compat": {
1239
- "version": "0.4.1",
1240
- "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.4.1.tgz",
1241
- "integrity": "sha512-AxxUBXKuPrWaVNQ8o1cG1GaCAtXT8a0eaTDfqgS5VsRYLAR0ALcfqDLwo/QyijZj1w8Qf8n3Qrfy/+Im245hOQ==",
1242
- "license": "Apache-2.0",
1243
- "dependencies": {
1244
- "@firebase/component": "0.7.0",
1245
- "@firebase/functions": "0.13.1",
1246
- "@firebase/functions-types": "0.6.3",
1247
- "@firebase/util": "1.13.0",
1248
- "tslib": "^2.1.0"
1249
- },
1250
- "engines": {
1251
- "node": ">=20.0.0"
1252
- },
1253
- "peerDependencies": {
1254
- "@firebase/app-compat": "0.x"
1255
- }
1256
- },
1257
- "node_modules/@firebase/functions-types": {
1258
- "version": "0.6.3",
1259
- "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.3.tgz",
1260
- "integrity": "sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==",
1261
- "license": "Apache-2.0"
1262
- },
1263
- "node_modules/@firebase/installations": {
1264
- "version": "0.6.19",
1265
- "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.19.tgz",
1266
- "integrity": "sha512-nGDmiwKLI1lerhwfwSHvMR9RZuIH5/8E3kgUWnVRqqL7kGVSktjLTWEMva7oh5yxQ3zXfIlIwJwMcaM5bK5j8Q==",
1267
- "license": "Apache-2.0",
1268
- "dependencies": {
1269
- "@firebase/component": "0.7.0",
1270
- "@firebase/util": "1.13.0",
1271
- "idb": "7.1.1",
1272
- "tslib": "^2.1.0"
1273
- },
1274
- "peerDependencies": {
1275
- "@firebase/app": "0.x"
1276
- }
1277
- },
1278
- "node_modules/@firebase/installations-compat": {
1279
- "version": "0.2.19",
1280
- "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.19.tgz",
1281
- "integrity": "sha512-khfzIY3EI5LePePo7vT19/VEIH1E3iYsHknI/6ek9T8QCozAZshWT9CjlwOzZrKvTHMeNcbpo/VSOSIWDSjWdQ==",
1282
- "license": "Apache-2.0",
1283
- "dependencies": {
1284
- "@firebase/component": "0.7.0",
1285
- "@firebase/installations": "0.6.19",
1286
- "@firebase/installations-types": "0.5.3",
1287
- "@firebase/util": "1.13.0",
1288
- "tslib": "^2.1.0"
1289
- },
1290
- "peerDependencies": {
1291
- "@firebase/app-compat": "0.x"
1292
- }
1293
- },
1294
- "node_modules/@firebase/installations-types": {
1295
- "version": "0.5.3",
1296
- "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.3.tgz",
1297
- "integrity": "sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==",
1298
- "license": "Apache-2.0",
1299
- "peerDependencies": {
1300
- "@firebase/app-types": "0.x"
1301
- }
1302
- },
1303
- "node_modules/@firebase/logger": {
1304
- "version": "0.5.0",
1305
- "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.0.tgz",
1306
- "integrity": "sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==",
1307
- "license": "Apache-2.0",
1308
- "dependencies": {
1309
- "tslib": "^2.1.0"
1310
- },
1311
- "engines": {
1312
- "node": ">=20.0.0"
1313
- }
1314
- },
1315
- "node_modules/@firebase/messaging": {
1316
- "version": "0.12.23",
1317
- "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.23.tgz",
1318
- "integrity": "sha512-cfuzv47XxqW4HH/OcR5rM+AlQd1xL/VhuaeW/wzMW1LFrsFcTn0GND/hak1vkQc2th8UisBcrkVcQAnOnKwYxg==",
1319
- "license": "Apache-2.0",
1320
- "dependencies": {
1321
- "@firebase/component": "0.7.0",
1322
- "@firebase/installations": "0.6.19",
1323
- "@firebase/messaging-interop-types": "0.2.3",
1324
- "@firebase/util": "1.13.0",
1325
- "idb": "7.1.1",
1326
- "tslib": "^2.1.0"
1327
- },
1328
- "peerDependencies": {
1329
- "@firebase/app": "0.x"
1330
- }
1331
- },
1332
- "node_modules/@firebase/messaging-compat": {
1333
- "version": "0.2.23",
1334
- "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.23.tgz",
1335
- "integrity": "sha512-SN857v/kBUvlQ9X/UjAqBoQ2FEaL1ZozpnmL1ByTe57iXkmnVVFm9KqAsTfmf+OEwWI4kJJe9NObtN/w22lUgg==",
1336
- "license": "Apache-2.0",
1337
- "dependencies": {
1338
- "@firebase/component": "0.7.0",
1339
- "@firebase/messaging": "0.12.23",
1340
- "@firebase/util": "1.13.0",
1341
- "tslib": "^2.1.0"
1342
- },
1343
- "peerDependencies": {
1344
- "@firebase/app-compat": "0.x"
1345
- }
1346
- },
1347
- "node_modules/@firebase/messaging-interop-types": {
1348
- "version": "0.2.3",
1349
- "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.3.tgz",
1350
- "integrity": "sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==",
1351
- "license": "Apache-2.0"
1352
- },
1353
- "node_modules/@firebase/performance": {
1354
- "version": "0.7.9",
1355
- "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.9.tgz",
1356
- "integrity": "sha512-UzybENl1EdM2I1sjYm74xGt/0JzRnU/0VmfMAKo2LSpHJzaj77FCLZXmYQ4oOuE+Pxtt8Wy2BVJEENiZkaZAzQ==",
1357
- "license": "Apache-2.0",
1358
- "dependencies": {
1359
- "@firebase/component": "0.7.0",
1360
- "@firebase/installations": "0.6.19",
1361
- "@firebase/logger": "0.5.0",
1362
- "@firebase/util": "1.13.0",
1363
- "tslib": "^2.1.0",
1364
- "web-vitals": "^4.2.4"
1365
- },
1366
- "peerDependencies": {
1367
- "@firebase/app": "0.x"
1368
- }
1369
- },
1370
- "node_modules/@firebase/performance-compat": {
1371
- "version": "0.2.22",
1372
- "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.22.tgz",
1373
- "integrity": "sha512-xLKxaSAl/FVi10wDX/CHIYEUP13jXUjinL+UaNXT9ByIvxII5Ne5150mx6IgM8G6Q3V+sPiw9C8/kygkyHUVxg==",
1374
- "license": "Apache-2.0",
1375
- "dependencies": {
1376
- "@firebase/component": "0.7.0",
1377
- "@firebase/logger": "0.5.0",
1378
- "@firebase/performance": "0.7.9",
1379
- "@firebase/performance-types": "0.2.3",
1380
- "@firebase/util": "1.13.0",
1381
- "tslib": "^2.1.0"
1382
- },
1383
- "peerDependencies": {
1384
- "@firebase/app-compat": "0.x"
1385
- }
1386
- },
1387
- "node_modules/@firebase/performance-types": {
1388
- "version": "0.2.3",
1389
- "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.3.tgz",
1390
- "integrity": "sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==",
1391
- "license": "Apache-2.0"
1392
- },
1393
- "node_modules/@firebase/remote-config": {
1394
- "version": "0.8.0",
1395
- "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.8.0.tgz",
1396
- "integrity": "sha512-sJz7C2VACeE257Z/3kY9Ap2WXbFsgsDLfaGfZmmToKAK39ipXxFan+vzB9CSbF6mP7bzjyzEnqPcMXhAnYE6fQ==",
1397
- "license": "Apache-2.0",
1398
- "dependencies": {
1399
- "@firebase/component": "0.7.0",
1400
- "@firebase/installations": "0.6.19",
1401
- "@firebase/logger": "0.5.0",
1402
- "@firebase/util": "1.13.0",
1403
- "tslib": "^2.1.0"
1404
- },
1405
- "peerDependencies": {
1406
- "@firebase/app": "0.x"
1407
- }
1408
- },
1409
- "node_modules/@firebase/remote-config-compat": {
1410
- "version": "0.2.21",
1411
- "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.21.tgz",
1412
- "integrity": "sha512-9+lm0eUycxbu8GO25JfJe4s6R2xlDqlVt0CR6CvN9E6B4AFArEV4qfLoDVRgIEB7nHKwvH2nYRocPWfmjRQTnw==",
1413
- "license": "Apache-2.0",
1414
- "dependencies": {
1415
- "@firebase/component": "0.7.0",
1416
- "@firebase/logger": "0.5.0",
1417
- "@firebase/remote-config": "0.8.0",
1418
- "@firebase/remote-config-types": "0.5.0",
1419
- "@firebase/util": "1.13.0",
1420
- "tslib": "^2.1.0"
1421
- },
1422
- "peerDependencies": {
1423
- "@firebase/app-compat": "0.x"
1424
- }
1425
- },
1426
- "node_modules/@firebase/remote-config-types": {
1427
- "version": "0.5.0",
1428
- "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.5.0.tgz",
1429
- "integrity": "sha512-vI3bqLoF14L/GchtgayMiFpZJF+Ao3uR8WCde0XpYNkSokDpAKca2DxvcfeZv7lZUqkUwQPL2wD83d3vQ4vvrg==",
1430
- "license": "Apache-2.0"
1431
- },
1432
- "node_modules/@firebase/storage": {
1433
- "version": "0.14.0",
1434
- "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.14.0.tgz",
1435
- "integrity": "sha512-xWWbb15o6/pWEw8H01UQ1dC5U3rf8QTAzOChYyCpafV6Xki7KVp3Yaw2nSklUwHEziSWE9KoZJS7iYeyqWnYFA==",
1436
- "license": "Apache-2.0",
1437
- "dependencies": {
1438
- "@firebase/component": "0.7.0",
1439
- "@firebase/util": "1.13.0",
1440
- "tslib": "^2.1.0"
1441
- },
1442
- "engines": {
1443
- "node": ">=20.0.0"
1444
- },
1445
- "peerDependencies": {
1446
- "@firebase/app": "0.x"
1447
- }
1448
- },
1449
- "node_modules/@firebase/storage-compat": {
1450
- "version": "0.4.0",
1451
- "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.4.0.tgz",
1452
- "integrity": "sha512-vDzhgGczr1OfcOy285YAPur5pWDEvD67w4thyeCUh6Ys0izN9fNYtA1MJERmNBfqjqu0lg0FM5GLbw0Il21M+g==",
1453
- "license": "Apache-2.0",
1454
- "dependencies": {
1455
- "@firebase/component": "0.7.0",
1456
- "@firebase/storage": "0.14.0",
1457
- "@firebase/storage-types": "0.8.3",
1458
- "@firebase/util": "1.13.0",
1459
- "tslib": "^2.1.0"
1460
- },
1461
- "engines": {
1462
- "node": ">=20.0.0"
1463
- },
1464
- "peerDependencies": {
1465
- "@firebase/app-compat": "0.x"
1466
- }
1467
- },
1468
- "node_modules/@firebase/storage-types": {
1469
- "version": "0.8.3",
1470
- "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.3.tgz",
1471
- "integrity": "sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==",
1472
- "license": "Apache-2.0",
1473
- "peerDependencies": {
1474
- "@firebase/app-types": "0.x",
1475
- "@firebase/util": "1.x"
1476
- }
1477
- },
1478
- "node_modules/@firebase/util": {
1479
- "version": "1.13.0",
1480
- "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.13.0.tgz",
1481
- "integrity": "sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==",
1482
- "hasInstallScript": true,
1483
- "license": "Apache-2.0",
1484
- "dependencies": {
1485
- "tslib": "^2.1.0"
1486
- },
1487
- "engines": {
1488
- "node": ">=20.0.0"
1489
- }
1490
- },
1491
- "node_modules/@firebase/webchannel-wrapper": {
1492
- "version": "1.0.5",
1493
- "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.5.tgz",
1494
- "integrity": "sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw==",
1495
- "license": "Apache-2.0"
1496
- },
1497
- "node_modules/@grpc/grpc-js": {
1498
- "version": "1.9.15",
1499
- "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz",
1500
- "integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==",
1501
- "license": "Apache-2.0",
1502
- "dependencies": {
1503
- "@grpc/proto-loader": "^0.7.8",
1504
- "@types/node": ">=12.12.47"
1505
- },
1506
- "engines": {
1507
- "node": "^8.13.0 || >=10.10.0"
1508
- }
1509
- },
1510
- "node_modules/@grpc/proto-loader": {
1511
- "version": "0.7.15",
1512
- "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
1513
- "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
1514
- "license": "Apache-2.0",
1515
- "dependencies": {
1516
- "lodash.camelcase": "^4.3.0",
1517
- "long": "^5.0.0",
1518
- "protobufjs": "^7.2.5",
1519
- "yargs": "^17.7.2"
1520
- },
1521
- "bin": {
1522
- "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
1523
- },
1524
- "engines": {
1525
- "node": ">=6"
1526
- }
1527
- },
1528
  "node_modules/@humanfs/core": {
1529
  "version": "0.19.1",
1530
  "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
@@ -1622,70 +982,6 @@
1622
  "@jridgewell/sourcemap-codec": "^1.4.14"
1623
  }
1624
  },
1625
- "node_modules/@protobufjs/aspromise": {
1626
- "version": "1.1.2",
1627
- "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
1628
- "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
1629
- "license": "BSD-3-Clause"
1630
- },
1631
- "node_modules/@protobufjs/base64": {
1632
- "version": "1.1.2",
1633
- "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
1634
- "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
1635
- "license": "BSD-3-Clause"
1636
- },
1637
- "node_modules/@protobufjs/codegen": {
1638
- "version": "2.0.4",
1639
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
1640
- "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
1641
- "license": "BSD-3-Clause"
1642
- },
1643
- "node_modules/@protobufjs/eventemitter": {
1644
- "version": "1.1.0",
1645
- "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
1646
- "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
1647
- "license": "BSD-3-Clause"
1648
- },
1649
- "node_modules/@protobufjs/fetch": {
1650
- "version": "1.1.0",
1651
- "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
1652
- "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
1653
- "license": "BSD-3-Clause",
1654
- "dependencies": {
1655
- "@protobufjs/aspromise": "^1.1.1",
1656
- "@protobufjs/inquire": "^1.1.0"
1657
- }
1658
- },
1659
- "node_modules/@protobufjs/float": {
1660
- "version": "1.0.2",
1661
- "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
1662
- "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
1663
- "license": "BSD-3-Clause"
1664
- },
1665
- "node_modules/@protobufjs/inquire": {
1666
- "version": "1.1.0",
1667
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
1668
- "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
1669
- "license": "BSD-3-Clause"
1670
- },
1671
- "node_modules/@protobufjs/path": {
1672
- "version": "1.1.2",
1673
- "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
1674
- "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
1675
- "license": "BSD-3-Clause"
1676
- },
1677
- "node_modules/@protobufjs/pool": {
1678
- "version": "1.1.0",
1679
- "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
1680
- "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
1681
- "license": "BSD-3-Clause"
1682
- },
1683
- "node_modules/@protobufjs/utf8": {
1684
- "version": "1.1.0",
1685
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
1686
- "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
1687
- "license": "BSD-3-Clause"
1688
- },
1689
  "node_modules/@reduxjs/toolkit": {
1690
  "version": "2.11.2",
1691
  "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz",
@@ -2444,15 +1740,6 @@
2444
  "dev": true,
2445
  "license": "MIT"
2446
  },
2447
- "node_modules/@types/node": {
2448
- "version": "25.3.0",
2449
- "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz",
2450
- "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==",
2451
- "license": "MIT",
2452
- "dependencies": {
2453
- "undici-types": "~7.18.0"
2454
- }
2455
- },
2456
  "node_modules/@types/react": {
2457
  "version": "19.2.14",
2458
  "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
@@ -2540,19 +1827,11 @@
2540
  "url": "https://github.com/sponsors/epoberezkin"
2541
  }
2542
  },
2543
- "node_modules/ansi-regex": {
2544
- "version": "5.0.1",
2545
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2546
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2547
- "license": "MIT",
2548
- "engines": {
2549
- "node": ">=8"
2550
- }
2551
- },
2552
  "node_modules/ansi-styles": {
2553
  "version": "4.3.0",
2554
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2555
  "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
 
2556
  "license": "MIT",
2557
  "dependencies": {
2558
  "color-convert": "^2.0.1"
@@ -2684,20 +1963,6 @@
2684
  "url": "https://github.com/chalk/chalk?sponsor=1"
2685
  }
2686
  },
2687
- "node_modules/cliui": {
2688
- "version": "8.0.1",
2689
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
2690
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
2691
- "license": "ISC",
2692
- "dependencies": {
2693
- "string-width": "^4.2.0",
2694
- "strip-ansi": "^6.0.1",
2695
- "wrap-ansi": "^7.0.0"
2696
- },
2697
- "engines": {
2698
- "node": ">=12"
2699
- }
2700
- },
2701
  "node_modules/clsx": {
2702
  "version": "2.1.1",
2703
  "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -2711,6 +1976,7 @@
2711
  "version": "2.0.1",
2712
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2713
  "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
 
2714
  "license": "MIT",
2715
  "dependencies": {
2716
  "color-name": "~1.1.4"
@@ -2723,6 +1989,7 @@
2723
  "version": "1.1.4",
2724
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2725
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
 
2726
  "license": "MIT"
2727
  },
2728
  "node_modules/concat-map": {
@@ -2942,12 +2209,6 @@
2942
  "dev": true,
2943
  "license": "ISC"
2944
  },
2945
- "node_modules/emoji-regex": {
2946
- "version": "8.0.0",
2947
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2948
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2949
- "license": "MIT"
2950
- },
2951
  "node_modules/enhanced-resolve": {
2952
  "version": "5.19.0",
2953
  "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz",
@@ -3016,6 +2277,7 @@
3016
  "version": "3.2.0",
3017
  "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
3018
  "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
 
3019
  "license": "MIT",
3020
  "engines": {
3021
  "node": ">=6"
@@ -3245,18 +2507,6 @@
3245
  "dev": true,
3246
  "license": "MIT"
3247
  },
3248
- "node_modules/faye-websocket": {
3249
- "version": "0.11.4",
3250
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
3251
- "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
3252
- "license": "Apache-2.0",
3253
- "dependencies": {
3254
- "websocket-driver": ">=0.5.1"
3255
- },
3256
- "engines": {
3257
- "node": ">=0.8.0"
3258
- }
3259
- },
3260
  "node_modules/fdir": {
3261
  "version": "6.5.0",
3262
  "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
@@ -3304,42 +2554,6 @@
3304
  "url": "https://github.com/sponsors/sindresorhus"
3305
  }
3306
  },
3307
- "node_modules/firebase": {
3308
- "version": "12.9.0",
3309
- "resolved": "https://registry.npmjs.org/firebase/-/firebase-12.9.0.tgz",
3310
- "integrity": "sha512-CwwTYoqZg6KxygPOaaJqIc4aoLvo0RCRrXoln9GoxLE8QyAwTydBaSLGVlR4WPcuOgN3OEL0tJLT1H4IU/dv7w==",
3311
- "license": "Apache-2.0",
3312
- "dependencies": {
3313
- "@firebase/ai": "2.8.0",
3314
- "@firebase/analytics": "0.10.19",
3315
- "@firebase/analytics-compat": "0.2.25",
3316
- "@firebase/app": "0.14.8",
3317
- "@firebase/app-check": "0.11.0",
3318
- "@firebase/app-check-compat": "0.4.0",
3319
- "@firebase/app-compat": "0.5.8",
3320
- "@firebase/app-types": "0.9.3",
3321
- "@firebase/auth": "1.12.0",
3322
- "@firebase/auth-compat": "0.6.2",
3323
- "@firebase/data-connect": "0.3.12",
3324
- "@firebase/database": "1.1.0",
3325
- "@firebase/database-compat": "2.1.0",
3326
- "@firebase/firestore": "4.11.0",
3327
- "@firebase/firestore-compat": "0.4.5",
3328
- "@firebase/functions": "0.13.1",
3329
- "@firebase/functions-compat": "0.4.1",
3330
- "@firebase/installations": "0.6.19",
3331
- "@firebase/installations-compat": "0.2.19",
3332
- "@firebase/messaging": "0.12.23",
3333
- "@firebase/messaging-compat": "0.2.23",
3334
- "@firebase/performance": "0.7.9",
3335
- "@firebase/performance-compat": "0.2.22",
3336
- "@firebase/remote-config": "0.8.0",
3337
- "@firebase/remote-config-compat": "0.2.21",
3338
- "@firebase/storage": "0.14.0",
3339
- "@firebase/storage-compat": "0.4.0",
3340
- "@firebase/util": "1.13.0"
3341
- }
3342
- },
3343
  "node_modules/flat-cache": {
3344
  "version": "4.0.1",
3345
  "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
@@ -3385,15 +2599,6 @@
3385
  "node": ">=6.9.0"
3386
  }
3387
  },
3388
- "node_modules/get-caller-file": {
3389
- "version": "2.0.5",
3390
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
3391
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
3392
- "license": "ISC",
3393
- "engines": {
3394
- "node": "6.* || 8.* || >= 10.*"
3395
- }
3396
- },
3397
  "node_modules/glob-parent": {
3398
  "version": "6.0.2",
3399
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -3453,18 +2658,6 @@
3453
  "hermes-estree": "0.25.1"
3454
  }
3455
  },
3456
- "node_modules/http-parser-js": {
3457
- "version": "0.5.10",
3458
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
3459
- "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
3460
- "license": "MIT"
3461
- },
3462
- "node_modules/idb": {
3463
- "version": "7.1.1",
3464
- "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
3465
- "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==",
3466
- "license": "ISC"
3467
- },
3468
  "node_modules/ignore": {
3469
  "version": "5.3.2",
3470
  "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -3531,15 +2724,6 @@
3531
  "node": ">=0.10.0"
3532
  }
3533
  },
3534
- "node_modules/is-fullwidth-code-point": {
3535
- "version": "3.0.0",
3536
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
3537
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
3538
- "license": "MIT",
3539
- "engines": {
3540
- "node": ">=8"
3541
- }
3542
- },
3543
  "node_modules/is-glob": {
3544
  "version": "4.0.3",
3545
  "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -3925,12 +3109,6 @@
3925
  "url": "https://github.com/sponsors/sindresorhus"
3926
  }
3927
  },
3928
- "node_modules/lodash.camelcase": {
3929
- "version": "4.3.0",
3930
- "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
3931
- "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
3932
- "license": "MIT"
3933
- },
3934
  "node_modules/lodash.merge": {
3935
  "version": "4.6.2",
3936
  "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -3938,12 +3116,6 @@
3938
  "dev": true,
3939
  "license": "MIT"
3940
  },
3941
- "node_modules/long": {
3942
- "version": "5.3.2",
3943
- "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
3944
- "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
3945
- "license": "Apache-2.0"
3946
- },
3947
  "node_modules/lru-cache": {
3948
  "version": "5.1.1",
3949
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -4163,30 +3335,6 @@
4163
  "node": ">= 0.8.0"
4164
  }
4165
  },
4166
- "node_modules/protobufjs": {
4167
- "version": "7.5.4",
4168
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz",
4169
- "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==",
4170
- "hasInstallScript": true,
4171
- "license": "BSD-3-Clause",
4172
- "dependencies": {
4173
- "@protobufjs/aspromise": "^1.1.2",
4174
- "@protobufjs/base64": "^1.1.2",
4175
- "@protobufjs/codegen": "^2.0.4",
4176
- "@protobufjs/eventemitter": "^1.1.0",
4177
- "@protobufjs/fetch": "^1.1.0",
4178
- "@protobufjs/float": "^1.0.2",
4179
- "@protobufjs/inquire": "^1.1.0",
4180
- "@protobufjs/path": "^1.1.2",
4181
- "@protobufjs/pool": "^1.1.0",
4182
- "@protobufjs/utf8": "^1.1.0",
4183
- "@types/node": ">=13.7.0",
4184
- "long": "^5.0.0"
4185
- },
4186
- "engines": {
4187
- "node": ">=12.0.0"
4188
- }
4189
- },
4190
  "node_modules/punycode": {
4191
  "version": "2.3.1",
4192
  "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -4341,15 +3489,6 @@
4341
  "redux": "^5.0.0"
4342
  }
4343
  },
4344
- "node_modules/require-directory": {
4345
- "version": "2.1.1",
4346
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
4347
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
4348
- "license": "MIT",
4349
- "engines": {
4350
- "node": ">=0.10.0"
4351
- }
4352
- },
4353
  "node_modules/reselect": {
4354
  "version": "5.1.1",
4355
  "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
@@ -4410,26 +3549,6 @@
4410
  "fsevents": "~2.3.2"
4411
  }
4412
  },
4413
- "node_modules/safe-buffer": {
4414
- "version": "5.2.1",
4415
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
4416
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
4417
- "funding": [
4418
- {
4419
- "type": "github",
4420
- "url": "https://github.com/sponsors/feross"
4421
- },
4422
- {
4423
- "type": "patreon",
4424
- "url": "https://www.patreon.com/feross"
4425
- },
4426
- {
4427
- "type": "consulting",
4428
- "url": "https://feross.org/support"
4429
- }
4430
- ],
4431
- "license": "MIT"
4432
- },
4433
  "node_modules/scheduler": {
4434
  "version": "0.27.0",
4435
  "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
@@ -4484,32 +3603,6 @@
4484
  "node": ">=0.10.0"
4485
  }
4486
  },
4487
- "node_modules/string-width": {
4488
- "version": "4.2.3",
4489
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
4490
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
4491
- "license": "MIT",
4492
- "dependencies": {
4493
- "emoji-regex": "^8.0.0",
4494
- "is-fullwidth-code-point": "^3.0.0",
4495
- "strip-ansi": "^6.0.1"
4496
- },
4497
- "engines": {
4498
- "node": ">=8"
4499
- }
4500
- },
4501
- "node_modules/strip-ansi": {
4502
- "version": "6.0.1",
4503
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
4504
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
4505
- "license": "MIT",
4506
- "dependencies": {
4507
- "ansi-regex": "^5.0.1"
4508
- },
4509
- "engines": {
4510
- "node": ">=8"
4511
- }
4512
- },
4513
  "node_modules/strip-json-comments": {
4514
  "version": "3.1.1",
4515
  "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -4581,7 +3674,8 @@
4581
  "version": "2.8.1",
4582
  "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
4583
  "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
4584
- "license": "0BSD"
 
4585
  },
4586
  "node_modules/type-check": {
4587
  "version": "0.4.0",
@@ -4610,12 +3704,6 @@
4610
  "node": ">=14.17"
4611
  }
4612
  },
4613
- "node_modules/undici-types": {
4614
- "version": "7.18.2",
4615
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
4616
- "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
4617
- "license": "MIT"
4618
- },
4619
  "node_modules/update-browserslist-db": {
4620
  "version": "1.2.3",
4621
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
@@ -4762,35 +3850,6 @@
4762
  }
4763
  }
4764
  },
4765
- "node_modules/web-vitals": {
4766
- "version": "4.2.4",
4767
- "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz",
4768
- "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==",
4769
- "license": "Apache-2.0"
4770
- },
4771
- "node_modules/websocket-driver": {
4772
- "version": "0.7.4",
4773
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
4774
- "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
4775
- "license": "Apache-2.0",
4776
- "dependencies": {
4777
- "http-parser-js": ">=0.5.1",
4778
- "safe-buffer": ">=5.1.0",
4779
- "websocket-extensions": ">=0.1.1"
4780
- },
4781
- "engines": {
4782
- "node": ">=0.8.0"
4783
- }
4784
- },
4785
- "node_modules/websocket-extensions": {
4786
- "version": "0.1.4",
4787
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
4788
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
4789
- "license": "Apache-2.0",
4790
- "engines": {
4791
- "node": ">=0.8.0"
4792
- }
4793
- },
4794
  "node_modules/which": {
4795
  "version": "2.0.2",
4796
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -4817,32 +3876,6 @@
4817
  "node": ">=0.10.0"
4818
  }
4819
  },
4820
- "node_modules/wrap-ansi": {
4821
- "version": "7.0.0",
4822
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
4823
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
4824
- "license": "MIT",
4825
- "dependencies": {
4826
- "ansi-styles": "^4.0.0",
4827
- "string-width": "^4.1.0",
4828
- "strip-ansi": "^6.0.0"
4829
- },
4830
- "engines": {
4831
- "node": ">=10"
4832
- },
4833
- "funding": {
4834
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
4835
- }
4836
- },
4837
- "node_modules/y18n": {
4838
- "version": "5.0.8",
4839
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
4840
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
4841
- "license": "ISC",
4842
- "engines": {
4843
- "node": ">=10"
4844
- }
4845
- },
4846
  "node_modules/yallist": {
4847
  "version": "3.1.1",
4848
  "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -4850,33 +3883,6 @@
4850
  "dev": true,
4851
  "license": "ISC"
4852
  },
4853
- "node_modules/yargs": {
4854
- "version": "17.7.2",
4855
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
4856
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
4857
- "license": "MIT",
4858
- "dependencies": {
4859
- "cliui": "^8.0.1",
4860
- "escalade": "^3.1.1",
4861
- "get-caller-file": "^2.0.5",
4862
- "require-directory": "^2.1.1",
4863
- "string-width": "^4.2.3",
4864
- "y18n": "^5.0.5",
4865
- "yargs-parser": "^21.1.1"
4866
- },
4867
- "engines": {
4868
- "node": ">=12"
4869
- }
4870
- },
4871
- "node_modules/yargs-parser": {
4872
- "version": "21.1.1",
4873
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
4874
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
4875
- "license": "ISC",
4876
- "engines": {
4877
- "node": ">=12"
4878
- }
4879
- },
4880
  "node_modules/yocto-queue": {
4881
  "version": "0.1.0",
4882
  "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
 
10
  "dependencies": {
11
  "@tailwindcss/vite": "^4.2.1",
12
  "clsx": "^2.1.1",
 
13
  "lucide-react": "^0.575.0",
14
  "react": "^19.2.0",
15
  "react-dom": "^19.2.0",
 
885
  "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
886
  }
887
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
888
  "node_modules/@humanfs/core": {
889
  "version": "0.19.1",
890
  "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
 
982
  "@jridgewell/sourcemap-codec": "^1.4.14"
983
  }
984
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
985
  "node_modules/@reduxjs/toolkit": {
986
  "version": "2.11.2",
987
  "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz",
 
1740
  "dev": true,
1741
  "license": "MIT"
1742
  },
 
 
 
 
 
 
 
 
 
1743
  "node_modules/@types/react": {
1744
  "version": "19.2.14",
1745
  "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
 
1827
  "url": "https://github.com/sponsors/epoberezkin"
1828
  }
1829
  },
 
 
 
 
 
 
 
 
 
1830
  "node_modules/ansi-styles": {
1831
  "version": "4.3.0",
1832
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1833
  "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1834
+ "dev": true,
1835
  "license": "MIT",
1836
  "dependencies": {
1837
  "color-convert": "^2.0.1"
 
1963
  "url": "https://github.com/chalk/chalk?sponsor=1"
1964
  }
1965
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1966
  "node_modules/clsx": {
1967
  "version": "2.1.1",
1968
  "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
 
1976
  "version": "2.0.1",
1977
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1978
  "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1979
+ "dev": true,
1980
  "license": "MIT",
1981
  "dependencies": {
1982
  "color-name": "~1.1.4"
 
1989
  "version": "1.1.4",
1990
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1991
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1992
+ "dev": true,
1993
  "license": "MIT"
1994
  },
1995
  "node_modules/concat-map": {
 
2209
  "dev": true,
2210
  "license": "ISC"
2211
  },
 
 
 
 
 
 
2212
  "node_modules/enhanced-resolve": {
2213
  "version": "5.19.0",
2214
  "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz",
 
2277
  "version": "3.2.0",
2278
  "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
2279
  "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
2280
+ "dev": true,
2281
  "license": "MIT",
2282
  "engines": {
2283
  "node": ">=6"
 
2507
  "dev": true,
2508
  "license": "MIT"
2509
  },
 
 
 
 
 
 
 
 
 
 
 
 
2510
  "node_modules/fdir": {
2511
  "version": "6.5.0",
2512
  "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
 
2554
  "url": "https://github.com/sponsors/sindresorhus"
2555
  }
2556
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2557
  "node_modules/flat-cache": {
2558
  "version": "4.0.1",
2559
  "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
 
2599
  "node": ">=6.9.0"
2600
  }
2601
  },
 
 
 
 
 
 
 
 
 
2602
  "node_modules/glob-parent": {
2603
  "version": "6.0.2",
2604
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
 
2658
  "hermes-estree": "0.25.1"
2659
  }
2660
  },
 
 
 
 
 
 
 
 
 
 
 
 
2661
  "node_modules/ignore": {
2662
  "version": "5.3.2",
2663
  "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
 
2724
  "node": ">=0.10.0"
2725
  }
2726
  },
 
 
 
 
 
 
 
 
 
2727
  "node_modules/is-glob": {
2728
  "version": "4.0.3",
2729
  "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
 
3109
  "url": "https://github.com/sponsors/sindresorhus"
3110
  }
3111
  },
 
 
 
 
 
 
3112
  "node_modules/lodash.merge": {
3113
  "version": "4.6.2",
3114
  "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
 
3116
  "dev": true,
3117
  "license": "MIT"
3118
  },
 
 
 
 
 
 
3119
  "node_modules/lru-cache": {
3120
  "version": "5.1.1",
3121
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
 
3335
  "node": ">= 0.8.0"
3336
  }
3337
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3338
  "node_modules/punycode": {
3339
  "version": "2.3.1",
3340
  "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
 
3489
  "redux": "^5.0.0"
3490
  }
3491
  },
 
 
 
 
 
 
 
 
 
3492
  "node_modules/reselect": {
3493
  "version": "5.1.1",
3494
  "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
 
3549
  "fsevents": "~2.3.2"
3550
  }
3551
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3552
  "node_modules/scheduler": {
3553
  "version": "0.27.0",
3554
  "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
 
3603
  "node": ">=0.10.0"
3604
  }
3605
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3606
  "node_modules/strip-json-comments": {
3607
  "version": "3.1.1",
3608
  "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
 
3674
  "version": "2.8.1",
3675
  "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
3676
  "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
3677
+ "license": "0BSD",
3678
+ "optional": true
3679
  },
3680
  "node_modules/type-check": {
3681
  "version": "0.4.0",
 
3704
  "node": ">=14.17"
3705
  }
3706
  },
 
 
 
 
 
 
3707
  "node_modules/update-browserslist-db": {
3708
  "version": "1.2.3",
3709
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
 
3850
  }
3851
  }
3852
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3853
  "node_modules/which": {
3854
  "version": "2.0.2",
3855
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
 
3876
  "node": ">=0.10.0"
3877
  }
3878
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3879
  "node_modules/yallist": {
3880
  "version": "3.1.1",
3881
  "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
 
3883
  "dev": true,
3884
  "license": "ISC"
3885
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3886
  "node_modules/yocto-queue": {
3887
  "version": "0.1.0",
3888
  "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
frontend/package.json CHANGED
@@ -13,7 +13,6 @@
13
  "dependencies": {
14
  "@tailwindcss/vite": "^4.2.1",
15
  "clsx": "^2.1.1",
16
- "firebase": "^12.9.0",
17
  "lucide-react": "^0.575.0",
18
  "react": "^19.2.0",
19
  "react-dom": "^19.2.0",
 
13
  "dependencies": {
14
  "@tailwindcss/vite": "^4.2.1",
15
  "clsx": "^2.1.1",
 
16
  "lucide-react": "^0.575.0",
17
  "react": "^19.2.0",
18
  "react-dom": "^19.2.0",
frontend/src/firebase.js DELETED
@@ -1,40 +0,0 @@
1
- import { initializeApp } from 'firebase/app'
2
- import { getFirestore, collection, query, orderBy, limit, onSnapshot } from 'firebase/firestore'
3
-
4
- const firebaseConfig = {
5
- apiKey: "AIzaSyBmPeo9UfEkPhtBN9pq7xyzFNI2Bw4yue4",
6
- authDomain: "philverify.firebaseapp.com",
7
- projectId: "philverify",
8
- storageBucket: "philverify.firebasestorage.app",
9
- messagingSenderId: "148970785140",
10
- appId: "1:978563490222:web:eea2551e0938ff2efaa83f",
11
- }
12
-
13
- const app = initializeApp(firebaseConfig)
14
- export const db = getFirestore(app)
15
-
16
- /**
17
- * Subscribe to the 20 most recent verifications in real-time.
18
- * @param {Function} callback - called with array of docs on each update
19
- * @param {Function} [onError] - called with Error when Firestore is unreachable (e.g. ad blocker)
20
- * @returns unsubscribe function
21
- */
22
- export function subscribeToHistory(callback, onError) {
23
- const q = query(
24
- collection(db, 'verifications'),
25
- orderBy('timestamp', 'desc'),
26
- limit(20)
27
- )
28
- return onSnapshot(
29
- q,
30
- (snap) => {
31
- callback(snap.docs.map(d => ({ id: d.id, ...d.data() })))
32
- },
33
- (error) => {
34
- // Firestore blocked (ERR_BLOCKED_BY_CLIENT from ad blockers) or
35
- // permission denied — fail fast and let caller fall back to REST.
36
- console.warn('[PhilVerify] Firestore unavailable:', error.code || error.message)
37
- if (onError) onError(error)
38
- }
39
- )
40
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/pages/HistoryPage.jsx CHANGED
@@ -1,11 +1,10 @@
1
  import { useEffect, useState, useCallback, useMemo } from 'react'
2
- import { subscribeToHistory } from '../firebase.js'
3
- import { timeAgo, VERDICT_MAP, scoreColor } from '../utils/format.js'
4
  import { PAGE_STYLE } from '../App.jsx'
5
  import { api } from '../api'
6
  import VerdictBadge from '../components/VerdictBadge.jsx'
7
  import SkeletonCard from '../components/SkeletonCard.jsx'
8
- import { Clock, RefreshCw, WifiOff, ChevronUp, ChevronDown, ChevronsUpDown, X, Loader2, FileText, Globe, ImageIcon, Video } from 'lucide-react'
9
 
10
 
11
  /* ── Sort icon helper ─────────────────────────────────── */
@@ -311,7 +310,6 @@ function DetailModal({ id, onClose }) {
311
  export default function HistoryPage() {
312
  const [entries, setEntries] = useState([])
313
  const [loading, setLoading] = useState(true)
314
- const [source, setSource] = useState('firestore')
315
  const [sort, setSort] = useState('timestamp')
316
  const [dir, setDir] = useState('desc')
317
  const [filter, setFilter] = useState('all') // 'all' | 'Credible' | 'Unverified' | 'Likely Fake'
@@ -328,38 +326,9 @@ export default function HistoryPage() {
328
  }, [])
329
 
330
  useEffect(() => {
331
- let resolved = false
332
- let restInterval = null
333
- let unsubRef = null // declared before subscribeToHistory so goRest() can reach it
334
-
335
- function goRest() {
336
- if (resolved) return
337
- resolved = true
338
- // Immediately kill the Firestore listener so the SDK stops retrying
339
- // (prevents the ERR_BLOCKED_BY_CLIENT console flood from auto-retries)
340
- unsubRef?.()
341
- setSource('rest')
342
- fetchRest()
343
- restInterval = setInterval(fetchRest, 30_000)
344
- }
345
-
346
- // Fallback to REST after 1.5 s if Firestore hasn't connected
347
- const fallbackTimer = setTimeout(goRest, 1500)
348
-
349
- unsubRef = subscribeToHistory(
350
- (docs) => {
351
- if (!resolved) { resolved = true; clearTimeout(fallbackTimer) }
352
- setEntries(docs)
353
- setLoading(false)
354
- },
355
- // onError: Firestore blocked by ad-blocker → instant REST fallback
356
- () => {
357
- clearTimeout(fallbackTimer)
358
- goRest()
359
- }
360
- )
361
-
362
- return () => { unsubRef?.(); clearTimeout(fallbackTimer); if (restInterval) clearInterval(restInterval) }
363
  }, [fetchRest])
364
 
365
  function handleSort(field) {
@@ -402,7 +371,7 @@ export default function HistoryPage() {
402
  <div>
403
  <h1 style={{ fontSize: 28, fontFamily: 'var(--font-display)' }}>History</h1>
404
  <p className="mt-1 text-sm" style={{ color: 'var(--text-secondary)', fontFamily: 'var(--font-body)' }}>
405
- {source === 'firestore' ? 'Real-time from Firestore' : 'Polling via REST API'}
406
  {' — '}<span className="tabular" style={{ fontFamily: 'var(--font-mono)' }}>{entries.length}</span> records
407
  </p>
408
  </div>
@@ -412,23 +381,12 @@ export default function HistoryPage() {
412
  fontFamily: 'var(--font-display)',
413
  letterSpacing: '0.1em',
414
  }}
415
- aria-label={source === 'firestore' ? 'Live data' : 'Polling REST API'}>
416
  <span className="w-1.5 h-1.5 rounded-full" style={{ background: 'currentColor' }} />
417
- {source === 'rest' ? <><WifiOff size={11} aria-hidden="true" /> POLLING</> : <><RefreshCw size={11} aria-hidden="true" /> LIVE</>}
418
  </div>
419
  </header>
420
 
421
- {/* ── Firestore blocked notice ───────────────── */}
422
- {source === 'rest' && !loading && (
423
- <div className="card p-3 flex items-center gap-2"
424
- style={{ borderColor: 'rgba(217,119,6,0.3)', background: 'rgba(217,119,6,0.05)' }}>
425
- <WifiOff size={13} style={{ color: 'var(--accent-gold)', flexShrink: 0 }} aria-hidden="true" />
426
- <p className="text-xs" style={{ color: 'var(--accent-gold)', fontFamily: 'var(--font-body)' }}>
427
- Firestore may be blocked by an ad blocker — using REST fallback. Whitelist <code>firestore.googleapis.com</code> to restore live updates.
428
- </p>
429
- </div>
430
- )}
431
-
432
  {/* ── Filter tabs ───────────────────────��────── */}
433
  {!loading && entries.length > 0 && (
434
  <div role="tablist" aria-label="Filter by verdict" className="flex gap-1 flex-wrap fade-up-2">
 
1
  import { useEffect, useState, useCallback, useMemo } from 'react'
2
+ import { timeAgo, scoreColor } from '../utils/format.js'
 
3
  import { PAGE_STYLE } from '../App.jsx'
4
  import { api } from '../api'
5
  import VerdictBadge from '../components/VerdictBadge.jsx'
6
  import SkeletonCard from '../components/SkeletonCard.jsx'
7
+ import { Clock, RefreshCw, ChevronUp, ChevronDown, ChevronsUpDown, X, Loader2, FileText, Globe, ImageIcon, Video } from 'lucide-react'
8
 
9
 
10
  /* ── Sort icon helper ─────────────────────────────────── */
 
310
  export default function HistoryPage() {
311
  const [entries, setEntries] = useState([])
312
  const [loading, setLoading] = useState(true)
 
313
  const [sort, setSort] = useState('timestamp')
314
  const [dir, setDir] = useState('desc')
315
  const [filter, setFilter] = useState('all') // 'all' | 'Credible' | 'Unverified' | 'Likely Fake'
 
326
  }, [])
327
 
328
  useEffect(() => {
329
+ fetchRest()
330
+ const interval = setInterval(fetchRest, 30_000)
331
+ return () => clearInterval(interval)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
332
  }, [fetchRest])
333
 
334
  function handleSort(field) {
 
371
  <div>
372
  <h1 style={{ fontSize: 28, fontFamily: 'var(--font-display)' }}>History</h1>
373
  <p className="mt-1 text-sm" style={{ color: 'var(--text-secondary)', fontFamily: 'var(--font-body)' }}>
374
+ {'Polling via REST API'}
375
  {' — '}<span className="tabular" style={{ fontFamily: 'var(--font-mono)' }}>{entries.length}</span> records
376
  </p>
377
  </div>
 
381
  fontFamily: 'var(--font-display)',
382
  letterSpacing: '0.1em',
383
  }}
384
+ aria-label="Polling REST API">
385
  <span className="w-1.5 h-1.5 rounded-full" style={{ background: 'currentColor' }} />
386
+ <RefreshCw size={11} aria-hidden="true" /> POLLING
387
  </div>
388
  </header>
389
 
 
 
 
 
 
 
 
 
 
 
 
390
  {/* ── Filter tabs ───────────────────────��────── */}
391
  {!loading && entries.length > 0 && (
392
  <div role="tablist" aria-label="Filter by verdict" className="flex gap-1 flex-wrap fade-up-2">