diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..57fe598 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,19 @@ +{ + "files.exclude": { + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "**/Thumbs.db": true, + "**/.classpath": true, + "**/.factorypath": true, + "**/.project": true, + "**/.settings": true, + "**/.vscode": true, + "**/dist-electron": true, + "**/node_modules": true, + "**/target": true + }, + "hide-files.files": [] +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ae46d4d --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2023-2024, Bamboooz +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the bamboooz.github.io authors nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index daf51f6..439b679 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ -# my website :D ->The font used in this website is [AlphaCentauri](https://joannavu.gumroad.com/l/iHUgj)
->Star animation taken from [here](https://codesandbox.io/p/sandbox/css-shooting-stars-animation-w96ut) \ No newline at end of file +# bamboooz.github.io + +My cool website. + +> The font used in this website is [AlphaCentauri](https://joannavu.gumroad.com/l/iHUgj)
+> Star animation taken from [here](https://codesandbox.io/p/sandbox/css-shooting-stars-animation-w96ut) diff --git a/package-lock.json b/package-lock.json index ac62b72..20ad11a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,12 +18,15 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", + "react-router-dom": "^6.22.1", "react-scripts": "5.0.1", + "tailwindcss-animation-delay": "^1.2.0", "typescript": "^4.9.5", "web-vitals": "^2.1.4" }, "devDependencies": { - "gh-pages": "^6.1.1" + "gh-pages": "^6.1.1", + "tailwindcss": "^3.4.1" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -3342,6 +3345,14 @@ } } }, + "node_modules/@remix-run/router": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.1.tgz", + "integrity": "sha512-zcU0gM3z+3iqj8UX45AmWY810l3oUmXM7uH4dt5xtzvMhRtYVhKGOmgOd1877dOPPepfCjUv57w+syamWIYe7w==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -14821,6 +14832,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.22.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.1.tgz", + "integrity": "sha512-0pdoRGwLtemnJqn1K0XHUbnKiX0S4X8CgvVVmHGOWmofESj31msHo/1YiqcJWK7Wxfq2a4uvvtS01KAQyWK/CQ==", + "dependencies": { + "@remix-run/router": "1.15.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.22.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.1.tgz", + "integrity": "sha512-iwMyyyrbL7zkKY7MRjOVRy+TMnS/OPusaFVxM2P11x9dzSzGmLsebkCvYirGq0DWB9K9hOspHYYtDz33gE5Duw==", + "dependencies": { + "@remix-run/router": "1.15.1", + "react-router": "6.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -16477,6 +16518,14 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss-animation-delay": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tailwindcss-animation-delay/-/tailwindcss-animation-delay-1.2.0.tgz", + "integrity": "sha512-fyDXWrBKZoTb6phV+bgtGFpxwWlvtlM+387gdpVc/mNgKJinayD1859vQ1aPmzDZ1DWbDZ/lpexukXRmc95Z6g==", + "peerDependencies": { + "tailwindcss": ">=2.0.0 || >=3.0.0" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", diff --git a/package.json b/package.json index 213afc2..367e41c 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,9 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", + "react-router-dom": "^6.22.1", "react-scripts": "5.0.1", + "tailwindcss-animation-delay": "^1.2.0", "typescript": "^4.9.5", "web-vitals": "^2.1.4" }, @@ -45,6 +47,7 @@ ] }, "devDependencies": { - "gh-pages": "^6.1.1" + "gh-pages": "^6.1.1", + "tailwindcss": "^3.4.1" } } diff --git a/src/App.css b/src/App.css index 384b001..5044b2e 100644 --- a/src/App.css +++ b/src/App.css @@ -1,138 +1,6 @@ -html, body, .App { - width: 100vw; - height: 100vh; - background: #141414; - overflow: hidden!important; - margin: 0; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - position: relative; -} - -.App { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - user-select: none; -} - -span { - position: absolute; - top: 0; - left: 0; - width: 4px; - height: 4px; - background: #fff; - border-radius: 50%; - box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.1), - 0 0 0 8px rgba(255, 255, 255, 0.1), 0 0 20px rgba(255, 255, 255, 1); - animation: animate 3s linear infinite; -} - -span::before { - content: ""; - position: absolute; - top: 50%; - transform: translateY(-50%); - width: 300px; - height: 1px; - background: linear-gradient(90deg, #fff, transparent); -} - -@keyframes animate { - 0% { - transform: rotate(315deg) translateX(0); - opacity: 1; - } - 70% { - opacity: 1; - } - 100% { - transform: rotate(315deg) translateX(-1500px); - opacity: 0; - } -} - -span:nth-child(1) { - top: -25px; - right: 0; - left: initial; - animation-delay: 4s; - animation-duration: 1s; -} - -span:nth-child(2) { - top: -25px; - right: 80px; - left: initial; - animation-delay: 4.2s; - animation-duration: 3s; -} - -span:nth-child(3) { - top: -25px; - right: 0px; - left: initial; - animation-delay: 4.4s; - animation-duration: 2s; -} - -span:nth-child(4) { - top: -25px; - right: 180px; - left: initial; - animation-delay: 4.6s; - animation-duration: 1.5s; -} - -span:nth-child(5) { - top: -25px; - right: 400px; - left: initial; - animation-delay: 4.8s; - animation-duration: 2.5s; -} - -span:nth-child(6) { - top: -25px; - right: 600px; - left: initial; - animation-delay: 5s; - animation-duration: 3s; -} - -span:nth-child(7) { - top: 300px; - right: -25px; - left: initial; - animation-delay: 5s; - animation-duration: 1.75s; -} - -span:nth-child(8) { - top: -25px; - right: 700px; - left: initial; - animation-delay: 5.4s; - animation-duration: 1.25s; -} - -span:nth-child(9) { - top: -25px; - right: 1000px; - left: initial; - animation-delay: 4.75s; - animation-duration: 2.25s; -} - -span:nth-child(10) { - top: -25px; - right: 1000px; - left: initial; - animation-delay: 6.75s; - animation-duration: 2.25s; -} +@tailwind base; +@tailwind components; +@tailwind utilities; @font-face { font-family: 'AlphaCentauri'; @@ -147,90 +15,15 @@ span:nth-child(10) { font-display: swap; } -.star-container { - display: flex; - justify-content: center; - align-items: center; - height: 100vh; +html, body, .App { width: 100vw; - overflow: hidden!important; -} - -.text-container { - position: absolute; - display: flex; - justify-content: center; - align-items: left; - flex-direction: column; -} - -.username { - font-family: 'AlphaCentauri'; - font-weight: 500; - font-style: normal; - line-height: 1.3; - white-space: nowrap; - position: relative; - font-size: 72px; - margin-bottom: -5px; - color: #fff; - animation: fadeInAnimation ease 3s; - animation-iteration-count: 1; - animation-fill-mode: forwards; - z-index: 99; -} - -.me-container { - opacity: 0; - transform: translateX(100%); - animation: fadeInMoveAnimation ease 3s forwards; - animation-delay: 1s; - display: flex; - outline: none; - display: flex; - justify-content: flex-start; - align-items: center; -} - -.page-button { - background: transparent; - height: 32px; - width: 32px; - color: white; - border-radius: 8px; - display: flex; - justify-content: center; - align-items: center; - border: 0; - margin-left: 6px; - z-index: 99; - outline: none; -} - -.page-button:hover { - color: darkgrey!important; -} - -.page-button:hover:active { - color: grey!important; -} - -.who-am-i { - font-family: 'AlphaCentauri'; - font-weight: 500; - font-style: normal; - line-height: 1.3; - white-space: nowrap; + height: 100vh; + background: #141414; + overflow: hidden; position: relative; - font-size: 30px; - margin-left: 4px; - margin-right: 6px; - color: #fff; - z-index: 99; -} - -.icon { - font-size: 32px; + margin: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } @media screen and (max-width: 750px) { @@ -273,22 +66,18 @@ span:nth-child(10) { } } -@keyframes fadeInAnimation { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } +::-webkit-scrollbar { + width: 12px; } - -@keyframes fadeInMoveAnimation { - 0% { - opacity: 0; - transform: translateX(100%); - } - 100% { - opacity: 1; - transform: translateX(0%); - } + +::-webkit-scrollbar-track { + background-color: #f1f1f1; +} + +::-webkit-scrollbar-thumb { + background-color: #c1c1c1; +} + +::-webkit-scrollbar-thumb:hover { + background-color: #a8a8a8; } diff --git a/src/App.tsx b/src/App.tsx index 3711072..44e7eba 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,45 +1,18 @@ -import "./App.css"; -import { PiGithubLogo } from "react-icons/pi"; -import { CiCoffeeBean } from "react-icons/ci"; +import React from "react"; +import { Routes, Route } from "react-router-dom"; -const App = () => { - const openGithubPage = () => { - window.open("https://github.com/Bamboooz", "_blank"); - } +import MainPage from "./pages/main/Main"; +import ProjectsPage from "./pages/projects/Projects"; - const openBuyMeACoffeePage = () => { - window.open("https://www.buymeacoffee.com/Bamboooz", "_blank"); - } +import "./App.css"; +import "./animations.css"; +const App = () => { return ( -
- {/* stars */} -
- - - - - - - - - - -
- -
-

BAMBOOOZ

-
-

web developer

- - -
-
-
+ + + + ); } diff --git a/src/animations.css b/src/animations.css new file mode 100644 index 0000000..98e9b6d --- /dev/null +++ b/src/animations.css @@ -0,0 +1,138 @@ +span { + animation: animate 3s linear infinite; +} + +span::before { + content: ""; + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 300px; + height: 1px; + background: linear-gradient(90deg, #fff, transparent); +} + +span:nth-child(1) { + top: -25px; + right: 0; + left: initial; + animation-delay: 4s; + animation-duration: 1s; +} + +span:nth-child(2) { + top: -25px; + right: 80px; + left: initial; + animation-delay: 4.2s; + animation-duration: 3s; +} + +span:nth-child(3) { + top: -25px; + right: 0px; + left: initial; + animation-delay: 4.4s; + animation-duration: 2s; +} + +span:nth-child(4) { + top: -25px; + right: 180px; + left: initial; + animation-delay: 4.6s; + animation-duration: 1.5s; +} + +span:nth-child(5) { + top: -25px; + right: 400px; + left: initial; + animation-delay: 4.8s; + animation-duration: 2.5s; +} + +span:nth-child(6) { + top: -25px; + right: 600px; + left: initial; + animation-delay: 5s; + animation-duration: 3s; +} + +span:nth-child(7) { + top: 300px; + right: -25px; + left: initial; + animation-delay: 5s; + animation-duration: 1.75s; +} + +span:nth-child(8) { + top: -25px; + right: 700px; + left: initial; + animation-delay: 5.4s; + animation-duration: 1.25s; +} + +span:nth-child(9) { + top: -25px; + right: 1000px; + left: initial; + animation-delay: 4.75s; + animation-duration: 2.25s; +} + +span:nth-child(10) { + top: -25px; + right: 1000px; + left: initial; + animation-delay: 6.75s; + animation-duration: 2.25s; +} + +.username { + animation: fadeInAnimation ease 3s; + animation-iteration-count: 1; + animation-fill-mode: forwards; +} + +.me-container { + animation: fadeInMoveAnimation ease 3s forwards; + animation-delay: 1s; +} + +@keyframes animate { + 0% { + transform: rotate(315deg) translateX(0); + opacity: 1; + } + 70% { + opacity: 1; + } + 100% { + transform: rotate(315deg) translateX(-1500px); + opacity: 0; + } +} + +@keyframes fadeInAnimation { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@keyframes fadeInMoveAnimation { + 0% { + opacity: 0; + transform: translateX(100%); + } + 100% { + opacity: 1; + transform: translateX(0%); + } +} diff --git a/src/assets/highlanders.png b/src/assets/highlanders.png new file mode 100644 index 0000000..78ca473 Binary files /dev/null and b/src/assets/highlanders.png differ diff --git a/src/assets/octokit.png b/src/assets/octokit.png new file mode 100644 index 0000000..3dfa8ac Binary files /dev/null and b/src/assets/octokit.png differ diff --git a/src/assets/osc.png b/src/assets/osc.png new file mode 100644 index 0000000..6d27890 Binary files /dev/null and b/src/assets/osc.png differ diff --git a/src/assets/trello.png b/src/assets/trello.png new file mode 100644 index 0000000..bf2a610 Binary files /dev/null and b/src/assets/trello.png differ diff --git a/src/components/about-me/AboutMe.tsx b/src/components/about-me/AboutMe.tsx new file mode 100644 index 0000000..424ce40 --- /dev/null +++ b/src/components/about-me/AboutMe.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { PiGithubLogo } from "react-icons/pi"; +import { GoFileCode } from "react-icons/go"; +import { FiCoffee } from "react-icons/fi"; + +const AboutMe = () => { + return ( + <> +
+

web developer

+ +
+ + + + + +
+ +
+ + + + + +
+
+ + ); +}; + +export default AboutMe; diff --git a/src/components/me/Me.tsx b/src/components/me/Me.tsx new file mode 100644 index 0000000..8b404cf --- /dev/null +++ b/src/components/me/Me.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import AboutMe from '../about-me/AboutMe'; + +const Me = () => { + return ( + <> +
+

BAMBOOOZ

+ +
+ + ); +}; + +export default Me; diff --git a/src/components/project-node/ProjectNode.tsx b/src/components/project-node/ProjectNode.tsx new file mode 100644 index 0000000..137eb59 --- /dev/null +++ b/src/components/project-node/ProjectNode.tsx @@ -0,0 +1,27 @@ +import React from 'react'; + +interface ProjectNodeProps { + name: string; + description: string; + url: string; + img: React.ReactElement; +}; + +const ProjectNode: React.FC = ({ name, description, url, img }) => { + return ( + <> + +
+ {React.cloneElement(img, { className: "rounded-2xl h-auto max-h-44" })} +
+ +
+

{name}

+

{description}

+
+
+ + ); +}; + +export default ProjectNode; diff --git a/src/components/projects/Projects.tsx b/src/components/projects/Projects.tsx new file mode 100644 index 0000000..2047b55 --- /dev/null +++ b/src/components/projects/Projects.tsx @@ -0,0 +1,59 @@ +import React from 'react'; +import { IoMdHome } from "react-icons/io"; +import { Link } from 'react-router-dom'; + +import ProjectNode from '../project-node/ProjectNode'; +import octokit from "../../assets/octokit.png"; +import osc from "../../assets/osc.png"; +import highlanders from "../../assets/highlanders.png"; +import trello from "../../assets/trello.png"; + +const Projects = () => { + const projects: { [name: string]: { description: string, url: string, img: React.ReactElement } } = { + "Highlanders": { + description: "Highlanders is a full stack mountaineering forum.", + url: "https://github.com/Bamboooz/highlanders", + img: , + }, + "os.c": { + description: "os.c is an advanced C CLI to fetch real-time hardware information.", + url: "https://github.com/Bamboooz/os.py", + img: , + }, + "trello-clone": { + description: "trello-clone is a simple clone of trello (wow) with nodes lists etc.", + url: "https://github.com/Bamboooz/trello-clone", + img: , + }, + "octokit.py": { + description: "Octokit.py is a simple python library to interact with GitHub v3 API.", + url: "https://github.com/Bamboooz/octokit.py", + img: , + }, + }; + + return ( + <> +
+
+

My projects

+ + +
+ +
+ +
+ +
+ {Object.keys(projects).map(key => { + const project = projects[key]; + return + })} +
+
+ + ); +}; + +export default Projects; diff --git a/src/components/stars/StarsContainer.tsx b/src/components/stars/StarsContainer.tsx new file mode 100644 index 0000000..34635ba --- /dev/null +++ b/src/components/stars/StarsContainer.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +const StarsContainer = () => { + const starClass = "absolute top-0 left-0 w-1 h-1 bg-white rounded-[50%] shadow-star"; + + return ( + <> +
+ {Array(10).fill(true).map((_, i) => )} +
+ + ); +}; + +export default StarsContainer; diff --git a/src/index.tsx b/src/index.tsx index 708d3cc..67053b5 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,6 +1,7 @@ import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App"; +import { BrowserRouter } from "react-router-dom"; const root = ReactDOM.createRoot( document.getElementById("root") as HTMLElement @@ -8,6 +9,8 @@ const root = ReactDOM.createRoot( root.render( - + + + ); diff --git a/src/pages/main/Main.tsx b/src/pages/main/Main.tsx new file mode 100644 index 0000000..9e7d185 --- /dev/null +++ b/src/pages/main/Main.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import StarsContainer from "../../components/stars/StarsContainer"; +import Me from "../../components/me/Me"; + +const MainPage = () => { + return ( +
+ + +
+ ); +}; + +export default MainPage; diff --git a/src/pages/projects/Projects.tsx b/src/pages/projects/Projects.tsx new file mode 100644 index 0000000..af636b2 --- /dev/null +++ b/src/pages/projects/Projects.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import Projects from '../../components/projects/Projects'; + +const ProjectsPage = () => { + return ( + <> +
+ +
+ + ); +}; + +export default ProjectsPage; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..879c643 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,22 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./src/**/*.{html,js,ts,tsx,jsx}" + ], + theme: { + extend: { + colors: { + "primary": "#141414", + }, + fontFamily: { + "alphacentauri": ["AlphaCentauri"], + }, + boxShadow: { + "star": "0 0 0 4px rgba(255, 255, 255, 0.1), 0 0 0 8px rgba(255, 255, 255, 0.1), 0 0 20px rgba(255, 255, 255, 1)", + }, + }, + }, + plugins: [ + require("tailwindcss-animation-delay"), + ], +}