r139-8r commited on
Commit
0898eec
·
1 Parent(s): 99a1e18

Fix: UI improvements, section reordering, resume file upload

Browse files
package-lock.json CHANGED
@@ -754,23 +754,6 @@
754
  "node": ">=18"
755
  }
756
  },
757
- "node_modules/@esbuild/win32-x64": {
758
- "version": "0.27.2",
759
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
760
- "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
761
- "cpu": [
762
- "x64"
763
- ],
764
- "dev": true,
765
- "license": "MIT",
766
- "optional": true,
767
- "os": [
768
- "win32"
769
- ],
770
- "engines": {
771
- "node": ">=18"
772
- }
773
- },
774
  "node_modules/@eslint-community/eslint-utils": {
775
  "version": "4.9.1",
776
  "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
@@ -1038,9 +1021,9 @@
1038
  "license": "MIT"
1039
  },
1040
  "node_modules/@rollup/rollup-android-arm-eabi": {
1041
- "version": "4.55.2",
1042
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.2.tgz",
1043
- "integrity": "sha512-21J6xzayjy3O6NdnlO6aXi/urvSRjm6nCI6+nF6ra2YofKruGixN9kfT+dt55HVNwfDmpDHJcaS3JuP/boNnlA==",
1044
  "cpu": [
1045
  "arm"
1046
  ],
@@ -1052,9 +1035,9 @@
1052
  ]
1053
  },
1054
  "node_modules/@rollup/rollup-android-arm64": {
1055
- "version": "4.55.2",
1056
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.2.tgz",
1057
- "integrity": "sha512-eXBg7ibkNUZ+sTwbFiDKou0BAckeV6kIigK7y5Ko4mB/5A1KLhuzEKovsmfvsL8mQorkoincMFGnQuIT92SKqA==",
1058
  "cpu": [
1059
  "arm64"
1060
  ],
@@ -1066,9 +1049,9 @@
1066
  ]
1067
  },
1068
  "node_modules/@rollup/rollup-darwin-arm64": {
1069
- "version": "4.55.2",
1070
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.2.tgz",
1071
- "integrity": "sha512-UCbaTklREjrc5U47ypLulAgg4njaqfOVLU18VrCrI+6E5MQjuG0lSWaqLlAJwsD7NpFV249XgB0Bi37Zh5Sz4g==",
1072
  "cpu": [
1073
  "arm64"
1074
  ],
@@ -1080,9 +1063,9 @@
1080
  ]
1081
  },
1082
  "node_modules/@rollup/rollup-darwin-x64": {
1083
- "version": "4.55.2",
1084
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.2.tgz",
1085
- "integrity": "sha512-dP67MA0cCMHFT2g5XyjtpVOtp7y4UyUxN3dhLdt11at5cPKnSm4lY+EhwNvDXIMzAMIo2KU+mc9wxaAQJTn7sQ==",
1086
  "cpu": [
1087
  "x64"
1088
  ],
@@ -1094,9 +1077,9 @@
1094
  ]
1095
  },
1096
  "node_modules/@rollup/rollup-freebsd-arm64": {
1097
- "version": "4.55.2",
1098
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.2.tgz",
1099
- "integrity": "sha512-WDUPLUwfYV9G1yxNRJdXcvISW15mpvod1Wv3ok+Ws93w1HjIVmCIFxsG2DquO+3usMNCpJQ0wqO+3GhFdl6Fow==",
1100
  "cpu": [
1101
  "arm64"
1102
  ],
@@ -1108,9 +1091,9 @@
1108
  ]
1109
  },
1110
  "node_modules/@rollup/rollup-freebsd-x64": {
1111
- "version": "4.55.2",
1112
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.2.tgz",
1113
- "integrity": "sha512-Ng95wtHVEulRwn7R0tMrlUuiLVL/HXA8Lt/MYVpy88+s5ikpntzZba1qEulTuPnPIZuOPcW9wNEiqvZxZmgmqQ==",
1114
  "cpu": [
1115
  "x64"
1116
  ],
@@ -1122,9 +1105,9 @@
1122
  ]
1123
  },
1124
  "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
1125
- "version": "4.55.2",
1126
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.2.tgz",
1127
- "integrity": "sha512-AEXMESUDWWGqD6LwO/HkqCZgUE1VCJ1OhbvYGsfqX2Y6w5quSXuyoy/Fg3nRqiwro+cJYFxiw5v4kB2ZDLhxrw==",
1128
  "cpu": [
1129
  "arm"
1130
  ],
@@ -1136,9 +1119,9 @@
1136
  ]
1137
  },
1138
  "node_modules/@rollup/rollup-linux-arm-musleabihf": {
1139
- "version": "4.55.2",
1140
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.2.tgz",
1141
- "integrity": "sha512-ZV7EljjBDwBBBSv570VWj0hiNTdHt9uGznDtznBB4Caj3ch5rgD4I2K1GQrtbvJ/QiB+663lLgOdcADMNVC29Q==",
1142
  "cpu": [
1143
  "arm"
1144
  ],
@@ -1150,9 +1133,9 @@
1150
  ]
1151
  },
1152
  "node_modules/@rollup/rollup-linux-arm64-gnu": {
1153
- "version": "4.55.2",
1154
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.2.tgz",
1155
- "integrity": "sha512-uvjwc8NtQVPAJtq4Tt7Q49FOodjfbf6NpqXyW/rjXoV+iZ3EJAHLNAnKT5UJBc6ffQVgmXTUL2ifYiLABlGFqA==",
1156
  "cpu": [
1157
  "arm64"
1158
  ],
@@ -1164,9 +1147,9 @@
1164
  ]
1165
  },
1166
  "node_modules/@rollup/rollup-linux-arm64-musl": {
1167
- "version": "4.55.2",
1168
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.2.tgz",
1169
- "integrity": "sha512-s3KoWVNnye9mm/2WpOZ3JeUiediUVw6AvY/H7jNA6qgKA2V2aM25lMkVarTDfiicn/DLq3O0a81jncXszoyCFA==",
1170
  "cpu": [
1171
  "arm64"
1172
  ],
@@ -1178,9 +1161,9 @@
1178
  ]
1179
  },
1180
  "node_modules/@rollup/rollup-linux-loong64-gnu": {
1181
- "version": "4.55.2",
1182
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.2.tgz",
1183
- "integrity": "sha512-gi21faacK+J8aVSyAUptML9VQN26JRxe484IbF+h3hpG+sNVoMXPduhREz2CcYr5my0NE3MjVvQ5bMKX71pfVA==",
1184
  "cpu": [
1185
  "loong64"
1186
  ],
@@ -1192,9 +1175,9 @@
1192
  ]
1193
  },
1194
  "node_modules/@rollup/rollup-linux-loong64-musl": {
1195
- "version": "4.55.2",
1196
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.2.tgz",
1197
- "integrity": "sha512-qSlWiXnVaS/ceqXNfnoFZh4IiCA0EwvCivivTGbEu1qv2o+WTHpn1zNmCTAoOG5QaVr2/yhCoLScQtc/7RxshA==",
1198
  "cpu": [
1199
  "loong64"
1200
  ],
@@ -1206,9 +1189,9 @@
1206
  ]
1207
  },
1208
  "node_modules/@rollup/rollup-linux-ppc64-gnu": {
1209
- "version": "4.55.2",
1210
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.2.tgz",
1211
- "integrity": "sha512-rPyuLFNoF1B0+wolH277E780NUKf+KoEDb3OyoLbAO18BbeKi++YN6gC/zuJoPPDlQRL3fIxHxCxVEWiem2yXw==",
1212
  "cpu": [
1213
  "ppc64"
1214
  ],
@@ -1220,9 +1203,9 @@
1220
  ]
1221
  },
1222
  "node_modules/@rollup/rollup-linux-ppc64-musl": {
1223
- "version": "4.55.2",
1224
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.2.tgz",
1225
- "integrity": "sha512-g+0ZLMook31iWV4PvqKU0i9E78gaZgYpSrYPed/4Bu+nGTgfOPtfs1h11tSSRPXSjC5EzLTjV/1A7L2Vr8pJoQ==",
1226
  "cpu": [
1227
  "ppc64"
1228
  ],
@@ -1234,9 +1217,9 @@
1234
  ]
1235
  },
1236
  "node_modules/@rollup/rollup-linux-riscv64-gnu": {
1237
- "version": "4.55.2",
1238
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.2.tgz",
1239
- "integrity": "sha512-i+sGeRGsjKZcQRh3BRfpLsM3LX3bi4AoEVqmGDyc50L6KfYsN45wVCSz70iQMwPWr3E5opSiLOwsC9WB4/1pqg==",
1240
  "cpu": [
1241
  "riscv64"
1242
  ],
@@ -1248,9 +1231,9 @@
1248
  ]
1249
  },
