Explanation
diff --git a/website/src/Menu.jsx b/website/src/Menu.jsx
index cf5cdd3..772f057 100644
--- a/website/src/Menu.jsx
+++ b/website/src/Menu.jsx
@@ -7,6 +7,7 @@ function Menu() {
>
);
diff --git a/website/src/Reviews.css b/website/src/Reviews.css
new file mode 100644
index 0000000..893b3a7
--- /dev/null
+++ b/website/src/Reviews.css
@@ -0,0 +1,60 @@
+.input-box {
+ display: flex;
+}
+
+.review-select-dropdown {
+ width: 200px;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ height: calc(50px + 40px * 2);
+ gap: 0px;
+ user-select: none;
+}
+
+.review-select-button {
+ width: 100%;
+ height: 50px;
+ cursor: pointer;
+ background: var(--surface);
+ border: 1px solid var(--surface);
+ outline: none;
+ color: white;
+ border-radius: 16px;
+}
+
+.review-select-button.active {
+ border-top-right-radius: 16px;
+ border-top-left-radius: 16px;
+
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+ border-bottom: 1px solid black;
+}
+
+.review-select-button:hover {
+ border-color: white;
+}
+
+.review-select-item {
+ cursor: pointer;
+ border: 1px solid var(--surface);
+ background: var(--surface);
+ text-align: center;
+ height: 40px;
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 0;
+}
+
+.review-select-item.last {
+ border-bottom-left-radius: 16px;
+ border-bottom-right-radius: 16px;
+}
+
+.review-select-item:hover {
+ cursor: pointer;
+ border-color: white;
+}
\ No newline at end of file
diff --git a/website/src/Reviews.jsx b/website/src/Reviews.jsx
new file mode 100644
index 0000000..a5109ac
--- /dev/null
+++ b/website/src/Reviews.jsx
@@ -0,0 +1,107 @@
+import { useState, useRef, useEffect } from 'react';
+import './Reviews.css';
+
+function Reviews() {
+ const [error, setError] = useState(null);
+ const [selectedWebsite, setSelectedWebsite] = useState("Not Specified");
+ const [selectWebsiteVisibility, setSelectWebsiteVisibility] = useState(false);
+ const websiteSelectButton = useRef();
+ const [text, setText] = useState("");
+
+
+ const fetchReviews = async () => {
+ const response = await fetch(`api.marvinkrausser/review`, {
+ method: "GET",
+ });
+
+ if (!response.ok) {
+ setError(true);
+ return;
+ }
+ else {
+ setError(false);
+ }
+
+ const result = await response.json();
+ }
+
+ const sendReview = async (review) => {
+
+ const response = await fetch(`api.marvinkrausser/review`, {
+ method: "POST",
+ body: JSON.stringify(review),
+ });
+
+ if (!response.ok) {
+ setError(true);
+ return;
+ }
+ else {
+ setError(false);
+ }
+
+ const result = await response.json();
+ }
+
+ const changeSelectedWebsite = (website) => {
+ setSelectedWebsite(website);
+ };
+
+ const websites = [
+ "CNN (current)",
+ "Portfolio",
+ "Not Specified"
+ ];
+
+ useEffect(() => {
+ function handleClick(event) {
+ if (websiteSelectButton.current && !websiteSelectButton.current.contains(event.target)
+ ) {
+ setSelectWebsiteVisibility(false);
+ }
+ }
+
+ document.addEventListener("click", handleClick);
+
+ return () => {
+ document.removeEventListener("click", handleClick);
+ };
+ }, []);
+
+
+ return (<>
+
+
Reviews
+
+
+
+
+ {selectWebsiteVisibility &&
+ {websites.map((site, i) =>
+ selectedWebsite !== site && (
+
= (websites.length - (selectedWebsite == websites.at(-1) ? 2 : 1)) ? "review-select-item last" : "review-select-item"}
+ onClick={() => changeSelectedWebsite(site)}
+ >
+ {site}
+
+ )
+ )}
+
}
+
+
+
setText(e.target.value)}
+ placeholder="Type something..."
+ />
+
+
+ >)
+}
+
+export default Reviews;
\ No newline at end of file
diff --git a/website/src/index.css b/website/src/index.css
index 2aff8ff..3ad6ae5 100644
--- a/website/src/index.css
+++ b/website/src/index.css
@@ -10,6 +10,11 @@ body {
background: rgb(4, 0, 10);
margin: 0;
padding: 0;
+ --surface: rgb(47, 168, 208);
+}
+
+button {
+ font-size: 1rem;
}
a {
@@ -25,4 +30,29 @@ h4 {
* {
box-sizing: border-box;
+}
+
+.site-headline {
+ margin: 50px min(100px, 10vw) 50px min(100px, 10vw);
+ color: rgb(47, 168, 208);
+ font-weight: bold;
+ font-size: clamp(1rem, min(8vw, 8vh), 4rem);
+ position: relative;
+ width: fit-content;
+}
+
+.site-headline::before {
+ content: "";
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ height: 4px;
+ width: 100%;
+ border-radius: 20px;
+ background: rgb(47, 168, 208);
+}
+
+.site-box {
+ margin-top: 150px;
+ width: 100%;
}
\ No newline at end of file