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 (
+
+ );
+}
+
+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"