1250
  "node_modules/@rollup/rollup-linux-riscv64-musl": {
1251
- "version": "4.55.2",
1252
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.2.tgz",
1253
- "integrity": "sha512-C1vLcKc4MfFV6I0aWsC7B2Y9QcsiEcvKkfxprwkPfLaN8hQf0/fKHwSF2lcYzA9g4imqnhic729VB9Fo70HO3Q==",
1254
  "cpu": [
1255
  "riscv64"
1256
  ],
@@ -1262,9 +1245,9 @@
1262
  ]
1263
  },
1264
  "node_modules/@rollup/rollup-linux-s390x-gnu": {
1265
- "version": "4.55.2",
1266
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.2.tgz",
1267
- "integrity": "sha512-68gHUK/howpQjh7g7hlD9DvTTt4sNLp1Bb+Yzw2Ki0xvscm2cOdCLZNJNhd2jW8lsTPrHAHuF751BygifW4bkQ==",
1268
  "cpu": [
1269
  "s390x"
1270
  ],
@@ -1276,9 +1259,9 @@
1276
  ]
1277
  },
1278
  "node_modules/@rollup/rollup-linux-x64-gnu": {
1279
- "version": "4.55.2",
1280
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.2.tgz",
1281
- "integrity": "sha512-1e30XAuaBP1MAizaOBApsgeGZge2/Byd6wV4a8oa6jPdHELbRHBiw7wvo4dp7Ie2PE8TZT4pj9RLGZv9N4qwlw==",
1282
  "cpu": [
1283
  "x64"
1284
  ],
@@ -1290,9 +1273,9 @@
1290
  ]
1291
  },
1292
  "node_modules/@rollup/rollup-linux-x64-musl": {
1293
- "version": "4.55.2",
1294
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.2.tgz",
1295
- "integrity": "sha512-4BJucJBGbuGnH6q7kpPqGJGzZnYrpAzRd60HQSt3OpX/6/YVgSsJnNzR8Ot74io50SeVT4CtCWe/RYIAymFPwA==",
1296
  "cpu": [
1297
  "x64"
1298
  ],
@@ -1304,9 +1287,9 @@
1304
  ]
1305
  },
1306
  "node_modules/@rollup/rollup-openbsd-x64": {
1307
- "version": "4.55.2",
1308
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.2.tgz",
1309
- "integrity": "sha512-cT2MmXySMo58ENv8p6/O6wI/h/gLnD3D6JoajwXFZH6X9jz4hARqUhWpGuQhOgLNXscfZYRQMJvZDtWNzMAIDw==",
1310
  "cpu": [
1311
  "x64"
1312
  ],
@@ -1318,9 +1301,9 @@
1318
  ]
1319
  },
1320
  "node_modules/@rollup/rollup-openharmony-arm64": {
1321
- "version": "4.55.2",
1322
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.2.tgz",
1323
- "integrity": "sha512-sZnyUgGkuzIXaK3jNMPmUIyJrxu/PjmATQrocpGA1WbCPX8H5tfGgRSuYtqBYAvLuIGp8SPRb1O4d1Fkb5fXaQ==",
1324
  "cpu": [
1325
  "arm64"
1326
  ],
@@ -1332,9 +1315,9 @@
1332
  ]
1333
  },
1334
  "node_modules/@rollup/rollup-win32-arm64-msvc": {
1335
- "version": "4.55.2",
1336
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.2.tgz",
1337
- "integrity": "sha512-sDpFbenhmWjNcEbBcoTV0PWvW5rPJFvu+P7XoTY0YLGRupgLbFY0XPfwIbJOObzO7QgkRDANh65RjhPmgSaAjQ==",
1338
  "cpu": [
1339
  "arm64"
1340
  ],
@@ -1346,9 +1329,9 @@
1346
  ]
1347
  },
1348
  "node_modules/@rollup/rollup-win32-ia32-msvc": {
1349
- "version": "4.55.2",
1350
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.2.tgz",
1351
- "integrity": "sha512-GvJ03TqqaweWCigtKQVBErw2bEhu1tyfNQbarwr94wCGnczA9HF8wqEe3U/Lfu6EdeNP0p6R+APeHVwEqVxpUQ==",
1352
  "cpu": [
1353
  "ia32"
1354
  ],
@@ -1360,23 +1343,9 @@
1360
  ]
1361
  },
1362
  "node_modules/@rollup/rollup-win32-x64-gnu": {
1363
- "version": "4.55.2",
1364
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.2.tgz",
1365
- "integrity": "sha512-KvXsBvp13oZz9JGe5NYS7FNizLe99Ny+W8ETsuCyjXiKdiGrcz2/J/N8qxZ/RSwivqjQguug07NLHqrIHrqfYw==",
1366
- "cpu": [
1367
- "x64"
1368
- ],
1369
- "dev": true,
1370
- "license": "MIT",
1371
- "optional": true,
1372
- "os": [
1373
- "win32"
1374
- ]
1375
- },
1376
- "node_modules/@rollup/rollup-win32-x64-msvc": {
1377
- "version": "4.55.2",
1378
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.2.tgz",
1379
- "integrity": "sha512-xNO+fksQhsAckRtDSPWaMeT1uIM+JrDRXlerpnWNXhn1TdB3YZ6uKBMBTKP0eX9XtYEP978hHk1f8332i2AW8Q==",
1380
  "cpu": [
1381
  "x64"
1382
  ],
@@ -1707,7 +1676,7 @@
1707
  "node": ">= 10"
1708
  }
1709
  },
1710
- "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
1711
  "version": "4.1.18",
1712
  "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz",
1713
  "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==",
@@ -1813,9 +1782,9 @@
1813
  "license": "MIT"
1814
  },
1815
  "node_modules/@types/react": {
1816
- "version": "19.2.8",
1817
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz",
1818
- "integrity": "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==",
1819
  "dev": true,
1820
  "license": "MIT",
1821
  "dependencies": {
@@ -1970,9 +1939,9 @@
1970
  "license": "MIT"
1971
  },
1972
  "node_modules/baseline-browser-mapping": {
1973
- "version": "2.9.15",
1974
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.15.tgz",
1975
- "integrity": "sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg==",
1976
  "dev": true,
1977
  "license": "Apache-2.0",
1978
  "bin": {
@@ -2248,6 +2217,23 @@
2248
  "@esbuild/win32-x64": "0.27.2"
2249
  }
2250
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2251
  "node_modules/escalade": {
2252
  "version": "3.2.0",
2253
  "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -2560,13 +2546,13 @@
2560
  }
2561
  },
2562
  "node_modules/framer-motion": {
2563
- "version": "12.27.1",
2564
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.27.1.tgz",
2565
- "integrity": "sha512-cEAqO69kcZt3gL0TGua8WTgRQfv4J57nqt1zxHtLKwYhAwA0x9kDS/JbMa1hJbwkGY74AGJKvZ9pX/IqWZtZWQ==",
2566
  "license": "MIT",
2567
  "dependencies": {
2568
- "motion-dom": "^12.27.1",
2569
- "motion-utils": "^12.24.10",
2570
  "tslib": "^2.4.0"
2571
  },
2572
  "peerDependencies": {
@@ -3088,7 +3074,7 @@
3088
  "url": "https://opencollective.com/parcel"
3089
  }
3090
  },
3091
- "node_modules/lightningcss-win32-x64-msvc": {
3092
  "version": "1.30.2",
3093
  "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz",
3094
  "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==",
@@ -3194,18 +3180,18 @@
3194
  }
3195
  },
3196
  "node_modules/motion-dom": {
3197
- "version": "12.27.1",
3198
- "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.27.1.tgz",
3199
- "integrity": "sha512-V/53DA2nBqKl9O2PMJleSUb/G0dsMMeZplZwgIQf5+X0bxIu7Q1cTv6DrjvTTGYRm3+7Y5wMlRZ1wT61boU/bQ==",
3200
  "license": "MIT",
3201
  "dependencies": {
3202
- "motion-utils": "^12.24.10"
3203
  }
3204
  },
3205
  "node_modules/motion-utils": {
3206
- "version": "12.24.10",
3207
- "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.24.10.tgz",
3208
- "integrity": "sha512-x5TFgkCIP4pPsRLpKoI86jv/q8t8FQOiM/0E8QKBzfMozWHfkKap2gA1hOki+B5g3IsBNpxbUnfOum1+dgvYww==",
3209
  "license": "MIT"
3210
  },
3211
  "node_modules/ms": {
@@ -3487,9 +3473,9 @@
3487
  }
3488
  },
