diff --git a/components/assets/mastodon_icon_137420.svg b/components/assets/mastodon_icon_137420.svg new file mode 100644 index 0000000..2845d4a --- /dev/null +++ b/components/assets/mastodon_icon_137420.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/components/assets/mastodon_square_icon_160787.svg b/components/assets/mastodon_square_icon_160787.svg new file mode 100644 index 0000000..f44067b --- /dev/null +++ b/components/assets/mastodon_square_icon_160787.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/components/main.jsx b/components/main.jsx index 2c3e78d..d771140 100644 --- a/components/main.jsx +++ b/components/main.jsx @@ -7,6 +7,9 @@ import TwitterIcon from "@mui/icons-material/Twitter"; import LinkedInIcon from "@mui/icons-material/LinkedIn"; import InstagramIcon from "@mui/icons-material/Instagram"; import FacebookIcon from "@mui/icons-material/Facebook"; +import SvgIcon from "@mui/material/SvgIcon"; +import MastodonSVG from "./assets/mastodon_icon_137420.svg"; + import { name, github_url, @@ -16,6 +19,7 @@ import { // email, // resume_url, instagram_url, + mastodon_url, } from "config"; import DiscordActivity from "./discord-activity"; @@ -62,6 +66,13 @@ function Main() { + + + + + + + {/*
diff --git a/components/nav.style.js b/components/nav.style.js index dde813b..367f69d 100644 --- a/components/nav.style.js +++ b/components/nav.style.js @@ -26,6 +26,7 @@ export default styled.nav` /* padding: 20px; */ margin-left: 10px; color: #fff; + border-radius: 5px; &:hover { color: #111111; background-color: #6ffc03; diff --git a/components/providers/cursor.js b/components/providers/cursor.js index 57859b6..f753b73 100644 --- a/components/providers/cursor.js +++ b/components/providers/cursor.js @@ -1,24 +1,4 @@ -import { useRef, useEffect } from "react"; - +// import { useRef, useEffect } from "react"; export default function CustomCursor() { - const cursorRef = useRef(null); - useEffect(() => { - if (cursorRef.current == null || cursorRef == null) return; - document.addEventListener("mousemove", (e) => { - if (cursorRef.current == null) return; - cursorRef.current.setAttribute( - "style", - "top: " + e.pageY + "px; left: " + e.pageX + "px;" - ); - }); - document.addEventListener("click", () => { - if (cursorRef.current == null) return; - cursorRef.current.classList.add("expand"); - setTimeout(() => { - if (cursorRef.current == null) return; - cursorRef.current.classList.remove("expand"); - }, 500); - }); - }, []); - return
; + return
; } diff --git a/components/providers/cursor.style.jsx b/components/providers/cursor.style.jsx new file mode 100644 index 0000000..6c2c6fa --- /dev/null +++ b/components/providers/cursor.style.jsx @@ -0,0 +1,57 @@ +import styled from "@emotion/styled"; + +export const CursorStyle = styled.div` + html { + cursor: url("data:image/svg+xml,%3Csvg height='8' width='8' viewBox='0 0 8 8' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='4' fill='%2364FFDA' r='2'/%3E%3C/svg%3E") + 4 4, + auto; + } + + .cursor { + display: none; + position: fixed; + top: 0; + left: 0; + width: var(--width); + height: var(--height); + transform: translate( + calc(var(--x) - var(--width) / 2), + calc(var(--y) - var(--height) / 2) + ); + transition: 150ms width cubic-bezier(0.39, 0.575, 0.565, 1), + 150ms height cubic-bezier(0.39, 0.575, 0.565, 1), + 150ms transform cubic-bezier(0.39, 0.575, 0.565, 1); + z-index: var(--zIndex); + pointer-events: none; + will-change: transform; + box-shadow: var(--boxShadow); + } + + @media (pointer: fine) { + .cursor { + display: block; + } + } + + .cursor::after { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border-radius: var(--radius); + border: 2px solid #64ffda; + opacity: var(--scale); + -webkit-transform: scale(var(--scale)); + transform: scale(var(--scale)); + transition: 300ms opacity cubic-bezier(0.39, 0.575, 0.565, 1), + 300ms transform cubic-bezier(0.39, 0.575, 0.565, 1), + 150ms border-radius cubic-bezier(0.39, 0.575, 0.565, 1); + } + + html:not(html:hover) .cursor::after { + opacity: 0; + transform: scale(0); + } +`; diff --git a/components/skillComponents/github_events.jsx b/components/skillComponents/github_events.jsx index 686bf1e..1bd2c00 100644 --- a/components/skillComponents/github_events.jsx +++ b/components/skillComponents/github_events.jsx @@ -1,7 +1,7 @@ import React from "react"; import SkillCard from "../skillCard"; -function GitHubUserEvtSkillCard({ title, image, evt1, evt2, evt3, url }) { +export default function ({ title, image, evt1, evt2, evt3, url }) { let ghLogo = "/images/github_events/GitIcon.png"; // Evt1 if (evt1.type === "PushEvent") { @@ -155,5 +155,3 @@ function GitHubUserEvtSkillCard({ title, image, evt1, evt2, evt3, url }) { ); } - -export default GitHubUserEvtSkillCard; diff --git a/components/skillComponents/github_trophy.jsx b/components/skillComponents/github_trophy.jsx index 59b6e77..3fc2bcc 100644 --- a/components/skillComponents/github_trophy.jsx +++ b/components/skillComponents/github_trophy.jsx @@ -1,8 +1,7 @@ import React from "react"; import SkillCard from "../skillCard"; -import SkillCardStyle from "../skillCard.styled"; -function GitHubThySkillCard({ title, image, bannerImage, url }) { +export default function ({ title, image, bannerImage, url }) { return (
@@ -12,5 +11,3 @@ function GitHubThySkillCard({ title, image, bannerImage, url }) {
); } - -export default GitHubThySkillCard; diff --git a/components/skills.style.js b/components/skills.style.js index aaa3be0..4aba75b 100644 --- a/components/skills.style.js +++ b/components/skills.style.js @@ -6,7 +6,8 @@ export default styled.div` height: 100vh; padding: 100px 20px; margin-top: 15px; - justify-content: center; + align-items: center; + flex-direction: column; overflow-y: auto !important; background-image: url("/images/background5.jpg"); background-size: cover; diff --git a/components/tootCard.js b/components/tootCard.js new file mode 100644 index 0000000..3e077f1 --- /dev/null +++ b/components/tootCard.js @@ -0,0 +1,45 @@ +import { format, parse } from "date-format-parse"; +import ArtCardStyle from "./tootCard.style"; +import { compile } from "html-to-text"; + +function SkillCard({ content, created_at, url, image }) { + const contents = [content]; + const options = { + wordwrap: 10, + limits: { + ellipsis: " ...", + maxInputLength: "200", + }, + longWordSplit: { + forceWrapOnLimit: true, + wrapCharacters: ["-", "/"], + }, + }; + const compiledConvert = compile(options); + const texts = contents.map(compiledConvert); + return ( +
+ {content && ( +
+ + +
+ {image && ( +
+ +
+ )} +
"{texts.join("\n")}"
+
+ # {format(created_at, "DD MMM YYYY")} +
+
+
+
+
+ )} +
+ ); +} + +export default SkillCard; diff --git a/components/tootCard.style.jsx b/components/tootCard.style.jsx new file mode 100644 index 0000000..981d8cd --- /dev/null +++ b/components/tootCard.style.jsx @@ -0,0 +1,32 @@ +import styled from "styled-components"; + +export default styled.div` + padding: 5%; + width: 230px; + height: 100%; + box-sizing: border-box; + background-color: #aa78f6; + border-radius: 5px; + box-shadow: 10px 9px 0px -3px #7b3ea7; + margin: 8px; + align-content: stretch; + * { + margin-top: inherit; + } + .type { + color: #9bdcf0; + /* padding: 4px; */ + } + .card-logo { + float: inline-end; + border-radius: 100px; + display: flex; + align-items: center; + } + + // On hover of the card, the card will grow in size + &:hover { + transform: scale(1.05); + transition: 0.3s; + } +`; diff --git a/components/toots.js b/components/toots.js new file mode 100644 index 0000000..152b4c6 --- /dev/null +++ b/components/toots.js @@ -0,0 +1,57 @@ +import React, { useEffect, useState } from "react"; +import { ArtStyle } from "./toots.style"; +import SkillCard from "./tootCard"; +import { APISDK } from "handlers/sdk"; +import SkillsStyle from "./skills.style"; +import Box from "@mui/material/Box"; +import LinearProgress from "@mui/material/LinearProgress"; + +export default function () { + const [skills, setSkills] = useState({}); + const [loading, setLoading] = useState(true); + + async function requestAPIS() { + await APISDK.req(); + APISDK.data.logo = { + masto: `https://cdn.fosstodon.org/accounts/avatars/000/028/400/original/324cba4cb379bd4e.png`, + }; + setSkills(APISDK.data); + setLoading(false); + } + + useEffect(() => { + requestAPIS(); + }, [loading, APISDK]); + let image = skills?.logo?.masto; + if (loading) { + return ( + + + + Fetching Toots from Fosstodon... + +
+
+ ); + } else { + return ( + <> +
+ Fosstodon Status + {skills && ( + + {skills?.masto_status?.data?.map((project, index) => { + project.image = image; + return ( + <> + + + ); + })} + + )} +
+ + ); + } +} diff --git a/components/toots.style.jsx b/components/toots.style.jsx new file mode 100644 index 0000000..ad72a59 --- /dev/null +++ b/components/toots.style.jsx @@ -0,0 +1,16 @@ +import styled from "styled-components"; + +export const ArtStyle = styled.div` + padding: 100px 50px; + height: 100vh; + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + overflow-y: auto; + background-image: url("/images/background7.png"); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + background-attachment: fixed; +`; diff --git a/config.js b/config.js index 3284596..104f8a2 100644 --- a/config.js +++ b/config.js @@ -2,11 +2,12 @@ export const name = "Jyotirmoy Bandhapadhayaya"; export const github_url = "https://github.com/bravo68web"; export const twitter_url = "https://twitter.com/bravo68web"; export const linkedin_url = "https://linkedin.com/in/bravo68web"; +export const mastodon_url = "https://fosstodon.org/@bravo68web/"; export const email = "mailto:hi@b68.dev"; export const instagram_url = "https://instagram.com/bravo68web"; export const phone = ""; export const address = ""; -export const website = "https://bravo68web.com"; +export const website = "https://b68.dev"; export const resume_url = ""; export const facebook_url = "https://www.facebook.com/Bravo68Web/"; export const discord_id = "457039372009865226"; diff --git a/handlers/sdk.js b/handlers/sdk.js index a46e343..d289f5e 100644 --- a/handlers/sdk.js +++ b/handlers/sdk.js @@ -61,11 +61,13 @@ export const APISDK = { endpoint: "/me/vscode/", name: "vscode", }, + { + endpoint: "/me/mastodon/statuses", + name: "masto_status", + }, ], this.data ); // return tempEndpoint("https://api.github.com/users/bravo68web", this.data); }, }; - -console.log(APISDK.data); diff --git a/package.json b/package.json index 6f1b0e8..5111a2a 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "core-js": "^3.21.1", "date-format-parse": "^0.2.7", "fs-extra": "^10.0.1", + "html-to-text": "^9.0.4", "next": "^13.1.1", "next-connect": "^0.12.2", "react": "^18.2.0", diff --git a/pages/toots.js b/pages/toots.js index 2dbaaf3..aad4dcc 100644 --- a/pages/toots.js +++ b/pages/toots.js @@ -1,6 +1,6 @@ import Head from "next/head"; import Nav from "components/nav"; -import About from "components/about"; +import Toots from "components/toots"; import Footer from "components/footer"; export default function Home() { @@ -13,9 +13,9 @@ export default function Home() {
); } diff --git a/public/images/background7.png b/public/images/background7.png new file mode 100644 index 0000000..039b3f6 Binary files /dev/null and b/public/images/background7.png differ diff --git a/yarn.lock b/yarn.lock index 39f5448..8800a1c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -534,6 +534,14 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== +"@selderee/plugin-htmlparser2@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.10.0.tgz#8a304d18df907e086f3cfc71ea0ced52d6524430" + integrity sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA== + dependencies: + domhandler "^5.0.3" + selderee "^0.10.0" + "@swc/helpers@0.4.14": version "0.4.14" resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" @@ -1051,6 +1059,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -1098,6 +1111,36 @@ dom-helpers@^5.0.1: "@babel/runtime" "^7.8.7" csstype "^3.0.2" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -1123,6 +1166,11 @@ enquirer@^2.3.5: dependencies: ansi-colors "^4.1.1" +entities@^4.2.0, entities@^4.3.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -1781,6 +1829,27 @@ hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.1: dependencies: react-is "^16.7.0" +html-to-text@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.4.tgz#a4e97e901511aa91912bde8e596cfe2a9cc9cf13" + integrity sha512-ckrQ5N2yZS7qSgKxUbqrBZ02NxD5cSy7KuYjCNIf+HWbdzY3fbjYjQsoRIl6TiaZ4+XWOi0ggFP8/pmgCK/o+A== + dependencies: + "@selderee/plugin-htmlparser2" "^0.10.0" + deepmerge "^4.3.0" + dom-serializer "^2.0.0" + htmlparser2 "^8.0.1" + selderee "^0.10.0" + +htmlparser2@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" + integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + domutils "^3.0.1" + entities "^4.3.0" + ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -2103,6 +2172,11 @@ language-tags@=1.0.5: dependencies: language-subtag-registry "~0.3.2" +leac@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" + integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -2366,6 +2440,14 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parseley@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.11.0.tgz#1ff817c829a02fcc214c9cc0d96b126d772ee814" + integrity sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ== + dependencies: + leac "^0.6.0" + peberminta "^0.8.0" + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -2386,6 +2468,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +peberminta@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.8.0.tgz#acf7b105f3d13c8ac28cad81f2f5fe4698507590" + integrity sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -2589,6 +2676,13 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" +selderee@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.10.0.tgz#ec83d6044d9026668dc9bd2561acfde99a4e3a1c" + integrity sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A== + dependencies: + parseley "^0.11.0" + semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"