Compare commits

...

20 commits

Author SHA1 Message Date
Zoey 8a54d9916b
major rewrite
Signed-off-by: Zoey <friendlypossum@netc.fr>
2024-09-10 23:03:54 +02:00
Zoey 18b10fd46c
some shit idk
Signed-off-by: Zoey <friendlypossum@netc.fr>
2024-08-30 23:08:32 +02:00
Zoey a5006bc0a1
Disabled live check for Owncast
Signed-off-by: Zoey <friendlypossum@netc.fr>
2024-08-09 21:06:13 +02:00
Zoey c3c35851cc
added send 2024-06-25 23:21:25 +02:00
Zoey 75247ac2a4
separated owncast, added forgejo, changed body text 2024-06-15 16:06:51 +02:00
Zoey e943309306
big changes - WIP 2024-06-12 21:33:58 +02:00
Zoey 82828ddef5
test3 2024-05-19 20:34:02 +02:00
Zoey 62a82dc0c8 Update keytest 2024-05-19 20:32:53 +02:00
Zoey 1c53a0e3d0 key test 2024-05-19 20:15:10 +02:00
Zoey b22218d80f Update May 2024
Added new links, images, fixed margins, padding, flex
Added discord embed meta tags
fixed some things being selectable
2024-05-16 18:37:55 +02:00
Zoey 13e80cc46f shit keeps breaking 2024-01-16 20:51:36 +01:00
Zoey 6d1c1088fe jsx 2024-01-16 20:48:35 +01:00
Zoey 7fa70fe497 fix overflow 2024-01-15 20:00:00 +01:00
Zoey 5399aa18d4 ui stuff, broken box, EoE dev versions, nginx req 2024-01-15 19:14:38 +01:00
Zoey ab52428eec disabled image saving client side 2024-01-15 13:59:49 +01:00
Zoey ca15fd2cf8 Big update 2024-01-15 13:47:31 +01:00
Zoey ca147cdbf8 anims 2024-01-14 13:00:51 +01:00
Zoey 30f23d7242 moon and stuff 2024-01-14 12:05:03 +01:00
Zoey 8d262a40c0 WIP 2024-01-14 11:24:34 +01:00
Zoey ba6b25934a react init 2024-01-14 09:02:42 +01:00
73 changed files with 24579 additions and 939 deletions

23
.gitignore vendored Normal file
View file

@ -0,0 +1,23 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*

70
README.md Normal file
View file

@ -0,0 +1,70 @@
# Getting Started with Create React App
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
## Available Scripts
In the project directory, you can run:
### `npm start`
Runs the app in the development mode.\
Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
The page will reload when you make changes.\
You may also see any lint errors in the console.
### `npm test`
Launches the test runner in the interactive watch mode.\
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
### `npm run build`
Builds the app for production to the `build` folder.\
It correctly bundles React in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes.\
Your app is ready to be deployed!
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
### `npm run eject`
**Note: this is a one-way operation. Once you `eject`, you can't go back!**
If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
## Learn More
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
To learn React, check out the [React documentation](https://reactjs.org/).
### Code Splitting
This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
### Analyzing the Bundle Size
This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
### Making a Progressive Web App
This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
### Advanced Configuration
This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
### Deployment
This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
### `npm run build` fails to minify
This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)

View file

@ -3,6 +3,5 @@
{
"path": "."
}
],
"settings": {}
]
}

BIN
bun.lockb Executable file

Binary file not shown.

View file

@ -1,52 +0,0 @@
@import url('https://fonts.googleapis.com/css2?family=Sarabun&display=swap');
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Sarabun', sans-serif;
font-weight: 400;
display: flex;
flex-direction: column;
align-items: center;
background-color: black;
color: lightpink;
padding-top: 6%;
padding-bottom: 3.5%;
}
/* Centered Content */
.headercontent {
text-align: center;
align-self: flex;
flex-grow: 1;
overflow-y: auto;
height: 100%;
width: 100%
}
.headercontent h1 {
padding-top: 10px;
font-size: 48px;
}
.headercontent h4 {
margin-bottom: 60px;
}
.headercontent p {
margin-bottom: 30px;
}
.TTClogo {
margin-top: 20px;
width: 250px;
margin-bottom: 10px;
}
.ShieldsDiscord {
margin-bottom: 20px;
}

View file

@ -1,20 +0,0 @@
@import url('https://fonts.googleapis.com/css2?family=Sarabun&display=swap');
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Sarabun', sans-serif;
font-weight: 400;
display: flex;
flex-direction: column;
align-items: center;
background-color: black;
color: lightpink;
padding-top: 6%;
padding-bottom: 3.5%;
}

View file

@ -1,29 +0,0 @@
@import url('https://fonts.googleapis.com/css2?family=Sarabun&display=swap');
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Sarabun', sans-serif;
font-weight: 400;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: black;
color: lightpink;
overflow: hidden;
margin: 0;
}
/* Centered Content */
.centered-content {
text-align: center;
}
#blahaj {
opacity: 0;
}

View file

@ -1,249 +0,0 @@
/* Header */
:root {
--background-color-dark: #111111;
--background-color-light: rgb(255, 224, 229);
--article-bg-dark: #161616;
--article-bg-light:#d3adb3;
--color-dark: lightpink;
--color-light: #111111;
--color-button-dark: rgb(160, 61, 76);
--color-buton-light: #333;
--color-button-hover-light: rgb(160, 61, 76);
--color-button-hover-dark: #333;
--color-bg-body-dark: black;
--color-bg-body-light: lightpink;
--color-body-light: lightpink;
--color-body-dark: black;
}
header {
background-color: var(--background-color-dark);
color: var(--color-light);
padding: 5px;
text-align: left;
position: fixed;
width: 100%;
top: 0;
left: 0;
}
/* Footer */
footer {
background-color: #111111;
color: lightpink;
padding: 5px;
text-align: center;
position: fixed;
width: 100%;
bottom: 0;
left: 0;
}
/* Add the following styles for the popup */
.image-popup {
position: relative;
display: inline-block;
max-width: 300px;
width: min-content;
}
.popup-content {
display: none;
position: absolute;
top: 100%;
left: 0;
width: min-content;
background-color: #1d1d1d;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
z-index: 1;
border-radius: 5px;
}
.image-popup:hover .popup-content {
display: flex;
}
.popup-content img {
width: 40px;
height: auto;
margin-right: 10px;
box-sizing: border-box;
transition: transform 0.1s ease-in-out;
}
.popup-content img:last-child {
margin-right: 0;
}
/* Add the following style to remove margin on the last child */
.popup-content > :last-child {
margin-right: 0;
}
.popup-content img:hover {
transform: scale(1.1); /* Add a slight scale effect on hover */
}
/* Navigation in Header*/
nav.top-nav ul {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
align-items: center; /* Align items vertically in the center */
}
nav.top-nav a {
text-decoration: none;
color: inherit;
padding: 10px 15px; /* Adjust padding for better spacing */
transition: color 0.3s; /* Add a smooth transition for color change */
}
nav.top-nav li {
margin: 0 15px;
border-right: 2px solid rgb(0, 0, 0); /* Add a right border to create a separator */
padding-right: 15px; /* Adjust padding for better spacing */
}
/* Style the last li to remove the border */
nav.top-nav li:last-child {
border-right: none;
}
/* Change text color on hover */
nav.top-nav a:hover {
color: rgb(255, 246, 247); /* Change to the desired hover color */
}
/* Navigation in Footer */
nav.bottom-nav ul {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
justify-content: center; /* Center the items horizontally */
align-items: center; /* Align items vertically in the center */
}
nav.bottom-nav li {
margin: 0 15px;
}
/* Navigation links in Footer */
nav.bottom-nav a {
text-decoration: none;
color: inherit;
padding: 10px 15px; /* Adjust padding for better spacing */
transition: color 0.3s; /* Add a smooth transition for color change */
}
/* Change text color on hover */
nav.bottom-nav a:hover {
color: inherit; /* Change to the desired hover color */
}
.toggle-button {
display: flex;
align-items: center;
justify-content: center;
background-color: #333;
color: inherit;
width: 40px;
height: 40px;
padding: 10px 20px;
border-color: #11111100;
border-radius: 5px;
cursor: pointer;
}
.toggle-button img {
transform: scale(.08);
}
input[type="checkbox"] {
display: none;
}
/*ARTICLES*/
#article-list {
flex-direction: column;
text-align: center;
position: fixed;
align-items: flex-start;
left: 0;
width: 20%;
height: 100vh;
background-color: var(--article-bg-dark);
color: var(--color-dark);
overflow-y: auto;
padding-top: 6%;
flex-grow: 1;
}
/* Style for the subtitles */
.article-subtitle {
bottom: 0;
left: 10%;
width: 80%;
padding: 5px;
text-align: center;
position: relative;
font-size: small;
}
/* Style for the container of the article content */
#article-container {
flex-grow: 1;
position: relative;
width: 85%; /* Adjusted width to accommodate the article list */
padding-left: 45%;
padding-right: 20%; /* Add some padding for spacing */
}
#article-container h1 {
text-align: center;
}
#article-container h3 {
text-align: left;
position: absolute;
left: 20%;
margin-top: 2%;
}
#article-container h6 {
text-align: left;
position: absolute;
left: 20%;
margin-top: 5%;
}
#article-container p {
text-align: left;
position: absolute;
left: 20%;
margin-top: 8%;
}
/* Responsive styles for smaller screens */
@media screen and (max-width: 768px) {
body {
padding-top: 10%; /* Adjust as needed */
}
#article-list {
width: 100%;
padding-top: 10%; /* Adjust as needed */
}
#article-container {
margin-left: 0;
width: 100%;
}
}