3489
  "node_modules/rollup": {
3490
- "version": "4.55.2",
3491
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.2.tgz",
3492
- "integrity": "sha512-PggGy4dhwx5qaW+CKBilA/98Ql9keyfnb7lh4SR6shQ91QQQi1ORJ1v4UinkdP2i87OBs9AQFooQylcrrRfIcg==",
3493
  "dev": true,
3494
  "license": "MIT",
3495
  "dependencies": {
@@ -3503,34 +3489,48 @@
3503
  "npm": ">=8.0.0"
3504
  },
3505
  "optionalDependencies": {
3506
- "@rollup/rollup-android-arm-eabi": "4.55.2",
3507
- "@rollup/rollup-android-arm64": "4.55.2",
3508
- "@rollup/rollup-darwin-arm64": "4.55.2",
3509
- "@rollup/rollup-darwin-x64": "4.55.2",
3510
- "@rollup/rollup-freebsd-arm64": "4.55.2",
3511
- "@rollup/rollup-freebsd-x64": "4.55.2",
3512
- "@rollup/rollup-linux-arm-gnueabihf": "4.55.2",
3513
- "@rollup/rollup-linux-arm-musleabihf": "4.55.2",
3514
- "@rollup/rollup-linux-arm64-gnu": "4.55.2",
3515
- "@rollup/rollup-linux-arm64-musl": "4.55.2",
3516
- "@rollup/rollup-linux-loong64-gnu": "4.55.2",
3517
- "@rollup/rollup-linux-loong64-musl": "4.55.2",
3518
- "@rollup/rollup-linux-ppc64-gnu": "4.55.2",
3519
- "@rollup/rollup-linux-ppc64-musl": "4.55.2",
3520
- "@rollup/rollup-linux-riscv64-gnu": "4.55.2",
3521
- "@rollup/rollup-linux-riscv64-musl": "4.55.2",
3522
- "@rollup/rollup-linux-s390x-gnu": "4.55.2",
3523
- "@rollup/rollup-linux-x64-gnu": "4.55.2",
3524
- "@rollup/rollup-linux-x64-musl": "4.55.2",
3525
- "@rollup/rollup-openbsd-x64": "4.55.2",
3526
- "@rollup/rollup-openharmony-arm64": "4.55.2",
3527
- "@rollup/rollup-win32-arm64-msvc": "4.55.2",
3528
- "@rollup/rollup-win32-ia32-msvc": "4.55.2",
3529
- "@rollup/rollup-win32-x64-gnu": "4.55.2",
3530
- "@rollup/rollup-win32-x64-msvc": "4.55.2",
3531
  "fsevents": "~2.3.2"
3532
  }
3533
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3534
  "node_modules/scheduler": {
3535
  "version": "0.27.0",
3536
  "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
 
754
  "node": ">=18"
755
  }
756
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
757
  "node_modules/@eslint-community/eslint-utils": {
758
  "version": "4.9.1",
759
  "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
 
1021
  "license": "MIT"
1022
  },
1023
  "node_modules/@rollup/rollup-android-arm-eabi": {
1024
+ "version": "4.55.3",
1025
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.3.tgz",
1026
+ "integrity": "sha512-qyX8+93kK/7R5BEXPC2PjUt0+fS/VO2BVHjEHyIEWiYn88rcRBHmdLgoJjktBltgAf+NY7RfCGB1SoyKS/p9kg==",
1027
  "cpu": [
1028
  "arm"
1029
  ],
 
1035
  ]
1036
  },
1037
  "node_modules/@rollup/rollup-android-arm64": {
1038
+ "version": "4.55.3",
1039
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.3.tgz",
1040
+ "integrity": "sha512-6sHrL42bjt5dHQzJ12Q4vMKfN+kUnZ0atHHnv4V0Wd9JMTk7FDzSY35+7qbz3ypQYMBPANbpGK7JpnWNnhGt8g==",
1041
  "cpu": [
1042
  "arm64"
1043
  ],
 
1049
  ]
1050
  },
1051
  "node_modules/@rollup/rollup-darwin-arm64": {
1052
+ "version": "4.55.3",
1053
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.3.tgz",
1054
+ "integrity": "sha512-1ht2SpGIjEl2igJ9AbNpPIKzb1B5goXOcmtD0RFxnwNuMxqkR6AUaaErZz+4o+FKmzxcSNBOLrzsICZVNYa1Rw==",
1055
  "cpu": [
1056
  "arm64"
1057
  ],
 
1063
  ]
1064
  },
1065
  "node_modules/@rollup/rollup-darwin-x64": {
1066
+ "version": "4.55.3",
1067
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.3.tgz",
1068
+ "integrity": "sha512-FYZ4iVunXxtT+CZqQoPVwPhH7549e/Gy7PIRRtq4t5f/vt54pX6eG9ebttRH6QSH7r/zxAFA4EZGlQ0h0FvXiA==",
1069
  "cpu": [
1070
  "x64"
1071
  ],
 
1077
  ]
1078
  },
1079
  "node_modules/@rollup/rollup-freebsd-arm64": {
1080
+ "version": "4.55.3",
1081
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.3.tgz",
1082
+ "integrity": "sha512-M/mwDCJ4wLsIgyxv2Lj7Len+UMHd4zAXu4GQ2UaCdksStglWhP61U3uowkaYBQBhVoNpwx5Hputo8eSqM7K82Q==",
1083
  "cpu": [
1084
  "arm64"
1085
  ],
 
1091
  ]
1092
  },
1093
  "node_modules/@rollup/rollup-freebsd-x64": {
1094
+ "version": "4.55.3",
1095
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.3.tgz",
1096
+ "integrity": "sha512-5jZT2c7jBCrMegKYTYTpni8mg8y3uY8gzeq2ndFOANwNuC/xJbVAoGKR9LhMDA0H3nIhvaqUoBEuJoICBudFrA==",
1097
  "cpu": [
1098
  "x64"
1099
  ],
 
1105
  ]
1106
  },
1107
  "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
1108
+ "version": "4.55.3",
1109
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.3.tgz",
1110
+ "integrity": "sha512-YeGUhkN1oA+iSPzzhEjVPS29YbViOr8s4lSsFaZKLHswgqP911xx25fPOyE9+khmN6W4VeM0aevbDp4kkEoHiA==",
1111
  "cpu": [
1112
  "arm"
1113
  ],
 
1119
  ]
1120
  },
1121
  "node_modules/@rollup/rollup-linux-arm-musleabihf": {
1122
+ "version": "4.55.3",
1123
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.3.tgz",
1124
+ "integrity": "sha512-eo0iOIOvcAlWB3Z3eh8pVM8hZ0oVkK3AjEM9nSrkSug2l15qHzF3TOwT0747omI6+CJJvl7drwZepT+re6Fy/w==",
1125
  "cpu": [
1126
  "arm"
1127
  ],
 
1133
  ]
1134
  },
1135
  "node_modules/@rollup/rollup-linux-arm64-gnu": {
1136
+ "version": "4.55.3",
1137
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.3.tgz",
1138
+ "integrity": "sha512-DJay3ep76bKUDImmn//W5SvpjRN5LmK/ntWyeJs/dcnwiiHESd3N4uteK9FDLf0S0W8E6Y0sVRXpOCoQclQqNg==",
1139
  "cpu": [
1140
  "arm64"
1141
  ],
 
1147
  ]
1148
  },
1149
  "node_modules/@rollup/rollup-linux-arm64-musl": {
1150
+ "version": "4.55.3",
1151
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.3.tgz",
1152
+ "integrity": "sha512-BKKWQkY2WgJ5MC/ayvIJTHjy0JUGb5efaHCUiG/39sSUvAYRBaO3+/EK0AZT1RF3pSj86O24GLLik9mAYu0IJg==",
1153
  "cpu": [
1154
  "arm64"
1155
  ],
 
1161
  ]
1162
  },
1163
  "node_modules/@rollup/rollup-linux-loong64-gnu": {
1164
+ "version": "4.55.3",
1165
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.3.tgz",
1166
+ "integrity": "sha512-Q9nVlWtKAG7ISW80OiZGxTr6rYtyDSkauHUtvkQI6TNOJjFvpj4gcH+KaJihqYInnAzEEUetPQubRwHef4exVg==",
1167
  "cpu": [
1168
  "loong64"
1169
  ],
 
1175
  ]
1176
  },
1177
  "node_modules/@rollup/rollup-linux-loong64-musl": {
1178
+ "version": "4.55.3",
1179
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.3.tgz",
1180
+ "integrity": "sha512-2H5LmhzrpC4fFRNwknzmmTvvyJPHwESoJgyReXeFoYYuIDfBhP29TEXOkCJE/KxHi27mj7wDUClNq78ue3QEBQ==",
1181
  "cpu": [
1182
  "loong64"
1183
  ],
 
1189
  ]
1190
  },
1191
  "node_modules/@rollup/rollup-linux-ppc64-gnu": {
1192
+ "version": "4.55.3",
1193
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.3.tgz",
1194
+ "integrity": "sha512-9S542V0ie9LCTznPYlvaeySwBeIEa7rDBgLHKZ5S9DBgcqdJYburabm8TqiqG6mrdTzfV5uttQRHcbKff9lWtA==",
1195
  "cpu": [
1196
  "ppc64"
1197
  ],
 
1203
  ]
