diff --git a/website/index.html b/website/index.html index d39c245..8bfab7b 100644 --- a/website/index.html +++ b/website/index.html @@ -10,7 +10,7 @@ diff --git a/website/src/App.css b/website/src/App.css deleted file mode 100644 index e69de29..0000000 diff --git a/website/src/App.jsx b/website/src/App.jsx index f29971e..5b7b58f 100644 --- a/website/src/App.jsx +++ b/website/src/App.jsx @@ -1,6 +1,4 @@ -import { useState } from 'react' -import { BrowserRouter as Router, Routes, Route, Navigate } from "react-router-dom"; -import './App.css' +import { Routes, Route, Navigate } from "react-router-dom"; import Menu from './Menu' import Homepage from './Homepage'; import Bird_CNN from './Bird_CNN'; diff --git a/website/src/Bird_CNN.jsx b/website/src/Bird_CNN.jsx index 193713f..fd323e0 100644 --- a/website/src/Bird_CNN.jsx +++ b/website/src/Bird_CNN.jsx @@ -86,16 +86,9 @@ function Bird_CNN() { <>
+ I build and deploy small machine learning projects end to end — + from training the model to serving it behind a live API. Below are a + couple of interactive demos, running on real models. +
+ +{description}
+ Try it → + + ))} +- The model’s performance has been limited to 2 FPS due to low-end server hardware constraints. + The model's performance has been limited to 2 FPS due to low-end server hardware constraints.
The webcam video is transmitted to a server for processing. The server does not store, train on, or use the data for any purpose other than face detection. @@ -196,13 +196,13 @@ function Object_Detection() { {running ? "End Detection" : "Start Detection"}
This Project is an implementation of the YOLO (You Only Look Once) algorithm. It was implemented with Pytorch and trained on a Dataset from Roboflow.
diff --git a/website/src/Object_Detection.module.css b/website/src/Object_Detection.module.css index 7dd390a..efe7c6f 100644 --- a/website/src/Object_Detection.module.css +++ b/website/src/Object_Detection.module.css @@ -1,36 +1,40 @@ -#video-container { - margin: 0px; - width: min(70vh, 90vw); - height: min(70vh, 90vw); +.video-container { + margin: clamp(20px, 5vh, 50px) 0; + width: min(70vh, 100%); + max-width: 600px; + aspect-ratio: 1 / 1; background-color: black; + border-radius: var(--radius); + overflow: hidden; + align-self: center; + position: relative; + border: 1px solid var(--surface-line); +} + +.button-div { + width: fit-content; + align-self: center; + margin: clamp(24px, 6vw, 50px) 0; +} + +.text-container-explanation { + margin: clamp(30px, 6vw, 70px) 0 0 0; + width: 100%; + max-width: 800px; align-self: center; position: relative; } -.button-div{ - width: 200px; - align-self: center; - margin: 50px; -} - -#text-container-explanation { - margin: 70px 0 0 0; - width: 80vw; - height: 300px; +.text-container-introduction { + margin: clamp(20px, 5vw, 50px) 0 0 0; + width: 100%; + max-width: 800px; align-self: center; position: relative; } -#text-container-introduction { - margin: 50px 0 20px 0; - width: 70vw; - height: fit-content; - align-self: center; - position: relative; - left: -10vw; -} - -#text-container-introduction p { - margin: 40px 0 40px 0; +.text-container-introduction p, +.text-container-explanation p { + margin: 20px 0; font-size: 1.1rem; -} \ No newline at end of file +} diff --git a/website/src/Reviews.module.css b/website/src/Reviews.module.css index 434cd9d..69f8379 100644 --- a/website/src/Reviews.module.css +++ b/website/src/Reviews.module.css @@ -1,17 +1,15 @@ .review-description { - margin: 20px 70px 70px 70px; + margin: 0 0 clamp(30px, 6vw, 60px) 0; font-size: 1.1rem; - width: min(800px, 70vw); + max-width: 65ch; height: fit-content; } .input-box { display: grid; - gap: 10px; - column-gap: 10vw; - width: 98vw; - max-width: calc(3 * 200px + 10vw * 2); - min-height: 100vh; + gap: 30px 60px; + width: 100%; + max-width: 800px; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); grid-auto-rows: fit-content(300px); @@ -35,6 +33,8 @@ .input-component-box.text { grid-column: 1 / -1; + width: 100%; + justify-items: center; } .description { @@ -167,7 +167,7 @@ .review-text { resize: none; overflow:auto; - width: min(600px, 98vw); + width: min(600px, 100%); height: 400px; border-radius: 8px; border: 2px solid var(--bg); diff --git a/website/src/index.css b/website/src/index.css index 14bc47d..d450801 100644 --- a/website/src/index.css +++ b/website/src/index.css @@ -1,43 +1,98 @@ +:root { + --surface: rgb(47, 168, 208); + --surface-dim: rgba(47, 168, 208, 0.15); + --surface-line: rgba(47, 168, 208, 0.35); + --bg: rgb(4, 0, 10); + --bg-elevated: rgb(13, 10, 22); + --text: rgb(255, 255, 255); + --text-dim: rgba(255, 255, 255, 0.68); + --accent-2: #c59eff; + --radius: 16px; + --nav-height: 70px; + --page-pad: clamp(20px, 6vw, 100px); +} + html { - font-family: system-ui, sans-serif; - color: rgb(255, 255, 255); + font-family: system-ui, -apple-system, sans-serif; + color: var(--text); font-size: 1rem; line-height: 1.7; - + -webkit-text-size-adjust: 100%; } body { background: var(--bg); + background-image: + radial-gradient(ellipse 900px 500px at 15% -10%, var(--surface-dim), transparent 60%), + radial-gradient(ellipse 700px 500px at 100% 10%, rgba(197, 158, 255, 0.08), transparent 55%); + background-attachment: fixed; margin: 0; padding: 0; - --surface: rgb(47, 168, 208); - --bg: rgb(4, 0, 10); + min-height: 100vh; + overflow-x: hidden; } button { font-size: 1rem; + font-family: inherit; } a { - color: rgb(255, 255, 255); + color: var(--text); } h1, h2, h3, h4 { - font-family: 'Times New Roman', serif; + font-family: 'Inter', system-ui, sans-serif; + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.15; +} + +p { + color: var(--text-dim); } * { box-sizing: border-box; } +*:focus-visible { + outline: 2px solid var(--accent-2); + outline-offset: 3px; +} + +::selection { + background: var(--surface); + color: black; +} + +/* scrollbar theming */ +::-webkit-scrollbar { + width: 10px; + height: 10px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.2); + border-radius: 10px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--surface); +} + .site-headline { - margin: 50px min(100px, 10vw) 50px min(100px, 10vw); + margin: 0 0 clamp(24px, 5vw, 50px) 0; color: var(--surface); font-weight: bold; - font-size: clamp(1rem, min(8vw, 8vh), 4rem); + font-size: clamp(2.2rem, 8vw, 4rem); position: relative; width: fit-content; } @@ -45,8 +100,8 @@ h4 { .site-headline::before { content: ""; position: absolute; - bottom: 0; - right: 0; + bottom: -6px; + left: 0; height: 4px; width: 100%; border-radius: 20px; @@ -54,11 +109,30 @@ h4 { } .site-box { - margin-top: 150px; + margin-top: calc(var(--nav-height) + clamp(30px, 8vh, 80px)); + margin-bottom: clamp(40px, 8vh, 100px); width: 100%; + max-width: 1200px; + padding: 0 var(--page-pad); height: fit-content; display: flex; flex-direction: column; + margin-left: auto; + margin-right: auto; +} + +.page-lead { + color: var(--text-dim); + font-size: 1.05rem; + max-width: 70ch; + margin: -10px 0 40px 0; +} + +.card { + background: var(--bg-elevated); + border: 1px solid var(--surface-line); + border-radius: var(--radius); + padding: clamp(20px, 3vw, 32px); } .custom-button { @@ -75,6 +149,7 @@ h4 { display: flex; align-items: center; justify-content: center; + transition: border-color 0.15s, color 0.15s, background-color 0.15s; } .custom-button:hover { @@ -90,4 +165,5 @@ h4 { .custom-button.inactive:hover { border-color: var(--surface); -} \ No newline at end of file + color: black; +}