11import React from 'react' ;
2- import styled from 'styled-components' ;
2+ import styled , { keyframes } from 'styled-components' ;
3+ import {
4+ FaGithub ,
5+ FaTwitter ,
6+ FaLinkedin ,
7+ FaInstagram ,
8+ FaEnvelope ,
9+ FaDiscord ,
10+ FaStackOverflow ,
11+ FaYoutube ,
12+ FaDev ,
13+ FaBehance ,
14+ FaDribbble ,
15+ FaFigma ,
16+ FaCoffee ,
17+ FaProductHunt ,
18+ FaMedium ,
19+ FaReddit ,
20+ } from 'react-icons/fa' ;
21+ import { SiLeetcode , SiCodeforces , SiHashnode , SiReplit } from 'react-icons/si' ;
22+
23+ const UnstopIcon = ( ) => (
24+ < svg width = "24" height = "24" viewBox = "0 0 225 225" xmlns = "http://www.w3.org/2000/svg" >
25+ < circle cx = "112.5" cy = "112.5" r = "112.5" fill = "transparent" />
26+ < text
27+ x = "50%"
28+ y = "50%"
29+ textAnchor = "middle"
30+ fill = "transparent"
31+ fontSize = "140"
32+ fontFamily = "Arial, sans-serif"
33+ fontWeight = "bold"
34+ dy = ".35em"
35+ >
36+ un
37+ </ text >
38+ </ svg >
39+ ) ;
40+
41+ const pulse = keyframes `
42+ 0% {
43+ opacity: 1;
44+ transform: scale(1);
45+ }
46+ 50% {
47+ opacity: 0.7;
48+ transform: scale(1.05);
49+ }
50+ 100% {
51+ opacity: 1;
52+ transform: scale(1);
53+ }
54+ ` ;
355
456const ProfileSkeletonWrapper = styled . div `
557 @import url('https://fonts.googleapis.com/css2?family=Merriweather+Sans:wght@300&display=swap');
@@ -8,22 +60,61 @@ const ProfileSkeletonWrapper = styled.div`
860
961 .skeleton {
1062 background-color: rgb(13, 25, 53);
11- animation: pulse 1.5s infinite ease-in-out;
63+ animation: ${ pulse } 1.5s infinite ease-in-out;
64+ border-radius: 8px;
65+ }
66+
67+ .skeleton-circle {
68+ border-radius: 50%;
69+ }
70+
71+ .skeleton-line {
72+ height: 1rem;
73+ margin-bottom: 0.5rem;
1274 }
1375
14- @keyframes pulse {
15- 0% {
16- opacity: 1;
17- }
18- 50% {
19- opacity: 0.5;
20- }
21- 100% {
22- opacity: 1;
23- }
76+ .skeleton-skill {
77+ height: 2rem;
78+ width: 4rem;
79+ margin-right: 0.5rem;
80+ }
81+
82+ .skeleton-icon {
83+ width: 2rem;
84+ height: 2rem;
85+ display: flex;
86+ align-items: center;
87+ justify-content: center;
88+ background-color: rgb(13, 25, 53);
89+ border-radius: 0.25rem;
90+ animation: ${ pulse } 1.5s infinite ease-in-out;
2491 }
2592` ;
2693
94+ const socialIcons = {
95+ GitHub : < div className = "skeleton-icon" /> ,
96+ Twitter : < div className = "skeleton-icon" /> ,
97+ LinkedIn : < div className = "skeleton-icon" /> ,
98+ Instagram : < div className = "skeleton-icon" /> ,
99+ Email : < div className = "skeleton-icon" /> ,
100+ Discord : < div className = "skeleton-icon" /> ,
101+ LeetCode : < div className = "skeleton-icon" /> ,
102+ Codeforces : < div className = "skeleton-icon" /> ,
103+ StackOverflow : < div className = "skeleton-icon" /> ,
104+ YouTube : < div className = "skeleton-icon" /> ,
105+ DevTo : < div className = "skeleton-icon" /> ,
106+ Hashnode : < div className = "skeleton-icon" /> ,
107+ Behance : < div className = "skeleton-icon" /> ,
108+ Dribbble : < div className = "skeleton-icon" /> ,
109+ Figma : < div className = "skeleton-icon" /> ,
110+ Replit : < div className = "skeleton-icon" /> ,
111+ BuyMeACoffee : < div className = "skeleton-icon" /> ,
112+ ProductHunt : < div className = "skeleton-icon" /> ,
113+ Medium : < div className = "skeleton-icon" /> ,
114+ Reddit : < div className = "skeleton-icon" /> ,
115+ Unstop : < div className = "skeleton-icon" /> ,
116+ } ;
117+
27118function ProfileSkeleton ( ) {
28119 const skeletonData = {
29120 name : '' ,
@@ -38,6 +129,22 @@ function ProfileSkeleton() {
38129 LinkedIn : '' ,
39130 Instagram : '' ,
40131 Email : '' ,
132+ Discord : '' ,
133+ LeetCode : '' ,
134+ Codeforces : '' ,
135+ StackOverflow : '' ,
136+ YouTube : '' ,
137+ DevTo : '' ,
138+ Hashnode : '' ,
139+ Behance : '' ,
140+ Dribbble : '' ,
141+ Figma : '' ,
142+ Replit : '' ,
143+ BuyMeACoffee : '' ,
144+ ProductHunt : '' ,
145+ Medium : '' ,
146+ Reddit : '' ,
147+ Unstop : '' ,
41148 } ,
42149 verified : false ,
43150 } ;
@@ -46,9 +153,9 @@ function ProfileSkeleton() {
46153 < ProfileSkeletonWrapper >
47154 < div className = "font-MerriweatherSans-Light mb-[1.5rem] h-auto rounded-[10px] pb-[0rem] pl-[1rem] pr-[1rem] pt-[1rem] shadow-lg" >
48155 < div className = "flex gap-[1rem]" >
49- < div className = "skeleton h-[6.1rem] w-[6.1rem] flex-shrink-0 rounded " > </ div >
156+ < div className = "skeleton skeleton-circle h-[6.1rem] w-[6.1rem] flex-shrink-0" > </ div >
50157 < div className = "w-[80%] overflow-hidden" >
51- < h3 className = "skeleton mb-[0.5rem] h-[1.6rem] w-full rounded-[0.25rem] " >
158+ < h3 className = "skeleton skeleton-line w-full" >
52159 { skeletonData . name }
53160 { skeletonData . verified && (
54161 < svg
@@ -63,40 +170,24 @@ function ProfileSkeleton() {
63170 </ svg >
64171 ) }
65172 </ h3 >
66- < p className = "skeleton mb-[0.4rem] h-[1.2rem] w-full rounded-[0.25rem] " > { skeletonData . location } </ p >
173+ < p className = "skeleton skeleton-line w-full" > { skeletonData . location } </ p >
67174 < div className = "flex gap-[1rem] overflow-hidden" >
68175 { skeletonData . skills &&
69- skeletonData . skills . map ( ( skill , index ) => {
70- return (
71- < div className = "skeleton h-[2rem] w-full rounded-[0.25rem]" key = { index } >
72- { skill }
73- </ div >
74- ) ;
75- } ) }
176+ skeletonData . skills . map ( ( skill , index ) => (
177+ < div className = "skeleton skeleton-skill" key = { index } >
178+ { skill }
179+ </ div >
180+ ) ) }
76181 </ div >
77182 </ div >
78183 < div className = "w-[10%] justify-end overflow-hidden" >
79- < div className = "skeleton mb-[0.5rem] h-[6rem] w-[4rem] rounded-[0.25rem ]" > </ div >
184+ < div className = "skeleton skeleton-line h-[6rem] w-[4rem]" > </ div >
80185 </ div >
81186 </ div >
82187 < div className = "mt-[1rem]" >
83- < div className = "skeleton mb-[0.4rem] h-[1.2rem] w-full rounded-[0.25rem]" > { skeletonData . bio } </ div >
84- < div className = "mt-[0.5rem] flex h-[3rem] gap-[1rem]" >
85- < div className = "skeleton mt-[0.4rem] flex h-[2rem] w-[2rem] rounded-[0.25rem]" >
86- { skeletonData . social . GitHub }
87- </ div >
88- < div className = "skeleton mt-[0.4rem] flex h-[2rem] w-[2rem] rounded-[0.25rem]" >
89- { skeletonData . social . GitHub }
90- </ div >
91- < div className = "skeleton mt-[0.4rem] flex h-[2rem] w-[2rem] rounded-[0.25rem]" >
92- { skeletonData . social . GitHub }
93- </ div >
94- < div className = "skeleton mt-[0.4rem] flex h-[2rem] w-[2rem] rounded-[0.25rem]" >
95- { skeletonData . social . GitHub }
96- </ div >
97- < div className = "skeleton mt-[0.4rem] flex h-[2rem] w-[2rem] rounded-[0.25rem]" >
98- { skeletonData . social . GitHub }
99- </ div >
188+ < div className = "skeleton skeleton-line w-full" > { skeletonData . bio } </ div >
189+ < div className = "mt-[0.5rem] flex h-[3rem] flex-wrap gap-[1rem]" >
190+ { Object . keys ( skeletonData . social ) . map ( ( platform , index ) => socialIcons [ platform ] ) }
100191 </ div >
101192 </ div >
102193 </ div >
0 commit comments