1204
  },
1205
  "node_modules/@rollup/rollup-linux-ppc64-musl": {
1206
+ "version": "4.55.3",
1207
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.3.tgz",
1208
+ "integrity": "sha512-ukxw+YH3XXpcezLgbJeasgxyTbdpnNAkrIlFGDl7t+pgCxZ89/6n1a+MxlY7CegU+nDgrgdqDelPRNQ/47zs0g==",
1209
  "cpu": [
1210
  "ppc64"
1211
  ],
 
1217
  ]
1218
  },
1219
  "node_modules/@rollup/rollup-linux-riscv64-gnu": {
1220
+ "version": "4.55.3",
1221
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.3.tgz",
1222
+ "integrity": "sha512-Iauw9UsTTvlF++FhghFJjqYxyXdggXsOqGpFBylaRopVpcbfyIIsNvkf9oGwfgIcf57z3m8+/oSYTo6HutBFNw==",
1223
  "cpu": [
1224
  "riscv64"
1225
  ],
 
1231
  ]
1232
  },
1233
  "node_modules/@rollup/rollup-linux-riscv64-musl": {
1234
+ "version": "4.55.3",
1235
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.3.tgz",
1236
+ "integrity": "sha512-3OqKAHSEQXKdq9mQ4eajqUgNIK27VZPW3I26EP8miIzuKzCJ3aW3oEn2pzF+4/Hj/Moc0YDsOtBgT5bZ56/vcA==",
1237
  "cpu": [
1238
  "riscv64"
1239
  ],
 
1245
  ]
1246
  },
1247
  "node_modules/@rollup/rollup-linux-s390x-gnu": {
1248
+ "version": "4.55.3",
1249
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.3.tgz",
1250
+ "integrity": "sha512-0CM8dSVzVIaqMcXIFej8zZrSFLnGrAE8qlNbbHfTw1EEPnFTg1U1ekI0JdzjPyzSfUsHWtodilQQG/RA55berA==",
1251
  "cpu": [
1252
  "s390x"
1253
  ],
 
1259
  ]
1260
  },
1261
  "node_modules/@rollup/rollup-linux-x64-gnu": {
1262
+ "version": "4.55.3",
1263
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.3.tgz",
1264
+ "integrity": "sha512-+fgJE12FZMIgBaKIAGd45rxf+5ftcycANJRWk8Vz0NnMTM5rADPGuRFTYar+Mqs560xuART7XsX2lSACa1iOmQ==",
1265
  "cpu": [
1266
  "x64"
1267
  ],
 
1273
  ]
1274
  },
1275
  "node_modules/@rollup/rollup-linux-x64-musl": {
1276
+ "version": "4.55.3",
1277
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.3.tgz",
1278
+ "integrity": "sha512-tMD7NnbAolWPzQlJQJjVFh/fNH3K/KnA7K8gv2dJWCwwnaK6DFCYST1QXYWfu5V0cDwarWC8Sf/cfMHniNq21A==",
1279
  "cpu": [
1280
  "x64"
1281
  ],
 
1287
  ]
1288
  },
1289
  "node_modules/@rollup/rollup-openbsd-x64": {
1290
+ "version": "4.55.3",
1291
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.3.tgz",
1292
+ "integrity": "sha512-u5KsqxOxjEeIbn7bUK1MPM34jrnPwjeqgyin4/N6e/KzXKfpE9Mi0nCxcQjaM9lLmPcHmn/xx1yOjgTMtu1jWQ==",
1293
  "cpu": [
1294
  "x64"
1295
  ],
 
1301
  ]
1302
  },
1303
  "node_modules/@rollup/rollup-openharmony-arm64": {
1304
+ "version": "4.55.3",
1305
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.3.tgz",
1306
+ "integrity": "sha512-vo54aXwjpTtsAnb3ca7Yxs9t2INZg7QdXN/7yaoG7nPGbOBXYXQY41Km+S1Ov26vzOAzLcAjmMdjyEqS1JkVhw==",
1307
  "cpu": [
1308
  "arm64"
1309
  ],
 
1315
  ]
1316
  },
1317
  "node_modules/@rollup/rollup-win32-arm64-msvc": {
1318
+ "version": "4.55.3",
1319
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.3.tgz",
1320
+ "integrity": "sha512-HI+PIVZ+m+9AgpnY3pt6rinUdRYrGHvmVdsNQ4odNqQ/eRF78DVpMR7mOq7nW06QxpczibwBmeQzB68wJ+4W4A==",
1321
  "cpu": [
1322
  "arm64"
1323
  ],
 
1329
  ]
1330
  },
1331
  "node_modules/@rollup/rollup-win32-ia32-msvc": {
1332
+ "version": "4.55.3",
1333
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.3.tgz",
1334
+ "integrity": "sha512-vRByotbdMo3Wdi+8oC2nVxtc3RkkFKrGaok+a62AT8lz/YBuQjaVYAS5Zcs3tPzW43Vsf9J0wehJbUY5xRSekA==",
1335
  "cpu": [
1336
  "ia32"
1337
  ],
 
1343
  ]
1344
  },
1345
  "node_modules/@rollup/rollup-win32-x64-gnu": {
1346
+ "version": "4.55.3",
1347
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.3.tgz",
1348
+ "integrity": "sha512-POZHq7UeuzMJljC5NjKi8vKMFN6/5EOqcX1yGntNLp7rUTpBAXQ1hW8kWPFxYLv07QMcNM75xqVLGPWQq6TKFA==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1349
  "cpu": [
1350
  "x64"
1351
  ],
 
1676
  "node": ">= 10"
1677
  }
1678
  },
1679
+ "node_modules/@tailwindcss/oxide/node_modules/@tailwindcss/oxide-win32-x64-msvc": {
1680
  "version": "4.1.18",
1681
  "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz",
1682
  "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==",
 
1782
  "license": "MIT"
1783
  },
1784
  "node_modules/@types/react": {
1785
+ "version": "19.2.9",
1786
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.9.tgz",
1787
+ "integrity": "sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA==",
1788
  "dev": true,
1789
  "license": "MIT",
1790
  "dependencies": {
 
1939
  "license": "MIT"
1940
  },
1941
  "node_modules/baseline-browser-mapping": {
1942
+ "version": "2.9.16",
1943
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.16.tgz",
1944
+ "integrity": "sha512-KeUZdBuxngy825i8xvzaK1Ncnkx0tBmb3k8DkEuqjKRkmtvNTjey2ZsNeh8Dw4lfKvbCOu9oeNx2TKm2vHqcRw==",
1945
  "dev": true,
1946
  "license": "Apache-2.0",
1947
  "bin": {
 
2217
  "@esbuild/win32-x64": "0.27.2"
2218
  }
2219
  },
2220
+ "node_modules/esbuild/node_modules/@esbuild/win32-x64": {
2221
+ "version": "0.27.2",
2222
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
2223
+ "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
2224
+ "cpu": [
2225
+ "x64"
2226
+ ],
2227
+ "dev": true,
2228
+ "license": "MIT",
2229
+ "optional": true,
2230
+ "os": [
2231
+ "win32"
2232
+ ],
2233
+ "engines": {
2234
+ "node": ">=18"
2235
+ }
2236
+ },
2237
  "node_modules/escalade": {
2238
  "version": "3.2.0",
2239
  "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
 
2546
  }
2547
  },
2548
  "node_modules/framer-motion": {
2549
+ "version": "12.28.1",
2550
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.28.1.tgz",
2551
+ "integrity": "sha512-72GkO7DS4FfcSjf26wx0v+rzkW8Fhn4Djh04aDbuEg7NYG8X8MhJZc6/5weG/YeEgIP+fCo8FS2y1HnXH8k8fQ==",
2552
  "license": "MIT",
2553
  "dependencies": {
2554
+ "motion-dom": "^12.28.1",
2555
+ "motion-utils": "^12.27.2",
2556
  "tslib": "^2.4.0"
2557
  },
2558
  "peerDependencies": {
 
3074
  "url": "https://opencollective.com/parcel"
3075
  }
3076
  },
3077
+ "node_modules/lightningcss/node_modules/lightningcss-win32-x64-msvc": {
3078
  "version": "1.30.2",
3079
  "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz",
3080
  "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==",
 
3180
  }
3181
  },
3182
  "node_modules/motion-dom": {
3183
+ "version": "12.28.1",
3184
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.28.1.tgz",
3185
+ "integrity": "sha512-xqgID69syDvXwFJnUd5bW6ajGUAr/qevRoUe/EqpsXUbVIopyWrAOiwQOhpgVQD+B7Ra60zTdj5gVkmwncebMg==",
3186
  "license": "MIT",
3187
  "dependencies": {
3188
+ "motion-utils": "^12.27.2"
3189
  }
3190
  },