View file

@ -1,77 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" type="image/png" sizes="48x48" href="/images/bunnie48px.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="color-scheme" content="dark light">
<title>Zoey's Bits - About</title>
<link rel="stylesheet" href="/css/about.css" type="text/css" media="all">
</head>
<body>
<div id="header-placeholder"></div>
<div class="headercontent">
<h1 id="title">About me!</h1>
<h4 id="subtitle">booba</h4>
<p>
I like bunnies, but don't own any.
</p>
<p>
Mostly a jack of all trades, master of none.
<br>
At least it makes for conversations that don't really die down.
</p>
<p>
Big proponent of Free and Open Source Software.
<br>
Self-hosting Gitea and Nextcloud servers.
<br>
Running Arch Linux (btw) since 2019.
<br>
My first Linux distro was Ubuntu 14.04 in, well.., 2014.
<br>
<p>
Aspiring game dev, doing everything from code,
<br>
through hosting services,
and creating all the 3D models, sprites and soon also sounds.
<br>
Yet to release a single project. ヽ(゚Д゚)ノ
</p>
<p>
Used to, and still do, have a relatively big K-On! oriented Discord server, <br>
like that's anything to brag about, <br>
but it's basically been on maintenance mode for maybe 2 years now. <br>
If you'd still like to join, knock yourself out. <br>
<a href="https://discord.gg/qpsYX58">
<img class="TTClogo" src="/images/TTClatestCircleCrop.png">
<br>
<img class="ShieldsDiscord" alt="Discord" src="https://img.shields.io/discord/625008568369938445?logo=discord">
</a>
<br>
<a href='https://mastodon.online/@sailorzoop'>
<img alt='Mastodon' src='https://img.shields.io/badge/| sailorzoop-darkblue?&logo=mastodon'>
</a>
<a href=''>
<img alt='Discord' src='https://img.shields.io/badge/| @sailorzoop-purple?&logo=discord'>
</a>
<a href='https://matrix.to/#/@sailorzoop:matrix.org'>
<img alt='Matrix' src='https://img.shields.io/badge/| @sailorzoop:matrix.org-darkgreen?&logo=matrix'>
</a>
</p>
</div>
<div id="footer-placeholder"></div>
<script src="/js/loadnavs.js" defer></script>
</body>
</html>

View file

@ -1,8 +0,0 @@
<footer>
<nav class="bottom-nav">
<ul>
<li>© LibreBun™ 2023</li>
</ul>
</nav>
</footer>

View file

@ -1,36 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="/css/styleHF.css" type="text/css" media="all">
</head>
<body>
<header>
<nav class="top-nav">
<ul>
<li>
<div class="image-popup">
<a href="/index.html">
<img src="/images/bunnie48px.png"></a>
<div class="popup-content">
<a class="gt" href="https://librebun.ooguy.com/gt" target="_blank"><img src="/images/gt.png"></a>
<a class="nc" href="https://librebun.ooguy.com/nc" target="_blank"><img src="/images/nc.png"></a>
</div>
</div>
</li>
<li><a href="/html/projects.html">Projects</a></li>
<li><a href="/html/rants.html">Rants</a></li>
<li><a href="/html/about.html">About</a></li>
<li>
<label for="toggle-checkbox" class="toggle-label">
<button class="toggle-button" onclick="toggleHeaderColor()"><img src="/images/moon.svg"</button>
</label>
</li>
</ul>
</nav>
</header>
<script src="/js/loadnavs.js" defer></script>
</body>
</html>

View file

@ -1,24 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" type="image/png" sizes="48x48" href="/images/bunnie48px.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Zoey's Bits - Projects</title>
<link rel="stylesheet" href="/css/style.css" type="text/css" media="all">
</head>
<body>
<div id="header-placeholder"></div>
<div class="centered-content">
<h1 id="title">Welcome to the projects section!</h1>
<h3 id="subtitle">WIP</h3>
</div>
<div id="footer-placeholder"></div>
<script src="/js/loadnavs.js" defer></script>
</body>
</html>

View file

@ -1,22 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" type="image/png" sizes="48x48" href="/images/bunnie48px.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Zoey's Bits - Rants</title>
<script src="https://cdn.jsdelivr.net/npm/showdown/dist/showdown.min.js"></script>
<link rel="stylesheet" href="/css/rants.css" type="text/css" media="all">
</head>
<body>
<div id="article-container"></div>
<div id="article-list"></div>
<div id="header-placeholder"></div>
<div id="footer-placeholder"></div>
<script src="/js/loadnavs.js" defer></script>
<script src="/js/articleload.js" defer></script>
<script src="/js/rants.js" defer></script>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View file

@ -1,57 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="300"
height="300"
viewBox="0 0 79.374998 79.375"
version="1.1"
id="svg1"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
sodipodi:docname="moon.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="2.2022289"
inkscape:cx="128.27913"
inkscape:cy="149.84818"
inkscape:window-width="1916"
inkscape:window-height="1056"
inkscape:window-x="1920"
inkscape:window-y="20"
inkscape:window-maximized="1"
inkscape:current-layer="layer3" />
<defs
id="defs1" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2">
<circle
style="display:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2.11667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="path4"
cx="39.6875"
cy="39.6875"
r="38.629166" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Layer 3">
<path
id="circle1"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2.11667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="M 46.058114,4.3440906 A 39.6875,39.6875 0 0 0 18.710238,53.357241 39.6875,39.6875 0 0 0 36.600488,76.534986 37.765205,46.535679 29.487085 0 1 40.156987,32.694321 37.765205,46.535679 29.487085 0 1 74.832599,7.1323231 39.6875,39.6875 0 0 0 46.058114,4.3440906 Z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View file

@ -1,57 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="300"
height="300"
viewBox="0 0 79.374998 79.375"
version="1.1"
id="svg1"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
sodipodi:docname="sun.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="2.2022289"
inkscape:cx="128.27913"
inkscape:cy="149.84818"
inkscape:window-width="1916"
inkscape:window-height="1056"
inkscape:window-x="1920"
inkscape:window-y="20"
inkscape:window-maximized="1"
inkscape:current-layer="layer3" />
<defs
id="defs1" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2">
<circle
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2.11667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="path4"
cx="39.6875"
cy="39.6875"
r="38.629166" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Layer 3">
<path
id="circle1"
style="display:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2.11667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="M 46.058114,4.3440906 A 39.6875,39.6875 0 0 0 18.710238,53.357241 39.6875,39.6875 0 0 0 36.600488,76.534986 37.765205,46.535679 29.487085 0 1 40.156987,32.694321 37.765205,46.535679 29.487085 0 1 74.832599,7.1323231 39.6875,39.6875 0 0 0 46.058114,4.3440906 Z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 494 KiB

View file

@ -1,27 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" type="image/png" sizes="48x48" href="/images/bunnie48px.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Zoey's Bits</title>
<link rel="stylesheet" href="/css/style.css" type="text/css" media="all">
<script src="/js/loadnavs.js" defer></script>
</head>
<body>
<div id="header-placeholder"></div>
<div class="centered-content">
<h1 id="title">Welcome to my Website!</h1>
<h3 id="subtitle">WIP</h3>
<img src="/images/under_construction.gif" alt="Under Construction">
<h3 id="blahaj">blahaj dance</h3>
</div>
<div id="footer-placeholder"></div>
</body>
</html>

View file

@ -1,23 +0,0 @@
// Function to convert Markdown to HTML
function convertMarkdownToHTML(markdownContent) {
// Simple Markdown to HTML conversion
// This is a basic example and may not cover all Markdown features
// You may need to enhance this function based on your requirements
return markdownContent
.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>') // Bold
.replace(/\*(.*?)\*/g, '<em>$1</em>'); // Italics
}
// Function to fetch and display an article
function displayArticle(articlePath) {
fetch(articlePath)
.then(response => response.text())
.then(markdownContent => {
const htmlContent = convertMarkdownToHTML(markdownContent);
document.getElementById('article-container').innerHTML = htmlContent;
})
.catch(error => console.error('Error fetching article:', error));
}
// Call the function with the path to your Markdown file
displayArticle('/md/rants/test.md');

View file

