diff --git a/backend/public/images/-ix4O5E6y-yzPCVbBpiobg.png b/backend/public/images/-ix4O5E6y-yzPCVbBpiobg.png new file mode 100644 index 0000000..cfea12e Binary files /dev/null and b/backend/public/images/-ix4O5E6y-yzPCVbBpiobg.png differ diff --git a/backend/public/images/0wkkxpF0Z-rE4l1QLBQGJQ.png b/backend/public/images/0wkkxpF0Z-rE4l1QLBQGJQ.png new file mode 100644 index 0000000..74f9db8 Binary files /dev/null and b/backend/public/images/0wkkxpF0Z-rE4l1QLBQGJQ.png differ diff --git a/backend/public/images/10qPXFGF3z-eQ8vj_Yk4RQ.png b/backend/public/images/10qPXFGF3z-eQ8vj_Yk4RQ.png deleted file mode 100644 index 8743887..0000000 Binary files a/backend/public/images/10qPXFGF3z-eQ8vj_Yk4RQ.png and /dev/null differ diff --git a/backend/public/images/1RCE0LM1FQvk1xuA-H20sw.png b/backend/public/images/1RCE0LM1FQvk1xuA-H20sw.png new file mode 100644 index 0000000..d4da5c9 Binary files /dev/null and b/backend/public/images/1RCE0LM1FQvk1xuA-H20sw.png differ diff --git a/backend/public/images/1yNJP5inlOb3GDZpP_e-0w.png b/backend/public/images/1yNJP5inlOb3GDZpP_e-0w.png new file mode 100644 index 0000000..8f4ffee Binary files /dev/null and b/backend/public/images/1yNJP5inlOb3GDZpP_e-0w.png differ diff --git a/backend/public/images/2Kf0feKrEHklXXkpaopieg.png b/backend/public/images/2Kf0feKrEHklXXkpaopieg.png new file mode 100644 index 0000000..e4a9819 Binary files /dev/null and b/backend/public/images/2Kf0feKrEHklXXkpaopieg.png differ diff --git a/backend/public/images/35RhwUhI3TB5ymb3qSt2KQ.png b/backend/public/images/35RhwUhI3TB5ymb3qSt2KQ.png new file mode 100644 index 0000000..0c1e95a Binary files /dev/null and b/backend/public/images/35RhwUhI3TB5ymb3qSt2KQ.png differ diff --git a/backend/public/images/3CVq6SL-dwe59TMCZx5UxQ.png b/backend/public/images/3CVq6SL-dwe59TMCZx5UxQ.png new file mode 100644 index 0000000..4cbfbaf Binary files /dev/null and b/backend/public/images/3CVq6SL-dwe59TMCZx5UxQ.png differ diff --git a/backend/public/images/3HsdH1EEu0Fk49-Q3ctILw.png b/backend/public/images/3HsdH1EEu0Fk49-Q3ctILw.png new file mode 100644 index 0000000..79076da Binary files /dev/null and b/backend/public/images/3HsdH1EEu0Fk49-Q3ctILw.png differ diff --git a/backend/public/images/3_Iiul17N9aIiiChjGX9fg.jpg b/backend/public/images/3_Iiul17N9aIiiChjGX9fg.jpg new file mode 100644 index 0000000..c4e3575 Binary files /dev/null and b/backend/public/images/3_Iiul17N9aIiiChjGX9fg.jpg differ diff --git a/backend/public/images/4Q-GCK0fuNZBDv2hgw7oBA.png b/backend/public/images/4Q-GCK0fuNZBDv2hgw7oBA.png new file mode 100644 index 0000000..551a873 Binary files /dev/null and b/backend/public/images/4Q-GCK0fuNZBDv2hgw7oBA.png differ diff --git a/backend/public/images/4iQYFAssPH_hC64GSIYkcQ.png b/backend/public/images/4iQYFAssPH_hC64GSIYkcQ.png new file mode 100644 index 0000000..1e2b738 Binary files /dev/null and b/backend/public/images/4iQYFAssPH_hC64GSIYkcQ.png differ diff --git a/backend/public/images/5yFaRnGoN2N1k6UX03siUA.png b/backend/public/images/5yFaRnGoN2N1k6UX03siUA.png new file mode 100644 index 0000000..43d9f01 Binary files /dev/null and b/backend/public/images/5yFaRnGoN2N1k6UX03siUA.png differ diff --git a/backend/public/images/6jNNKgGDTonQWzDyRPNPTg.png b/backend/public/images/6jNNKgGDTonQWzDyRPNPTg.png new file mode 100644 index 0000000..ea762a1 Binary files /dev/null and b/backend/public/images/6jNNKgGDTonQWzDyRPNPTg.png differ diff --git a/backend/public/images/6qBDWQPDPZP7CoUEu1dJ8A.png b/backend/public/images/6qBDWQPDPZP7CoUEu1dJ8A.png new file mode 100644 index 0000000..30b9da7 Binary files /dev/null and b/backend/public/images/6qBDWQPDPZP7CoUEu1dJ8A.png differ diff --git a/backend/public/images/8hZrWjXe-C85VefAzSKE2Q.png b/backend/public/images/8hZrWjXe-C85VefAzSKE2Q.png new file mode 100644 index 0000000..87e2573 Binary files /dev/null and b/backend/public/images/8hZrWjXe-C85VefAzSKE2Q.png differ diff --git a/backend/public/images/A9CcI2ih-2Wsf_k4fntKsQ.png b/backend/public/images/A9CcI2ih-2Wsf_k4fntKsQ.png new file mode 100644 index 0000000..cfea12e Binary files /dev/null and b/backend/public/images/A9CcI2ih-2Wsf_k4fntKsQ.png differ diff --git a/backend/public/images/Bww1EIhg9Sh4VGSljlGm-Q.png b/backend/public/images/Bww1EIhg9Sh4VGSljlGm-Q.png deleted file mode 100644 index 8743887..0000000 Binary files a/backend/public/images/Bww1EIhg9Sh4VGSljlGm-Q.png and /dev/null differ diff --git a/backend/public/images/CJgBRmHueA-a_fIy8XUnPw.png b/backend/public/images/CJgBRmHueA-a_fIy8XUnPw.png new file mode 100644 index 0000000..42c3ca7 Binary files /dev/null and b/backend/public/images/CJgBRmHueA-a_fIy8XUnPw.png differ diff --git a/backend/public/images/DVE3B1CscMPa6sfaTC0GuQ.png b/backend/public/images/DVE3B1CscMPa6sfaTC0GuQ.png new file mode 100644 index 0000000..647babf Binary files /dev/null and b/backend/public/images/DVE3B1CscMPa6sfaTC0GuQ.png differ diff --git a/backend/public/images/DthjQH4w1Eupgh6kLBgpxA.png b/backend/public/images/DthjQH4w1Eupgh6kLBgpxA.png new file mode 100644 index 0000000..cfea12e Binary files /dev/null and b/backend/public/images/DthjQH4w1Eupgh6kLBgpxA.png differ diff --git a/backend/public/images/EMqOkcxq_99BsdFiD6GtiA.png b/backend/public/images/EMqOkcxq_99BsdFiD6GtiA.png new file mode 100644 index 0000000..9f45620 Binary files /dev/null and b/backend/public/images/EMqOkcxq_99BsdFiD6GtiA.png differ diff --git a/backend/public/images/Fnpgyag2ERqiye5JEc18iQ.png b/backend/public/images/Fnpgyag2ERqiye5JEc18iQ.png new file mode 100644 index 0000000..247a635 Binary files /dev/null and b/backend/public/images/Fnpgyag2ERqiye5JEc18iQ.png differ diff --git a/backend/public/images/FslFo0F26nU4z5mbwYxFow.png b/backend/public/images/FslFo0F26nU4z5mbwYxFow.png new file mode 100644 index 0000000..e851f0f Binary files /dev/null and b/backend/public/images/FslFo0F26nU4z5mbwYxFow.png differ diff --git a/backend/public/images/HwxDI3xnPkIcmNLZBAfHAA.png b/backend/public/images/HwxDI3xnPkIcmNLZBAfHAA.png new file mode 100644 index 0000000..e0debcb Binary files /dev/null and b/backend/public/images/HwxDI3xnPkIcmNLZBAfHAA.png differ diff --git a/backend/public/images/HzFSAPyCmRRXFzcPzze1gg.png b/backend/public/images/HzFSAPyCmRRXFzcPzze1gg.png new file mode 100644 index 0000000..4864947 Binary files /dev/null and b/backend/public/images/HzFSAPyCmRRXFzcPzze1gg.png differ diff --git a/backend/public/images/I2X-JaLHhy5_HJtsVU4WJg.png b/backend/public/images/I2X-JaLHhy5_HJtsVU4WJg.png new file mode 100644 index 0000000..c0b638b Binary files /dev/null and b/backend/public/images/I2X-JaLHhy5_HJtsVU4WJg.png differ diff --git a/backend/public/images/IV9bN7QxJdMAFY_T065zGQ.png b/backend/public/images/IV9bN7QxJdMAFY_T065zGQ.png new file mode 100644 index 0000000..43794c3 Binary files /dev/null and b/backend/public/images/IV9bN7QxJdMAFY_T065zGQ.png differ diff --git a/backend/public/images/IgBXRoDMFCB0BTGBgcks8g.png b/backend/public/images/IgBXRoDMFCB0BTGBgcks8g.png new file mode 100644 index 0000000..3522476 Binary files /dev/null and b/backend/public/images/IgBXRoDMFCB0BTGBgcks8g.png differ diff --git a/backend/public/images/JG_-Em96Mg30VNV-QGMRVw.png b/backend/public/images/JG_-Em96Mg30VNV-QGMRVw.png new file mode 100644 index 0000000..182f231 Binary files /dev/null and b/backend/public/images/JG_-Em96Mg30VNV-QGMRVw.png differ diff --git a/backend/public/images/KCH8tBhzi4WI2PP3CvPKHg.png b/backend/public/images/KCH8tBhzi4WI2PP3CvPKHg.png new file mode 100644 index 0000000..db6bf04 Binary files /dev/null and b/backend/public/images/KCH8tBhzi4WI2PP3CvPKHg.png differ diff --git a/backend/public/images/M6i6ln5zEooSE5p77WfXsw.png b/backend/public/images/M6i6ln5zEooSE5p77WfXsw.png new file mode 100644 index 0000000..8569b89 Binary files /dev/null and b/backend/public/images/M6i6ln5zEooSE5p77WfXsw.png differ diff --git a/backend/public/images/M7opq0yogrtmD3a_osB9_w.jpg b/backend/public/images/M7opq0yogrtmD3a_osB9_w.jpg new file mode 100644 index 0000000..47f7a34 Binary files /dev/null and b/backend/public/images/M7opq0yogrtmD3a_osB9_w.jpg differ diff --git a/backend/public/images/OVj5h_7Y4n7akr0LBTXxiw.png b/backend/public/images/OVj5h_7Y4n7akr0LBTXxiw.png new file mode 100644 index 0000000..96600ea Binary files /dev/null and b/backend/public/images/OVj5h_7Y4n7akr0LBTXxiw.png differ diff --git a/backend/public/images/OjbeoY-AUe_NUl1jvExKEA.png b/backend/public/images/OjbeoY-AUe_NUl1jvExKEA.png deleted file mode 100644 index 2e3a6eb..0000000 Binary files a/backend/public/images/OjbeoY-AUe_NUl1jvExKEA.png and /dev/null differ diff --git a/backend/public/images/OtaHYyVYluEhF8JA7FjtYg.png b/backend/public/images/OtaHYyVYluEhF8JA7FjtYg.png new file mode 100644 index 0000000..e4a9819 Binary files /dev/null and b/backend/public/images/OtaHYyVYluEhF8JA7FjtYg.png differ diff --git a/backend/public/images/P5OpNRpPh33e36Zl3Olh8w.png b/backend/public/images/P5OpNRpPh33e36Zl3Olh8w.png new file mode 100644 index 0000000..e851f0f Binary files /dev/null and b/backend/public/images/P5OpNRpPh33e36Zl3Olh8w.png differ diff --git a/backend/public/images/PZRo7bLCZAH17MIm3qDljA.jpg b/backend/public/images/PZRo7bLCZAH17MIm3qDljA.jpg new file mode 100644 index 0000000..3d7e13a Binary files /dev/null and b/backend/public/images/PZRo7bLCZAH17MIm3qDljA.jpg differ diff --git a/backend/public/images/PjCvH7h9ijHiTB2DD7ZyBA.png b/backend/public/images/PjCvH7h9ijHiTB2DD7ZyBA.png new file mode 100644 index 0000000..e13a5ed Binary files /dev/null and b/backend/public/images/PjCvH7h9ijHiTB2DD7ZyBA.png differ diff --git a/backend/public/images/QvZGFYBuFRJwYriRv_nktQ.png b/backend/public/images/QvZGFYBuFRJwYriRv_nktQ.png new file mode 100644 index 0000000..6703515 Binary files /dev/null and b/backend/public/images/QvZGFYBuFRJwYriRv_nktQ.png differ diff --git a/backend/public/images/SapUyXoJTIUYQpCbA4bkTA.png b/backend/public/images/SapUyXoJTIUYQpCbA4bkTA.png new file mode 100644 index 0000000..cfea12e Binary files /dev/null and b/backend/public/images/SapUyXoJTIUYQpCbA4bkTA.png differ diff --git a/backend/public/images/T2UWQBFDLqnWUO5KQwJimQ.png b/backend/public/images/T2UWQBFDLqnWUO5KQwJimQ.png new file mode 100644 index 0000000..a4380ad Binary files /dev/null and b/backend/public/images/T2UWQBFDLqnWUO5KQwJimQ.png differ diff --git a/backend/public/images/Tv_tKHVF7CeUsMU7eitd1g.png b/backend/public/images/Tv_tKHVF7CeUsMU7eitd1g.png new file mode 100644 index 0000000..25d1a0e Binary files /dev/null and b/backend/public/images/Tv_tKHVF7CeUsMU7eitd1g.png differ diff --git a/backend/public/images/UX62cPqq-Qi9cDlVfWqJrg.png b/backend/public/images/UX62cPqq-Qi9cDlVfWqJrg.png new file mode 100644 index 0000000..f3ace03 Binary files /dev/null and b/backend/public/images/UX62cPqq-Qi9cDlVfWqJrg.png differ diff --git a/backend/public/images/VWtYnTjBQ-sgvIrRf2G86Q.png b/backend/public/images/VWtYnTjBQ-sgvIrRf2G86Q.png deleted file mode 100644 index 8743887..0000000 Binary files a/backend/public/images/VWtYnTjBQ-sgvIrRf2G86Q.png and /dev/null differ diff --git a/backend/public/images/Vv4ZC-F1vsRcozGOfpEeNA.png b/backend/public/images/Vv4ZC-F1vsRcozGOfpEeNA.png new file mode 100644 index 0000000..b455c91 Binary files /dev/null and b/backend/public/images/Vv4ZC-F1vsRcozGOfpEeNA.png differ diff --git a/backend/public/images/Wb4pTyWSKVqt7OftMXa35A.png b/backend/public/images/Wb4pTyWSKVqt7OftMXa35A.png new file mode 100644 index 0000000..e029049 Binary files /dev/null and b/backend/public/images/Wb4pTyWSKVqt7OftMXa35A.png differ diff --git a/backend/public/images/YJ1Q_9ASMVD-Ta8jPYTJcw.png b/backend/public/images/YJ1Q_9ASMVD-Ta8jPYTJcw.png new file mode 100644 index 0000000..b9edcf7 Binary files /dev/null and b/backend/public/images/YJ1Q_9ASMVD-Ta8jPYTJcw.png differ diff --git a/backend/public/images/YRNWGl2hh4n9tj0FDIDx3w.png b/backend/public/images/YRNWGl2hh4n9tj0FDIDx3w.png new file mode 100644 index 0000000..182f231 Binary files /dev/null and b/backend/public/images/YRNWGl2hh4n9tj0FDIDx3w.png differ diff --git a/backend/public/images/Ylftalq9OVptSWGRP66iUw.png b/backend/public/images/Ylftalq9OVptSWGRP66iUw.png new file mode 100644 index 0000000..09edeea Binary files /dev/null and b/backend/public/images/Ylftalq9OVptSWGRP66iUw.png differ diff --git a/backend/public/images/_Em7FF0KFkND_AbyoZ4pLg.png b/backend/public/images/_Em7FF0KFkND_AbyoZ4pLg.png new file mode 100644 index 0000000..cfea12e Binary files /dev/null and b/backend/public/images/_Em7FF0KFkND_AbyoZ4pLg.png differ diff --git a/backend/public/images/aE1rpdrrSAi3mVJlrq8CwA.png b/backend/public/images/aE1rpdrrSAi3mVJlrq8CwA.png new file mode 100644 index 0000000..fe07b86 Binary files /dev/null and b/backend/public/images/aE1rpdrrSAi3mVJlrq8CwA.png differ diff --git a/backend/public/images/b060lpKcrt7-p99PmJyH0Q.png b/backend/public/images/b060lpKcrt7-p99PmJyH0Q.png deleted file mode 100644 index c470edc..0000000 Binary files a/backend/public/images/b060lpKcrt7-p99PmJyH0Q.png and /dev/null differ diff --git a/backend/public/images/bFk5C4J6unE1p71-XmdZxQ.png b/backend/public/images/bFk5C4J6unE1p71-XmdZxQ.png new file mode 100644 index 0000000..1953fb5 Binary files /dev/null and b/backend/public/images/bFk5C4J6unE1p71-XmdZxQ.png differ diff --git a/backend/public/images/bL9gzwO7YARFKY13IK-d7w.png b/backend/public/images/bL9gzwO7YARFKY13IK-d7w.png new file mode 100644 index 0000000..f1c755c Binary files /dev/null and b/backend/public/images/bL9gzwO7YARFKY13IK-d7w.png differ diff --git a/backend/public/images/dL72pa1ZThztSd1SESE1hA.png b/backend/public/images/dL72pa1ZThztSd1SESE1hA.png new file mode 100644 index 0000000..557c41e Binary files /dev/null and b/backend/public/images/dL72pa1ZThztSd1SESE1hA.png differ diff --git a/backend/public/images/dYwqGEpXv6RawDikZerDFw.png b/backend/public/images/dYwqGEpXv6RawDikZerDFw.png new file mode 100644 index 0000000..cfea12e Binary files /dev/null and b/backend/public/images/dYwqGEpXv6RawDikZerDFw.png differ diff --git a/backend/public/images/e2YCN6IKv6CPRp36Z1g6-A.jpg b/backend/public/images/e2YCN6IKv6CPRp36Z1g6-A.jpg new file mode 100644 index 0000000..cecf9bf Binary files /dev/null and b/backend/public/images/e2YCN6IKv6CPRp36Z1g6-A.jpg differ diff --git a/backend/public/images/fhSrUL2eRrThsH38EBQb6A.png b/backend/public/images/fhSrUL2eRrThsH38EBQb6A.png new file mode 100644 index 0000000..09edeea Binary files /dev/null and b/backend/public/images/fhSrUL2eRrThsH38EBQb6A.png differ diff --git a/backend/public/images/gnMPjlSTPtqrCvtdua8MZg.png b/backend/public/images/gnMPjlSTPtqrCvtdua8MZg.png new file mode 100644 index 0000000..43d9f01 Binary files /dev/null and b/backend/public/images/gnMPjlSTPtqrCvtdua8MZg.png differ diff --git a/backend/public/images/hAmA5c2_WWAd1JazAcvqsQ.png b/backend/public/images/hAmA5c2_WWAd1JazAcvqsQ.png new file mode 100644 index 0000000..f4f4837 Binary files /dev/null and b/backend/public/images/hAmA5c2_WWAd1JazAcvqsQ.png differ diff --git a/backend/public/images/i9d1hsn1lhHXNxb-J_y4hg.png b/backend/public/images/i9d1hsn1lhHXNxb-J_y4hg.png new file mode 100644 index 0000000..a4380ad Binary files /dev/null and b/backend/public/images/i9d1hsn1lhHXNxb-J_y4hg.png differ diff --git a/backend/public/images/jrtxK1iG4nXo2mEnO5Sz-Q.png b/backend/public/images/jrtxK1iG4nXo2mEnO5Sz-Q.png new file mode 100644 index 0000000..cfea12e Binary files /dev/null and b/backend/public/images/jrtxK1iG4nXo2mEnO5Sz-Q.png differ diff --git a/backend/public/images/jvj9ryViPZ2UW9LNsDz13A.png b/backend/public/images/jvj9ryViPZ2UW9LNsDz13A.png new file mode 100644 index 0000000..60ac0d1 Binary files /dev/null and b/backend/public/images/jvj9ryViPZ2UW9LNsDz13A.png differ diff --git a/backend/public/images/kA0AY87LQaBnozRUBpETfg.png b/backend/public/images/kA0AY87LQaBnozRUBpETfg.png deleted file mode 100644 index ea39443..0000000 Binary files a/backend/public/images/kA0AY87LQaBnozRUBpETfg.png and /dev/null differ diff --git a/backend/public/images/kPyJ0o5zy_ceN-UHfDpJlA.png b/backend/public/images/kPyJ0o5zy_ceN-UHfDpJlA.png new file mode 100644 index 0000000..414ffa1 Binary files /dev/null and b/backend/public/images/kPyJ0o5zy_ceN-UHfDpJlA.png differ diff --git a/backend/public/images/kRA5uCqiEkZVSnH6xGORBg.png b/backend/public/images/kRA5uCqiEkZVSnH6xGORBg.png new file mode 100644 index 0000000..d4da5c9 Binary files /dev/null and b/backend/public/images/kRA5uCqiEkZVSnH6xGORBg.png differ diff --git a/backend/public/images/mGzwhBN9jcNX42Lmy0m9Ww.png b/backend/public/images/mGzwhBN9jcNX42Lmy0m9Ww.png new file mode 100644 index 0000000..db6bf04 Binary files /dev/null and b/backend/public/images/mGzwhBN9jcNX42Lmy0m9Ww.png differ diff --git a/backend/public/images/nLi46REpThU_xm2xcbBgXg.png b/backend/public/images/nLi46REpThU_xm2xcbBgXg.png deleted file mode 100644 index c470edc..0000000 Binary files a/backend/public/images/nLi46REpThU_xm2xcbBgXg.png and /dev/null differ diff --git a/backend/public/images/pxk4Umk4mzs45uYrU3pj7w.png b/backend/public/images/pxk4Umk4mzs45uYrU3pj7w.png deleted file mode 100644 index 2e3a6eb..0000000 Binary files a/backend/public/images/pxk4Umk4mzs45uYrU3pj7w.png and /dev/null differ diff --git a/backend/public/images/rfscuCeFMpDs1ej-MUB4Xg.png b/backend/public/images/rfscuCeFMpDs1ej-MUB4Xg.png new file mode 100644 index 0000000..c056194 Binary files /dev/null and b/backend/public/images/rfscuCeFMpDs1ej-MUB4Xg.png differ diff --git a/backend/public/images/sTXDul5qd3e10_YthVfBpA.png b/backend/public/images/sTXDul5qd3e10_YthVfBpA.png new file mode 100644 index 0000000..063e107 Binary files /dev/null and b/backend/public/images/sTXDul5qd3e10_YthVfBpA.png differ diff --git a/backend/public/images/txBRrQOvfpUo9NtLokwibg.png b/backend/public/images/txBRrQOvfpUo9NtLokwibg.png new file mode 100644 index 0000000..4464c9a Binary files /dev/null and b/backend/public/images/txBRrQOvfpUo9NtLokwibg.png differ diff --git a/backend/public/images/vK9yZZGhf8tuciTBp4tO-A.png b/backend/public/images/vK9yZZGhf8tuciTBp4tO-A.png new file mode 100644 index 0000000..29657dd Binary files /dev/null and b/backend/public/images/vK9yZZGhf8tuciTBp4tO-A.png differ diff --git a/backend/public/images/vcLxVgMPMEJKkLEqBkYp5g.png b/backend/public/images/vcLxVgMPMEJKkLEqBkYp5g.png new file mode 100644 index 0000000..ce440e2 Binary files /dev/null and b/backend/public/images/vcLxVgMPMEJKkLEqBkYp5g.png differ diff --git a/backend/public/images/wR6N6ynQq3fWAysQ92xKNg.png b/backend/public/images/wR6N6ynQq3fWAysQ92xKNg.png new file mode 100644 index 0000000..a749c3a Binary files /dev/null and b/backend/public/images/wR6N6ynQq3fWAysQ92xKNg.png differ diff --git a/backend/public/images/wj0_mcCO_CmSGScAW3ZTFg.png b/backend/public/images/wj0_mcCO_CmSGScAW3ZTFg.png new file mode 100644 index 0000000..92ba6af Binary files /dev/null and b/backend/public/images/wj0_mcCO_CmSGScAW3ZTFg.png differ diff --git a/backend/public/images/xoTWRbwsorm9620ZQ52egw.png b/backend/public/images/xoTWRbwsorm9620ZQ52egw.png new file mode 100644 index 0000000..45eb056 Binary files /dev/null and b/backend/public/images/xoTWRbwsorm9620ZQ52egw.png differ diff --git a/backend/public/images/yY0F9oCznl1DLN8GBy3DsQ.png b/backend/public/images/yY0F9oCznl1DLN8GBy3DsQ.png deleted file mode 100644 index 8743887..0000000 Binary files a/backend/public/images/yY0F9oCznl1DLN8GBy3DsQ.png and /dev/null differ diff --git a/backend/public/images/ykC7ogoz5UwG6CAktiQ5vg.png b/backend/public/images/ykC7ogoz5UwG6CAktiQ5vg.png new file mode 100644 index 0000000..da9816d Binary files /dev/null and b/backend/public/images/ykC7ogoz5UwG6CAktiQ5vg.png differ diff --git a/backend/public/images/ze345YaIB9nayo6NZabzsQ.jpg b/backend/public/images/ze345YaIB9nayo6NZabzsQ.jpg new file mode 100644 index 0000000..2836c7f Binary files /dev/null and b/backend/public/images/ze345YaIB9nayo6NZabzsQ.jpg differ diff --git a/backend/schema.graphql b/backend/schema.graphql index 77b914a..debd8d0 100644 --- a/backend/schema.graphql +++ b/backend/schema.graphql @@ -852,7 +852,6 @@ type KeySegmentInfo { id: ID! title: String order: Int - colSpan: KeySegmentInfoColSpanType segment: KeySegment brandLink: String brandLogo: ImageFieldOutput @@ -860,11 +859,6 @@ type KeySegmentInfo { itemsCount(where: KeySegmentInfoItemWhereInput! = {}): Int } -enum KeySegmentInfoColSpanType { - ONE - TWO -} - input KeySegmentInfoWhereUniqueInput { id: ID } @@ -876,19 +870,11 @@ input KeySegmentInfoWhereInput { id: IDFilter title: StringFilter order: IntNullableFilter - colSpan: KeySegmentInfoColSpanTypeNullableFilter segment: KeySegmentWhereInput brandLink: StringFilter items: KeySegmentInfoItemManyRelationFilter } -input KeySegmentInfoColSpanTypeNullableFilter { - equals: KeySegmentInfoColSpanType - in: [KeySegmentInfoColSpanType!] - notIn: [KeySegmentInfoColSpanType!] - not: KeySegmentInfoColSpanTypeNullableFilter -} - input KeySegmentInfoItemManyRelationFilter { every: KeySegmentInfoItemWhereInput some: KeySegmentInfoItemWhereInput @@ -899,14 +885,12 @@ input KeySegmentInfoOrderByInput { id: OrderDirection title: OrderDirection order: OrderDirection - colSpan: OrderDirection brandLink: OrderDirection } input KeySegmentInfoUpdateInput { title: String order: Int - colSpan: KeySegmentInfoColSpanType segment: KeySegmentRelateToOneForUpdateInput brandLink: String brandLogo: ImageFieldInput @@ -934,7 +918,6 @@ input KeySegmentInfoUpdateArgs { input KeySegmentInfoCreateInput { title: String order: Int - colSpan: KeySegmentInfoColSpanType segment: KeySegmentRelateToOneForCreateInput brandLink: String brandLogo: ImageFieldInput @@ -955,10 +938,16 @@ type KeySegmentInfoItem { id: ID! text: String infoLogo: ImageFieldOutput + colSpan: KeySegmentInfoItemColSpanType order: Int info: KeySegmentInfo } +enum KeySegmentInfoItemColSpanType { + ONE + TWO +} + input KeySegmentInfoItemWhereUniqueInput { id: ID } @@ -969,19 +958,29 @@ input KeySegmentInfoItemWhereInput { NOT: [KeySegmentInfoItemWhereInput!] id: IDFilter text: StringFilter + colSpan: KeySegmentInfoItemColSpanTypeNullableFilter order: IntNullableFilter info: KeySegmentInfoWhereInput } +input KeySegmentInfoItemColSpanTypeNullableFilter { + equals: KeySegmentInfoItemColSpanType + in: [KeySegmentInfoItemColSpanType!] + notIn: [KeySegmentInfoItemColSpanType!] + not: KeySegmentInfoItemColSpanTypeNullableFilter +} + input KeySegmentInfoItemOrderByInput { id: OrderDirection text: OrderDirection + colSpan: OrderDirection order: OrderDirection } input KeySegmentInfoItemUpdateInput { text: String infoLogo: ImageFieldInput + colSpan: KeySegmentInfoItemColSpanType order: Int info: KeySegmentInfoRelateToOneForUpdateInput } @@ -1000,6 +999,7 @@ input KeySegmentInfoItemUpdateArgs { input KeySegmentInfoItemCreateInput { text: String infoLogo: ImageFieldInput + colSpan: KeySegmentInfoItemColSpanType order: Int info: KeySegmentInfoRelateToOneForCreateInput } diff --git a/backend/schema.prisma b/backend/schema.prisma index f8f408d..5f4b018 100644 --- a/backend/schema.prisma +++ b/backend/schema.prisma @@ -147,7 +147,6 @@ model KeySegmentInfo { id String @id @default(cuid()) title String @default("") order Int? @default(0) - colSpan String? @default("ONE") segment KeySegment? @relation("KeySegmentInfo_segment", fields: [segmentId], references: [id]) segmentId String? @map("segment") brandLink String @default("") @@ -169,6 +168,7 @@ model KeySegmentInfoItem { infoLogo_width Int? infoLogo_height Int? infoLogo_extension String? + colSpan String? @default("ONE") order Int? @default(0) info KeySegmentInfo? @relation("KeySegmentInfoItem_info", fields: [infoId], references: [id]) infoId String? @map("info") diff --git a/backend/schema.ts b/backend/schema.ts index 32115b7..10ce217 100644 --- a/backend/schema.ts +++ b/backend/schema.ts @@ -336,22 +336,51 @@ export const lists: Lists = { many: true, ui: { displayMode: "cards", - cardFields: ["title", "colSpan", "order"], - inlineCreate: { fields: ["title", "colSpan", "order"] }, - inlineEdit: { fields: ["title", "colSpan", "order"] }, + cardFields: ["title", "order"], + inlineCreate: { fields: ["title", "order", "brandLink", "brandLogo"] }, + inlineEdit: { fields: ["title", "order", "brandLink", "brandLogo"] }, linkToItem: true, }, }), }, }), + /* Info card (column block) */ KeySegmentInfo: list({ access: allowAll, - ui: { label: "Key Segment • Info Block", listView: { initialColumns: ["order", "title", "colSpan"] } }, + ui: { label: "Key Segment • Info Block", listView: { initialColumns: ["order", "title"] } }, fields: { title: text({ validation: { isRequired: true } }), order: integer({ defaultValue: 0 }), + segment: relationship({ ref: "KeySegment.info" }), + + // бренд принадлежит целому блоку + brandLink: text({ ui: { description: "Ссылка бренда (опц.)" } }), + brandLogo: image({ storage: 'local_images', ui: { description: "Лого бренда (опц.)" } }), + + items: relationship({ + ref: "KeySegmentInfoItem.info", + many: true, + ui: { + displayMode: "cards", + cardFields: ["text", "order", "infoLogo", "colSpan"], + inlineCreate: { fields: ["text", "infoLogo", "colSpan", "order"] }, + inlineEdit: { fields: ["text", "infoLogo", "colSpan", "order"] }, + linkToItem: true, + }, + }), + }, + }), + + + /* Info list item (только текст + лого) */ + KeySegmentInfoItem: list({ + access: allowAll, + ui: { label: "Key Segment • Info Item", listView: { initialColumns: ["order", "text", "infoLogo", "colSpan"] } }, + fields: { + text: text({ validation: { isRequired: true } }), + infoLogo: image({ storage: 'local_images', ui: { description: "Лого в зелёном квадратике" } }), colSpan: select({ type: 'enum', options: [ @@ -361,38 +390,12 @@ export const lists: Lists = { defaultValue: 'ONE', ui: { displayMode: 'segmented-control' }, }), - segment: relationship({ ref: "KeySegment.info" }), - - // 🔽 теперь бренд принадлежит целому блоку - brandLink: text({ ui: { description: "Ссылка бренда (опц.)" } }), - brandLogo: image({ storage: 'local_images', ui: { description: "Лого бренда (опц.)" } }), - - items: relationship({ - ref: "KeySegmentInfoItem.info", - many: true, - ui: { - displayMode: "cards", - cardFields: ["text", "order", "infoLogo"], - inlineCreate: { fields: ["text", "infoLogo", "order"] }, - inlineEdit: { fields: ["text", "infoLogo", "order"] }, - linkToItem: true, - }, - }), - }, - }), - - /* Info list item (только текст + лого) */ - KeySegmentInfoItem: list({ - access: allowAll, - ui: { label: "Key Segment • Info Item", listView: { initialColumns: ["order", "text", "infoLogo"] } }, - fields: { - text: text({ validation: { isRequired: true } }), - infoLogo: image({ storage: 'local_images', ui: { description: "Лого в зелёном квадратике" } }), order: integer({ defaultValue: 0 }), info: relationship({ ref: "KeySegmentInfo.items" }), }, }), + WhyChooseUsItem: list({ access: allowAll, ui: { diff --git a/landing/src/components/ContactFormSection/index.tsx b/landing/src/components/ContactFormSection/index.tsx index e157d73..95fb214 100644 --- a/landing/src/components/ContactFormSection/index.tsx +++ b/landing/src/components/ContactFormSection/index.tsx @@ -37,6 +37,10 @@ const ContactFormSection: React.FC = () => { const [error, setError] = React.useState(null); const [sent, setSent] = React.useState(false); + // состояния согласий + const [agreePrivacy, setAgreePrivacy] = React.useState(true); + const [agreeComms, setAgreeComms] = React.useState(true); + const onSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); @@ -53,10 +57,17 @@ const ContactFormSection: React.FC = () => { const email = String(fd.get("email") || "").trim(); const phone = String(fd.get("phone") || "").trim(); + // читаем согласия из формы (и дублируем защиту состояниями) + const consentPrivacy = fd.get("consentPrivacy") === "on"; + const consentComms = fd.get("consentComms") === "on"; + // простая валидация if (!name) return setError("Please enter your name."); if (!country) return setError("Please choose a country from the list."); if (!email) return setError("Please enter your business email."); + if (!consentPrivacy || !consentComms || !agreePrivacy || !agreeComms) { + return setError("Please accept both consents."); + } try { setBusy(true); @@ -67,7 +78,7 @@ const ContactFormSection: React.FC = () => { { data: { name, - countryIso: country, + countryCode: country, company, position, email, @@ -76,28 +87,11 @@ const ContactFormSection: React.FC = () => { } ); - // 2) шлём письмо (если у тебя есть этот эндпоинт; ошибки не блокируют успех) - try { - await fetch("/api/send-mail", { - method: "POST", - headers: { "content-type": "application/json" }, - body: JSON.stringify({ - subject: "New contact request from landing", - text: - `Name: ${name}\n` + - `Country: ${country}\n` + - `Company: ${company}\n` + - `Position: ${position}\n` + - `Email: ${email}\n` + - `Phone: ${phone}\n`, - }), - }); - } catch { - // молча игнорим — форма уже сохранена в БД - } - setSent(true); // прячем форму, показываем «спасибо» form.reset(); // чистим поля, на всякий + // на всякий возвращаем чекбоксы в true (форма уже скрыта) + setAgreePrivacy(true); + setAgreeComms(true); } catch (err: any) { setError(err?.message || "Failed to submit. Please try again."); } finally { @@ -170,7 +164,13 @@ const ContactFormSection: React.FC = () => { {/* согласия */} - + setAgreePrivacy(e.target.checked)} + /> - + setAgreeComms(e.target.checked)} + /> - + {busy ? "Sending…" : "Submit a request"} diff --git a/landing/src/components/CountriesMap/index.tsx b/landing/src/components/CountriesMap/index.tsx index 8a60026..6db44c9 100644 --- a/landing/src/components/CountriesMap/index.tsx +++ b/landing/src/components/CountriesMap/index.tsx @@ -20,6 +20,15 @@ const GEO_URL = "/data/countries-110m.json"; const CARD_W = 290; const CARD_H = 160; +const MIN_ZOOM = 0.8; +const MAX_ZOOM = 8; +const INITIAL_ZOOM = 4; +const ZOOM_STEP = 1.25; + +const clamp = (n: number, min: number, max: number) => + Math.min(max, Math.max(min, n)); + + /* =================== CMS types/selection =================== */ type CmsItem = { id: string; text: string; order: number }; type CmsCountry = { @@ -110,6 +119,33 @@ function mapCountries(section?: CmsSection | null): CountryCard[] { }); } +function updateScaleKeepCenter(newScale: number) { + const g = document.querySelector("g.rsm-zoomable-group"); + const svg = g?.closest("svg") as SVGSVGElement | null; + if (!g || !svg) return; + + const transform = g.getAttribute("transform") || ""; + const matchT = transform.match(/translate\((-?\d+\.?\d*)[, ]+(-?\d+\.?\d*)\)/); + const matchS = transform.match(/scale\((-?\d+\.?\d*)\)/); + + let tx = matchT ? parseFloat(matchT[1]) : 0; + let ty = matchT ? parseFloat(matchT[2]) : 0; + const currentScale = matchS ? parseFloat(matchS[1]) : 1; + + // центр SVG + const cx = svg.clientWidth / 2; + const cy = svg.clientHeight / 2; + + // пересчёт translate + const ratio = newScale / currentScale; + tx = cx - (cx - tx) * ratio; + ty = cy - (cy - ty) * ratio; + + g.setAttribute("transform", `translate(${tx} ${ty}) scale(${newScale})`); +} + + + /* =================== component =================== */ export default function CountriesMap() { const wrapRef = useRef(null); @@ -142,7 +178,20 @@ export default function CountriesMap() { const initialCenter: [number, number] = mobile ? [65, 38] : [52, 38]; const [center, setCenter] = useState<[number, number]>(initialCenter); - const [zoom, setZoom] = useState(4); + const [zoom, setZoom] = useState(INITIAL_ZOOM); + const [zoomScale, setZoomScale] = useState(INITIAL_ZOOM); + + useEffect(() => { + updateScaleKeepCenter(zoomScale); + },[zoomScale]); + + const zoomIn = () => setZoomScale(z => clamp(z * ZOOM_STEP, MIN_ZOOM, MAX_ZOOM)); + const zoomOut = () => setZoomScale(z => clamp(z / ZOOM_STEP, MIN_ZOOM, MAX_ZOOM)); + const resetView = () => { + setCenter(initialCenter); + setZoom(INITIAL_ZOOM); + }; + return ( @@ -161,6 +210,7 @@ export default function CountriesMap() { minZoom={0.8} maxZoom={8} translateExtent={[[-1000, -500], [1000, 900]]} + filterZoomEvent={(e) => e.type !== "wheel" && e.type !== "dblclick"} onMoveEnd={() => { setCenter(initialCenter); setZoom(zoom); @@ -306,6 +356,12 @@ export default function CountriesMap() { })} + + + + + + + ); } @@ -318,3 +374,31 @@ const Wrap = styled.div` overflow: hidden; width: 100%; `; + +const ZoomControls = styled.div` + position: absolute; + right: 12px; + top: 12px; + display: flex; + gap: 8px; + z-index: 2; + pointer-events: auto; + flex-direction: column; +`; + +const ZoomBtn = styled.button` + width: 36px; + height: 36px; + border-radius: 10px; + background: #fff; + border: 1px solid #14935f; + box-shadow: 0px 8px 14.13px 0px #2764698f; + font-weight: 700; + line-height: 0; + display: grid; + place-items: center; + cursor: pointer; + user-select: none; + &:active { transform: translateY(1px); } +`; + diff --git a/landing/src/components/FooterSection/index.tsx b/landing/src/components/FooterSection/index.tsx index 815c640..03e3e9b 100644 --- a/landing/src/components/FooterSection/index.tsx +++ b/landing/src/components/FooterSection/index.tsx @@ -68,8 +68,15 @@ const FooterSection: React.FC = () => { - - + + { + window.location.href = "/#freedom"; + }} + src={logoSrc} + alt="Logo" + /> +