3191
  "node_modules/motion-utils": {
3192
+ "version": "12.27.2",
3193
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.27.2.tgz",
3194
+ "integrity": "sha512-B55gcoL85Mcdt2IEStY5EEAsrMSVE2sI14xQ/uAdPL+mfQxhKKFaEag9JmfxedJOR4vZpBGoPeC/Gm13I/4g5Q==",
3195
  "license": "MIT"
3196
  },
3197
  "node_modules/ms": {
 
3473
  }
3474
  },
3475
  "node_modules/rollup": {
3476
+ "version": "4.55.3",
3477
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.3.tgz",
3478
+ "integrity": "sha512-y9yUpfQvetAjiDLtNMf1hL9NXchIJgWt6zIKeoB+tCd3npX08Eqfzg60V9DhIGVMtQ0AlMkFw5xa+AQ37zxnAA==",
3479
  "dev": true,
3480
  "license": "MIT",
3481
  "dependencies": {
 
3489
  "npm": ">=8.0.0"
3490
  },
3491
  "optionalDependencies": {
3492
+ "@rollup/rollup-android-arm-eabi": "4.55.3",
3493
+ "@rollup/rollup-android-arm64": "4.55.3",
3494
+ "@rollup/rollup-darwin-arm64": "4.55.3",
3495
+ "@rollup/rollup-darwin-x64": "4.55.3",
3496
+ "@rollup/rollup-freebsd-arm64": "4.55.3",
3497
+ "@rollup/rollup-freebsd-x64": "4.55.3",
3498
+ "@rollup/rollup-linux-arm-gnueabihf": "4.55.3",
3499
+ "@rollup/rollup-linux-arm-musleabihf": "4.55.3",
3500
+ "@rollup/rollup-linux-arm64-gnu": "4.55.3",
3501
+ "@rollup/rollup-linux-arm64-musl": "4.55.3",
3502
+ "@rollup/rollup-linux-loong64-gnu": "4.55.3",
3503
+ "@rollup/rollup-linux-loong64-musl": "4.55.3",
3504
+ "@rollup/rollup-linux-ppc64-gnu": "4.55.3",
3505
+ "@rollup/rollup-linux-ppc64-musl": "4.55.3",
3506
+ "@rollup/rollup-linux-riscv64-gnu": "4.55.3",
3507
+ "@rollup/rollup-linux-riscv64-musl": "4.55.3",
3508
+ "@rollup/rollup-linux-s390x-gnu": "4.55.3",
3509
+ "@rollup/rollup-linux-x64-gnu": "4.55.3",
3510
+ "@rollup/rollup-linux-x64-musl": "4.55.3",
3511
+ "@rollup/rollup-openbsd-x64": "4.55.3",
3512
+ "@rollup/rollup-openharmony-arm64": "4.55.3",
3513
+ "@rollup/rollup-win32-arm64-msvc": "4.55.3",
3514
+ "@rollup/rollup-win32-ia32-msvc": "4.55.3",
3515
+ "@rollup/rollup-win32-x64-gnu": "4.55.3",
3516
+ "@rollup/rollup-win32-x64-msvc": "4.55.3",
3517
  "fsevents": "~2.3.2"
3518
  }
3519
  },
3520
+ "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": {
3521
+ "version": "4.55.3",
3522
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.3.tgz",
3523
+ "integrity": "sha512-aPFONczE4fUFKNXszdvnd2GqKEYQdV5oEsIbKPujJmWlCI9zEsv1Otig8RKK+X9bed9gFUN6LAeN4ZcNuu4zjg==",
3524
+ "cpu": [
3525
+ "x64"
3526
+ ],
3527
+ "dev": true,
3528
+ "license": "MIT",
3529
+ "optional": true,
3530
+ "os": [
3531
+ "win32"
3532
+ ]
3533
+ },
3534
  "node_modules/scheduler": {
3535
  "version": "0.27.0",
3536
  "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
src/components/ui/AuthModal.jsx CHANGED
@@ -11,8 +11,9 @@ export const AuthModal = ({ isOpen, onClose, onSuccess }) => {
11
  const [password, setPassword] = useState('');
12
  const [loading, setLoading] = useState(false);
13
  const [error, setError] = useState(null);
 
14
 
15
- const { signIn, signUp } = useAuth();
16
 
17
  const handleSubmit = async (e) => {
18
  e.preventDefault();
@@ -26,9 +27,13 @@ export const AuthModal = ({ isOpen, onClose, onSuccess }) => {
26
 
27
  if (authError) throw authError;
28
 
29
- // Success
30
- if (onSuccess) onSuccess();
31
- onClose();
 
 
 
 
32
  } catch (err) {
33
  console.error('Auth error:', err);
34
  setError(err.message);
@@ -37,13 +42,48 @@ export const AuthModal = ({ isOpen, onClose, onSuccess }) => {
37
  }
38
  };
39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  return (
41
  <Modal
42
  isOpen={isOpen}
43
  onClose={onClose}
44
  title={isSignIn ? "Sign In to Roast" : "Join the Roast Club"}
45
  >
46
- <form onSubmit={handleSubmit} className="space-y-4">
47
  {error && (
48
  <div className="bg-red-50 text-red-600 p-3 text-sm border-l-4 border-red-500 flex items-start gap-2">
49
  <AlertCircle size={16} className="mt-0.5" />
@@ -51,59 +91,77 @@ export const AuthModal = ({ isOpen, onClose, onSuccess }) => {
51
  </div>
52
  )}
53
 
54
- <div>
55
- <label className="block text-sm font-bold mb-1">Email</label>
56
- <div className="relative">
57
- <Mail className="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" size={18} />
58
- <Input
59
- type="email"
60
- value={email}
61
- onChange={(e) => setEmail(e.target.value)}
62
- placeholder="you@example.com"
63
- className="pl-10"
64
- required
65
- />
66
- </div>
 
67
  </div>
68
 
69
- <div>
70
- <label className="block text-sm font-bold mb-1">Password</label>
71
- <div className="relative">
72
- <Lock className="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" size={18} />
73
- <Input
74
- type="password"
75
- value={password}
76
- onChange={(e) => setPassword(e.target.value)}
77
- placeholder="••••••••"
78
- className="pl-10"
79
- required
80
- />
 
 
81
  </div>
82
- </div>
83
 
84
- <div className="pt-2">
85
- <Button
86
- type="submit"
87
- disabled={loading}
88
- className="w-full btn-brutal-primary justify-center"
89
- >
90
- {loading ? <Loader2 className="animate-spin" size={20} /> : (isSignIn ? 'Sign In' : 'Sign Up')}
91
- </Button>
92
- </div>
 
 
 
 
 
93
 
94
- <div className="text-center text-sm pt-2">
95
- <span className="text-gray-500">
96
- {isSignIn ? "Don't have an account? " : "Already have an account? "}
97
- </span>
98
- <button
99
- type="button"
100
- onClick={() => setIsSignIn(!isSignIn)}
101
- className="font-bold underline hover:text-brutalist-red"
102
- >
103
- {isSignIn ? 'Sign Up' : 'Sign In'}
104
- </button>
105
- </div>
106
- </form>
 
 
 
 
 
 
 
 
 
 
 
107
  </Modal>
108
  );
109
  };
 
11
  const [password, setPassword] = useState('');
12
  const [loading, setLoading] = useState(false);
13
  const [error, setError] = useState(null);
14
+ const [showSuccess, setShowSuccess] = useState(false);
15
 
16
+ const { signIn, signUp, signInWithGoogle } = useAuth();
17
 
18
  const handleSubmit = async (e) => {
19
  e.preventDefault();
 
27
 
28
  if (authError) throw authError;
29
 
30
+ // Success handling
31
+ if (isSignIn) {
32
+ if (onSuccess) onSuccess();
33
+ onClose();
34
+ } else {
35
+ setShowSuccess(true);
36
+ }
37
  } catch (err) {
38
  console.error('Auth error:', err);
39
  setError(err.message);
 
42
  }
43
  };
44
 
45
+ const handleGoogleSignIn = async () => {
46
+ try {
47
+ const { error } = await signInWithGoogle();
48
+ if (error) throw error;
49
+ } catch (err) {
50
+ console.error('Google Auth error:', err);
51
+ setError(err.message);
52
+ }
53
+ };
54
+
55
+ if (showSuccess) {
56
+ return (
57
+ <Modal isOpen={isOpen} onClose={onClose} title="Check Your Inbox!">
58
+ <div className="text-center py-4 space-y-4">
59
+ <div className="w-16 h-16 bg-blue-100 rounded-full flex items-center justify-center mx-auto">
60
+ <Mail className="text-blue-600" size={32} />
61
+ </div>
62
+ <div>
63
+ <p className="font-bold text-lg mb-2">Verification Link Sent</p>
64
+ <p className="text-gray-600 mb-4">
65
+ We sent a confirmation link to <span className="font-bold">{email}</span>.
66
+ Click it to activate your account and start roasting!
67
+ </p>
68
+ <p className="text-xs text-gray-400">
69
+ Check your spam folder if you don't see it.
70
+ </p>
71
+ </div>
72
+ <Button onClick={onClose} className="w-full btn-brutal-primary justify-center">
73
+ Got it!
74
+ </Button>
75
+ </div>
76
+ </Modal>
77
+ );
78
+ }
79
+
80
  return (
81
  <Modal
82
  isOpen={isOpen}
83
  onClose={onClose}
84
  title={isSignIn ? "Sign In to Roast" : "Join the Roast Club"}
85
  >
86
+ <div className="space-y-4">
87
  {error && (
88
  <div className="bg-red-50 text-red-600 p-3 text-sm border-l-4 border-red-500 flex items-start gap-2">
89
  <AlertCircle size={16} className="mt-0.5" />
 
91
  </div>
92
  )}
93
 
94
+ {/* Google Login */}
95
+ <button
96
+ type="button"
97
+ onClick={handleGoogleSignIn}
98
+ className="w-full flex items-center justify-center gap-2 bg-white border-2 border-brutalist-black p-2 font-bold hover:bg-gray-50 transition-colors"
99
+ >
100
+ <img src="https://www.svgrepo.com/show/475656/google-color.svg" alt="Google" className="w-5 h-5" />
101
+ Continue with Google
102
+ </button>
103
+
104
+ <div className="relative flex py-2 items-center">
105
+ <div className="flex-grow border-t border-gray-300"></div>
106
+ <span className="flex-shrink-0 mx-4 text-gray-400 text-xs uppercase font-bold">Or with Email</span>
107
+ <div className="flex-grow border-t border-gray-300"></div>
108
  </div>
109
 
110
+ <form onSubmit={handleSubmit} className="space-y-4">
111
+ <div>
112
+ <label className="block text-sm font-bold mb-1">Email</label>
113
+ <div className="relative">
114
+ <Mail className="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" size={18} />
115
+ <Input
116
+ type="email"
117
+ value={email}
118
+ onChange={(e) => setEmail(e.target.value)}
119
+ placeholder="you@example.com"
120
+ className="pl-10"
121
+ required
122
+ />
123
+ </div>
124
  </div>
 
125
 
126
+ <div>
127
+ <label className="block text-sm font-bold mb-1">Password</label>
128
+ <div className="relative">
129
+ <Lock className="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" size={18} />
130
+ <Input
131
+ type="password"
132
+ value={password}
133
+ onChange={(e) => setPassword(e.target.value)}
134
+ placeholder="••••••••"
135
+ className="pl-10"
136
+ required
137
+ />
138
+ </div>
139
+ </div>
140
 
141
+ <div className="pt-2">
142
+ <Button
143
+ type="submit"
144
+ disabled={loading}
145
+ className="w-full btn-brutal-primary justify-center"
146
+ >
147
+ {loading ? <Loader2 className="animate-spin" size={20} /> : (isSignIn ? 'Sign In' : 'Sign Up')}
148
+ </Button>
149
+ </div>
150
+
151
+ <div className="text-center text-sm pt-2">
152
+ <span className="text-gray-500">
153
+ {isSignIn ? "Don't have an account? " : "Already have an account? "}
154
+ </span>
155
+ <button
156
+ type="button"
157
+ onClick={() => setIsSignIn(!isSignIn)}
158
+ className="font-bold underline hover:text-brutalist-red"
159
+ >
160
+ {isSignIn ? 'Sign Up' : 'Sign In'}
161
+ </button>
162
+ </div>
163
+ </form>
164
+ </div>
165
  </Modal>
166
  );
167
  };
src/contexts/AuthContext.jsx CHANGED
@@ -46,6 +46,15 @@ export const AuthProvider = ({ children }) => {
46
  return supabase.auth.signInWithPassword({ email, password });
47
  };
48
 
 
 
 
 
 
 
 
 
 
49
  const signOut = () => {
50
  return supabase.auth.signOut();
51
  };
@@ -55,6 +64,7 @@ export const AuthProvider = ({ children }) => {
55
  isPremium,
56
  signUp,
57
  signIn,
 
58
  signOut,
59
  loading
60
  };
 
46
  return supabase.auth.signInWithPassword({ email, password });
47
  };
