From ef67915621348283f342ed4881df6c3d9a03a8b7 Mon Sep 17 00:00:00 2001 From: Darius Schefer Date: Wed, 27 Aug 2025 19:47:13 +0200 Subject: [PATCH 1/9] Devcontainer support --- .devcontainer/devcontainer.json | 57 +++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..2ed435d --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,57 @@ +{ + "name": "bun", + "image": "oven/bun:debian", + "privileged": true, + "features": { + "ghcr.io/devcontainers/features/common-utils:1": { + "version": "latest", + "configureZshAsDefaultShell": true, + "username": "bun", + "userUid": "1000", + "userGid": "1000" + }, + "ghcr.io/rocker-org/devcontainer-features/apt-packages:1": { + "packages": "stow,tmux,ripgrep,python3-venv,python3-virtualenv" + }, + }, + "remoteUser": "bun", + "workspaceFolder": "/home/bun/ws", + "workspaceMount": "source=${localWorkspaceFolder},target=/home/bun/ws,type=bind", + "containerEnv": { + }, + "runArgs": [ + "--net=host", + "-e", + "DISPLAY=${env:DISPLAY}", + "-e", + "TERM=${env:TERM}", + "-e", + "SHELL=${env:SHELL}", + "-v", + "${env:SSH_AUTH_SOCK}:/tmp/ssh-agent.socket", + "-e", + "SSH_AUTH_SOCK=/tmp/ssh-agent.socket" + ], + "mounts": [ + { + "source": "/tmp/.X11-unix", + "target": "/tmp/.X11-unix", + "type": "bind", + "consistency": "cached" + }, + { + "source": "/dev/dri", + "target": "/dev/dri", + "type": "bind", + "consistency": "cached" + }, + { + "source": "/dev/shm", + "target": "/dev/shm", + "type": "bind", + "consistency": "cached" + } + ], + "postCreateCommand": { + } +} From 97737def297ab884f67965872b7b92169ae7933d Mon Sep 17 00:00:00 2001 From: Darius Schefer Date: Wed, 27 Aug 2025 21:50:17 +0200 Subject: [PATCH 2/9] Timetable styling --- src/components/Timetable/Timetable.tsx | 4 ++- src/components/Timetable/style.module.css | 5 ++++ src/components/TimetableRow/TimetableRow.tsx | 29 ++++++++++++++++++-- src/components/TimetableRow/style.module.css | 29 ++++++++++++++++++++ 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/src/components/Timetable/Timetable.tsx b/src/components/Timetable/Timetable.tsx index c4d2d11..2a05494 100644 --- a/src/components/Timetable/Timetable.tsx +++ b/src/components/Timetable/Timetable.tsx @@ -2,6 +2,8 @@ import { useEffect } from "react"; import DepartureList from "@/components/DepartureList/DepartureList"; import { useKVVStore } from "@/store/kvv"; +import style from "./style.module.css"; + export default function Timetable() { const fetchTimetable = useKVVStore((state) => state.fetch); const pStreet = useKVVStore((state) => state.pStreet); @@ -16,7 +18,7 @@ export default function Timetable() { }, [fetchTimetable]); return ( -
+

Timetable

diff --git a/src/components/Timetable/style.module.css b/src/components/Timetable/style.module.css index e69de29..e1e70fd 100644 --- a/src/components/Timetable/style.module.css +++ b/src/components/Timetable/style.module.css @@ -0,0 +1,5 @@ +.wrapper { + border-radius: 10px; + padding: 1px 100px 30px 100px; + box-shadow: 5px 5px 10px #aeaeae; +} diff --git a/src/components/TimetableRow/TimetableRow.tsx b/src/components/TimetableRow/TimetableRow.tsx index 7c7bb15..d016523 100644 --- a/src/components/TimetableRow/TimetableRow.tsx +++ b/src/components/TimetableRow/TimetableRow.tsx @@ -10,12 +10,35 @@ export default function TimetableRow({ const hour = String(departure.dateTime.hour).padStart(2, "0"); const minute = String(departure.dateTime.minute).padStart(2, "0"); const dateTimeString = `${hour}:${minute}`; + const lineNumber = departure.servingLine.number; return ( - {dateTimeString} - {departure.servingLine.number} - ({departure.servingLine.direction}) + {dateTimeString} + + {lineNumber} + + {departure.servingLine.direction} ); } + +const lineNumberToStyle = (number) => { + switch (number) { + case "S2": + return styles.S2; + break; + case "S5": + case "S51": + return styles.S5; + break; + case "S1": + case "S11": + return styles.S1; + break; + default: + return styles.lineNumberDefault; + } +}; diff --git a/src/components/TimetableRow/style.module.css b/src/components/TimetableRow/style.module.css index a6f418f..e5819be 100644 --- a/src/components/TimetableRow/style.module.css +++ b/src/components/TimetableRow/style.module.css @@ -1,3 +1,32 @@ +td { + padding: 4px 7px; +} + .timetableRow { text-align: left; } + +.departureTime { + font-weight: 600; + /* background-color: rgba(180, 180, 180, 0.1); */ +} + +.lineNumber { + text-align: center; +} + +.S2 { + background-color: rgba(200, 100, 200, 0.2); +} + +.S5 { + background-color: rgba(230, 20, 20, 0.2); +} + +.S1 { + background-color: rgba(20, 180, 90, 0.2); +} + +.lineNumberDefault { + background-color: rgba(100, 100, 100, 0.2); +} From 97d9a04b29627799f57bd9e50d68ee672d354c5b Mon Sep 17 00:00:00 2001 From: Darius Schefer Date: Wed, 27 Aug 2025 23:19:17 +0200 Subject: [PATCH 3/9] Dashboard with cards --- src/App.tsx | 9 +++---- src/components/Dashboard/Dashboard.tsx | 25 +++++++++++++++++++ src/components/Dashboard/style.module.css | 18 +++++++++++++ .../DepartureList/DepartureList.tsx | 4 ++- src/components/DepartureList/style.module.css | 12 ++++++++- src/components/Timetable/Timetable.tsx | 2 +- src/components/Timetable/style.module.css | 5 ---- src/components/TimetableRow/style.module.css | 1 - 8 files changed, 61 insertions(+), 15 deletions(-) create mode 100644 src/components/Dashboard/Dashboard.tsx create mode 100644 src/components/Dashboard/style.module.css diff --git a/src/App.tsx b/src/App.tsx index cfe54d4..1d554ad 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,14 +1,11 @@ import "@/App.css"; -import Flatastic from "@/components/Flatastic/Flatastic"; -import HomeAssistant from "@/components/HomeAssistant/HomeAssistant"; -import Timetable from "@/components/Timetable/Timetable"; + +import Dashboard from "@/components/Dashboard/Dashboard"; function App() { return ( <> - - - + ); } diff --git a/src/components/Dashboard/Dashboard.tsx b/src/components/Dashboard/Dashboard.tsx new file mode 100644 index 0000000..7ffe448 --- /dev/null +++ b/src/components/Dashboard/Dashboard.tsx @@ -0,0 +1,25 @@ +import Flatastic from "@/components/Flatastic/Flatastic"; +import HomeAssistant from "@/components/HomeAssistant/HomeAssistant"; +import Timetable from "@/components/Timetable/Timetable"; + +import style from "./style.module.css"; + +export default function Dashboard() { + return ( +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ ); +} diff --git a/src/components/Dashboard/style.module.css b/src/components/Dashboard/style.module.css new file mode 100644 index 0000000..d231a20 --- /dev/null +++ b/src/components/Dashboard/style.module.css @@ -0,0 +1,18 @@ +.dashboard { + +} + +.cardWrapper { +} + +.card { + border-radius: 10px; + padding: 1px 100px 30px 100px; + margin-bottom: 20px; + border: 1px solid rgba(220, 220, 220, 0.4); + box-shadow: 5px 5px 7px rgba(220, 220, 220, 0.5); +} + +.footer { + background-color: red; +} diff --git a/src/components/DepartureList/DepartureList.tsx b/src/components/DepartureList/DepartureList.tsx index 376b813..5d42d1f 100644 --- a/src/components/DepartureList/DepartureList.tsx +++ b/src/components/DepartureList/DepartureList.tsx @@ -58,7 +58,9 @@ export default function DepartureList(props: { return (
-

{name} Departures

+
+

{name}

+
{departureTables(left)} {departureTables(right)} diff --git a/src/components/DepartureList/style.module.css b/src/components/DepartureList/style.module.css index cdd0d4e..ecc1717 100644 --- a/src/components/DepartureList/style.module.css +++ b/src/components/DepartureList/style.module.css @@ -1,7 +1,12 @@ .container { display: flex; flex-direction: column; - align-items: center; + align-items: stretch; + border: 1px solid rgba(220, 220, 220, 0.4); + box-shadow: 5px 5px 7px rgba(220, 220, 220, 0.5); + border-radius: 10px; + padding: 0 10px 10px 10px; + margin-bottom: 20px; } .departureLists { @@ -9,4 +14,9 @@ flex-direction: row; justify-content: space-between; width: 100%; + gap: 120px; +} + +.heading { + text-align: left; } diff --git a/src/components/Timetable/Timetable.tsx b/src/components/Timetable/Timetable.tsx index 2a05494..ec2079f 100644 --- a/src/components/Timetable/Timetable.tsx +++ b/src/components/Timetable/Timetable.tsx @@ -19,7 +19,7 @@ export default function Timetable() { return (
-

Timetable

+

Timetable 🚉

diff --git a/src/components/Timetable/style.module.css b/src/components/Timetable/style.module.css index e1e70fd..e69de29 100644 --- a/src/components/Timetable/style.module.css +++ b/src/components/Timetable/style.module.css @@ -1,5 +0,0 @@ -.wrapper { - border-radius: 10px; - padding: 1px 100px 30px 100px; - box-shadow: 5px 5px 10px #aeaeae; -} diff --git a/src/components/TimetableRow/style.module.css b/src/components/TimetableRow/style.module.css index e5819be..098f42b 100644 --- a/src/components/TimetableRow/style.module.css +++ b/src/components/TimetableRow/style.module.css @@ -8,7 +8,6 @@ td { .departureTime { font-weight: 600; - /* background-color: rgba(180, 180, 180, 0.1); */ } .lineNumber { From 0cb9867bc7f67e4903432d0f858cf3fb0f1415bc Mon Sep 17 00:00:00 2001 From: Darius Schefer Date: Wed, 27 Aug 2025 23:32:08 +0200 Subject: [PATCH 4/9] Footer --- bun.lock | 3 +++ package.json | 1 + src/components/Dashboard/Dashboard.tsx | 5 ++++- src/components/Dashboard/style.module.css | 2 +- src/components/DepartureList/style.module.css | 2 +- src/components/Footer/Footer.tsx | 17 +++++++++++++++++ src/components/Footer/style.module.css | 17 +++++++++++++++++ 7 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 src/components/Footer/Footer.tsx create mode 100644 src/components/Footer/style.module.css diff --git a/bun.lock b/bun.lock index f3f2ee9..3beb17e 100644 --- a/bun.lock +++ b/bun.lock @@ -10,6 +10,7 @@ "lodash": "^4.17.21", "react": "^19.1.0", "react-dom": "^19.1.0", + "react-fast-marquee": "^1.6.5", "react-redux": "^9.2.0", "redux-persist": "^6.0.0", "zustand": "^5.0.6", @@ -634,6 +635,8 @@ "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="], + "react-fast-marquee": ["react-fast-marquee@1.6.5", "", { "peerDependencies": { "react": ">= 16.8.0 || ^18.0.0", "react-dom": ">= 16.8.0 || ^18.0.0" } }, "sha512-swDnPqrT2XISAih0o74zQVE2wQJFMvkx+9VZXYYNSLb/CUcAzU9pNj637Ar2+hyRw6b4tP6xh4GQZip2ZCpQpg=="], + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], "react-redux": ["react-redux@9.2.0", "", { "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@types/react": "^18.2.25 || ^19", "react": "^18.0 || ^19", "redux": "^5.0.0" }, "optionalPeers": ["@types/react", "redux"] }, "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g=="], diff --git a/package.json b/package.json index 60e3e9e..71b51fe 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "lodash": "^4.17.21", "react": "^19.1.0", "react-dom": "^19.1.0", + "react-fast-marquee": "^1.6.5", "react-redux": "^9.2.0", "redux-persist": "^6.0.0", "zustand": "^5.0.6" diff --git a/src/components/Dashboard/Dashboard.tsx b/src/components/Dashboard/Dashboard.tsx index 7ffe448..f65949e 100644 --- a/src/components/Dashboard/Dashboard.tsx +++ b/src/components/Dashboard/Dashboard.tsx @@ -1,6 +1,7 @@ import Flatastic from "@/components/Flatastic/Flatastic"; import HomeAssistant from "@/components/HomeAssistant/HomeAssistant"; import Timetable from "@/components/Timetable/Timetable"; +import Footer from "@/components/Footer/Footer"; import style from "./style.module.css"; @@ -19,7 +20,9 @@ export default function Dashboard() {
-
+
+
+
); } diff --git a/src/components/Dashboard/style.module.css b/src/components/Dashboard/style.module.css index d231a20..33f2548 100644 --- a/src/components/Dashboard/style.module.css +++ b/src/components/Dashboard/style.module.css @@ -14,5 +14,5 @@ } .footer { - background-color: red; + background-color: rgba(220, 220, 220, 0.5); } diff --git a/src/components/DepartureList/style.module.css b/src/components/DepartureList/style.module.css index ecc1717..ccaf088 100644 --- a/src/components/DepartureList/style.module.css +++ b/src/components/DepartureList/style.module.css @@ -5,7 +5,7 @@ border: 1px solid rgba(220, 220, 220, 0.4); box-shadow: 5px 5px 7px rgba(220, 220, 220, 0.5); border-radius: 10px; - padding: 0 10px 10px 10px; + padding: 0 10px 20px 10px; margin-bottom: 20px; } diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx new file mode 100644 index 0000000..e5d6944 --- /dev/null +++ b/src/components/Footer/Footer.tsx @@ -0,0 +1,17 @@ +import Marquee from "react-fast-marquee"; + +import style from "./style.module.css"; + +export default function Footer() { + let pasta = + 'Ok, so I was playing the hit game Among Us the other day, and when the game started, a red bean-shaped character that appeared to be wearing a spacesuit told me "shh," while having his index finger in front of where his mouth should be. I believe this act made this red bean character extremely suspicious. To understand why this red bean character is suspicious, we first must understand how the game “Among Us” works. The game consists of 10 bean-shaped characters, called crewmates, that are given tasks for them to complete. As these characters do their tasks, they may witness abnormal things that are not supposed to happen, such as the lights turning off on their own, sudden reactor meltdown and other crewmates dying. These acts show that there is an imposter among the crewmates that is sabotaging and is trying to kill everyone. Now why is this important to determine why the red bean is suspicious? Well now we know how the game works, now we must analyze the red bean’s actions. At the beginning of the game, the red bean tells us “shh” while having his index finger in front of where his mouth should be. This action suggests that the red bean wants us to be quiet, or keep our mouths shut. Now why would the red bean want us to do this? This could be because the red bean wants to limit our communication in order to prevent us from spreading information. What information does the red bean want to prevent from spreading? We can assume that the reason why the red bean wants to prevent us from spreading information, is because he is actually the imposter, and he is planning on committing the crimes mentioned earlier. He does not want others to find out about actions he will cause, therefore he does not want us to communicate with each other. This concludes the reason for why I believe the red bean from the hit game Among Us is suspicious. So if you happen to see a red bean-shaped character wearing a spacesuit, please be careful.'; + + return ( +
+
BREAKING
+
+ {pasta} +
+
+ ); +} diff --git a/src/components/Footer/style.module.css b/src/components/Footer/style.module.css new file mode 100644 index 0000000..e5e6f52 --- /dev/null +++ b/src/components/Footer/style.module.css @@ -0,0 +1,17 @@ +.container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} + +.info { + background-color: red; + color: white; + font-weight: bold; + padding: 5px; +} + +.marquee { + +} From 7f12cb59d85201c5590143f51d98d307f6be83ca Mon Sep 17 00:00:00 2001 From: Darius Schefer Date: Wed, 27 Aug 2025 23:43:40 +0200 Subject: [PATCH 5/9] HomeAssistant update --- src/components/HomeAssistant/HomeAssistant.tsx | 15 +++++++++++++-- src/components/HomeAssistant/style.module.css | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/components/HomeAssistant/style.module.css diff --git a/src/components/HomeAssistant/HomeAssistant.tsx b/src/components/HomeAssistant/HomeAssistant.tsx index 472a8a1..8efd805 100644 --- a/src/components/HomeAssistant/HomeAssistant.tsx +++ b/src/components/HomeAssistant/HomeAssistant.tsx @@ -1,6 +1,8 @@ import { useEffect } from "react"; import { useHomeAssistantStore } from "@/store/homeAssistant"; +import style from "./style.module.css"; + export default function Timetable() { const fetchHomeAssistantData = useHomeAssistantStore( (state) => state.fetch, @@ -21,8 +23,17 @@ export default function Timetable() { return (

Tent

-

Temperature: {tentTemperature}°C

-

Humidity: {tentHumidity}%

+
+
+

Temperature

+

{tentTemperature}°C

+
+ +
+

Humidity

+

{tentHumidity}%

+
+
); } diff --git a/src/components/HomeAssistant/style.module.css b/src/components/HomeAssistant/style.module.css new file mode 100644 index 0000000..44f61b0 --- /dev/null +++ b/src/components/HomeAssistant/style.module.css @@ -0,0 +1,18 @@ +.cardContainer { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 20px; +} + +.card { + height: 150px; + width: 150px; + display: flex; + flex-direction: column; + align-items: stretch; + border: 1px solid rgba(220, 220, 220, 0.4); + box-shadow: 5px 5px 7px rgba(220, 220, 220, 0.5); + border-radius: 10px; +} From 241db688c2926fcd3f911893dcf5da72a3f56909 Mon Sep 17 00:00:00 2001 From: Darius Schefer Date: Thu, 28 Aug 2025 00:55:34 +0200 Subject: [PATCH 6/9] A e s t h e t i c s --- src/App.css | 39 ++--------------------- src/components/Dashboard/style.module.css | 21 ++++++++---- src/components/Flatastic/Flatastic.tsx | 12 ++++--- src/components/Flatastic/style.module.css | 20 ++++++++++++ 4 files changed, 44 insertions(+), 48 deletions(-) diff --git a/src/App.css b/src/App.css index f44fb79..527b0d1 100644 --- a/src/App.css +++ b/src/App.css @@ -1,42 +1,7 @@ #root { + height: 100vh; max-width: 1280px; margin: 0 auto; - padding: 2rem; + padding: 0; text-align: center; } - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/src/components/Dashboard/style.module.css b/src/components/Dashboard/style.module.css index 33f2548..1823727 100644 --- a/src/components/Dashboard/style.module.css +++ b/src/components/Dashboard/style.module.css @@ -1,18 +1,25 @@ .dashboard { - + display: flex; + flex-direction: column; + height: 100%; } .cardWrapper { + margin: 30px; + height: 100%; + gap: 30px; + flex-direction: column; + display: flex; + justify-content: flex-start; } .card { - border-radius: 10px; - padding: 1px 100px 30px 100px; - margin-bottom: 20px; - border: 1px solid rgba(220, 220, 220, 0.4); - box-shadow: 5px 5px 7px rgba(220, 220, 220, 0.5); + border-radius: 10px; + padding: 1px 100px 30px 100px; + border: 1px solid rgba(220, 220, 220, 0.4); + box-shadow: 5px 5px 7px rgba(220, 220, 220, 0.5); } .footer { - background-color: rgba(220, 220, 220, 0.5); + background-color: rgba(220, 220, 220, 0.5); } diff --git a/src/components/Flatastic/Flatastic.tsx b/src/components/Flatastic/Flatastic.tsx index dc4894c..ce7180f 100644 --- a/src/components/Flatastic/Flatastic.tsx +++ b/src/components/Flatastic/Flatastic.tsx @@ -3,6 +3,8 @@ import { useFlatasticStore } from "@/store/flatastic"; import type { FlatasticChore } from "@/types/flatasticChore"; +import style from "./style.module.css"; + const idToNameMap: Record = { 1836104: "Gruber", 1836101: "Darius", @@ -25,11 +27,13 @@ export default function Flatastic() { return (

Flatastic Chores

-
    +
      {chores.map((chore: FlatasticChore) => ( -
    • - {idToNameMap[chore.currentUser]}: {chore.title} - - Points: {chore.points} +
    • + + {idToNameMap[chore.currentUser]} + + : {chore.title} - {"🪙".repeat(chore.points)}
    • ))}
    diff --git a/src/components/Flatastic/style.module.css b/src/components/Flatastic/style.module.css index e69de29..1809cf3 100644 --- a/src/components/Flatastic/style.module.css +++ b/src/components/Flatastic/style.module.css @@ -0,0 +1,20 @@ +.choreList { + list-style-type: none; + display: flex; + flex-direction: row; + flex-wrap: wrap; + border-radius: 10px; + gap: 10px; + padding: 10px 0; +} + +.chore { + padding: 5px 10px; + border: 1px solid rgba(220, 220, 220, 0.4); + box-shadow: 5px 5px 7px rgba(220, 220, 220, 0.5); + text-align: left; +} + +.userName { + font-weight: bold; +} From b1adbe74decbb3172a1312e9f016beea16495c92 Mon Sep 17 00:00:00 2001 From: Darius Schefer Date: Thu, 28 Aug 2025 02:04:25 +0200 Subject: [PATCH 7/9] Windows look update --- resources/weed.png | Bin 0 -> 59005 bytes src/App.css | 2 +- src/components/Dashboard/Dashboard.tsx | 17 +++- src/components/Dashboard/style.module.css | 34 +++++++- src/components/DepartureList/style.module.css | 7 +- src/components/Flatastic/style.module.css | 8 +- src/components/Footer/Footer.tsx | 20 ++++- src/components/Footer/style.module.css | 78 ++++++++++++++++-- .../HomeAssistant/HomeAssistant.tsx | 1 - src/components/HomeAssistant/style.module.css | 11 ++- src/components/Timetable/Timetable.tsx | 2 +- 11 files changed, 148 insertions(+), 32 deletions(-) create mode 100644 resources/weed.png diff --git a/resources/weed.png b/resources/weed.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9ea46bfb0f6154c8c137c9fdcee5245d99d13f GIT binary patch literal 59005 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
    - +
    🕐 Timetable
    +
    + +
    - +
    🧹 Flatastic
    +
    + +
    - +
    + 🏠 HomeAssistant [Tent] +
    +
    + +
    diff --git a/src/components/Dashboard/style.module.css b/src/components/Dashboard/style.module.css index 1823727..5d692ec 100644 --- a/src/components/Dashboard/style.module.css +++ b/src/components/Dashboard/style.module.css @@ -2,6 +2,7 @@ display: flex; flex-direction: column; height: 100%; + background-color: #007c7d; } .cardWrapper { @@ -14,12 +15,37 @@ } .card { - border-radius: 10px; + flex-direction: column; + justify-content: flex-start; + background-color: #c0c0c0; + border-top: 2px solid white; + border-left: 2px solid white; + border-bottom: 2px solid #828282; + border-right: 2px solid #828282; +} + +.cardContent { padding: 1px 100px 30px 100px; - border: 1px solid rgba(220, 220, 220, 0.4); - box-shadow: 5px 5px 7px rgba(220, 220, 220, 0.5); +} + +.cardHeader { + height: 30px; + color: white; + background-color: #000082; + text-align: left; + padding-left: 5px; + font-weight: bold; +} + +.cardHeaderInactive { + height: 30px; + color: #c0c0c0; + background-color: #808080; + text-align: left; + padding-left: 5px; + font-weight: bold; } .footer { - background-color: rgba(220, 220, 220, 0.5); + background-color: #c0c0c0; } diff --git a/src/components/DepartureList/style.module.css b/src/components/DepartureList/style.module.css index ccaf088..d794b84 100644 --- a/src/components/DepartureList/style.module.css +++ b/src/components/DepartureList/style.module.css @@ -2,11 +2,12 @@ display: flex; flex-direction: column; align-items: stretch; - border: 1px solid rgba(220, 220, 220, 0.4); - box-shadow: 5px 5px 7px rgba(220, 220, 220, 0.5); - border-radius: 10px; padding: 0 10px 20px 10px; margin-bottom: 20px; + border-top: 2px solid white; + border-left: 2px solid white; + border-bottom: 2px solid #828282; + border-right: 2px solid #828282; } .departureLists { diff --git a/src/components/Flatastic/style.module.css b/src/components/Flatastic/style.module.css index 1809cf3..3c72ab0 100644 --- a/src/components/Flatastic/style.module.css +++ b/src/components/Flatastic/style.module.css @@ -3,16 +3,18 @@ display: flex; flex-direction: row; flex-wrap: wrap; - border-radius: 10px; + gap: 10px; padding: 10px 0; } .chore { padding: 5px 10px; - border: 1px solid rgba(220, 220, 220, 0.4); - box-shadow: 5px 5px 7px rgba(220, 220, 220, 0.5); text-align: left; + border-top: 2px solid white; + border-left: 2px solid white; + border-bottom: 2px solid #828282; + border-right: 2px solid #828282; } .userName { diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx index e5d6944..a41d933 100644 --- a/src/components/Footer/Footer.tsx +++ b/src/components/Footer/Footer.tsx @@ -8,9 +8,23 @@ export default function Footer() { return (
    -
    BREAKING
    -
    - {pasta} +
    +
    + + Start +
    + +
    + 🕐 Timetable + 🧹 Flatastic + 🏠 HomeAssistant +
    +
    +
    +
    BREAKING
    +
    + {pasta} +
    ); diff --git a/src/components/Footer/style.module.css b/src/components/Footer/style.module.css index e5e6f52..c82846e 100644 --- a/src/components/Footer/style.module.css +++ b/src/components/Footer/style.module.css @@ -1,17 +1,77 @@ .container { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + gap: 20px; +} + +.taskbar { + font-weight: bold; + height: 35px; + display: flex; + flex-direction: row; + text-align: left; +} + +.startButton { + display: inline-flex; + justify-content: space-around; + align-items: center; + width: 100px; + border-top: 2px solid white; + border-left: 2px solid white; + border-bottom: 2px solid black; + border-right: 2px solid black; +} + +.startIcon { + height: 30px; +} + +.divider { + margin: auto 8px; + width: 4px; + height: 25px; + border-top: 2px solid white; + border-left: 2px solid white; + border-bottom: 2px solid black; + border-right: 2px solid black; +} + +.windows { + display: flex; + flex-direction: row; + gap: 5px; +} + +.window { + min-width: 150px; + padding-left: 10px; + display: inline-flex; + align-items: center; + border-top: 2px solid white; + border-left: 2px solid white; + border-bottom: 2px solid black; + border-right: 2px solid black; +} + +.newsticker { + display: flex; + flex-direction: row; + align-items: center; + border-top: 2px solid white; + border-left: 2px solid white; + border-bottom: 2px solid black; + border-right: 2px solid black; } .info { - background-color: red; - color: white; - font-weight: bold; - padding: 5px; + background-color: red; + color: white; + font-weight: bold; + padding: 5px; } .marquee { - } diff --git a/src/components/HomeAssistant/HomeAssistant.tsx b/src/components/HomeAssistant/HomeAssistant.tsx index 8efd805..555a70d 100644 --- a/src/components/HomeAssistant/HomeAssistant.tsx +++ b/src/components/HomeAssistant/HomeAssistant.tsx @@ -22,7 +22,6 @@ export default function Timetable() { return (
    -

    Tent

    Temperature

    diff --git a/src/components/HomeAssistant/style.module.css b/src/components/HomeAssistant/style.module.css index 44f61b0..e4c5916 100644 --- a/src/components/HomeAssistant/style.module.css +++ b/src/components/HomeAssistant/style.module.css @@ -1,7 +1,8 @@ .cardContainer { + padding-top: 20px; display: flex; flex-direction: row; - justify-content: center; + justify-content: flex-start; align-items: center; gap: 20px; } @@ -12,7 +13,9 @@ display: flex; flex-direction: column; align-items: stretch; - border: 1px solid rgba(220, 220, 220, 0.4); - box-shadow: 5px 5px 7px rgba(220, 220, 220, 0.5); - border-radius: 10px; + text-align: center; + border-top: 2px solid white; + border-left: 2px solid white; + border-bottom: 2px solid #828282; + border-right: 2px solid #828282; } diff --git a/src/components/Timetable/Timetable.tsx b/src/components/Timetable/Timetable.tsx index ec2079f..2d72f13 100644 --- a/src/components/Timetable/Timetable.tsx +++ b/src/components/Timetable/Timetable.tsx @@ -19,7 +19,7 @@ export default function Timetable() { return (
    -

    Timetable 🚉

    +

    Departures

    From 42419e2e3b7308415b8be24e7e2f4e72becc1997 Mon Sep 17 00:00:00 2001 From: Darius Schefer Date: Thu, 28 Aug 2025 04:44:25 +0200 Subject: [PATCH 8/9] Clock widget and more copypasta --- resources/clock.png | Bin 0 -> 2352 bytes src/components/Dashboard/Dashboard.tsx | 12 ++++- src/components/Dashboard/style.module.css | 4 ++ src/components/Datetime/Datetime.tsx | 41 ++++++++++++++++++ src/components/Datetime/style.module.css | 17 ++++++++ src/components/DepartureList/style.module.css | 4 +- src/components/Flatastic/Flatastic.tsx | 2 +- src/components/Footer/Footer.tsx | 25 +++++++++-- src/components/Footer/pasta.ts | 9 ++++ src/components/Footer/style.module.css | 23 +++++----- src/index.css | 2 +- 11 files changed, 119 insertions(+), 20 deletions(-) create mode 100644 resources/clock.png create mode 100644 src/components/Datetime/Datetime.tsx create mode 100644 src/components/Datetime/style.module.css create mode 100644 src/components/Footer/pasta.ts diff --git a/resources/clock.png b/resources/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1445ad691728bc203200ff7ffe9e3b1d26d4d2 GIT binary patch literal 2352 zcmeAS@N?(olHy`uVBq!ia0y~yV3J{AVEn?t1{5h{{KCh;!13MF#WAE}&f7bu^KM6o zuwL9S@qgK$r?2Lz<$k!aOl$g*YqNg2+Ukht9r*j09jI$0gYVnc?qhfmEw@@f!Ek?{};NVxlz+ichk>LqU;N0Ff7d*<1dJ675^gobYcnC=fi`r)& zHaZ83uirPhu+;xY!k3#|^#ufUJleDB?n)kODVdL*{9*I=?vYW)<_fq~ceu~R##W^t zwtr@5UQxT3b%!hg^{>x{&aFy+{KEd);0V`^?#rGp8xl4Wq#xHBK+~d$G+X9m*a}H;N+|I z|6iT^_s948c3x+t=XE6?Z1KDN=EDa5x9?SWjJcNI?@V~~wLQIU^x_ZVGK&Yy?&UT+%+}l6%*U@3BYH3d zZolGwuu1OzzemD8`FD;d?`ryce*S?t#vdE+p1Mv#fB)NBy8rm?57NulGygfqi7Quw^OLpA zhlRQSSO1Rx_p!oeUWIPF`P-a5dv9L6QU3P2{J9f^G}l~zCv>nr{*J7Y#jYTOzkkel zRDG;DFP}S52DPC_nwWK}SXz#}5vV0mh zA3hMZe26Vy!Myvu_$#YJ;w?joa)D2C`~L2?kC`VsaWW{km_6vhZ`J0*j;ZAx3DV0r zUd?T~YAt)&kL7omeSP};AQ)B7w7hU{U-l#OLO7Z z_IAqh5el^LNyTAhR${ZtG}OZDYo70`vX+jSj6e0hyZUTZ-rmcGmcP%rzWv~L zV)DAhN$G?V(7C;L?p$43Zl$*VU;l5W_4ilrKXPXR0eika3%y&lym{-JoCE*y2mkZ9 zf*&^)YVujjUH{g??>2w!2X+EQsWxA4N!R16<#zuLu}?qmR$)XyeKz0qlrH8SB6yXJ h
    -
    🕐 Timetable
    +
    🚊 Timetable
    + +
    +
    +
    🕐 Clock
    + +
    +
    +
    🧹 Flatastic
    +
    🏠 HomeAssistant [Tent] diff --git a/src/components/Dashboard/style.module.css b/src/components/Dashboard/style.module.css index 5d692ec..20dc40b 100644 --- a/src/components/Dashboard/style.module.css +++ b/src/components/Dashboard/style.module.css @@ -49,3 +49,7 @@ .footer { background-color: #c0c0c0; } + +.uglyHack { + width: 45%; +} diff --git a/src/components/Datetime/Datetime.tsx b/src/components/Datetime/Datetime.tsx new file mode 100644 index 0000000..7e99200 --- /dev/null +++ b/src/components/Datetime/Datetime.tsx @@ -0,0 +1,41 @@ +import style from "./style.module.css"; + +import { useState, useEffect } from "react"; + +export default function Datetime() { + const locale = "de"; + const [today, setDate] = useState(new Date()); + + useEffect(() => { + const timer = setInterval(() => { + setDate(new Date()); + }, 20 * 1000); + return () => { + clearInterval(timer); + }; + }, []); + + const date = today.toLocaleDateString(locale, { + month: "long", + day: "numeric", + year: "numeric", + }); + + const time = today.toLocaleTimeString(locale, { + hour: "numeric", + hour12: false, + minute: "numeric", + }); + + return ( +
    +
    + +
    +
    +
    {time}
    +
    {date}
    +
    +
    + ); +} diff --git a/src/components/Datetime/style.module.css b/src/components/Datetime/style.module.css new file mode 100644 index 0000000..82edaef --- /dev/null +++ b/src/components/Datetime/style.module.css @@ -0,0 +1,17 @@ +.container { + display: flex; + flex-direction: row; + align-items: center; + +} + +img { + height: 200px; +} + +.textContainer { + font-size: 16pt; + font-weight: bold; + display: flex; + flex-direction: column; +} diff --git a/src/components/DepartureList/style.module.css b/src/components/DepartureList/style.module.css index d794b84..8b18dd1 100644 --- a/src/components/DepartureList/style.module.css +++ b/src/components/DepartureList/style.module.css @@ -13,11 +13,11 @@ .departureLists { display: flex; flex-direction: row; - justify-content: space-between; + justify-content: space-around; width: 100%; - gap: 120px; } .heading { text-align: left; + padding-left: 30px; } diff --git a/src/components/Flatastic/Flatastic.tsx b/src/components/Flatastic/Flatastic.tsx index ce7180f..c31af82 100644 --- a/src/components/Flatastic/Flatastic.tsx +++ b/src/components/Flatastic/Flatastic.tsx @@ -26,7 +26,7 @@ export default function Flatastic() { return (
    -

    Flatastic Chores

    +

    Chores

      {chores.map((chore: FlatasticChore) => (
    • diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx index a41d933..58fd82b 100644 --- a/src/components/Footer/Footer.tsx +++ b/src/components/Footer/Footer.tsx @@ -1,10 +1,26 @@ +import { useState, useEffect } from "react"; import Marquee from "react-fast-marquee"; +import Datetime from "@/components/Datetime/Datetime"; + import style from "./style.module.css"; +import pasta from "./pasta.ts"; export default function Footer() { - let pasta = - 'Ok, so I was playing the hit game Among Us the other day, and when the game started, a red bean-shaped character that appeared to be wearing a spacesuit told me "shh," while having his index finger in front of where his mouth should be. I believe this act made this red bean character extremely suspicious. To understand why this red bean character is suspicious, we first must understand how the game “Among Us” works. The game consists of 10 bean-shaped characters, called crewmates, that are given tasks for them to complete. As these characters do their tasks, they may witness abnormal things that are not supposed to happen, such as the lights turning off on their own, sudden reactor meltdown and other crewmates dying. These acts show that there is an imposter among the crewmates that is sabotaging and is trying to kill everyone. Now why is this important to determine why the red bean is suspicious? Well now we know how the game works, now we must analyze the red bean’s actions. At the beginning of the game, the red bean tells us “shh” while having his index finger in front of where his mouth should be. This action suggests that the red bean wants us to be quiet, or keep our mouths shut. Now why would the red bean want us to do this? This could be because the red bean wants to limit our communication in order to prevent us from spreading information. What information does the red bean want to prevent from spreading? We can assume that the reason why the red bean wants to prevent us from spreading information, is because he is actually the imposter, and he is planning on committing the crimes mentioned earlier. He does not want others to find out about actions he will cause, therefore he does not want us to communicate with each other. This concludes the reason for why I believe the red bean from the hit game Among Us is suspicious. So if you happen to see a red bean-shaped character wearing a spacesuit, please be careful.'; + const [index, setIndex] = useState(0); + + // random shitpost every minute + useEffect(() => { + const timer = setInterval(() => { + setIndex(Math.floor(Math.random() * pasta.length)); + console.log("sus!"); + }, 60 * 1000); + return () => { + clearInterval(timer); + }; + }, []); + + const text = pasta[index]; return (
      @@ -15,15 +31,16 @@ export default function Footer() {
      - 🕐 Timetable 🧹 Flatastic + 🚊 Timetable 🏠 HomeAssistant
    +
    BREAKING
    - {pasta} + {text}
    diff --git a/src/components/Footer/pasta.ts b/src/components/Footer/pasta.ts new file mode 100644 index 0000000..b3a882b --- /dev/null +++ b/src/components/Footer/pasta.ts @@ -0,0 +1,9 @@ +const pasta = [ + 'Ok, so I was playing the hit game Among Us the other day, and when the game started, a red bean-shaped character that appeared to be wearing a spacesuit told me "shh," while having his index finger in front of where his mouth should be. I believe this act made this red bean character extremely suspicious. To understand why this red bean character is suspicious, we first must understand how the game “Among Us” works. The game consists of 10 bean-shaped characters, called crewmates, that are given tasks for them to complete. As these characters do their tasks, they may witness abnormal things that are not supposed to happen, such as the lights turning off on their own, sudden reactor meltdown and other crewmates dying. These acts show that there is an imposter among the crewmates that is sabotaging and is trying to kill everyone. Now why is this important to determine why the red bean is suspicious? Well now we know how the game works, now we must analyze the red bean’s actions. At the beginning of the game, the red bean tells us “shh” while having his index finger in front of where his mouth should be. This action suggests that the red bean wants us to be quiet, or keep our mouths shut. Now why would the red bean want us to do this? This could be because the red bean wants to limit our communication in order to prevent us from spreading information. What information does the red bean want to prevent from spreading? We can assume that the reason why the red bean wants to prevent us from spreading information, is because he is actually the imposter, and he is planning on committing the crimes mentioned earlier. He does not want others to find out about actions he will cause, therefore he does not want us to communicate with each other. This concludes the reason for why I believe the red bean from the hit game Among Us is suspicious. So if you happen to see a red bean-shaped character wearing a spacesuit, please be careful.', + "「真正的Emo」只有DC的硬核emo和90年代末 的 Screamo 局,而所謂的「中西部 Emo」 不過 是被真正 Emo所影響的另類搖滾罷了。每次聽到 有人說什麼 My Chemical Romance 不是正宗的 Emo,但又覺得 Sunny Day Real Estate 是的時 候,我他媽就覺得有夠智障,因為他們和 My Chemical Romance 其實一樣都是假 Emo(只能 說他們是被emo影響的樂團)。真正的 Emo 應該 聽起來很強烈、甚至帶著一些憤怒的活力!假 Emo則軟弱、自卑,那些廢物把精力和情感錯誤 地注入音樂當中,只能說他們所謂的emo是失敗 的嘗試罷了。一些真正的Emo 團包括Pg 99、 Rites of Spring、Cap'n Jazz(絕對是中西部樂 團圈裡面唯一真正的 Emo 樂團)和Loma Prieta。那些假的 Emo 團像是 American Football My Chemical Romance Mineral... 等。EMO就該屬於硬核,不是獨立曲風、更別說 是流行龐克、另類搖滾、或是他媽的任何其他主 流類型!!!", + '\"YoU tOucHEd ThAt BlOcK So yOu HavE tO PuLl tHat OnE Out" Go fuck yourself, that\'s not how the fucking game is played, you dumb, the fuck, asshole. Quoted from the official Jenga rules: "Players may tap a block to find a loose one. Any blocks moved but not played should be replaced, unless doing so would make the tower fall." You\'ve never even fucking read the rules have you, you shithead idiot. What, is the game over in 3 seconds, if you just so happen to touch a load bearing block first? FUCKING NO DUMBASS. Learn to read you illiterate fuck.', + "I can't fucking take it any more. Among Us has singlehandedly ruined my life. The other day my teacher was teaching us Greek Mythology and he mentioned a pegasus and I immediately thought 'Pegasus? more like Mega Sus!!!!' and I've never wanted to kms more. I can't look at a vent without breaking down and fucking crying. I can't eat pasta without thinking 'IMPASTA??? THATS PRETTY SUS!!!!' Skit 4 by Kanye West. The lyrics ruined me. A Mongoose, or the 25th island of greece. The scientific name for pig. I can't fucking take it anymore. Please fucking end my suffering.", + "What the fuck did you just fucking say about me, you little bitch? I'll have you know I graduated top of my class in the Navy Seals, and I've been involved in numerous secret raids on Al-Quaeda, and I have over 300 confirmed kills. I am trained in gorilla warfare and I'm the top sniper in the entire US armed forces. You are nothing to me but just another target. I will wipe you the fuck out with precision the likes of which has never been seen before on this Earth, mark my fucking words. You think you can get away with saying that shit to me over the Internet? Think again, fucker. As we speak I am contacting my secret network of spies across the USA and your IP is being traced right now so you better prepare for the storm, maggot. The storm that wipes out the pathetic little thing you call your life. You're fucking dead, kid. I can be anywhere, anytime, and I can kill you in over seven hundred ways, and that's just with my bare hands. Not only am I extensively trained in unarmed combat, but I have access to the entire arsenal of the United States Marine Corps and I will use it to its full extent to wipe your miserable ass off the face of the continent, you little shit. If only you could have known what unholy retribution your little \"clever\" comment was about to bring down upon you, maybe you would have held your fucking tongue. But you couldn't, you didn't, and now you're paying the price, you goddamn idiot. I will shit fury all over you and you will drown in it. You're fucking dead, kiddo.", +]; + +export default pasta; diff --git a/src/components/Footer/style.module.css b/src/components/Footer/style.module.css index c82846e..23fbede 100644 --- a/src/components/Footer/style.module.css +++ b/src/components/Footer/style.module.css @@ -1,14 +1,15 @@ .container { + height: 35px; display: flex; flex-direction: row; - justify-content: flex-start; + justify-content: space-between; align-items: center; - gap: 20px; + gap: 10px; + margin: 2px; } .taskbar { font-weight: bold; - height: 35px; display: flex; flex-direction: row; text-align: left; @@ -21,8 +22,8 @@ width: 100px; border-top: 2px solid white; border-left: 2px solid white; - border-bottom: 2px solid black; - border-right: 2px solid black; + border-bottom: 2px solid #828282; + border-right: 2px solid #828282; } .startIcon { @@ -35,8 +36,8 @@ height: 25px; border-top: 2px solid white; border-left: 2px solid white; - border-bottom: 2px solid black; - border-right: 2px solid black; + border-bottom: 2px solid #828282; + border-right: 2px solid #828282; } .windows { @@ -52,8 +53,8 @@ align-items: center; border-top: 2px solid white; border-left: 2px solid white; - border-bottom: 2px solid black; - border-right: 2px solid black; + border-bottom: 2px solid #828282; + border-right: 2px solid #828282; } .newsticker { @@ -62,8 +63,8 @@ align-items: center; border-top: 2px solid white; border-left: 2px solid white; - border-bottom: 2px solid black; - border-right: 2px solid black; + border-bottom: 2px solid #828282; + border-right: 2px solid #828282; } .info { diff --git a/src/index.css b/src/index.css index 6e2bee0..302a33e 100644 --- a/src/index.css +++ b/src/index.css @@ -1,5 +1,5 @@ :root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + font-family: Arial, sans-serif; line-height: 1.5; font-weight: 400; From aa8da0bb56e0ae49de93bb1116eff4488e302b80 Mon Sep 17 00:00:00 2001 From: Darius Schefer Date: Thu, 28 Aug 2025 20:37:00 +0200 Subject: [PATCH 9/9] Terminal window --- {resources => src/assets}/clock.png | Bin {resources => src/assets}/weed.png | Bin src/components/Dashboard/Dashboard.tsx | 22 ++++++++---- src/components/Dashboard/style.module.css | 13 ++++--- src/components/Datetime/Datetime.tsx | 2 +- src/components/Datetime/style.module.css | 5 ++- src/components/Footer/Footer.tsx | 5 ++- src/components/Terminal/Terminal.tsx | 41 ++++++++++++++++++++++ src/components/Terminal/pasta.ts | 9 +++++ src/components/Terminal/style.module.css | 33 +++++++++++++++++ 10 files changed, 115 insertions(+), 15 deletions(-) rename {resources => src/assets}/clock.png (100%) rename {resources => src/assets}/weed.png (100%) create mode 100644 src/components/Terminal/Terminal.tsx create mode 100644 src/components/Terminal/pasta.ts create mode 100644 src/components/Terminal/style.module.css diff --git a/resources/clock.png b/src/assets/clock.png similarity index 100% rename from resources/clock.png rename to src/assets/clock.png diff --git a/resources/weed.png b/src/assets/weed.png similarity index 100% rename from resources/weed.png rename to src/assets/weed.png diff --git a/src/components/Dashboard/Dashboard.tsx b/src/components/Dashboard/Dashboard.tsx index 4e83b22..d40faef 100644 --- a/src/components/Dashboard/Dashboard.tsx +++ b/src/components/Dashboard/Dashboard.tsx @@ -2,6 +2,7 @@ import Flatastic from "@/components/Flatastic/Flatastic"; import HomeAssistant from "@/components/HomeAssistant/HomeAssistant"; import Timetable from "@/components/Timetable/Timetable"; import Datetime from "@/components/Datetime/Datetime"; +import Terminal from "@/components/Terminal/Terminal"; import Footer from "@/components/Footer/Footer"; import style from "./style.module.css"; @@ -17,9 +18,9 @@ export default function Dashboard() {
    -
    +
    -
    🕐 Clock
    +
    🕐 Clock
    @@ -32,13 +33,20 @@ export default function Dashboard() {
    -
    - 🏠 HomeAssistant [Tent] -
    -
    - +
    +
    🔔 Terminal
    +
    + + {/*
    */} + {/*
    */} + {/* 🏠 HomeAssistant [Tent] */} + {/*
    */} + {/*
    */} + {/* */} + {/*
    */} + {/*
    */}
    diff --git a/src/components/Dashboard/style.module.css b/src/components/Dashboard/style.module.css index 20dc40b..3646978 100644 --- a/src/components/Dashboard/style.module.css +++ b/src/components/Dashboard/style.module.css @@ -46,10 +46,13 @@ font-weight: bold; } -.footer { - background-color: #c0c0c0; -} - -.uglyHack { +.clock { width: 45%; } + +.terminal { +} + +.footer { + background-color: #c0c0c0; +} diff --git a/src/components/Datetime/Datetime.tsx b/src/components/Datetime/Datetime.tsx index 7e99200..1647b30 100644 --- a/src/components/Datetime/Datetime.tsx +++ b/src/components/Datetime/Datetime.tsx @@ -30,7 +30,7 @@ export default function Datetime() { return (
    - +
    {time}
    diff --git a/src/components/Datetime/style.module.css b/src/components/Datetime/style.module.css index 82edaef..af4291f 100644 --- a/src/components/Datetime/style.module.css +++ b/src/components/Datetime/style.module.css @@ -2,11 +2,14 @@ display: flex; flex-direction: row; align-items: center; + padding-right: 25px; } img { - height: 200px; + height: 100px; + scale: 130%; + object-fit: cover; } .textContainer { diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx index 58fd82b..87d9cd7 100644 --- a/src/components/Footer/Footer.tsx +++ b/src/components/Footer/Footer.tsx @@ -26,7 +26,10 @@ export default function Footer() {
    - + Start
    diff --git a/src/components/Terminal/Terminal.tsx b/src/components/Terminal/Terminal.tsx new file mode 100644 index 0000000..73bb423 --- /dev/null +++ b/src/components/Terminal/Terminal.tsx @@ -0,0 +1,41 @@ +import { useEffect } from "react"; +import { useHomeAssistantStore } from "@/store/homeAssistant"; + +import pasta from "./pasta.ts"; +import style from "./style.module.css"; + +export default function Terminal() { + const fetchHomeAssistantData = useHomeAssistantStore( + (state) => state.fetch, + ); + const tentTemperature = useHomeAssistantStore( + (state) => state.tentTemperature, + ); + const tentHumidity = useHomeAssistantStore((state) => state.tentHumidity); + + useEffect(() => { + fetchHomeAssistantData(); + const interval = setInterval(() => { + fetchHomeAssistantData(); + }, 60000); + return () => clearInterval(interval); + }, [fetchHomeAssistantData]); + + return ( +
    + + -[#rauchen]---muehlburger-bubatz-buben.de- + + + [BubatzBot]: + **UPDATE** Tent: {tentTemperature}°C,{" "} + {tentHumidity}% + + + + [anonymous]: + {pasta[0]} + +
    + ); +} diff --git a/src/components/Terminal/pasta.ts b/src/components/Terminal/pasta.ts new file mode 100644 index 0000000..b3a882b --- /dev/null +++ b/src/components/Terminal/pasta.ts @@ -0,0 +1,9 @@ +const pasta = [ + 'Ok, so I was playing the hit game Among Us the other day, and when the game started, a red bean-shaped character that appeared to be wearing a spacesuit told me "shh," while having his index finger in front of where his mouth should be. I believe this act made this red bean character extremely suspicious. To understand why this red bean character is suspicious, we first must understand how the game “Among Us” works. The game consists of 10 bean-shaped characters, called crewmates, that are given tasks for them to complete. As these characters do their tasks, they may witness abnormal things that are not supposed to happen, such as the lights turning off on their own, sudden reactor meltdown and other crewmates dying. These acts show that there is an imposter among the crewmates that is sabotaging and is trying to kill everyone. Now why is this important to determine why the red bean is suspicious? Well now we know how the game works, now we must analyze the red bean’s actions. At the beginning of the game, the red bean tells us “shh” while having his index finger in front of where his mouth should be. This action suggests that the red bean wants us to be quiet, or keep our mouths shut. Now why would the red bean want us to do this? This could be because the red bean wants to limit our communication in order to prevent us from spreading information. What information does the red bean want to prevent from spreading? We can assume that the reason why the red bean wants to prevent us from spreading information, is because he is actually the imposter, and he is planning on committing the crimes mentioned earlier. He does not want others to find out about actions he will cause, therefore he does not want us to communicate with each other. This concludes the reason for why I believe the red bean from the hit game Among Us is suspicious. So if you happen to see a red bean-shaped character wearing a spacesuit, please be careful.', + "「真正的Emo」只有DC的硬核emo和90年代末 的 Screamo 局,而所謂的「中西部 Emo」 不過 是被真正 Emo所影響的另類搖滾罷了。每次聽到 有人說什麼 My Chemical Romance 不是正宗的 Emo,但又覺得 Sunny Day Real Estate 是的時 候,我他媽就覺得有夠智障,因為他們和 My Chemical Romance 其實一樣都是假 Emo(只能 說他們是被emo影響的樂團)。真正的 Emo 應該 聽起來很強烈、甚至帶著一些憤怒的活力!假 Emo則軟弱、自卑,那些廢物把精力和情感錯誤 地注入音樂當中,只能說他們所謂的emo是失敗 的嘗試罷了。一些真正的Emo 團包括Pg 99、 Rites of Spring、Cap'n Jazz(絕對是中西部樂 團圈裡面唯一真正的 Emo 樂團)和Loma Prieta。那些假的 Emo 團像是 American Football My Chemical Romance Mineral... 等。EMO就該屬於硬核,不是獨立曲風、更別說 是流行龐克、另類搖滾、或是他媽的任何其他主 流類型!!!", + '\"YoU tOucHEd ThAt BlOcK So yOu HavE tO PuLl tHat OnE Out" Go fuck yourself, that\'s not how the fucking game is played, you dumb, the fuck, asshole. Quoted from the official Jenga rules: "Players may tap a block to find a loose one. Any blocks moved but not played should be replaced, unless doing so would make the tower fall." You\'ve never even fucking read the rules have you, you shithead idiot. What, is the game over in 3 seconds, if you just so happen to touch a load bearing block first? FUCKING NO DUMBASS. Learn to read you illiterate fuck.', + "I can't fucking take it any more. Among Us has singlehandedly ruined my life. The other day my teacher was teaching us Greek Mythology and he mentioned a pegasus and I immediately thought 'Pegasus? more like Mega Sus!!!!' and I've never wanted to kms more. I can't look at a vent without breaking down and fucking crying. I can't eat pasta without thinking 'IMPASTA??? THATS PRETTY SUS!!!!' Skit 4 by Kanye West. The lyrics ruined me. A Mongoose, or the 25th island of greece. The scientific name for pig. I can't fucking take it anymore. Please fucking end my suffering.", + "What the fuck did you just fucking say about me, you little bitch? I'll have you know I graduated top of my class in the Navy Seals, and I've been involved in numerous secret raids on Al-Quaeda, and I have over 300 confirmed kills. I am trained in gorilla warfare and I'm the top sniper in the entire US armed forces. You are nothing to me but just another target. I will wipe you the fuck out with precision the likes of which has never been seen before on this Earth, mark my fucking words. You think you can get away with saying that shit to me over the Internet? Think again, fucker. As we speak I am contacting my secret network of spies across the USA and your IP is being traced right now so you better prepare for the storm, maggot. The storm that wipes out the pathetic little thing you call your life. You're fucking dead, kid. I can be anywhere, anytime, and I can kill you in over seven hundred ways, and that's just with my bare hands. Not only am I extensively trained in unarmed combat, but I have access to the entire arsenal of the United States Marine Corps and I will use it to its full extent to wipe your miserable ass off the face of the continent, you little shit. If only you could have known what unholy retribution your little \"clever\" comment was about to bring down upon you, maybe you would have held your fucking tongue. But you couldn't, you didn't, and now you're paying the price, you goddamn idiot. I will shit fury all over you and you will drown in it. You're fucking dead, kiddo.", +]; + +export default pasta; diff --git a/src/components/Terminal/style.module.css b/src/components/Terminal/style.module.css new file mode 100644 index 0000000..17a05c9 --- /dev/null +++ b/src/components/Terminal/style.module.css @@ -0,0 +1,33 @@ +.container { + display: flex; + flex-direction: column; + font-family: monospace; + font-size: 12pt; + + background-color: black; + color: white; + display: flex; + flex-direction: column; + width: 100%; + height: 285px; + overflow: hidden; +} + +.title { + color: thistle; + margin-bottom: 12pt; +} + +.bubatzBot { + color: skyblue; + padding-right: 5px +} + +.pastaBot { + color: bisque; + padding-right: 5px +} + +.infoMessage { + color: lightgreen; +}