@ -1,90 +0,0 @@
document.addEventListener('DOMContentLoaded', function () {
console.log('DOMContentLoaded event fired');
// Wait for the DOM to load
// Load header and footer
loadContent('/html/elements/header.html', document.getElementById('header-placeholder'))
.then(() => {
toggleHeaderColor();
// After loading the header content, initialize toggle button and checkbox for header color
const toggleButton = document.querySelector('button.toggle-button');
});
loadContent('/html/elements/footer.html', document.getElementById('footer-placeholder'));
// Load external stylesheets
loadStylesheet('/css/style.css'); // Add more stylesheets if needed
loadStylesheet('/css/styleHF.css');
// Retrieve the header element
const header = document.querySelector('header');
// Check if the header element exists before initializing the toggle button
if (header) {
// Call the function once to set the initial header color based on checkbox state
toggleHeaderColor();
}
});
async function loadContent(url, container) {
try {
const response = await fetch(url);
const html = await response.text();
container.innerHTML = html;
// After loading the content, load any stylesheets within it
const stylesheets = container.querySelectorAll('link[rel="stylesheet"]');
stylesheets.forEach(stylesheet => {
const href = stylesheet.getAttribute('href');
loadStylesheet(href);
});
} catch (error) {
console.error('Error loading content:', error);
}
}
function loadStylesheet(href) {
const link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = href;
document.head.appendChild(link);
}
let isLightMode = true;
function toggleHeaderColor() {
const header = document.querySelector('header');
const togglebutton = document.querySelector('.toggle-button');
const body = document.querySelector('body');
const articlelist = document.querySelector('#article-list');
isLightMode = !isLightMode;
if (!isLightMode) {
header.style.backgroundColor = 'var(--background-color-dark)';
header.style.color = 'var(--color-dark)';
togglebutton.backgroundColor = 'var(--color-button-dark)';
togglebutton.classList.add('dark-mode');
togglebutton.classList.remove('light-mode');
body.style.backgroundColor = 'var(--color-bg-body-dark)';
body.style.color = 'var(--color-bg-body-light)';
articlelist.style.backgroundColor = 'var(--article-bg-dark)';
articlelist.style.color = 'var(--color-dark)';
} else {
header.style.backgroundColor = 'var(--background-color-light)';
header.style.color = 'var(--color-light)';
togglebutton.backgroundColor = 'var(--color-button-light)';
togglebutton.classList.add('light-mode');
togglebutton.classList.remove('dark-mode');
body.style.backgroundColor = 'var(--color-bg-body-light)';
body.style.color = 'var(--color-bg-body-dark)';
articlelist.style.backgroundColor = 'var(--article-bg-light)';
articlelist.style.color = 'var(--color-light)';
}
}

View file