48
 
49
+ const signInWithGoogle = () => {
50
+ return supabase.auth.signInWithOAuth({
51
+ provider: 'google',
52
+ options: {
53
+ redirectTo: `${window.location.origin}/`
54
+ }
55
+ });
56
+ };
57
+
58
  const signOut = () => {
59
  return supabase.auth.signOut();
60
  };
 
64
  isPremium,
65
  signUp,
66
  signIn,
67
+ signInWithGoogle,
68
  signOut,
69
  loading
70
  };
src/features/ClapbackChat.jsx CHANGED
@@ -144,7 +144,7 @@ export const ClapbackChat = () => {
144
  <motion.button
145
  layoutId="chat-bubble"
146
  onClick={() => setIsOpen(true)}
147
- className="fixed bottom-4 right-4 z-50 h-14 w-14 md:h-16 md:w-16 rounded-full bg-brutalist-black text-white hover:bg-brutalist-red p-0 flex items-center justify-center border-4 border-brutalist-black shadow-hard-lg"
148
  whileHover={{ scale: 1.1, rotate: -5 }}
149
  whileTap={{ scale: 0.95 }}
150
  >
 
144
  <motion.button
145
  layoutId="chat-bubble"
146
  onClick={() => setIsOpen(true)}
147
+ className="fixed bottom-4 right-4 md:bottom-8 md:right-8 z-50 h-14 w-14 md:h-16 md:w-16 rounded-full bg-brutalist-black text-white hover:bg-brutalist-red p-0 flex items-center justify-center border-4 border-brutalist-black shadow-hard-lg animate-pulse-glow"
148
  whileHover={{ scale: 1.1, rotate: -5 }}
149
  whileTap={{ scale: 0.95 }}
150
  >
src/features/ResumeUpload.jsx CHANGED
@@ -1,6 +1,6 @@
1
- import React, { useState } from 'react';
2
  import { motion, AnimatePresence } from 'framer-motion';
3
- import { Upload, FileText, X, ShieldCheck, Lock } from 'lucide-react';
4
  import { Card } from '../components/ui/Card';
5
  import { Button } from '../components/ui/Button';
6
  import { useAuth } from '../contexts/AuthContext';
@@ -10,52 +10,93 @@ export const ResumeUpload = () => {
10
  const [file, setFile] = useState(null);
11
  const [isDragOver, setIsDragOver] = useState(false);
12
  const [showAuthModal, setShowAuthModal] = useState(false);
 
 
13
 
14
  const { user } = useAuth();
15
 
16
- // Handle file upload - requires auth
17
- const handleUpload = (e) => {
18
  if (!user) {
19
  setShowAuthModal(true);
20
  return;
21
  }
22
- e?.preventDefault?.();
23
- setIsDragOver(false);
24
- // In a real app, validating file type here
25
- setFile({ name: "john_doe_resume.pdf", size: "1.2 MB" });
 
 
 
 
 
 
 
 
 
 
26
  };
27
 
 
28
  const handleDrop = (e) => {
29
  e.preventDefault();
 
 
30
  if (!user) {
31
  setShowAuthModal(true);
32
  return;
33
  }
34
- setIsDragOver(false);
35
- setFile({ name: "john_doe_resume.pdf", size: "1.2 MB" });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  };
37
 
38
  return (
39
  <>
40
- <section className="py-20 bg-brutalist-gray/20">
41
  <div className="container mx-auto px-4 text-center">
42
- <h2 className="text-4xl md:text-5xl font-black uppercase mb-4">
43
  Resume Reality Check
44
  </h2>
45
- <p className="text-xl text-gray-600 mb-12 max-w-2xl mx-auto">
46
  We'll compare your "Expert" skills against your actual code.
47
- <span className="bg-black text-white px-2 mx-1 font-mono text-sm">PDF ONLY</span>
48
  </p>
49
 
50
- <div className="max-w-xl mx-auto relative">
51
  {/* Security Badge */}
52
- <div className="absolute -top-6 -right-6 z-10 rotate-12">
53
- <div className="bg-brutalist-white border-2 border-brutalist-black px-4 py-2 shadow-hard flex items-center gap-2">
54
- <ShieldCheck className="text-green-600" size={20} />
55
  <span className="font-bold text-xs uppercase">PII Redacted</span>
56
  </div>
57
  </div>
58
 
 
 
 
 
 
 
 
 
 
59
  <Card className="relative overflow-hidden">
60
  <AnimatePresence mode="wait">
61
  {!file ? (
@@ -65,28 +106,28 @@ export const ResumeUpload = () => {
65
  animate={{ opacity: 1 }}
66
  exit={{ opacity: 0 }}
67
  className={`
68
- border-4 border-dashed rounded-none p-12 transition-colors duration-300
69
- flex flex-col items-center justify-center gap-4
70
  ${isDragOver ? 'border-brutalist-red bg-red-50' : 'border-gray-300 hover:border-brutalist-black'}
71
  `}
72
  onDragOver={(e) => { e.preventDefault(); setIsDragOver(true); }}
73
  onDragLeave={() => setIsDragOver(false)}
74
  onDrop={handleDrop}
75
- onClick={handleUpload}
76
  >
77
  {!user ? (
78
  <>
79
- <Lock size={48} className="text-gray-400" />
80
- <div className="space-y-2">
81
- <p className="font-bold text-lg">Sign in to Upload</p>
82
  <p className="text-sm font-mono text-gray-500">Click to sign in first</p>
83
  </div>
84
  </>
85
  ) : (
86
  <>
87
- <Upload size={48} className={isDragOver ? "text-brutalist-red" : "text-gray-400"} />
88
- <div className="space-y-2">
89
- <p className="font-bold text-lg">Drop your Resume here</p>
90
  <p className="text-sm font-mono text-gray-500">or click to browse</p>
91
  </div>
92
  </>
@@ -97,28 +138,39 @@ export const ResumeUpload = () => {
97
  key="file"
98
  initial={{ scale: 0.9, opacity: 0 }}
99
  animate={{ scale: 1, opacity: 1 }}
100
- className="bg-neutral-50 p-8 border-2 border-dashed border-brutalist-black"
101
  >
102
- <div className="flex items-center justify-between gap-4 mb-6">
103
- <div className="flex items-center gap-4">
104
- <div className="w-16 h-16 bg-red-100 border-2 border-brutalist-black flex items-center justify-center">
105
- <FileText size={32} className="text-brutalist-red" />
106
  </div>
107
  <div className="text-left">
108
- <p className="font-bold text-lg">{file.name}</p>
109
- <p className="font-mono text-xs text-gray-500">1.2 MB • SCANNED</p>
110
  </div>
111
  </div>
112
  <button
113
  onClick={() => setFile(null)}
114
- className="p-2 hover:bg-red-100 transition-colors border-2 border-transparent hover:border-red-200"
115
  >
116
- <X size={20} />
117
  </button>
118
  </div>
119
 
120
- <Button className="w-full bg-brutalist-red text-white hover:bg-neutral-900">
121
- EXPOSE MY LIES
 
 
 
 
 
 
 
 
 
 
 
122
  </Button>
123
  </motion.div>
124
  )}
 
1
+ import React, { useState, useRef } from 'react';
2
  import { motion, AnimatePresence } from 'framer-motion';
3
+ import { Upload, FileText, X, ShieldCheck, Lock, Loader2 } from 'lucide-react';
4
  import { Card } from '../components/ui/Card';
5
  import { Button } from '../components/ui/Button';
6
  import { useAuth } from '../contexts/AuthContext';
 
10
  const [file, setFile] = useState(null);
11
  const [isDragOver, setIsDragOver] = useState(false);
12
  const [showAuthModal, setShowAuthModal] = useState(false);
13
+ const [isAnalyzing, setIsAnalyzing] = useState(false);
14
+ const fileInputRef = useRef(null);
15
 
16
  const { user } = useAuth();
17
 
18
+ // Handle click on upload area
19
+ const handleClick = () => {
20
  if (!user) {
21
  setShowAuthModal(true);
22
  return;
23
  }
24
+ // Trigger file input
25
+ fileInputRef.current?.click();
26
+ };
27
+
28
+ // Handle file selection from input
29
+ const handleFileChange = (e) => {
30
+ const selectedFile = e.target.files?.[0];
31
+ if (selectedFile && selectedFile.type === 'application/pdf') {
32
+ setFile({
33
+ name: selectedFile.name,
34
+ size: `${(selectedFile.size / 1024 / 1024).toFixed(2)} MB`,
35
+ rawFile: selectedFile
36
+ });
37
+ }
38
  };
39
 
40
+ // Handle drag and drop
41
  const handleDrop = (e) => {
42
  e.preventDefault();
43
+ setIsDragOver(false);
44
+
45
  if (!user) {
46
  setShowAuthModal(true);
47
  return;
48
  }
49
+
50
+ const droppedFile = e.dataTransfer.files?.[0];
51
+ if (droppedFile && droppedFile.type === 'application/pdf') {
52
+ setFile({
53
+ name: droppedFile.name,
54
+ size: `${(droppedFile.size / 1024 / 1024).toFixed(2)} MB`,
55
+ rawFile: droppedFile
56
+ });
57
+ }
58
+ };
59
+
60
+ const handleAnalyze = async () => {
61
+ if (!file) return;
62
+ setIsAnalyzing(true);
63
+ // TODO: Implement actual resume analysis API call
64
+ setTimeout(() => {
65
+ setIsAnalyzing(false);
66
+ alert('Resume analysis coming soon!');
67
+ }, 2000);
68
  };
69
 
70
  return (
71
  <>
72
+ <section className="py-16 bg-brutalist-gray/20">
73
  <div className="container mx-auto px-4 text-center">
74
+ <h2 className="text-3xl md:text-4xl font-black uppercase mb-3">
75
  Resume Reality Check
76
  </h2>
77
+ <p className="text-lg text-gray-600 mb-8 max-w-xl mx-auto">
78
  We'll compare your "Expert" skills against your actual code.
79
+ <span className="bg-black text-white px-2 mx-1 font-mono text-xs">PDF ONLY</span>
80
  </p>
81
 
82
+ <div className="max-w-md mx-auto relative">
83
  {/* Security Badge */}
84
+ <div className="absolute -top-4 -right-4 z-10 rotate-12">
85
+ <div className="bg-white border-2 border-brutalist-black px-3 py-1 shadow-hard flex items-center gap-2">
86
+ <ShieldCheck className="text-green-600" size={16} />
87
  <span className="font-bold text-xs uppercase">PII Redacted</span>
88
  </div>
89
  </div>
90
 
91
+ {/* Hidden file input */}
92
+ <input
93
+ ref={fileInputRef}
94
+ type="file"
95
+ accept=".pdf"
96
+ onChange={handleFileChange}
97
+ className="hidden"
98
+ />
99
+
100
  <Card className="relative overflow-hidden">
101
  <AnimatePresence mode="wait">
102
  {!file ? (
 
106
  animate={{ opacity: 1 }}
107
  exit={{ opacity: 0 }}
108
  className={`
109
+ border-4 border-dashed rounded-none p-8 transition-colors duration-300 cursor-pointer
110
+ flex flex-col items-center justify-center gap-3
111
  ${isDragOver ? 'border-brutalist-red bg-red-50' : 'border-gray-300 hover:border-brutalist-black'}
112
  `}
113
  onDragOver={(e) => { e.preventDefault(); setIsDragOver(true); }}
114
  onDragLeave={() => setIsDragOver(false)}
115
  onDrop={handleDrop}
116
+ onClick={handleClick}
117
  >
118
  {!user ? (
119
  <>
120
+ <Lock size={40} className="text-gray-400" />
121
+ <div className="space-y-1">
122
+ <p className="font-bold">Sign in to Upload</p>
123
  <p className="text-sm font-mono text-gray-500">Click to sign in first</p>
124
  </div>
125
  </>
126
  ) : (
127
  <>
128
+ <Upload size={40} className={isDragOver ? "text-brutalist-red" : "text-gray-400"} />
129
+ <div className="space-y-1">
130
+ <p className="font-bold">Drop your Resume here</p>
131
  <p className="text-sm font-mono text-gray-500">or click to browse</p>
132
  </div>
133
  </>
 
138
  key="file"
139
  initial={{ scale: 0.9, opacity: 0 }}
140
  animate={{ scale: 1, opacity: 1 }}
141
+ className="bg-neutral-50 p-6 border-2 border-dashed border-brutalist-black"
142
  >
143
+ <div className="flex items-center justify-between gap-4 mb-4">
144
+ <div className="flex items-center gap-3">
145
+ <div className="w-12 h-12 bg-red-100 border-2 border-brutalist-black flex items-center justify-center">
146
+ <FileText size={24} className="text-brutalist-red" />
147
  </div>
148
  <div className="text-left">
149
+ <p className="font-bold text-sm truncate max-w-[150px]">{file.name}</p>
150
+ <p className="font-mono text-xs text-gray-500">{file.size}</p>
151
  </div>
152
  </div>
153
  <button
154
  onClick={() => setFile(null)}
155
+ className="p-2 hover:bg-red-100 transition-colors rounded"
156
  >
157
+ <X size={18} />
158
  </button>
159
  </div>
160
 
161
+ <Button
162
+ onClick={handleAnalyze}
163
+ disabled={isAnalyzing}
164
+ className="w-full bg-brutalist-red text-white hover:bg-neutral-900 justify-center"
165
+ >
166
+ {isAnalyzing ? (
167
+ <>
168
+ <Loader2 size={18} className="animate-spin mr-2" />
169
+ ANALYZING...
170
+ </>
171
+ ) : (
172
+ 'EXPOSE MY LIES'
173
+ )}
174
  </Button>
175
  </motion.div>
176
  )}
src/features/RoastView.jsx CHANGED
@@ -1,58 +1,77 @@
1
  import React from 'react';
2
  import { Scorecard } from '../components/ui/Scorecard';
3
  import { Stamp } from '../components/ui/Stamp';
4
- import { FixItButton } from './FixItButton';
5
  import { motion } from 'framer-motion';
 
6
 
7
  export const RoastView = ({ roastData }) => {
8
  if (!roastData) return null;
9
 
10
- const { roast, errors, tier } = roastData;
11
- const isPremium = tier === 'premium';
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  return (
14
  <section id="roast-view" className="py-12 bg-gray-50 border-y-4 border-brutalist-black">
15
  <div className="container mx-auto px-4">
16
  <div className="flex flex-col lg:flex-row gap-8">
17
 
18
- {/* The Evidence (Website Screenshot) */}
19
  <div className="flex-1">
20
- <div className="flex items-center justify-between mb-4">
21
- <h2 className="text-2xl font-black uppercase">Evidence #402</h2>
22
- <span className="font-mono text-sm bg-red-100 text-brutalist-red px-2 py-1 border border-brutalist-red font-bold">
23
- DETECTED TECHNOLOGY: TRASH 🗑️
24
- </span>
 
 
 
 
 
 
25
  </div>
26
 
27
- <div className="relative border-4 border-brutalist-black bg-white shadow-hard-lg min-h-[600px] overflow-hidden group">
28
  {/* Roast Content */}
29
- <div className="p-8">
30
- <h3 className="font-black text-2xl mb-4">THE VERDICT:</h3>
31
- <div className="prose prose-lg font-medium text-gray-800 mb-8 whitespace-pre-wrap">
32
  {roast}
33
  </div>
34
 
35
- {/* Fixes List */}
36
- <div className="space-y-4">
37
- {errors?.map((error, idx) => (
38
- <div key={idx} className="bg-red-50 border-l-4 border-brutalist-red p-4">
39
- <p className="font-bold text-brutalist-red text-sm mb-1">ISSUE #{idx + 1}</p>
40
- <p className="text-gray-800">{error}</p>
41
- </div>
42
- ))}
43
- </div>
 
 
 
44
  </div>
45
 
46
- {/* Overlay Stamps */}
47
- <Stamp className="top-20 right-10 rotate-12" angle={12}>
48
- <p className="text-xl">ROASTED</p>
49
- <p className="text-xs font-mono">EMOTIONAL DAMAGE: 100%</p>
50
  </Stamp>
51
  </div>
52
  </div>
53
 
54
- {/* The Verdict (Scorecard) */}
55
- <div className="w-full lg:w-96">
56
  <Scorecard />
57
  </div>
58
  </div>
 
1
  import React from 'react';
2
  import { Scorecard } from '../components/ui/Scorecard';
3
  import { Stamp } from '../components/ui/Stamp';
 
4
  import { motion } from 'framer-motion';
5
+ import { Download, Share2 } from 'lucide-react';
6
 
7
  export const RoastView = ({ roastData }) => {
8
  if (!roastData) return null;
9
 
10
+ const { roast, errors, tier, screenshot } = roastData;
11
+
12
+ const handleShare = () => {
13
+ if (navigator.share) {
14
+ navigator.share({
15
+ title: 'My PixelRoast Result',
16
+ text: roast?.substring(0, 100) + '...',
17
+ url: window.location.href
18
+ });
19
+ } else {
20
+ navigator.clipboard.writeText(window.location.href);
21
+ alert('Link copied!');
22
+ }
23
+ };
24
 
25
  return (
26
  <section id="roast-view" className="py-12 bg-gray-50 border-y-4 border-brutalist-black">
27
  <div className="container mx-auto px-4">
28
  <div className="flex flex-col lg:flex-row gap-8">
29
 
30
+ {/* The Evidence (Website Screenshot / Roast) */}
31
  <div className="flex-1">
32
+ <div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4 mb-4">
33
+ <h2 className="text-2xl font-black uppercase">The Verdict</h2>
34
+ <div className="flex gap-2">
35
+ <button
36
+ onClick={handleShare}
37
+ className="flex items-center gap-2 px-3 py-2 text-sm font-bold border-2 border-brutalist-black bg-white hover:bg-brutalist-yellow transition-colors"
38
+ >
39
+ <Share2 size={16} />
40
+ SHARE
41
+ </button>
42
+ </div>
43
  </div>
44
 
45
+ <div className="relative border-4 border-brutalist-black bg-white shadow-hard-lg overflow-hidden">
46
  {/* Roast Content */}
47
+ <div className="p-6 md:p-8">
48
+ <div className="prose prose-lg font-medium text-gray-800 mb-6 whitespace-pre-wrap">
 
49
  {roast}
50
  </div>
51
 
52
+ {/* Issues List */}
53
+ {errors && errors.length > 0 && (
54
+ <div className="space-y-3 mt-6">
55
+ <h4 className="font-black text-sm uppercase text-gray-500">Issues Found:</h4>
56
+ {errors.map((error, idx) => (
57
+ <div key={idx} className="bg-red-50 border-l-4 border-brutalist-red p-3">
58
+ <p className="font-bold text-brutalist-red text-xs mb-1">#{idx + 1}</p>
59
+ <p className="text-gray-800 text-sm">{error}</p>
60
+ </div>
61
+ ))}
62
+ </div>
63
+ )}
64
  </div>
65
 
66
+ {/* Overlay Stamp */}
67
+ <Stamp className="top-4 right-4 rotate-12" angle={12}>
68
+ <p className="text-lg">ROASTED</p>
 
69
  </Stamp>
70
  </div>
71
  </div>
72
 
73
+ {/* The Scorecard */}
74
+ <div className="w-full lg:w-80">
75
  <Scorecard />
76
  </div>
77
  </div>
src/pages/Home.jsx CHANGED
@@ -8,28 +8,31 @@ import { AboutSection } from '../features/AboutSection';
8
  import { PricingSection } from '../features/PricingSection';
9
  import { Footer } from '../features/Footer';
10
  import { ScanHistory } from '../features/ScanHistory';
 
11
 
12
  const Home = () => {
13
  const [roastResult, setRoastResult] = useState(null);
 
14
 
15
  return (
16
  <div className="space-y-0">
17
  <HeroSection onRoastComplete={setRoastResult} />
18
- <PersonalitySelector />
19
- <AboutSection />
20
- <PricingSection />
21
-
22
- {/* Divider */}
23
- <div className="h-4 bg-brutalist-black border-y-4 border-white my-0" />
24
 
25
- {/* Scan History connects to RoastView via onSelectScan */}
26
- <ScanHistory onSelectScan={(scan) => {
27
- setRoastResult(scan.roast_data);
28
- document.getElementById('roast-view')?.scrollIntoView({ behavior: 'smooth' });
29
- }} />
 
 
30
 
 
31
  <RoastView roastData={roastResult} />
32
 
 
 
 
 
33
  <section id="resume">
34
  <ResumeUpload />
35
  </section>
 
8
  import { PricingSection } from '../features/PricingSection';
9
  import { Footer } from '../features/Footer';
10
  import { ScanHistory } from '../features/ScanHistory';
11
+ import { useAuth } from '../contexts/AuthContext';
12
 
13
  const Home = () => {
14
  const [roastResult, setRoastResult] = useState(null);
15
+ const { user } = useAuth();
16
 
17
  return (
18
  <div className="space-y-0">
19
  <HeroSection onRoastComplete={setRoastResult} />
 
 
 
 
 
 
20
 
21
+ {/* History of Shame - right after Hero, only for logged in users */}
22
+ {user && (
23
+ <ScanHistory onSelectScan={(scan) => {
24
+ setRoastResult(scan.roast_data);
25
+ document.getElementById('roast-view')?.scrollIntoView({ behavior: 'smooth' });
26
+ }} />
27
+ )}
28
 
29
+ {/* Roast Result - shows after a roast or when selecting from history */}
30
  <RoastView roastData={roastResult} />
31
 
32
+ <PersonalitySelector />
33
+ <AboutSection />
34
+ <PricingSection />
35
+
36
  <section id="resume">
37
  <ResumeUpload />
38
  </section>