@ -1,79 +0,0 @@
const articles = [
{ title: 'Electron', subtitle: '', path: '/md/rants/electron.md' },
{ title: 'Discord', subtitle: '', path: '/md/rants/discord.md' },
{ title: 'Wayland', subtitle: '', path: '/md/rants/wayland.md' },
];
const showdownConverter = new showdown.Converter();
function createArticleBox(article) {
const articleBox = document.createElement('div');
articleBox.className = 'article-box';
articleBox.setAttribute('data-path', article.path);
const titleElement = document.createElement('h3');
titleElement.textContent = article.title;
const subtitleElement = document.createElement('p');
subtitleElement.textContent = article.subtitle;
subtitleElement.className = 'article-subtitle';
articleBox.appendChild(titleElement);
articleBox.appendChild(subtitleElement);
articleBox.addEventListener('click', () => {
loadArticle(article.path);
updateArticleBoxContent(article.path, article.title, article.subtitle);
});
return articleBox;
}
function createArticleList() {
const articleListContainer = document.getElementById('article-list');
articles.forEach(article => {
const articleBox = createArticleBox(article);
articleListContainer.appendChild(articleBox);
});
}
function loadArticle(articlePath) {
fetch(articlePath)
.then(response => response.text())
.then(markdownContent => {
const { title, subtitle } = extractTitleAndSubtitle(markdownContent);
const htmlContent = showdownConverter.makeHtml(markdownContent);
document.getElementById('article-container').innerHTML = htmlContent;
updateArticleBoxContent(articlePath, title, subtitle);
})
.catch(error => console.error('Error fetching article:', error));
}
function extractTitleAndSubtitle(markdownContent) {
const lines = markdownContent.split('\n');
const title = lines[0] ? lines[0].replace(/^#+\s*/, '').trim() : 'Untitled';
const subtitle = lines[3] ? lines[3].replace(/^#+\s*/, '').trim() : '';
return { title, subtitle };
}
function updateArticleBoxContent(articlePath, title, subtitle) {
const articleBox = document.querySelector(`.article-box[data-path="${articlePath}"]`);
if (articleBox) {
articleBox.innerHTML = '';
const titleElement = document.createElement('h3');
titleElement.textContent = title;
const subtitleElement = document.createElement('p');
subtitleElement.textContent = subtitle;
subtitleElement.className = 'article-subtitle';
articleBox.appendChild(titleElement);
articleBox.appendChild(subtitleElement);
}
}
// Load the functions when the DOM is fully loaded
document.addEventListener('DOMContentLoaded', () => {
createArticleList();
if (articles.length > 0) {
loadArticle(articles[0].path);
}
});

View file

@ -1,43 +0,0 @@
document.addEventListener('DOMContentLoaded', function () {
const title = document.querySelector('#title');
const subtitle = document.querySelector('#subtitle');
const blahaj = document.querySelector('#blahaj');
function handleClick() {
// Move elements up and fade them out
title.animate(
[
{ transform: 'translateY(0)', opacity: 1 },
{ transform: 'translateY(-50px)', opacity: 0 }
],
{ duration: 1000, easing: 'ease-out', fill: 'forwards' }
);
subtitle.animate(
[
{ transform: 'translateY(0)', opacity: 1 },
{ transform: 'translateY(-50px)', opacity: 0 }
],
{ duration: 1000, easing: 'ease-out', fill: 'forwards', delay: 200 }
);
blahaj.animate(
[
{ transform: 'translateY(-50px)', opacity: 0 },
{ transform: 'translateY(-0px)', opacity: 1 }
],
{ duration: 500, easing: 'ease-out', fill: 'forwards', delay: 400 }
);
// Remove the event listener after it has been triggered
document.body.removeEventListener('click', handleClick);
title.addEventListener('animationend', function () {
title.remove();
});
subtitle.addEventListener('animationend', function () {
subtitle.remove();
});
}
});

View file

@ -1,3 +0,0 @@
{
"godotver": "4.2.1"
}

0
keytest Normal file
View file

View file

@ -1,10 +0,0 @@
# Discord
###### 20th December 2023 - Zoey
<br>
### Here's the reason I hate Discord.
<br>
lorem ipsum butts and cakes, you are now my favourite person who bakes
this is still the same paragraph
yeah
<br>
butts

View file

@ -1,6 +0,0 @@
# Electron
###### 21th December 2023 - Zoey
<br>
### Electron is awful and here's why.
<br>
Lorem ipsum motherfuckerssss

View file

@ -1,6 +0,0 @@
# Wayland
######22th December 2023 - Zoey
<br>
### Insane defaults.
<br>
Lorem ipsum motherfuckerssss

View file

@ -1,15 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Not Found</title>
<link href="/style.css" rel="stylesheet" type="text/css" media="all">
</head>
<body>
<div class="centered-content">
<h1>Page Not Found</h1>
<p>There's nobunny here.</p>
</div>
</body>
</html>

18324
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

44
package.json Normal file
View file

@ -0,0 +1,44 @@
{
"name": "zoeysbits",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-player": "^2.16.0",
"react-router-dom": "^6.23.1",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"tailwindcss": "^3.4.1",
"tailwindcss-image-rendering": "^1.0.2"
}
}

12
public/Gitea_Logo.svg Normal file
View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="main_outline" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640;" xml:space="preserve">
<g>
<path id="teabag" style="fill:#FFFFFF" d="M395.9,484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5,21.2-17.9,33.8-11.8 c17.2,8.3,27.1,13,27.1,13l-0.1-109.2l16.7-0.1l0.1,117.1c0,0,57.4,24.2,83.1,40.1c3.7,2.3,10.2,6.8,12.9,14.4 c2.1,6.1,2,13.1-1,19.3l-61,126.9C423.6,484.9,408.4,490.3,395.9,484.2z"/>
<g>
<g>
<path style="fill:#609926" d="M622.7,149.8c-4.1-4.1-9.6-4-9.6-4s-117.2,6.6-177.9,8c-13.3,0.3-26.5,0.6-39.6,0.7c0,39.1,0,78.2,0,117.2 c-5.5-2.6-11.1-5.3-16.6-7.9c0-36.4-0.1-109.2-0.1-109.2c-29,0.4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5 c-9.8-0.6-22.5-2.1-39,1.5c-8.7,1.8-33.5,7.4-53.8,26.9C-4.9,212.4,6.6,276.2,8,285.8c1.7,11.7,6.9,44.2,31.7,72.5 c45.8,56.1,144.4,54.8,144.4,54.8s12.1,28.9,30.6,55.5c25,33.1,50.7,58.9,75.7,62c63,0,188.9-0.1,188.9-0.1s12,0.1,28.3-10.3 c14-8.5,26.5-23.4,26.5-23.4s12.9-13.8,30.9-45.3c5.5-9.7,10.1-19.1,14.1-28c0,0,55.2-117.1,55.2-231.1 C633.2,157.9,624.7,151.8,622.7,149.8z M125.6,353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6,321.8,60,295.4 c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5,38.5-30c13.8-3.7,31-3.1,31-3.1s7.1,59.4,15.7,94.2c7.2,29.2,24.8,77.7,24.8,77.7 S142.5,359.9,125.6,353.9z M425.9,461.5c0,0-6.1,14.5-19.6,15.4c-5.8,0.4-10.3-1.2-10.3-1.2s-0.3-0.1-5.3-2.1l-112.9-55 c0,0-10.9-5.7-12.8-15.6c-2.2-8.1,2.7-18.1,2.7-18.1L322,273c0,0,4.8-9.7,12.2-13c0.6-0.3,2.3-1,4.5-1.5c8.1-2.1,18,2.8,18,2.8 l110.7,53.7c0,0,12.6,5.7,15.3,16.2c1.9,7.4-0.5,14-1.8,17.2C474.6,363.8,425.9,461.5,425.9,461.5z"/>
<path style="fill:#609926" d="M326.8,380.1c-8.2,0.1-15.4,5.8-17.3,13.8c-1.9,8,2,16.3,9.1,20c7.7,4,17.5,1.8,22.7-5.4 c5.1-7.1,4.3-16.9-1.8-23.1l24-49.1c1.5,0.1,3.7,0.2,6.2-0.5c4.1-0.9,7.1-3.6,7.1-3.6c4.2,1.8,8.6,3.8,13.2,6.1 c4.8,2.4,9.3,4.9,13.4,7.3c0.9,0.5,1.8,1.1,2.8,1.9c1.6,1.3,3.4,3.1,4.7,5.5c1.9,5.5-1.9,14.9-1.9,14.9 c-2.3,7.6-18.4,40.6-18.4,40.6c-8.1-0.2-15.3,5-17.7,12.5c-2.6,8.1,1.1,17.3,8.9,21.3c7.8,4,17.4,1.7,22.5-5.3 c5-6.8,4.6-16.3-1.1-22.6c1.9-3.7,3.7-7.4,5.6-11.3c5-10.4,13.5-30.4,13.5-30.4c0.9-1.7,5.7-10.3,2.7-21.3 c-2.5-11.4-12.6-16.7-12.6-16.7c-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3c4.7-9.7,9.4-19.3,14.1-29 c-4.1-2-8.1-4-12.2-6.1c-4.8,9.8-9.7,19.7-14.5,29.5c-6.7-0.1-12.9,3.5-16.1,9.4c-3.4,6.3-2.7,14.1,1.9,19.8 C343.2,346.5,335,363.3,326.8,380.1z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

View file

Before

Width:  |  Height:  |  Size: 703 B

After

Width:  |  Height:  |  Size: 703 B

BIN
public/bunnie96px.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 929 B

5127
public/bunnie96px.svg Normal file

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 295 KiB

BIN
public/firesharelogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 KiB

40
public/forgejologo.svg Normal file
View file

@ -0,0 +1,40 @@
<svg viewBox="0 0 212 212" xmlns="http://www.w3.org/2000/svg">
<metadata
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
>
<rdf:RDF>
<cc:Work rdf:about="https://codeberg.org/forgejo/meta/src/branch/readme/branding#logo">
<dc:title>Forgejo logo</dc:title>
<cc:creator rdf:resource="https://caesarschinas.com/"><cc:attributionName>Caesar Schinas</cc:attributionName></cc:creator>
<cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
</rdf:RDF>
</metadata>
<style type="text/css">
circle {
fill: none;
stroke: #000;
stroke-width: 15;
}
path {
fill: none;
stroke: #000;
stroke-width: 25;
}
.orange {
stroke:#ff6600;
}
.red {
stroke:#d40000;
}
</style>
<g transform="translate(6,6)">
<path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" class="orange" />
<path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" class="red" />
<circle cx="142" cy="20" r="18" class="orange" />
<circle cx="142" cy="88" r="18" class="red" />
<circle cx="58" cy="180" r="18" class="red" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

85
public/graphitelogo.svg Normal file
View file

@ -0,0 +1,85 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1935 6994 c-186 -39 -328 -137 -415 -287 -24 -39 -51 -84 -61 -99
-11 -15 -19 -29 -19 -31 0 -3 -39 -71 -86 -153 -47 -82 -160 -277 -251 -434
-90 -157 -169 -292 -174 -300 -5 -8 -55 -96 -112 -195 -113 -196 -393 -681
-408 -705 -5 -8 -41 -71 -80 -140 -40 -69 -85 -147 -101 -175 -73 -126 -100
-226 -97 -349 3 -109 33 -203 106 -329 69 -117 281 -485 310 -537 11 -19 111
-192 223 -385 111 -192 212 -366 222 -385 11 -19 37 -64 58 -100 21 -36 47
-81 58 -100 11 -19 59 -102 107 -185 48 -82 95 -163 104 -180 9 -16 49 -86 89
-155 40 -69 78 -134 85 -145 77 -134 155 -215 259 -268 145 -74 44 -69 1583
-69 1525 0 1434 -4 1570 63 l62 31 304 -217 c167 -120 360 -259 429 -308 69
-50 148 -106 175 -125 48 -34 130 -93 150 -110 6 -4 21 -16 35 -26 17 -12 19
-16 6 -12 -31 11 -209 55 -246 61 -19 3 -42 8 -50 10 -28 8 -184 26 -285 33
-203 13 -1356 5 -1760 -13 -44 -2 -161 -6 -260 -10 -99 -4 -209 -8 -245 -10
-36 -2 -121 -6 -190 -10 -191 -9 -276 -14 -380 -20 -90 -5 -125 -8 -315 -20
-44 -3 -114 -8 -155 -11 -198 -13 -326 -22 -405 -29 -27 -2 -81 -7 -120 -10
-38 -3 -88 -8 -110 -10 -22 -3 -62 -7 -90 -10 -27 -3 -66 -7 -85 -10 -19 -3
-55 -7 -80 -10 -25 -4 -64 -11 -88 -16 -23 -5 -59 -12 -80 -15 -74 -11 -307
-76 -381 -106 -42 -17 -91 -42 -109 -55 l-33 -25 38 -28 c47 -35 138 -66 218
-75 33 -4 71 -9 85 -11 27 -5 291 -11 860 -19 462 -7 617 -12 1355 -40 66 -3
181 -7 255 -10 74 -3 178 -7 230 -10 52 -3 142 -7 200 -10 232 -12 407 -28
575 -50 17 -2 56 -7 88 -10 32 -4 111 -12 175 -19 104 -12 493 -13 602 -2 19
1 78 6 130 11 52 4 102 9 112 10 9 2 48 7 85 10 37 4 75 8 83 10 8 2 35 7 60
10 84 11 172 25 205 31 11 2 34 7 50 10 141 25 376 82 477 115 204 67 307 135
359 237 20 40 24 61 24 142 0 83 -7 178 -20 301 -3 20 -7 65 -10 100 -3 35 -7
84 -10 109 -2 25 -7 73 -9 108 -12 137 -17 188 -21 212 -2 14 -6 61 -10 105
-5 74 -8 102 -20 225 -7 68 -15 158 -21 225 -3 33 -7 80 -10 105 -2 25 -6 71
-9 102 -2 31 -6 82 -9 112 -3 31 -8 81 -11 111 -3 30 -7 79 -10 108 -3 28 -7
79 -10 112 -3 33 -7 84 -10 113 -3 28 -7 76 -10 105 -2 28 -7 75 -9 102 -3 28
-8 82 -11 120 -3 39 -8 86 -10 105 -2 19 -7 67 -10 105 -3 39 -8 90 -10 115
-3 25 -7 74 -10 110 -3 36 -7 85 -10 110 -5 48 -11 105 -20 210 -3 36 -8 85
-10 110 -3 25 -7 74 -10 110 -5 69 -13 141 -21 202 -7 53 -46 144 -110 255
-32 54 -66 114 -77 133 -10 19 -61 107 -112 195 -51 88 -102 177 -114 199 -12
21 -78 135 -147 255 -68 119 -130 225 -136 236 -6 11 -74 127 -151 259 -76
131 -148 255 -159 275 -33 60 -288 501 -335 579 -23 40 -43 75 -43 78 0 10
-63 88 -100 122 -78 74 -174 125 -275 147 -48 11 -341 13 -1440 13 -759 0
-1389 -2 -1400 -4z m2666 -602 c87 -43 85 -39 309 -427 51 -88 104 -180 118
-205 14 -25 33 -58 43 -75 10 -16 32 -55 49 -85 17 -30 40 -71 51 -90 12 -19
134 -229 271 -467 l249 -432 -33 -37 c-18 -20 -42 -47 -53 -58 -58 -60 -211
-273 -280 -390 -10 -17 -56 -26 -205 -41 -36 -4 -78 -8 -95 -10 -113 -12 -153
-17 -175 -20 -14 -2 -56 -7 -95 -11 -38 -4 -81 -8 -95 -9 -14 -2 -34 -3 -45
-4 -15 -1 -47 -37 -105 -117 -47 -64 -90 -122 -95 -128 -6 -6 -22 -27 -35 -46
-13 -19 -68 -94 -121 -166 l-97 -131 -69 -2 c-145 -3 -301 -21 -457 -52 -94
-19 -99 -19 -112 -2 -7 10 -14 21 -14 25 0 3 -21 42 -46 85 -26 43 -57 96 -70
119 -13 23 -105 182 -205 355 -100 173 -192 332 -204 354 -13 22 -105 182
-205 355 -101 173 -194 335 -208 359 -47 84 -82 146 -92 161 -8 13 -160 278
-185 322 -5 10 -80 138 -165 285 -85 147 -167 288 -181 315 -14 26 -31 54 -38
62 -24 29 65 158 133 193 76 40 73 40 1310 39 l1201 -1 46 -23z m-2956 -912
c43 -74 86 -151 97 -170 11 -19 93 -161 182 -315 239 -412 431 -745 453 -785
11 -19 76 -132 145 -250 69 -118 137 -236 151 -262 15 -26 82 -143 150 -260
68 -117 195 -337 282 -488 87 -151 176 -303 198 -338 42 -66 56 -77 487 -385
74 -53 215 -154 313 -224 l179 -128 -1071 -3 c-1052 -2 -1071 -2 -1123 18 -59
23 -113 68 -144 120 -115 194 -164 279 -164 284 0 3 -15 29 -33 58 -19 29 -47
78 -64 108 -17 30 -54 96 -83 145 -29 50 -61 106 -72 125 -45 78 -322 559
-353 610 -18 30 -103 179 -190 330 -87 151 -170 295 -185 320 -48 81 -58 177
-26 253 13 32 221 398 353 622 7 11 38 65 70 120 32 55 64 112 73 126 8 14 47
81 85 148 39 67 75 130 80 139 6 9 37 63 69 120 32 56 60 101 61 100 1 -2 37
-64 80 -138z m4304 -1486 c1 -32 4 -61 6 -64 2 -3 7 -48 10 -100 3 -52 8 -97
10 -100 2 -3 6 -45 10 -95 4 -49 8 -101 10 -115 4 -26 8 -67 25 -240 17 -173
21 -214 25 -240 2 -14 6 -65 10 -115 3 -49 8 -97 10 -105 2 -8 7 -51 10 -94 4
-43 8 -86 10 -95 1 -9 6 -54 10 -101 4 -47 8 -98 10 -115 2 -16 7 -64 11 -105
3 -41 7 -82 9 -90 2 -8 6 -53 10 -100 4 -47 9 -88 11 -92 2 -3 2 -12 -1 -20
-4 -10 -20 -13 -53 -12 -71 4 -179 -22 -259 -61 -79 -39 -189 -139 -223 -203
-37 -71 -28 -72 -155 19 -64 46 -126 91 -138 99 -12 8 -83 59 -157 112 -74 53
-174 125 -223 160 -190 137 -212 153 -215 160 -2 5 -7 8 -12 8 -7 0 -188 126
-300 210 -14 10 -106 76 -205 147 -290 208 -315 226 -312 229 7 7 227 42 312
49 39 4 110 8 159 9 80 3 91 6 107 27 10 13 65 87 121 164 56 77 106 145 110
150 5 6 49 64 97 131 49 66 95 121 102 121 24 0 167 14 186 17 10 2 50 7 88
11 39 3 84 8 100 10 17 3 50 7 75 9 25 2 93 10 151 17 l106 12 38 64 c65 110
281 394 296 387 3 -2 7 -29 8 -60z"/>
<path d="M1314 4324 c-43 -14 -93 -67 -96 -99 -5 -66 5 -92 78 -218 78 -134
88 -152 153 -265 20 -35 41 -71 46 -80 13 -21 67 -116 93 -162 11 -19 83 -145
161 -278 77 -134 141 -248 141 -253 0 -5 5 -9 10 -9 6 0 10 -4 10 -10 0 -5 27
-55 60 -111 33 -55 60 -102 60 -104 0 -2 27 -49 60 -104 33 -56 60 -104 60
-107 0 -2 8 -17 18 -32 11 -15 40 -63 67 -108 50 -85 77 -108 136 -118 49 -7
116 28 141 74 37 68 11 140 -142 390 -28 47 -807 1395 -842 1460 -43 78 -66
108 -91 122 -40 21 -84 26 -123 12z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

25
public/index.html Normal file
View file

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/bunnie48px.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta content="#763568" data-react-helmet="true" name="theme-color" />
<meta content="Zoey's Bits" property="og:title" />
<meta content="Somebunny's place." property="og:description" />
<meta content="https://bits.li-yo.ts.net/" property="og:url" />
<meta content="https://bits.li-yo.ts.net/bunnie96px.png" property="og:image" />
<meta
name="description"
content="Somebunny's place."
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/bunnie48px.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<title>Zoey's Bits</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>

24
public/jellyfinlogo.svg Normal file
View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- ***** BEGIN LICENSE BLOCK *****
- Part of the Jellyfin project (https://jellyfin.media)
-
- All copyright belongs to the Jellyfin contributors; a full list can
- be found in the file CONTRIBUTORS.md
-
- This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.
- To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/.
- ***** END LICENSE BLOCK ***** -->
<svg version="1.1" id="icon-transparent" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512">
<defs>
<linearGradient id="linear-gradient" gradientUnits="userSpaceOnUse" x1="110.25" y1="213.3" x2="496.14" y2="436.09">
<stop offset="0" style="stop-color:#AA5CC3"/>
<stop offset="1" style="stop-color:#00A4DC"/>
</linearGradient>
</defs>
<title>icon-transparent</title>
<g id="icon-transparent">
<path id="inner-shape" d="M256,201.6c-20.4,0-86.2,119.3-76.2,139.4s142.5,19.9,152.4,0S276.5,201.6,256,201.6z" fill="url(#linear-gradient)"/>
<path id="outer-shape" d="M256,23.3c-61.6,0-259.8,359.4-229.6,420.1s429.3,60,459.2,0S317.6,23.3,256,23.3z
M406.5,390.8c-19.6,39.3-281.1,39.8-300.9,0s110.1-275.3,150.4-275.3S426.1,351.4,406.5,390.8z" fill="url(#linear-gradient)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

75
public/lemmylogo.svg Normal file
View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="62.920513mm"
height="41.44083mm"
viewBox="0 0 951.2393 626.50705"
version="1.1"
id="svg8"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
inkscape:export-xdpi="300"
inkscape:export-ydpi="300"
enable-background="new">
<defs
id="defs2" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-36.380379,-256.78621)"
style="display:inline">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 167.03908,270.78735 c -0.94784,-0.002 -1.8939,0.004 -2.83789,0.0215 -4.31538,0.0778 -8.58934,0.3593 -12.8125,0.8457 -33.78522,3.89116 -64.215716,21.86394 -82.871086,53.27344 -18.27982,30.77718 -22.77749,64.66635 -13.46094,96.06837 9.31655,31.40203 31.88488,59.93174 65.296886,82.5332 0.20163,0.13618 0.40678,0.26709 0.61523,0.39258 28.65434,17.27768 57.18167,28.93179 87.74218,34.95508 -0.74566,12.61339 -0.72532,25.5717 0.082,38.84375 2.43989,40.10943 16.60718,77.03742 38.0957,109.67187 l -77.00781,31.4375 c -8.30605,3.25932 -12.34178,12.68234 -8.96967,20.94324 3.37211,8.2609 12.84919,12.16798 21.06342,8.68371 l 84.69727,-34.57617 c 15.70675,18.72702 33.75346,35.68305 53.12109,50.57032 0.74013,0.56891 1.4904,1.12236 2.23437,1.68554 l -49.61132,65.69141 c -5.45446,7.0474 -4.10058,17.19288 3.01098,22.5634 7.11156,5.37052 17.24028,3.89649 22.52612,-3.27824 l 50.38672,-66.71876 c 27.68572,17.53469 57.07524,31.20388 86.07227,40.25196 14.88153,27.28008 43.96965,44.64648 77.58789,44.64648 33.93762,0 63.04252,-18.68693 77.80082,-45.4375 28.7072,-9.21295 57.7527,-22.93196 85.1484,-40.40234 l 51.0977,67.66016 c 5.2858,7.17473 15.4145,8.64876 22.5261,3.27824 7.1115,-5.37052 8.4654,-15.516 3.011,-22.5634 l -50.3614,-66.68555 c 0.334,-0.25394 0.6727,-0.50077 1.0059,-0.75586 19.1376,-14.64919 37.0259,-31.28581 52.7031,-49.63476 l 82.5625,33.70507 c 8.2143,3.48427 17.6913,-0.42281 21.0634,-8.68371 3.3722,-8.2609 -0.6636,-17.68392 -8.9696,-20.94324 l -74.5391,-30.42773 c 22.1722,-32.82971 37.0383,-70.03397 40.1426,-110.46094 1.0253,-13.35251 1.2292,-26.42535 0.6387,-39.17578 30.3557,-6.05408 58.7164,-17.66833 87.2011,-34.84375 0.2085,-0.12549 0.4136,-0.2564 0.6153,-0.39258 33.412,-22.60147 55.9803,-51.13117 65.2968,-82.5332 9.3166,-31.40202 4.8189,-65.29118 -13.4609,-96.06837 -18.6553,-31.40951 -49.0859,-49.38228 -82.8711,-53.27344 -4.2231,-0.4864 -8.4971,-0.76791 -12.8125,-0.8457 -30.2077,-0.54448 -62.4407,8.82427 -93.4316,26.71484 -22.7976,13.16063 -43.3521,33.31423 -59.4375,55.30469 -44.9968,-25.75094 -103.5444,-40.25065 -175.4785,-41.43945 -6.4522,-0.10663 -13.0125,-0.10696 -19.67974,0.002 -80.18875,1.30929 -144.38284,16.5086 -192.87109,43.9922 -0.11914,-0.19111 -0.24287,-0.37932 -0.37109,-0.56446 -16.29,-22.764 -37.41085,-43.73706 -60.89649,-57.29493 -30.02247,-17.33149 -61.21051,-26.66489 -90.59375,-26.73633 z"
id="path817-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccssccccccscccccscccscccscccccsccscccssccscscccscc"
inkscape:label="white-border"
sodipodi:insensitive="true" />
<path
id="path1087"
style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 716.85595,362.96478 c 15.29075,-21.36763 35.36198,-41.10921 56.50979,-53.31749 66.66377,-38.48393 137.02617,-33.22172 170.08018,22.43043 33.09493,55.72093 14.98656,117.48866 -47.64399,159.85496 -31.95554,19.26819 -62.93318,30.92309 -97.22892,35.54473 M 307.14407,362.96478 C 291.85332,341.59715 271.78209,321.85557 250.63429,309.64729 183.97051,271.16336 113.60811,276.42557 80.554051,332.07772 47.459131,387.79865 65.56752,449.56638 128.19809,491.93268 c 31.95554,19.26819 62.93319,30.92309 97.22893,35.54473"
inkscape:connector-curvature="0"
inkscape:label="ears"
sodipodi:insensitive="true" />
<path
style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 801.23205,576.8699 C 812.73478,427.06971 720.58431,321.98291 511.99999,325.38859 303.41568,328.79426 213.71393,428.0311 222.76794,576.8699 c 8.64289,142.08048 176.80223,246.40388 288.12038,246.40388 111.31815,0 279.45076,-104.5447 290.34373,-246.40388 z"
id="path969"
inkscape:connector-curvature="0"
sodipodi:nodetypes="szszs"
inkscape:label="head"
sodipodi:insensitive="true" />
<path
id="path1084"
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 610.4991,644.28932 c 0,23.11198 18.70595,41.84795 41.78091,41.84795 23.07495,0 41.7809,-18.73597 41.7809,-41.84795 0,-23.112 -18.70594,-41.84796 -41.7809,-41.84796 -23.07496,0 -41.78091,18.73596 -41.78091,41.84796 z m -280.56002,0 c 0,23.32492 18.87829,42.23352 42.16586,42.23352 23.28755,0 42.16585,-18.9086 42.16585,-42.23352 0,-23.32494 -18.87829,-42.23353 -42.16585,-42.23353 -23.28757,0 -42.16586,18.90859 -42.16586,42.23353 z"
inkscape:connector-curvature="0"
inkscape:label="eyes"
sodipodi:nodetypes="ssssssssss"
sodipodi:insensitive="true" />
<path
id="path1008"
style="display:inline;opacity:1;fill:none;stroke:#000000;stroke-width:32;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 339.72919,769.2467 -54.54422,72.22481 m 399.08582,-72.22481 54.54423,72.22481 M 263.68341,697.82002 175.92752,733.64353 m 579.85765,-35.82351 87.7559,35.82351"
inkscape:connector-curvature="0"
inkscape:label="whiskers"
sodipodi:nodetypes="cccccccc"
sodipodi:insensitive="true" />
<path
style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 512.00082,713.08977 c -45.86417,0 -75.13006,31.84485 -74.14159,71.10084 1.07048,42.51275 32.46865,71.10323 74.14159,71.10323 41.67296,0 74.05118,-32.99608 74.14161,-71.10323 0.0932,-39.26839 -28.27742,-71.10084 -74.14161,-71.10084 z"
id="path1115"
inkscape:connector-curvature="0"
inkscape:label="nose"
sodipodi:nodetypes="zszsz"
sodipodi:insensitive="true" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8 KiB

15
public/manifest.json Normal file
View file

@ -0,0 +1,15 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "bunnie48px.png",
"type": "image/png",
"sizes": "48x48"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

BIN
public/memoslogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

BIN
public/ollamalogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
public/owncastlogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

BIN
public/photonlogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

3
public/robots.txt Normal file
View file

@ -0,0 +1,3 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:

1
public/sendlogo.svg Normal file
View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="64mm" height="64mm" viewBox="0 0 64 64" version="1.1" id="svg898"><defs id="defs892"/><metadata id="metadata895"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><g id="layer1"><path id="cloud-upload" d="m 63.999948,34.285731 a 17.033293,17.033293 0 0 1 -4.406235,11.428568 14.856655,14.856655 0 0 1 -10.55805,4.571428 h -2.178561 v -6.857139 h 2.178561 A 8.0044292,8.0044292 0 0 0 54.504416,41.118327 10.183788,10.183788 0 0 0 57.14281,34.285731 11.442004,11.442004 0 0 0 45.714251,22.857173 c -0.37683,0 -2.312648,0.241803 -3.490288,0.393502 A 1.1359993,1.1359993 0 0 1 41.00286,22.487082 L 40.537483,21.129528 A 14.102711,14.102711 0 0 0 28.821257,11.497829 13.665957,13.665957 0 0 0 14.091416,28.276812 l 0.488099,2.087681 a 1.1428564,1.1428564 0 0 1 -0.782255,1.354176 l -2.053987,0.62062 a 6.7940986,6.7940986 0 0 0 -4.8860757,6.517846 4.6043628,4.6043628 0 0 0 0.9464197,2.808045 5.5388308,5.5388308 0 0 0 4.089282,1.763384 h 5.250006 v 6.857137 H 11.892899 A 12.235604,12.235604 0 0 1 2.2121047,45.633903 11.506439,11.506439 0 0 1 5.8514086e-5,38.857135 13.5727,13.5727 0 0 1 6.9442617,26.97321 C 6.8863778,26.359414 6.8571876,25.747771 6.8571876,25.142857 A 20.563484,20.563484 0 0 1 45.843766,16.000009 18.306983,18.306983 0 0 1 64,34.285707 Z M 32.923239,32.122512 a 1.1428564,1.1428564 0 0 0 -1.846543,0 l -8.591651,11.775239 a 1.1428564,1.1428564 0 0 0 0.923268,1.816548 h 5.163091 v 12.571418 a 1.1428564,1.1428564 0 0 0 1.14285,1.142858 h 4.571428 a 1.1428564,1.1428564 0 0 0 1.142859,-1.142858 V 45.714299 h 5.163084 a 1.1428564,1.1428564 0 0 0 0.923265,-1.816548 z" stroke-width="2.28572" fill="#45a1ff" fill-opacity="1"/></g></svg>

After

Width:  |  Height:  |  Size: 2 KiB

25
public/teardropdark.svg Normal file
View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="454.27927"
height="129.77107"
viewBox="0 0 120.19472 34.335263"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<g
id="layer1">
<path
id="rect1"
style="display:none;fill:#ffffff;stroke-width:2.11667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0"
d="M -19.736644,-31.973684 H 297.23702 c 0,0 0,0 0,0 V -6.6239681e-7 c 0,3.6696783e-7 0,6.6239681e-7 0,6.6239681e-7 H -19.736644 c 0,0 -1e-6,-2.9542898e-7 -1e-6,-6.6239681e-7 V -31.973684 Z" />
<path
id="path3"
style="display:inline;fill:#111111;fill-opacity:1;stroke:none;stroke-width:2.11667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0"
d="m 0,0 v 33.88608 c 0,0 41.608442,4.922788 64.420873,-17.825377 C 80.526949,0 97.528814,1.2317739 120.19472,0 v 0 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

25
public/teardroplight.svg Normal file
View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="454.27927"
height="129.77107"
viewBox="0 0 120.19472 34.335263"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<g
id="layer1">
<path
id="rect1"
style="display:none;fill:#ffffff;stroke-width:2.11667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0"
d="M -19.736644,-31.973684 H 297.23702 c 0,0 0,0 0,0 V -6.6239681e-7 c 0,3.6696783e-7 0,6.6239681e-7 0,6.6239681e-7 H -19.736644 c 0,0 -1e-6,-2.9542898e-7 -1e-6,-6.6239681e-7 V -31.973684 Z" />
<path
id="path3"
style="display:inline;fill:#ffffff;stroke:none;stroke-width:2.11667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0"
d="m 0,0 v 33.88608 c 0,0 41.608442,4.922788 64.420873,-17.825377 C 80.526949,0 97.528814,1.2317739 120.19472,0 v 0 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

219
src/App.css Normal file
View file

@ -0,0 +1,219 @@
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
@media (prefers-reduced-motion: no-preference) {
.DarkModeButton {
animation: DarkModeButton-spin 2.5s ease-in-out infinite alternate;
}
}
.WelcomeText {
animation: Welcome-spin 10s infinite ease-in-out alternate;
}
.HeaderName {
font-size: x-large;
user-select: none;
}
.HeaderButt {
font-size: larger;
user-select: none;
}
.HeaderButt:hover {
transform:scale(1.1);
animation: LogoHoverAnime 0.1s ease-in-out;
text-shadow: black;
}
.Logos {
width: 60px;
height: 60px;
user-select: none;
pointer-events: none;
}
.PubP {
font-size: larger;
user-select: none;
pointer-events: none;
}
.LogoBoxesPub {
height: 75px;
display: flex;
justify-content: center;
align-items: left;
margin-top: 10px;
}
.LogoBoxesPub {
transition: transform 0.25s ease;
}
.LogoBoxesPub:hover {
transform: scale(1.1) /*rotate(360deg)*/;
animation: LogoHoverAnim 0.1s ease-in-out;
}
.TextButt {
user-select: none;
object-position: center;
}
.BunnyLogo {
user-select: none;
cursor: pointer;
}
.BunnyLogo:hover {
transform:scale(0.56);
animation: LogoHoverAnime 0.1s ease-in-out;
}
.Teardrop {
user-select: none;
pointer-events: none;
object-position: center;
}
.ForgejoLogo,
.JellyfinLogo,
.GraphiteLogo {
height: 76px;
width: 76px;
user-select: none;
pointer-events: none;
object-position: center;
}
.UpdatesTitle {
font-size: x-large;
}
.UpdatesContent {
font-size: large;
}
.TailP {
color: #111111;
user-select: none;
pointer-events: none;
object-position: center;
}
.SubHeaders {
user-select: none;
pointer-events: none;
}
.LogoBoxesTail {
width: 100px;
height: 100px;
display: flex;
justify-content: center;
align-items: center;
}
.LogoBoxesTail {
transition: transform 0.25s ease;
}
.LogoBoxesTail:hover {
transform: scale(1.1) rotate(360deg);
animation: LogoHoverSpinAnim 1s ease-in-out;
}
.VersionBox {
display: flex;
justify-content: center;
overflow: hidden;
}
.Versions {
overflow:hidden;
border-right: .15em solid orange;
margin-right: auto;
text-wrap: auto;
animation: typing 1s steps(75, end),
blink-caret 1s step-end infinite;
}
@keyframes typing {
from {
width: 0;}
to {
width: 100%;
}
}
@keyframes blink-caret {
from, to {
border-color: transparent
}
50% {
border-color: orange;
}
}
.MainBG {
background: linear-gradient(
to right,
#69233b,
#61182a,
#520a22,
#312436
);
background-size: 600% 600%;
animation: Gradient 120s ease infinite;
}
@keyframes Gradient {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
@keyframes DarkModeButton-spin {
from {
transform: rotate(-10deg);
}
to {
transform: rotate(10deg);
}
}
@keyframes LogoHoverAnim {
from {
/*transform: rotate(0deg) scale(1);*/
transform: scale(1);
}
to {
/*transform: rotate(360deg) scale(1.1);*/
transform: scale(1.1);
}
}
@keyframes LogoHoverSpinAnim {
from {
transform: rotate(0deg) scale(1);
}
to {
transform: rotate(360deg) scale(1.1);
}
}
@keyframes Welcome-spin {
from {
transform: rotate(-2deg);
}
to {
transform: rotate(2deg);
}
}

17
src/App.js Normal file
View file

@ -0,0 +1,17 @@
import React, { Component } from 'react';
import './App.css';
import StreamEmbed from './components/Embed';
import Home from './components/Home';
function App() {
return (
<div className="body">
<Home/>
</div>
);
}
export default App;

8
src/App.test.js Normal file
View file

@ -0,0 +1,8 @@
import { render, screen } from '@testing-library/react';
import App from './App';
test('renders learn react link', () => {
render(<App />);
const linkElement = screen.getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});

3
src/Moon.svg Normal file
View file

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<path d="M50 0 A50 50 0 0 0 50 100 Z" fill="yellow" stroke="black"/>
</svg>

After

Width:  |  Height:  |  Size: 140 B

21
src/bunny.svg Normal file
View file

@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200">
<!-- Bunny body -->
<ellipse cx="100" cy="150" rx="80" ry="100" fill="#f5c7a1"/>
<!-- Bunny head -->
<circle cx="100" cy="70" r="50" fill="#f5c7a1"/>
<!-- Bunny eyes -->
<circle cx="80" cy="60" r="5" fill="#000"/>
<circle cx="120" cy="60" r="5" fill="#000"/>
<!-- Bunny nose -->
<polygon points="100,70 95,80 105,80" fill="#000"/>
<!-- Bunny ears -->
<polygon points="50,30 80,10 90,30" fill="#f5c7a1"/>
<polygon points="110,30 140,10 150,30" fill="#f5c7a1"/>
<!-- Bunny mouth -->
<path d="M 90 80 Q 100 90 110 80" fill="transparent" stroke="#000" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 742 B

12
src/components/About.js Normal file
View file

@ -0,0 +1,12 @@
import BottomBar from "./BottomBar";
import TopBar from "./TopBar";
const AboutPage = () => {
return(
<div className="flex justify-center items-center w-screen h-screen text-xl text-secondary MainBG">
<h1>WIP butt</h1>
</div>
);
}
export default AboutPage;

12
src/components/Blog.js Normal file
View file

@ -0,0 +1,12 @@
import BottomBar from "./BottomBar";
import TopBar from "./TopBar";
const BlogPage = () => {
return(
<div className="flex justify-center items-center w-screen h-screen text-xl text-secondary MainBG">
<h1>WIP blogpage</h1>
</div>
);
}
export default BlogPage;

View file

@ -0,0 +1,11 @@
const BottomBar = () => {
return (
<div className="fixed bottom-0 left-0 h-8 w-screen flex flex-row backdrop-brightness-50 text-secondary justify-center items-center">
<div className="fixed flex justify-center">
<p className="text-sm">&copy; LibreBun 2024</p>
</div>
</div>
);
};
export default BottomBar;

51
src/components/Embed.js Normal file
View file

@ -0,0 +1,51 @@
import React, { useState, useEffect } from 'react';
const StreamEmbed = () => {
const [isLive, setIsLive] = useState(false);
const checkStream = async () => {
const owncastURL = "https://cast.li-yo.ts.net";
const statusAPI = `${owncastURL}/api/status`;
try {
const response = await fetch(statusAPI);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
// Check if the stream is live
setIsLive(data.online);
} catch (error) {
console.error("Error checking stream status:", error);
}
};
useEffect(() => {
// Check the stream status when the component mounts
checkStream();
// Optionally, you can set an interval to check the stream status periodically
const intervalId = setInterval(checkStream, 60000); // Check every 60 seconds
// Cleanup interval on component unmount
return () => clearInterval(intervalId);
}, []);
return (
<>
{ (
<div className="fixed overflow-hidden bottom-0 right-0 mb-20 mr-16 rounded-md">
<iframe
className="overflow-hidden"
src="https://cast.li-yo.ts.net/embed/video?initiallyMuted=true"
title="Zoey's Emporium"
height="280"
width="384"
referrerPolicy="origin"
allowFullScreen
></iframe>
</div>
)}
</>
);
};
export default StreamEmbed;

View file

@ -0,0 +1,10 @@
import React from 'react';
function FilePage() {
return (
<div>
<h1>File Page</h1>
<p>This is the content of the new page.</p>
</div>
);
}

62
src/components/Home.js Normal file
View file

@ -0,0 +1,62 @@
import { useEffect, useState } from 'react';
function Home() {
const [Versions, setVersions] = useState('');
useEffect(() => {
const fetchFiles = async () => {
try {
const Response = await fetch('versions.txt');
const Text = await Response.text();
setVersions(Text);
} catch (error) {
console.error('Error fetching file:', error);
}
};
fetchFiles();
}, []);
return (
<div className='flex flex-col justify-center items-center w-screen h-screen overflow-hidden MainBG'>
<div className='flex flex-col items-center'>
<p className='text-4xl mb-2 text-secondary'>Welcome to Zoey's Bits!</p>
<p className='text-xl mb-8 text-secondary'>The home of all my bits and pieces.</p>
</div>
<div className='flex'>
<div className='flex flex-col w-fit h-fit text-secondary rounded-md items-center'>
<p className='text-xl'>Feel free to use my public services.</p>
<div className='grid grid-cols-3 grid-rows-2 gap-4 mx-2 my-2'>
<a href='https://git.li-yo.ts.net/' target='_blank' rel='noopener noreferrer' className='backdrop-brightness-75 shadow-md rounded-md p-1 flex LogoBoxesPub'>
<img className='Logos' draggable='false' src={process.env.PUBLIC_URL + '/forgejologo.svg'} alt='Memos' />
<p className='self-center mx-2 PubP'>Forgejo</p>
</a>
<a href='https://lemmy.li-yo.ts.net/' target='_blank' rel='noopener noreferrer' className='backdrop-brightness-75 shadow-md rounded-md p-1 flex LogoBoxesPub'>
<img className='Logos' draggable='false' src={process.env.PUBLIC_URL + '/lemmylogo.svg'} alt='Lemmy' />
<p className='self-center mx-2 PubP'>Lemmy</p>
</a>
<a href='https://clips.li-yo.ts.net/' target='_blank' rel='noopener noreferrer' className='backdrop-brightness-75 shadow-md rounded-md p-1 flex LogoBoxesPub'>
<img className='Logos' draggable='false' src={process.env.PUBLIC_URL + '/firesharelogo.png'} alt='Fireshare' />
<p className='self-center mx-2 PubP'>Fireshare</p>
</a>
<a href='https://memos.li-yo.ts.net/' target='_blank' rel='noopener noreferrer' className='backdrop-brightness-75 shadow-md rounded-md p-1 flex LogoBoxesPub'>
<img className='Logos' draggable='false' src={process.env.PUBLIC_URL + '/memoslogo.png'} alt='Memos' />
<p className='self-center mx-2 PubP'>Memos</p>
</a>
<a href='https://send.li-yo.ts.net/' target='_blank' rel='noopener noreferrer' className='backdrop-brightness-75 shadow-md rounded-md p-1 flex LogoBoxesPub'>
<img className='Logos' draggable='false' src={process.env.PUBLIC_URL + '/sendlogo.svg'} alt='Send' />
<p className='self-center mx-2 PubP'>Send</p>
</a>
<a href='https://cast.li-yo.ts.net/' target='_blank' rel='noopener noreferrer' className='backdrop-brightness-75 shadow-md rounded-md p-1 flex LogoBoxesPub'>
<img className='Logos' draggable='false' src={process.env.PUBLIC_URL + '/owncastlogo.png'} alt='Owncast' />
<p className='self-center mx-2 PubP'>Owncast</p>
</a>
</div>
</div>
</div>
</div>
);
}
export default Home;

View file

@ -0,0 +1,12 @@
import BottomBar from "./BottomBar";
import TopBar from "./TopBar";
const ProjectsPage = () => {
return(
<div className="flex justify-center items-center w-screen h-screen text-xl text-secondary MainBG">
<h1>WIP projectspage</h1>
</div>
);
}
export default ProjectsPage;

12
src/components/RTMP.js Normal file
View file

@ -0,0 +1,12 @@
import React from 'react'
import ReactPlayer from 'react-player'
// Lazy load the YouTube player
function RTMP() {
return (
<ReactPlayer url='rtmp://192.168.0.12:4036/live/umodaxcx!7cvuS!XrsHX&lh3PtqtVs' />
)
}
export default RTMP;

12
src/components/SideBar.js Normal file
View file

@ -0,0 +1,12 @@
const SideBar = () => {
return (
<div className="fixed left-0 h-screen flex-shrink-0 w-24 flex flex-col bg-sidebar text-secondary shadow-sm justify-center items-center">
<div className="fixed flex flex-shrink-0">
<p className="text-sm">butts</p>
<p className="text-sm">butts2</p>
</div>
</div>
);
};
export default SideBar;

27
src/components/Stream.js Normal file
View file

@ -0,0 +1,27 @@
import BottomBar from "./BottomBar";
import TopBar from "./TopBar";
const StreamPage = () => {
return(
<div className="flex flex-col items-center justify-center w-screen h-screen text-xl text-secondary MainBG">
<div className="flex flex-row items-center justify-center w-screen h-5/6 mt-8 text-xl text-secondary">
<iframe
className="mt-5 overflow-hidden justify-left flex"
src="https://cast.li-yo.ts.net/embed/video"
title="Owncast"
height="100%" width="60%"
referrerpolicy="origin"
allowfullscreen>
</iframe>
<iframe
className="ml-5 mt-5 overflow-scroll"
src="https://cast.li-yo.ts.net/embed/chat/readwrite/"
height="100%" width="30%">
</iframe>
</div>
<a href="https://cast.li-yo.ts.net/" className="my-5">Join me on my actual Owncast site!</a>
</div>
);
}
export default StreamPage;

27
src/components/TopBar.js Normal file
View file

@ -0,0 +1,27 @@
import React from "react";
import { useNavigate } from "react-router-dom";
const TopBar = () => {
const navigate = useNavigate();
return (
<div className="fixed top-0 left-0 h-16 w-screen flex flex-row backdrop-brightness-75 text-secondary items-center">
<div className="topbar-clickables">
<div className="flex flex-row">
<div className="scale-50 BunnyLogo">
<div className="">
<img onClick={() => navigate("/")} draggable="false" src={process.env.PUBLIC_URL + "/bunnie96px.svg"} alt="Bunnie"/>
</div>
</div>
<div className="flex space-x-3">
<button className="HeaderButt" onClick={() => navigate("/blog")}>Blog</button>
<button className="HeaderButt" onClick={() => navigate("/projects")}>Projects</button>
<button className="HeaderButt" onClick={() => navigate("/stream")}>Stream</button>
<button className="HeaderButt" onClick={() => navigate("/about")}>About</button>
</div>
</div>
</div>
</div>
);
};
export default TopBar;

26
src/index.css Normal file
View file

@ -0,0 +1,26 @@
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
@import url(https://fonts.googleapis.com/css2?family=Sarabun);
@layer components {
.TopButton {
@apply hover:text-texthover cursor-pointer transition-colors duration-300;
}
.DarkModeButton {
@apply cursor-pointer text-secondary bg-violet-950
border-4 border-violet-950 rounded-md;
}
}
body {
margin: 0;
font-family: 'Sarabun', sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
monospace;
}

74
src/index.js Normal file
View file

@ -0,0 +1,74 @@
import React, { StrictMode } from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import {createBrowserRouter,RouterProvider} from "react-router-dom";
import AboutPage from './components/About';
import StreamPage from './components/Stream';
import ProjectsPage from './components/Projects';
import BlogPage from './components/Blog';
import TopBar from './components/TopBar';
import BottomBar from './components/BottomBar';
const router = createBrowserRouter([
{
path: "/",
element: (
<>
<TopBar/>
<App/>
<BottomBar/>
</>
),
},
{
path: "/about",
element: (
<>
<AboutPage/>
<TopBar/>
<BottomBar/>
</>
),
},
{
path: "/stream",
element: (
<>
<StreamPage/>
<TopBar/>
<BottomBar/>
</>
),
},
{
path: "/projects",
element: (
<>
<ProjectsPage/>
<TopBar/>
<BottomBar/>
</>
),
},
{
path: "/blog",
element: (
<>
<BlogPage/>
<TopBar/>
<BottomBar/>
</>
),
}
]);
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<StrictMode>
<RouterProvider router={router} />
</StrictMode>
);
reportWebVitals();

13
src/reportWebVitals.js Normal file
View file

@ -0,0 +1,13 @@
const reportWebVitals = onPerfEntry => {
if (onPerfEntry && onPerfEntry instanceof Function) {
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
getCLS(onPerfEntry);
getFID(onPerfEntry);
getFCP(onPerfEntry);
getLCP(onPerfEntry);
getTTFB(onPerfEntry);
});
}
};
export default reportWebVitals;

5
src/setupTests.js Normal file
View file

@ -0,0 +1,5 @@
// jest-dom adds custom jest matchers for asserting on DOM nodes.
// allows you to do things like:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom';

19
tailwind.config.js Normal file
View file

@ -0,0 +1,19 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
mode: 'jit',
content: ["./src/**/*.{html,js}"],
darkMode: false,
theme: {
extend: {
colors: {
primary: "#111111",
secondary: "#f9b6c1",
sidebar: "#161616",
texthover: "#eae8f0",
},
},
},
plugins: [
require('tailwindcss-image-rendering'),
],
}