mirror of
https://github.com/NohamR/gitprofile.git
synced 2026-05-26 13:48:17 +00:00
Compare commits
162 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22d6ee0d0f | ||
|
|
f5b9ed4afb | ||
|
|
76fa0740e6 | ||
|
|
5803c2149c | ||
|
|
78413294ea | ||
|
|
5631516710 | ||
|
|
13a715a1a5 | ||
|
|
ca63dc0b5d | ||
|
|
f90076df3f | ||
|
|
30ea06d78e | ||
|
|
17156c1dad | ||
|
|
f0c3098ad6 | ||
|
|
efaebb7892 | ||
|
|
1b4a87b16f | ||
|
|
41279736f5 | ||
|
|
d31d14ddd9 | ||
|
|
85a515638a | ||
|
|
5fb622858e | ||
|
|
9ebb6debc4 | ||
|
|
b06ddf911a | ||
|
|
2c9700d47e | ||
|
|
1229633a77 | ||
|
|
da5e690de0 | ||
|
|
e1ee10a39c | ||
|
|
e7a343c1c0 | ||
|
|
e643996019 | ||
|
|
f38bbafb2d | ||
|
|
de4b91f282 | ||
|
|
fec425195d | ||
|
|
a15c278f08 | ||
|
|
9f32665a7a | ||
|
|
62ae9293d4 | ||
|
|
c964a40478 | ||
|
|
e2f0e76f7a | ||
|
|
52907c78ff | ||
|
|
d16f45702d | ||
|
|
9258c1de46 | ||
|
|
28bdd6c3fe | ||
|
|
444e220657 | ||
|
|
a1525e87b2 | ||
|
|
f141ef4a1d | ||
|
|
8373d93ba5 | ||
|
|
e56dc34e1e | ||
|
|
027d427db9 | ||
|
|
394c7f2476 | ||
|
|
80d93e976a | ||
|
|
7fd43fac48 | ||
|
|
2ff2e301e9 | ||
|
|
0515e2ec62 | ||
|
|
8853f2f2b5 | ||
|
|
c888fb77a5 | ||
|
|
5a30b610b3 | ||
|
|
46b228615a | ||
|
|
07d4595738 | ||
|
|
1226b4436b | ||
|
|
101882f503 | ||
|
|
d7e05033c5 | ||
|
|
f1c07e98cb | ||
|
|
3a10225e81 | ||
|
|
ad6e7aaddb | ||
|
|
f15703f68c | ||
|
|
2db8bf69e6 | ||
|
|
223a2de0a3 | ||
|
|
65b427481c | ||
|
|
302071014e | ||
|
|
59151b02f4 | ||
|
|
7220ff4c92 | ||
|
|
0a89bc8233 | ||
|
|
02ed553904 | ||
|
|
5575e6c5f2 | ||
|
|
03ee76d815 | ||
|
|
15dce3a539 | ||
|
|
38a7adffc8 | ||
|
|
82ce615ff6 | ||
|
|
8d85ac349c | ||
|
|
c7ac31bb99 | ||
|
|
d307af49ac | ||
|
|
42dd2303be | ||
|
|
8fbbc0e0c5 | ||
|
|
2364f267cf | ||
|
|
fff850f94f | ||
|
|
382e3835b2 | ||
|
|
8988fde115 | ||
|
|
203273f349 | ||
|
|
bf0404222d | ||
|
|
62fc6941ed | ||
|
|
01f6a21083 | ||
|
|
45fd66e595 | ||
|
|
4eeb320f92 | ||
|
|
9cd95eb08d | ||
|
|
32740ede32 | ||
|
|
984bee1fcf | ||
|
|
53b4a1ee39 | ||
|
|
7ec5802b54 | ||
|
|
71223e4c04 | ||
|
|
04603e7bd3 | ||
|
|
422e0ba12f | ||
|
|
9382fcd1cd | ||
|
|
dab07bebf7 | ||
|
|
4ecbe62332 | ||
|
|
37587c5e7a | ||
|
|
cdcd39beaf | ||
|
|
7c94acfc53 | ||
|
|
dd01541a98 | ||
|
|
3cf6c15103 | ||
|
|
c91974514c | ||
|
|
02a568bf90 | ||
|
|
ecf1b42136 | ||
|
|
a7fa79b3ee | ||
|
|
939a4b789b | ||
|
|
5497a6f095 | ||
|
|
307d0cbc4c | ||
|
|
dd540ed60d | ||
|
|
50eef86608 | ||
|
|
4c2c40bbbd | ||
|
|
bb0eae5d7a | ||
|
|
0beb2c6adc | ||
|
|
16a8fccdd9 | ||
|
|
51655eecf1 | ||
|
|
cf39d43367 | ||
|
|
87c18a2d1f | ||
|
|
d35e145106 | ||
|
|
6891901bc4 | ||
|
|
cb7c233787 | ||
|
|
f3fdb85d7c | ||
|
|
d05e70788d | ||
|
|
f1b5243926 | ||
|
|
2b619792de | ||
|
|
89c85fe4e8 | ||
|
|
ae8cc57533 | ||
|
|
fcbc08d483 | ||
|
|
d1b2404e97 | ||
|
|
b236d19940 | ||
|
|
26f4d47b17 | ||
|
|
9cc38ca819 | ||
|
|
f8bae71a00 | ||
|
|
c07cd59c06 | ||
|
|
d1bd06f05f | ||
|
|
078b79eb95 | ||
|
|
0c9051bf64 | ||
|
|
7ad35bb66b | ||
|
|
ba45cabee5 | ||
|
|
11f54ff5c7 | ||
|
|
d70f5408b3 | ||
|
|
49bd7c1108 | ||
|
|
c519cbc0c9 | ||
|
|
79a9e0704a | ||
|
|
6805d6eac1 | ||
|
|
dda3e18544 | ||
|
|
3cbea96846 | ||
|
|
6854a7b80c | ||
|
|
438ba16020 | ||
|
|
91c3a36f1e | ||
|
|
23732a7c16 | ||
|
|
697ca9f179 | ||
|
|
6faf857173 | ||
|
|
dd34d0155c | ||
|
|
ed2e832599 | ||
|
|
8d4462c700 | ||
|
|
2619676c6e | ||
|
|
9e34239877 | ||
|
|
e895b2e8f3 |
2
.github/workflows/deploy.yml
vendored
2
.github/workflows/deploy.yml
vendored
@@ -58,4 +58,4 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
id: deployment
|
id: deployment
|
||||||
uses: actions/deploy-pages@v1
|
uses: actions/deploy-pages@v1.2.3
|
||||||
|
|||||||
115
README.md
115
README.md
@@ -68,6 +68,7 @@
|
|||||||
✓ [Social Links](#social-links)
|
✓ [Social Links](#social-links)
|
||||||
✓ [Skill Section](#skills)
|
✓ [Skill Section](#skills)
|
||||||
✓ [Experience Section](#experience)
|
✓ [Experience Section](#experience)
|
||||||
|
✓ [Certification Section](#certifications)
|
||||||
✓ [Education Section](#education)
|
✓ [Education Section](#education)
|
||||||
✓ [Projects Section](#projects)
|
✓ [Projects Section](#projects)
|
||||||
✓ [Blog Posts Section](#blog-posts)
|
✓ [Blog Posts Section](#blog-posts)
|
||||||
@@ -80,11 +81,11 @@ Or try it **[online](https://stackblitz.com/edit/gitprofile)**.
|
|||||||
<img src="https://arifszn.github.io/assets/img/hosted/gitprofile/themes.png" alt="Themes">
|
<img src="https://arifszn.github.io/assets/img/hosted/gitprofile/themes.png" alt="Themes">
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
## 🎉 Thank you for the 400 ★
|
## 🎉 Thank you for the 500 ★
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<a href="https://arifszn.github.io/gitprofile">
|
<a href="https://arifszn.github.io/gitprofile">
|
||||||
<img src="https://user-images.githubusercontent.com/45073703/189209364-fc4df315-b66a-4654-907d-b0b7a9d2161e.gif" alt="Thank You" width="60%"/>
|
<img src="https://user-images.githubusercontent.com/45073703/202119579-eae272bd-ed39-434d-9361-df25308e0691.gif" alt="Thank You" width="50%"/>
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -92,9 +93,9 @@ Or try it **[online](https://stackblitz.com/edit/gitprofile)**.
|
|||||||
|
|
||||||
There are three ways to use **GitProfile**. Use any.
|
There are three ways to use **GitProfile**. Use any.
|
||||||
|
|
||||||
- Forking this repo _(recommended)_
|
- [Forking this repo _(recommended)_](#forking-this-repo)
|
||||||
- Setting up locally
|
- [Setting up locally](#setting-up-locally)
|
||||||
- Installing as package
|
- [Installing as package](#installing-as-package)
|
||||||
|
|
||||||
### Forking this repo
|
### Forking this repo
|
||||||
|
|
||||||
@@ -212,14 +213,17 @@ const config = {
|
|||||||
social: {
|
social: {
|
||||||
linkedin: '',
|
linkedin: '',
|
||||||
twitter: '',
|
twitter: '',
|
||||||
|
mastodon: '',
|
||||||
facebook: '',
|
facebook: '',
|
||||||
instagram: '',
|
instagram: '',
|
||||||
dribbble: '',
|
dribbble: '',
|
||||||
behance: '',
|
behance: '',
|
||||||
medium: '',
|
medium: '',
|
||||||
dev: '',
|
dev: '',
|
||||||
stackoverflow: '',
|
stackoverflow: '', // format: userid/username
|
||||||
website: '',
|
website: '',
|
||||||
|
skype: '',
|
||||||
|
telegram: '',
|
||||||
phone: '',
|
phone: '',
|
||||||
email: '',
|
email: '',
|
||||||
},
|
},
|
||||||
@@ -243,6 +247,14 @@ const config = {
|
|||||||
companyLink: 'https://example.com',
|
companyLink: 'https://example.com',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
certifications: [
|
||||||
|
{
|
||||||
|
body: 'Certification Body Name',
|
||||||
|
name: 'Sample Certification',
|
||||||
|
year: 'March 2022',
|
||||||
|
link: 'https://example.com',
|
||||||
|
},
|
||||||
|
],
|
||||||
education: [
|
education: [
|
||||||
{
|
{
|
||||||
institution: 'Institution Name',
|
institution: 'Institution Name',
|
||||||
@@ -257,6 +269,23 @@ const config = {
|
|||||||
to: '2014',
|
to: '2014',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
// To hide the `My Projects` section, keep it empty.
|
||||||
|
externalProjects: [
|
||||||
|
{
|
||||||
|
title: 'Project Name',
|
||||||
|
description:
|
||||||
|
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed euismod, nunc ut.',
|
||||||
|
imageUrl: 'https://via.placeholder.com/250x250',
|
||||||
|
link: 'https://example.com',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Project Name',
|
||||||
|
description:
|
||||||
|
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed euismod, nunc ut.',
|
||||||
|
imageUrl: 'https://via.placeholder.com/250x250',
|
||||||
|
link: 'https://example.com',
|
||||||
|
},
|
||||||
|
],
|
||||||
// Display blog posts from your medium or dev account. (Optional)
|
// Display blog posts from your medium or dev account. (Optional)
|
||||||
blog: {
|
blog: {
|
||||||
source: 'dev', // medium | dev
|
source: 'dev', // medium | dev
|
||||||
@@ -330,6 +359,9 @@ const config = {
|
|||||||
'--rounded-btn': '3rem',
|
'--rounded-btn': '3rem',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Optional Footer. Supports plain text or HTML.
|
||||||
|
footer: `Copyright © 2023 John Doe`,
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -341,7 +373,7 @@ The default theme can be specified.
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
// gitprofile.config.js
|
// gitprofile.config.js
|
||||||
module.exports = {
|
const config = {
|
||||||
// ...
|
// ...
|
||||||
themeConfig: {
|
themeConfig: {
|
||||||
defaultTheme: 'light',
|
defaultTheme: 'light',
|
||||||
@@ -358,7 +390,7 @@ You can create your own custom theme by modifying these values. Theme `procyon`
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
// gitprofile.config.js
|
// gitprofile.config.js
|
||||||
module.exports = {
|
const config = {
|
||||||
// ...
|
// ...
|
||||||
themeConfig: {
|
themeConfig: {
|
||||||
customTheme: {
|
customTheme: {
|
||||||
@@ -381,7 +413,7 @@ module.exports = {
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
// gitprofile.config.js
|
// gitprofile.config.js
|
||||||
module.exports = {
|
const config = {
|
||||||
// ...
|
// ...
|
||||||
googleAnalytics: {
|
googleAnalytics: {
|
||||||
id: '',
|
id: '',
|
||||||
@@ -397,7 +429,7 @@ Besides tracking visitors, it will track `click events` on projects and blog pos
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
// gitprofile.config.js
|
// gitprofile.config.js
|
||||||
module.exports = {
|
const config = {
|
||||||
// ...
|
// ...
|
||||||
hotjar: {
|
hotjar: {
|
||||||
id: '',
|
id: '',
|
||||||
@@ -416,15 +448,16 @@ Your avatar and bio will be fetched from GitHub automatically.
|
|||||||
|
|
||||||
### Social Links
|
### Social Links
|
||||||
|
|
||||||
You can link your social media services you're using, including LinkedIn, Twitter, Facebook, Instagram, Dribbble, Behance, Medium, dev, Stack Overflow, personal website, phone and email.
|
You can link your social media services you're using, including LinkedIn, Twitter, Mastodon, Facebook, Instagram, Dribbble, Behance, Medium, dev, Stack Overflow, Skype, Telegram, personal website, phone and email.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
// gitprofile.config.js
|
// gitprofile.config.js
|
||||||
module.exports = {
|
const config = {
|
||||||
// ...
|
// ...
|
||||||
social: {
|
social: {
|
||||||
linkedin: 'ariful-alam',
|
linkedin: 'ariful-alam',
|
||||||
twitter: 'arif_szn',
|
twitter: 'arif_szn',
|
||||||
|
mastodon: 'arifszn@mastodon.social',
|
||||||
facebook: '',
|
facebook: '',
|
||||||
instagram: '',
|
instagram: '',
|
||||||
dribbble: '',
|
dribbble: '',
|
||||||
@@ -432,6 +465,8 @@ module.exports = {
|
|||||||
medium: '',
|
medium: '',
|
||||||
dev: '',
|
dev: '',
|
||||||
stackoverflow: '',
|
stackoverflow: '',
|
||||||
|
skype: '',
|
||||||
|
telegram: '',
|
||||||
website: '',
|
website: '',
|
||||||
phone: '',
|
phone: '',
|
||||||
email: '',
|
email: '',
|
||||||
@@ -445,7 +480,7 @@ To showcase your skills provide them here.
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
// gitprofile.config.js
|
// gitprofile.config.js
|
||||||
module.exports = {
|
const config = {
|
||||||
// ...
|
// ...
|
||||||
skills: ['JavaScript', 'React.js'],
|
skills: ['JavaScript', 'React.js'],
|
||||||
};
|
};
|
||||||
@@ -459,7 +494,7 @@ Provide your job history in `experiences`.
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
// gitprofile.config.js
|
// gitprofile.config.js
|
||||||
module.exports = {
|
const config = {
|
||||||
// ...
|
// ...
|
||||||
experiences: [
|
experiences: [
|
||||||
{
|
{
|
||||||
@@ -488,7 +523,7 @@ Provide your education history in `education`.
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
// gitprofile.config.js
|
// gitprofile.config.js
|
||||||
module.exports = {
|
const config = {
|
||||||
// ...
|
// ...
|
||||||
education: [
|
education: [
|
||||||
{
|
{
|
||||||
@@ -509,13 +544,36 @@ module.exports = {
|
|||||||
|
|
||||||
Empty array will hide the education section.
|
Empty array will hide the education section.
|
||||||
|
|
||||||
### Projects
|
### Certifications
|
||||||
|
|
||||||
Your public repo from GitHub will be displayed here automatically. You can limit how many projects do you want to be displayed. Also, you can hide forked or specific repo.
|
Provide your industry certifications in `certifications`.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
// gitprofile.config.js
|
// gitprofile.config.js
|
||||||
module.exports = {
|
const config = {
|
||||||
|
// ...
|
||||||
|
certifications: [
|
||||||
|
{
|
||||||
|
name: 'Lorem ipsum',
|
||||||
|
body: 'Lorem ipsum dolor sit amet',
|
||||||
|
year: 'March 2022',
|
||||||
|
link: 'https://example.com',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Empty array will hide the certifications section.
|
||||||
|
|
||||||
|
### Projects
|
||||||
|
|
||||||
|
#### Github Projects
|
||||||
|
|
||||||
|
Your public repo from GitHub will be displayed in the `Github Projects` section automatically. You can limit how many projects do you want to be displayed. Also, you can hide forked or specific repo.
|
||||||
|
|
||||||
|
```js
|
||||||
|
// gitprofile.config.js
|
||||||
|
const config = {
|
||||||
// ...
|
// ...
|
||||||
github: {
|
github: {
|
||||||
username: 'arifszn',
|
username: 'arifszn',
|
||||||
@@ -529,13 +587,32 @@ module.exports = {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### External Projects
|
||||||
|
|
||||||
|
In this section you can showcase your external/personal projects.
|
||||||
|
|
||||||
|
```js
|
||||||
|
// gitprofile.config.js
|
||||||
|
const config = {
|
||||||
|
// ...
|
||||||
|
externalProjects: [
|
||||||
|
{
|
||||||
|
title: 'Project Name',
|
||||||
|
description: 'Description',
|
||||||
|
link: 'https://example.com',
|
||||||
|
imageUrl: 'https://via.placeholder.com/250x250',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
### Blog Posts
|
### Blog Posts
|
||||||
|
|
||||||
If you have [medium](https://medium.com) or [dev](https://dev.to) account, you can show your recent blog posts in here just by providing your medium/dev username. You can limit how many posts to display (Max is `10`).
|
If you have [medium](https://medium.com) or [dev](https://dev.to) account, you can show your recent blog posts in here just by providing your medium/dev username. You can limit how many posts to display (Max is `10`).
|
||||||
|
|
||||||
```js
|
```js
|
||||||
// gitprofile.config.js
|
// gitprofile.config.js
|
||||||
module.exports = {
|
const config = {
|
||||||
// ...
|
// ...
|
||||||
blog: {
|
blog: {
|
||||||
source: 'dev',
|
source: 'dev',
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ const config = {
|
|||||||
social: {
|
social: {
|
||||||
linkedin: 'ariful-alam',
|
linkedin: 'ariful-alam',
|
||||||
twitter: 'arif_szn',
|
twitter: 'arif_szn',
|
||||||
|
mastodon: 'arifszn@mastodon.social',
|
||||||
facebook: '',
|
facebook: '',
|
||||||
instagram: '',
|
instagram: '',
|
||||||
dribbble: '',
|
dribbble: '',
|
||||||
@@ -20,12 +21,15 @@ const config = {
|
|||||||
medium: 'arifszn',
|
medium: 'arifszn',
|
||||||
dev: 'arifszn',
|
dev: 'arifszn',
|
||||||
stackoverflow: '', // format: userid/username
|
stackoverflow: '', // format: userid/username
|
||||||
website: 'https://arifszn.github.io',
|
skype: '',
|
||||||
|
telegram: '',
|
||||||
|
website: 'https://arifszn.com',
|
||||||
phone: '',
|
phone: '',
|
||||||
email: 'arifulalamszn@gmail.com',
|
email: 'arifulalamszn@gmail.com',
|
||||||
},
|
},
|
||||||
resume: {
|
resume: {
|
||||||
fileUrl: 'resume.pdf', // Empty fileUrl will hide the `Download Resume` button.
|
fileUrl:
|
||||||
|
'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf', // Empty fileUrl will hide the `Download Resume` button.
|
||||||
},
|
},
|
||||||
skills: [
|
skills: [
|
||||||
'PHP',
|
'PHP',
|
||||||
@@ -59,6 +63,14 @@ const config = {
|
|||||||
companyLink: 'https://example.com',
|
companyLink: 'https://example.com',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
/* certifications: [
|
||||||
|
{
|
||||||
|
name: 'Lorem ipsum',
|
||||||
|
body: 'Lorem ipsum dolor sit amet',
|
||||||
|
year: 'March 2022',
|
||||||
|
link: 'https://example.com'
|
||||||
|
},
|
||||||
|
], */
|
||||||
education: [
|
education: [
|
||||||
{
|
{
|
||||||
institution: 'Institution Name',
|
institution: 'Institution Name',
|
||||||
@@ -73,11 +85,29 @@ const config = {
|
|||||||
to: '2014',
|
to: '2014',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
||||||
|
// To hide the `My Projects` section, keep it empty.
|
||||||
|
externalProjects: [
|
||||||
|
{
|
||||||
|
title: 'Project Name',
|
||||||
|
description:
|
||||||
|
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed euismod, nunc ut.',
|
||||||
|
imageUrl: 'https://via.placeholder.com/250x250',
|
||||||
|
link: 'https://example.com',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Project Name',
|
||||||
|
description:
|
||||||
|
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed euismod, nunc ut.',
|
||||||
|
imageUrl: 'https://via.placeholder.com/250x250',
|
||||||
|
link: 'https://example.com',
|
||||||
|
},
|
||||||
|
],
|
||||||
// Display blog posts from your medium or dev account. (Optional)
|
// Display blog posts from your medium or dev account. (Optional)
|
||||||
blog: {
|
blog: {
|
||||||
source: 'dev', // medium | dev
|
source: 'dev', // medium | dev
|
||||||
username: 'arifszn', // to hide blog section, keep it empty
|
username: 'arifszn', // to hide blog section, keep it empty
|
||||||
limit: 3, // How many posts to display. Max is 10.
|
limit: 2, // How many posts to display. Max is 10.
|
||||||
},
|
},
|
||||||
googleAnalytics: {
|
googleAnalytics: {
|
||||||
id: '', // GA3 tracking id/GA4 tag id UA-XXXXXXXXX-X | G-XXXXXXXXXX
|
id: '', // GA3 tracking id/GA4 tag id UA-XXXXXXXXX-X | G-XXXXXXXXXX
|
||||||
@@ -88,7 +118,7 @@ const config = {
|
|||||||
snippetVersion: 6,
|
snippetVersion: 6,
|
||||||
},
|
},
|
||||||
themeConfig: {
|
themeConfig: {
|
||||||
defaultTheme: 'business',
|
defaultTheme: 'winter',
|
||||||
|
|
||||||
// Hides the switch in the navbar
|
// Hides the switch in the navbar
|
||||||
// Useful if you want to support a single color mode
|
// Useful if you want to support a single color mode
|
||||||
@@ -146,6 +176,13 @@ const config = {
|
|||||||
'--rounded-btn': '3rem',
|
'--rounded-btn': '3rem',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Optional Footer. Supports plain text or HTML.
|
||||||
|
footer: `Made with <a
|
||||||
|
class="text-primary" href="https://github.com/arifszn/gitprofile"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
>GitProfile</a> and ❤️`,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default config;
|
export default config;
|
||||||
|
|||||||
2392
package-lock.json
generated
2392
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@arifszn/gitprofile",
|
"name": "@arifszn/gitprofile",
|
||||||
"description": "Create an automatic portfolio based on GitHub profile",
|
"description": "Create an automatic portfolio based on GitHub profile",
|
||||||
"version": "2.1.0",
|
"version": "2.4.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"author": "arifszn",
|
"author": "arifszn",
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@arifszn/blog-js": "^2.0.0",
|
"@arifszn/blog-js": "^2.0.0",
|
||||||
"@vitejs/plugin-react": "^2.0.0",
|
"@vitejs/plugin-react": "^3.0.0",
|
||||||
"autoprefixer": "^10.4.4",
|
"autoprefixer": "^10.4.4",
|
||||||
"axios": "^1.1.3",
|
"axios": "^1.1.3",
|
||||||
"daisyui": "^2.11.0",
|
"daisyui": "^2.11.0",
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
"react-hotjar": "^5.0.0",
|
"react-hotjar": "^5.0.0",
|
||||||
"react-icons": "^4.3.1",
|
"react-icons": "^4.3.1",
|
||||||
"tailwindcss": "^3.0.23",
|
"tailwindcss": "^3.0.23",
|
||||||
"vite": "^3.0.1"
|
"vite": "^4.0.3"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"git-profile",
|
"git-profile",
|
||||||
|
|||||||
Binary file not shown.
@@ -7,9 +7,11 @@ import AvatarCard from './avatar-card';
|
|||||||
import Details from './details';
|
import Details from './details';
|
||||||
import Skill from './skill';
|
import Skill from './skill';
|
||||||
import Experience from './experience';
|
import Experience from './experience';
|
||||||
|
import Certification from './certification';
|
||||||
import Education from './education';
|
import Education from './education';
|
||||||
import Project from './project';
|
import Project from './project';
|
||||||
import Blog from './blog';
|
import Blog from './blog';
|
||||||
|
import Footer from './footer';
|
||||||
import {
|
import {
|
||||||
genericError,
|
genericError,
|
||||||
getInitialTheme,
|
getInitialTheme,
|
||||||
@@ -18,12 +20,12 @@ import {
|
|||||||
setupHotjar,
|
setupHotjar,
|
||||||
tooManyRequestError,
|
tooManyRequestError,
|
||||||
sanitizeConfig,
|
sanitizeConfig,
|
||||||
skeleton,
|
|
||||||
} from '../helpers/utils';
|
} from '../helpers/utils';
|
||||||
import { HelmetProvider } from 'react-helmet-async';
|
import { HelmetProvider } from 'react-helmet-async';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import '../assets/index.css';
|
import '../assets/index.css';
|
||||||
import { formatDistance } from 'date-fns';
|
import { formatDistance } from 'date-fns';
|
||||||
|
import ExternalProject from './external-project';
|
||||||
|
|
||||||
const bgColor = 'bg-base-300';
|
const bgColor = 'bg-base-300';
|
||||||
|
|
||||||
@@ -187,6 +189,10 @@ const GitProfile = ({ config }) => {
|
|||||||
loading={loading}
|
loading={loading}
|
||||||
education={sanitizedConfig.education}
|
education={sanitizedConfig.education}
|
||||||
/>
|
/>
|
||||||
|
<Certification
|
||||||
|
loading={loading}
|
||||||
|
certifications={sanitizedConfig.certifications}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="lg:col-span-2 col-span-1">
|
<div className="lg:col-span-2 col-span-1">
|
||||||
@@ -197,6 +203,11 @@ const GitProfile = ({ config }) => {
|
|||||||
github={sanitizedConfig.github}
|
github={sanitizedConfig.github}
|
||||||
googleAnalytics={sanitizedConfig.googleAnalytics}
|
googleAnalytics={sanitizedConfig.googleAnalytics}
|
||||||
/>
|
/>
|
||||||
|
<ExternalProject
|
||||||
|
loading={loading}
|
||||||
|
externalProjects={sanitizedConfig.externalProjects}
|
||||||
|
googleAnalytics={sanitizedConfig.googleAnalytics}
|
||||||
|
/>
|
||||||
<Blog
|
<Blog
|
||||||
loading={loading}
|
loading={loading}
|
||||||
googleAnalytics={sanitizedConfig.googleAnalytics}
|
googleAnalytics={sanitizedConfig.googleAnalytics}
|
||||||
@@ -210,24 +221,7 @@ const GitProfile = ({ config }) => {
|
|||||||
className={`p-4 footer ${bgColor} text-base-content footer-center`}
|
className={`p-4 footer ${bgColor} text-base-content footer-center`}
|
||||||
>
|
>
|
||||||
<div className="card compact bg-base-100 shadow">
|
<div className="card compact bg-base-100 shadow">
|
||||||
<a
|
<Footer content={sanitizedConfig.footer} loading={loading} />
|
||||||
className="card-body"
|
|
||||||
href="https://github.com/arifszn/gitprofile"
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
{loading ? (
|
|
||||||
skeleton({ width: 'w-52', height: 'h-6' })
|
|
||||||
) : (
|
|
||||||
<p className="font-mono text-sm">
|
|
||||||
Made with{' '}
|
|
||||||
<span className="text-primary">GitProfile</span> and
|
|
||||||
❤️
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
@@ -252,6 +246,7 @@ GitProfile.propTypes = {
|
|||||||
social: PropTypes.shape({
|
social: PropTypes.shape({
|
||||||
linkedin: PropTypes.string,
|
linkedin: PropTypes.string,
|
||||||
twitter: PropTypes.string,
|
twitter: PropTypes.string,
|
||||||
|
mastodon: PropTypes.string,
|
||||||
facebook: PropTypes.string,
|
facebook: PropTypes.string,
|
||||||
instagram: PropTypes.string,
|
instagram: PropTypes.string,
|
||||||
dribbble: PropTypes.string,
|
dribbble: PropTypes.string,
|
||||||
@@ -260,10 +255,23 @@ GitProfile.propTypes = {
|
|||||||
dev: PropTypes.string,
|
dev: PropTypes.string,
|
||||||
stackoverflow: PropTypes.string,
|
stackoverflow: PropTypes.string,
|
||||||
website: PropTypes.string,
|
website: PropTypes.string,
|
||||||
|
skype: PropTypes.string,
|
||||||
|
telegram: PropTypes.string,
|
||||||
phone: PropTypes.string,
|
phone: PropTypes.string,
|
||||||
email: PropTypes.string,
|
email: PropTypes.string,
|
||||||
}),
|
}),
|
||||||
|
resume: PropTypes.shape({
|
||||||
|
fileUrl: PropTypes.string,
|
||||||
|
}),
|
||||||
skills: PropTypes.array,
|
skills: PropTypes.array,
|
||||||
|
externalProjects: PropTypes.arrayOf(
|
||||||
|
PropTypes.shape({
|
||||||
|
title: PropTypes.string.isRequired,
|
||||||
|
description: PropTypes.string.isRequired,
|
||||||
|
link: PropTypes.string.isRequired,
|
||||||
|
imageUrl: PropTypes.string,
|
||||||
|
})
|
||||||
|
),
|
||||||
experiences: PropTypes.arrayOf(
|
experiences: PropTypes.arrayOf(
|
||||||
PropTypes.shape({
|
PropTypes.shape({
|
||||||
company: PropTypes.string,
|
company: PropTypes.string,
|
||||||
@@ -272,6 +280,14 @@ GitProfile.propTypes = {
|
|||||||
to: PropTypes.string,
|
to: PropTypes.string,
|
||||||
})
|
})
|
||||||
),
|
),
|
||||||
|
certifications: PropTypes.arrayOf(
|
||||||
|
PropTypes.shape({
|
||||||
|
body: PropTypes.string,
|
||||||
|
name: PropTypes.string,
|
||||||
|
year: PropTypes.string,
|
||||||
|
link: PropTypes.string,
|
||||||
|
})
|
||||||
|
),
|
||||||
education: PropTypes.arrayOf(
|
education: PropTypes.arrayOf(
|
||||||
PropTypes.shape({
|
PropTypes.shape({
|
||||||
institution: PropTypes.string,
|
institution: PropTypes.string,
|
||||||
@@ -308,6 +324,7 @@ GitProfile.propTypes = {
|
|||||||
'--rounded-btn': PropTypes.string,
|
'--rounded-btn': PropTypes.string,
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
|
footer: PropTypes.string,
|
||||||
}).isRequired,
|
}).isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ const Blog = ({ loading, blog, googleAnalytics }) => {
|
|||||||
<div
|
<div
|
||||||
className={`card compact bg-base-100 ${
|
className={`card compact bg-base-100 ${
|
||||||
loading || (articles && articles.length)
|
loading || (articles && articles.length)
|
||||||
? 'card compact shadow bg-opacity-40'
|
? 'shadow bg-opacity-40'
|
||||||
: 'shadow-lg'
|
: 'shadow-lg'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
|
|||||||
99
src/components/certification/index.jsx
Normal file
99
src/components/certification/index.jsx
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
import { skeleton } from '../../helpers/utils';
|
||||||
|
import { Fragment } from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
const ListItem = ({ year, name, body, link }) => (
|
||||||
|
<li className="mb-5 ml-4">
|
||||||
|
<div
|
||||||
|
className="absolute w-2 h-2 bg-base-300 rounded-full border border-base-300 mt-1.5"
|
||||||
|
style={{ left: '-4.5px' }}
|
||||||
|
></div>
|
||||||
|
<div className="my-0.5 text-xs">{year}</div>
|
||||||
|
<div className="font-semibold">
|
||||||
|
<a href={link} target="_blank" rel="noreferrer">
|
||||||
|
{name}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<h3 className="mb-4 font-normal">{body}</h3>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
|
||||||
|
const Certification = ({ certifications, loading }) => {
|
||||||
|
const renderSkeleton = () => {
|
||||||
|
let array = [];
|
||||||
|
for (let index = 0; index < 2; index++) {
|
||||||
|
array.push(
|
||||||
|
<ListItem
|
||||||
|
key={index}
|
||||||
|
year={skeleton({
|
||||||
|
width: 'w-5/12',
|
||||||
|
height: 'h-4',
|
||||||
|
})}
|
||||||
|
name={skeleton({
|
||||||
|
width: 'w-6/12',
|
||||||
|
height: 'h-4',
|
||||||
|
className: 'my-1.5',
|
||||||
|
})}
|
||||||
|
body={skeleton({ width: 'w-6/12', height: 'h-3' })}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return array;
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{certifications?.length !== 0 && (
|
||||||
|
<div className="card shadow-lg compact bg-base-100">
|
||||||
|
<div className="card-body">
|
||||||
|
<div className="mx-3">
|
||||||
|
<h5 className="card-title">
|
||||||
|
{loading ? (
|
||||||
|
skeleton({ width: 'w-32', height: 'h-8' })
|
||||||
|
) : (
|
||||||
|
<span className="text-base-content opacity-70">
|
||||||
|
Certification
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</h5>
|
||||||
|
</div>
|
||||||
|
<div className="text-base-content text-opacity-60">
|
||||||
|
<ol className="relative border-l border-base-300 border-opacity-30 my-2 mx-4">
|
||||||
|
{loading ? (
|
||||||
|
renderSkeleton()
|
||||||
|
) : (
|
||||||
|
<Fragment>
|
||||||
|
{certifications.map((certification, index) => (
|
||||||
|
<ListItem
|
||||||
|
key={index}
|
||||||
|
year={`${certification.year}`}
|
||||||
|
name={certification.name}
|
||||||
|
body={certification.body}
|
||||||
|
link={certification.link ? certification.link : null}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</Fragment>
|
||||||
|
)}
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
ListItem.propTypes = {
|
||||||
|
year: PropTypes.node,
|
||||||
|
name: PropTypes.node,
|
||||||
|
body: PropTypes.node,
|
||||||
|
link: PropTypes.string,
|
||||||
|
};
|
||||||
|
|
||||||
|
Certification.propTypes = {
|
||||||
|
certifications: PropTypes.array.isRequired,
|
||||||
|
loading: PropTypes.bool.isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Certification;
|
||||||
@@ -1,13 +1,12 @@
|
|||||||
import { MdLocationOn, MdMail } from 'react-icons/md';
|
import { MdLocationOn } from 'react-icons/md';
|
||||||
import {
|
import {
|
||||||
AiFillGithub,
|
AiFillGithub,
|
||||||
AiFillInstagram,
|
AiFillInstagram,
|
||||||
AiFillMediumSquare,
|
AiFillMediumSquare,
|
||||||
} from 'react-icons/ai';
|
} from 'react-icons/ai';
|
||||||
import { SiTwitter } from 'react-icons/si';
|
import { SiTwitter } from 'react-icons/si';
|
||||||
import { GrLinkedinOption } from 'react-icons/gr';
|
|
||||||
import { CgDribbble } from 'react-icons/cg';
|
import { CgDribbble } from 'react-icons/cg';
|
||||||
import { RiPhoneFill } from 'react-icons/ri';
|
import { RiPhoneFill, RiMailFill } from 'react-icons/ri';
|
||||||
import { Fragment } from 'react';
|
import { Fragment } from 'react';
|
||||||
import {
|
import {
|
||||||
FaBehanceSquare,
|
FaBehanceSquare,
|
||||||
@@ -15,11 +14,33 @@ import {
|
|||||||
FaDev,
|
FaDev,
|
||||||
FaFacebook,
|
FaFacebook,
|
||||||
FaGlobe,
|
FaGlobe,
|
||||||
|
FaSkype,
|
||||||
|
FaMastodon,
|
||||||
FaStackOverflow,
|
FaStackOverflow,
|
||||||
|
FaTelegram,
|
||||||
|
FaLinkedin,
|
||||||
} from 'react-icons/fa';
|
} from 'react-icons/fa';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { skeleton } from '../../helpers/utils';
|
import { skeleton } from '../../helpers/utils';
|
||||||
|
|
||||||
|
const isCompanyMention = (company) => {
|
||||||
|
return company.startsWith('@') && !company.includes(' ');
|
||||||
|
};
|
||||||
|
|
||||||
|
const companyLink = (company) => {
|
||||||
|
return `https://github.com/${company.substring(1)}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getFormattedMastodonValue = (mastodonValue, isLink) => {
|
||||||
|
const [username, server] = mastodonValue.split('@');
|
||||||
|
|
||||||
|
if (isLink) {
|
||||||
|
return `https://${server}/@${username}`;
|
||||||
|
} else {
|
||||||
|
return `${username}@${server}`;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const ListItem = ({ icon, title, value, link, skeleton = false }) => {
|
const ListItem = ({ icon, title, value, link, skeleton = false }) => {
|
||||||
return (
|
return (
|
||||||
<a
|
<a
|
||||||
@@ -28,33 +49,23 @@ const ListItem = ({ icon, title, value, link, skeleton = false }) => {
|
|||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
className="flex justify-start py-2 px-1 items-center"
|
className="flex justify-start py-2 px-1 items-center"
|
||||||
>
|
>
|
||||||
<span className="w-2 m-2">{icon}</span>
|
<div className="flex-grow font-medium gap-2 flex items-center my-1">
|
||||||
<div className="flex-grow font-medium px-2">{title}</div>
|
{icon} {title}
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
className={`${
|
className={`${
|
||||||
skeleton ? 'flex-grow' : ''
|
skeleton ? 'flex-grow' : ''
|
||||||
} text-sm font-normal text-right mr-2 ml-3 ${link ? 'truncate' : ''}`}
|
} text-sm font-normal text-right mr-2 ml-3 ${link ? 'truncate' : ''}`}
|
||||||
|
style={{
|
||||||
|
wordBreak: 'break-word',
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<div
|
{value}
|
||||||
style={{
|
|
||||||
wordBreak: 'break-word',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{value}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const isCompanyMention = (company) => {
|
|
||||||
return company.startsWith('@') && !company.includes(' ');
|
|
||||||
};
|
|
||||||
|
|
||||||
const companyLink = (company) => {
|
|
||||||
return `https://github.com/${company.substring(1)}`;
|
|
||||||
};
|
|
||||||
|
|
||||||
const Details = ({ profile, loading, social, github }) => {
|
const Details = ({ profile, loading, social, github }) => {
|
||||||
const renderSkeleton = () => {
|
const renderSkeleton = () => {
|
||||||
let array = [];
|
let array = [];
|
||||||
@@ -83,14 +94,14 @@ const Details = ({ profile, loading, social, github }) => {
|
|||||||
<Fragment>
|
<Fragment>
|
||||||
{profile.location && (
|
{profile.location && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<MdLocationOn className="mr-2" />}
|
icon={<MdLocationOn />}
|
||||||
title="Based in:"
|
title="Based in:"
|
||||||
value={profile.location}
|
value={profile.location}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{profile.company && (
|
{profile.company && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<FaBuilding className="mr-2" />}
|
icon={<FaBuilding />}
|
||||||
title="Company:"
|
title="Company:"
|
||||||
value={profile.company}
|
value={profile.company}
|
||||||
link={
|
link={
|
||||||
@@ -101,22 +112,30 @@ const Details = ({ profile, loading, social, github }) => {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<AiFillGithub className="mr-2" />}
|
icon={<AiFillGithub />}
|
||||||
title="GitHub:"
|
title="GitHub:"
|
||||||
value={github.username}
|
value={github.username}
|
||||||
link={`https://github.com/${github.username}`}
|
link={`https://github.com/${github.username}`}
|
||||||
/>
|
/>
|
||||||
{social?.twitter && (
|
{social?.twitter && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<SiTwitter className="mr-2" />}
|
icon={<SiTwitter />}
|
||||||
title="Twitter:"
|
title="Twitter:"
|
||||||
value={social.twitter}
|
value={social.twitter}
|
||||||
link={`https://twitter.com/${social.twitter}`}
|
link={`https://twitter.com/${social.twitter}`}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
{social?.mastodon && (
|
||||||
|
<ListItem
|
||||||
|
icon={<FaMastodon />}
|
||||||
|
title="Mastodon:"
|
||||||
|
value={getFormattedMastodonValue(social.mastodon, false)}
|
||||||
|
link={getFormattedMastodonValue(social.mastodon, true)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
{social?.linkedin && (
|
{social?.linkedin && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<GrLinkedinOption className="mr-2" />}
|
icon={<FaLinkedin />}
|
||||||
title="LinkedIn:"
|
title="LinkedIn:"
|
||||||
value={social.linkedin}
|
value={social.linkedin}
|
||||||
link={`https://www.linkedin.com/in/${social.linkedin}`}
|
link={`https://www.linkedin.com/in/${social.linkedin}`}
|
||||||
@@ -124,7 +143,7 @@ const Details = ({ profile, loading, social, github }) => {
|
|||||||
)}
|
)}
|
||||||
{social?.dribbble && (
|
{social?.dribbble && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<CgDribbble className="mr-2" />}
|
icon={<CgDribbble />}
|
||||||
title="Dribbble:"
|
title="Dribbble:"
|
||||||
value={social.dribbble}
|
value={social.dribbble}
|
||||||
link={`https://dribbble.com/${social.dribbble}`}
|
link={`https://dribbble.com/${social.dribbble}`}
|
||||||
@@ -132,7 +151,7 @@ const Details = ({ profile, loading, social, github }) => {
|
|||||||
)}
|
)}
|
||||||
{social?.behance && (
|
{social?.behance && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<FaBehanceSquare className="mr-2" />}
|
icon={<FaBehanceSquare />}
|
||||||
title="Behance:"
|
title="Behance:"
|
||||||
value={social.behance}
|
value={social.behance}
|
||||||
link={`https://www.behance.net/${social.behance}`}
|
link={`https://www.behance.net/${social.behance}`}
|
||||||
@@ -140,7 +159,7 @@ const Details = ({ profile, loading, social, github }) => {
|
|||||||
)}
|
)}
|
||||||
{social?.facebook && (
|
{social?.facebook && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<FaFacebook className="mr-2" />}
|
icon={<FaFacebook />}
|
||||||
title="Facebook:"
|
title="Facebook:"
|
||||||
value={social.facebook}
|
value={social.facebook}
|
||||||
link={`https://www.facebook.com/${social.facebook}`}
|
link={`https://www.facebook.com/${social.facebook}`}
|
||||||
@@ -148,7 +167,7 @@ const Details = ({ profile, loading, social, github }) => {
|
|||||||
)}
|
)}
|
||||||
{social?.instagram && (
|
{social?.instagram && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<AiFillInstagram className="mr-2" />}
|
icon={<AiFillInstagram />}
|
||||||
title="Instagram:"
|
title="Instagram:"
|
||||||
value={social.instagram}
|
value={social.instagram}
|
||||||
link={`https://www.instagram.com/${social.instagram}`}
|
link={`https://www.instagram.com/${social.instagram}`}
|
||||||
@@ -156,7 +175,7 @@ const Details = ({ profile, loading, social, github }) => {
|
|||||||
)}
|
)}
|
||||||
{social?.medium && (
|
{social?.medium && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<AiFillMediumSquare className="mr-2" />}
|
icon={<AiFillMediumSquare />}
|
||||||
title="Medium:"
|
title="Medium:"
|
||||||
value={social.medium}
|
value={social.medium}
|
||||||
link={`https://medium.com/@${social.medium}`}
|
link={`https://medium.com/@${social.medium}`}
|
||||||
@@ -164,7 +183,7 @@ const Details = ({ profile, loading, social, github }) => {
|
|||||||
)}
|
)}
|
||||||
{social?.dev && (
|
{social?.dev && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<FaDev className="mr-2" />}
|
icon={<FaDev />}
|
||||||
title="Dev:"
|
title="Dev:"
|
||||||
value={social.dev}
|
value={social.dev}
|
||||||
link={`https://dev.to/${social.dev}`}
|
link={`https://dev.to/${social.dev}`}
|
||||||
@@ -172,7 +191,7 @@ const Details = ({ profile, loading, social, github }) => {
|
|||||||
)}
|
)}
|
||||||
{social?.stackoverflow && (
|
{social?.stackoverflow && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<FaStackOverflow className="mr-2" />}
|
icon={<FaStackOverflow />}
|
||||||
title="Stack Overflow:"
|
title="Stack Overflow:"
|
||||||
value={social.stackoverflow.split('/').slice(-1)}
|
value={social.stackoverflow.split('/').slice(-1)}
|
||||||
link={`https://stackoverflow.com/users/${social.stackoverflow}`}
|
link={`https://stackoverflow.com/users/${social.stackoverflow}`}
|
||||||
@@ -180,15 +199,32 @@ const Details = ({ profile, loading, social, github }) => {
|
|||||||
)}
|
)}
|
||||||
{social?.website && (
|
{social?.website && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<FaGlobe className="mr-2" />}
|
icon={<FaGlobe />}
|
||||||
title="Website:"
|
title="Website:"
|
||||||
value={social.website}
|
value={social.website}
|
||||||
link={social.website}
|
link={social.website}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
{social?.skype && (
|
||||||
|
<ListItem
|
||||||
|
icon={<FaSkype />}
|
||||||
|
title="Skype"
|
||||||
|
value={social.skype}
|
||||||
|
link={`skype:${social.skype}?chat`}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{social?.telegram && (
|
||||||
|
<ListItem
|
||||||
|
icon={<FaTelegram />}
|
||||||
|
title="Telegram"
|
||||||
|
value={social.telegram}
|
||||||
|
link={`https://t.me/${social.telegram}`}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
{social?.phone && (
|
{social?.phone && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<RiPhoneFill className="mr-2" />}
|
icon={<RiPhoneFill />}
|
||||||
title="Phone:"
|
title="Phone:"
|
||||||
value={social.phone}
|
value={social.phone}
|
||||||
link={`tel:${social.phone}`}
|
link={`tel:${social.phone}`}
|
||||||
@@ -196,7 +232,7 @@ const Details = ({ profile, loading, social, github }) => {
|
|||||||
)}
|
)}
|
||||||
{social?.email && (
|
{social?.email && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<MdMail className="mr-2" />}
|
icon={<RiMailFill />}
|
||||||
title="Email:"
|
title="Email:"
|
||||||
value={social.email}
|
value={social.email}
|
||||||
link={`mailto:${social.email}`}
|
link={`mailto:${social.email}`}
|
||||||
|
|||||||
171
src/components/external-project/index.jsx
Normal file
171
src/components/external-project/index.jsx
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
import { Fragment } from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { ga, skeleton } from '../../helpers/utils';
|
||||||
|
import LazyImage from '../lazy-image';
|
||||||
|
|
||||||
|
const displaySection = (externalProjects) => {
|
||||||
|
if (
|
||||||
|
externalProjects &&
|
||||||
|
Array.isArray(externalProjects) &&
|
||||||
|
externalProjects.length
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const ExternalProject = ({ externalProjects, loading, googleAnalytics }) => {
|
||||||
|
const renderSkeleton = () => {
|
||||||
|
let array = [];
|
||||||
|
for (let index = 0; index < externalProjects.length; index++) {
|
||||||
|
array.push(
|
||||||
|
<div className="card shadow-lg compact bg-base-100" key={index}>
|
||||||
|
<div className="p-8 h-full w-full">
|
||||||
|
<div className="flex items-center flex-col">
|
||||||
|
<div className="w-full">
|
||||||
|
<div className="flex items-start px-4">
|
||||||
|
<div className="w-full">
|
||||||
|
<h2>
|
||||||
|
{skeleton({
|
||||||
|
width: 'w-32',
|
||||||
|
height: 'h-8',
|
||||||
|
className: 'mb-2 mx-auto',
|
||||||
|
})}
|
||||||
|
</h2>
|
||||||
|
<div className="avatar w-full h-full">
|
||||||
|
<div className="w-20 h-20 mask mask-squircle mx-auto">
|
||||||
|
{skeleton({
|
||||||
|
width: 'w-full',
|
||||||
|
height: 'h-full',
|
||||||
|
shape: '',
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="mt-2">
|
||||||
|
{skeleton({
|
||||||
|
width: 'w-full',
|
||||||
|
height: 'h-4',
|
||||||
|
className: 'mx-auto',
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
<div className="mt-2 flex items-center flex-wrap justify-center">
|
||||||
|
{skeleton({
|
||||||
|
width: 'w-full',
|
||||||
|
height: 'h-4',
|
||||||
|
className: 'mx-auto',
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return array;
|
||||||
|
};
|
||||||
|
|
||||||
|
const renderExternalProjects = () => {
|
||||||
|
return externalProjects.map((item, index) => (
|
||||||
|
<a
|
||||||
|
className="card shadow-lg compact bg-base-100 cursor-pointer"
|
||||||
|
key={index}
|
||||||
|
href={item.link}
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (googleAnalytics?.id) {
|
||||||
|
ga.event({
|
||||||
|
action: 'Click External Project',
|
||||||
|
params: {
|
||||||
|
post: item.title,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
window?.open(item.link, '_blank');
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div className="p-8 h-full w-full">
|
||||||
|
<div className="flex items-center flex-col">
|
||||||
|
<div className="w-full">
|
||||||
|
<div className="px-4">
|
||||||
|
<div className="text-center w-full">
|
||||||
|
<h2 className="font-semibold text-lg tracking-wide text-center opacity-60 mb-2">
|
||||||
|
{item.title}
|
||||||
|
</h2>
|
||||||
|
{item.imageUrl && (
|
||||||
|
<div className="avatar opacity-90">
|
||||||
|
<div className="w-20 h-20 mask mask-squircle">
|
||||||
|
<LazyImage
|
||||||
|
src={item.imageUrl}
|
||||||
|
alt={'thumbnail'}
|
||||||
|
placeholder={skeleton({
|
||||||
|
width: 'w-full',
|
||||||
|
height: 'h-full',
|
||||||
|
shape: '',
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<p className="mt-1 text-base-content text-opacity-60 text-sm">
|
||||||
|
{item.description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
));
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Fragment>
|
||||||
|
{displaySection(externalProjects) && (
|
||||||
|
<div className="col-span-1 lg:col-span-2">
|
||||||
|
<div className="grid grid-cols-2 gap-6">
|
||||||
|
<div className="col-span-2">
|
||||||
|
<div className="card compact bg-base-100 shadow bg-opacity-40">
|
||||||
|
<div className="card-body">
|
||||||
|
<div className="mx-3 flex items-center justify-between mb-2">
|
||||||
|
<h5 className="card-title">
|
||||||
|
{loading ? (
|
||||||
|
skeleton({ width: 'w-40', height: 'h-8' })
|
||||||
|
) : (
|
||||||
|
<span className="text-base-content opacity-70">
|
||||||
|
My Projects
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</h5>
|
||||||
|
</div>
|
||||||
|
<div className="col-span-2">
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||||
|
{loading ? renderSkeleton() : renderExternalProjects()}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</Fragment>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
ExternalProject.propTypes = {
|
||||||
|
externalProjects: PropTypes.array,
|
||||||
|
loading: PropTypes.bool.isRequired,
|
||||||
|
googleAnalytics: PropTypes.object,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ExternalProject;
|
||||||
24
src/components/footer/index.jsx
Normal file
24
src/components/footer/index.jsx
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
import { skeleton } from '../../helpers/utils';
|
||||||
|
|
||||||
|
const Footer = ({ content, loading }) => {
|
||||||
|
if (!content) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="card-body">
|
||||||
|
{loading ? (
|
||||||
|
skeleton({ width: 'w-52', height: 'h-6' })
|
||||||
|
) : (
|
||||||
|
<div dangerouslySetInnerHTML={{ __html: content }} />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
Footer.propTypes = {
|
||||||
|
content: PropTypes.string,
|
||||||
|
loading: PropTypes.bool.isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Footer;
|
||||||
@@ -2,6 +2,7 @@ import { Fragment } from 'react';
|
|||||||
import { AiOutlineStar, AiOutlineFork } from 'react-icons/ai';
|
import { AiOutlineStar, AiOutlineFork } from 'react-icons/ai';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { ga, languageColor, skeleton } from '../../helpers/utils';
|
import { ga, languageColor, skeleton } from '../../helpers/utils';
|
||||||
|
import { MdInsertLink } from 'react-icons/md';
|
||||||
|
|
||||||
const Project = ({ repo, loading, github, googleAnalytics }) => {
|
const Project = ({ repo, loading, github, googleAnalytics }) => {
|
||||||
if (!loading && Array.isArray(repo) && repo.length === 0) {
|
if (!loading && Array.isArray(repo) && repo.length === 0) {
|
||||||
@@ -18,7 +19,11 @@ const Project = ({ repo, loading, github, googleAnalytics }) => {
|
|||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<span>
|
<span>
|
||||||
<h5 className="card-title text-lg">
|
<h5 className="card-title text-lg">
|
||||||
{skeleton({ width: 'w-32', height: 'h-8' })}
|
{skeleton({
|
||||||
|
width: 'w-32',
|
||||||
|
height: 'h-8',
|
||||||
|
className: 'mb-1',
|
||||||
|
})}
|
||||||
</h5>
|
</h5>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -81,31 +86,17 @@ const Project = ({ repo, loading, github, googleAnalytics }) => {
|
|||||||
>
|
>
|
||||||
<div className="flex justify-between flex-col p-8 h-full w-full">
|
<div className="flex justify-between flex-col p-8 h-full w-full">
|
||||||
<div>
|
<div>
|
||||||
<div className="flex items-center opacity-60">
|
<div className="flex items-center">
|
||||||
<svg
|
<div className="card-title text-lg tracking-wide flex text-base-content opacity-60">
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
<MdInsertLink className="my-auto" />
|
||||||
fill="none"
|
<span className="capitalize">{item.name}</span>
|
||||||
viewBox="0 0 24 24"
|
</div>
|
||||||
className="text-base-content inline-block w-5 h-5 mr-2 stroke-current"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
strokeWidth="2"
|
|
||||||
d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"
|
|
||||||
></path>
|
|
||||||
</svg>
|
|
||||||
<span>
|
|
||||||
<h5 className="card-title text-lg text-base-content">
|
|
||||||
{item.name}
|
|
||||||
</h5>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
<p className="mb-5 mt-1 text-base-content text-opacity-60 text-sm">
|
<p className="mb-5 mt-1 text-base-content text-opacity-60 text-sm">
|
||||||
{item.description}
|
{item.description}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between text-sm text-base-content text-opacity-60">
|
<div className="flex justify-between text-sm text-base-content text-opacity-60 truncate">
|
||||||
<div className="flex flex-grow">
|
<div className="flex flex-grow">
|
||||||
<span className="mr-3 flex items-center">
|
<span className="mr-3 flex items-center">
|
||||||
<AiOutlineStar className="mr-0.5" />
|
<AiOutlineStar className="mr-0.5" />
|
||||||
@@ -141,10 +132,10 @@ const Project = ({ repo, loading, github, googleAnalytics }) => {
|
|||||||
<div className="mx-3 flex items-center justify-between mb-2">
|
<div className="mx-3 flex items-center justify-between mb-2">
|
||||||
<h5 className="card-title">
|
<h5 className="card-title">
|
||||||
{loading ? (
|
{loading ? (
|
||||||
skeleton({ width: 'w-28', height: 'h-8' })
|
skeleton({ width: 'w-40', height: 'h-8' })
|
||||||
) : (
|
) : (
|
||||||
<span className="text-base-content opacity-70">
|
<span className="text-base-content opacity-70">
|
||||||
My Projects
|
GitHub Projects
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</h5>
|
</h5>
|
||||||
@@ -155,7 +146,7 @@ const Project = ({ repo, loading, github, googleAnalytics }) => {
|
|||||||
href={`https://github.com/${github.username}?tab=repositories`}
|
href={`https://github.com/${github.username}?tab=repositories`}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
className="text-base-content opacity-50"
|
className="text-base-content opacity-50 hover:underline"
|
||||||
>
|
>
|
||||||
See All
|
See All
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ const ThemeChanger = ({ theme, setTheme, loading, themeConfig }) => {
|
|||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
tabIndex={0}
|
tabIndex={0}
|
||||||
className="mt-16 overflow-y-auto shadow-2xl top-px dropdown-content max-h-96 w-52 rounded-b-box bg-base-200 text-base-content"
|
className="mt-16 overflow-y-auto shadow-2xl top-px dropdown-content max-h-96 w-52 rounded-lg bg-base-200 text-base-content"
|
||||||
>
|
>
|
||||||
<ul className="p-4 menu compact">
|
<ul className="p-4 menu compact">
|
||||||
{[
|
{[
|
||||||
|
|||||||
@@ -147,6 +147,7 @@ export const sanitizeConfig = (config) => {
|
|||||||
social: {
|
social: {
|
||||||
linkedin: config?.social?.linkedin,
|
linkedin: config?.social?.linkedin,
|
||||||
twitter: config?.social?.twitter,
|
twitter: config?.social?.twitter,
|
||||||
|
mastodon: config?.social?.mastodon,
|
||||||
facebook: config?.social?.facebook,
|
facebook: config?.social?.facebook,
|
||||||
instagram: config?.social?.instagram,
|
instagram: config?.social?.instagram,
|
||||||
dribbble: config?.social?.dribbble,
|
dribbble: config?.social?.dribbble,
|
||||||
@@ -157,12 +158,16 @@ export const sanitizeConfig = (config) => {
|
|||||||
website: config?.social?.website,
|
website: config?.social?.website,
|
||||||
phone: config?.social?.phone,
|
phone: config?.social?.phone,
|
||||||
email: config?.social?.email,
|
email: config?.social?.email,
|
||||||
|
skype: config?.social?.skype,
|
||||||
|
telegram: config?.social?.telegram,
|
||||||
},
|
},
|
||||||
resume: {
|
resume: {
|
||||||
fileUrl: config?.resume?.fileUrl || '',
|
fileUrl: config?.resume?.fileUrl || '',
|
||||||
},
|
},
|
||||||
skills: config?.skills || [],
|
skills: config?.skills || [],
|
||||||
|
externalProjects: config?.externalProjects || [],
|
||||||
experiences: config?.experiences || [],
|
experiences: config?.experiences || [],
|
||||||
|
certifications: config?.certifications || [],
|
||||||
education: config?.education || [],
|
education: config?.education || [],
|
||||||
blog: {
|
blog: {
|
||||||
source: config?.blog?.source,
|
source: config?.blog?.source,
|
||||||
@@ -185,6 +190,7 @@ export const sanitizeConfig = (config) => {
|
|||||||
themes: themes,
|
themes: themes,
|
||||||
customTheme: customTheme,
|
customTheme: customTheme,
|
||||||
},
|
},
|
||||||
|
footer: config?.footer,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -206,7 +212,7 @@ export const tooManyRequestError = (reset) => {
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
rate limit.
|
rate limit
|
||||||
</a>
|
</a>
|
||||||
! Try again later{` ${reset}`}.
|
! Try again later{` ${reset}`}.
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
43
types/index.d.ts
vendored
43
types/index.d.ts
vendored
@@ -49,6 +49,11 @@ export interface Social {
|
|||||||
*/
|
*/
|
||||||
twitter?: string;
|
twitter?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mastodon
|
||||||
|
*/
|
||||||
|
mastodon?: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Facebook
|
* Facebook
|
||||||
*/
|
*/
|
||||||
@@ -89,6 +94,16 @@ export interface Social {
|
|||||||
*/
|
*/
|
||||||
website?: string;
|
website?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skype username
|
||||||
|
*/
|
||||||
|
skype?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Telegram username
|
||||||
|
*/
|
||||||
|
telegram?: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Phone
|
* Phone
|
||||||
*/
|
*/
|
||||||
@@ -214,6 +229,19 @@ export interface Experience {
|
|||||||
to?: string;
|
to?: string;
|
||||||
companyLink?: string;
|
companyLink?: string;
|
||||||
}
|
}
|
||||||
|
export interface Certifications {
|
||||||
|
body?: string;
|
||||||
|
name?: string;
|
||||||
|
year?: string;
|
||||||
|
link?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ExternalProjects {
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
imageUrl?: string;
|
||||||
|
link: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface Education {
|
export interface Education {
|
||||||
institution?: string;
|
institution?: string;
|
||||||
@@ -252,6 +280,16 @@ export interface Config {
|
|||||||
*/
|
*/
|
||||||
experiences?: Array<Experience>;
|
experiences?: Array<Experience>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* External Projects
|
||||||
|
*/
|
||||||
|
externalProjects?: Array<ExternalProjects>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Certifications list
|
||||||
|
*/
|
||||||
|
certifications?: Array<Certifications>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Education list
|
* Education list
|
||||||
*/
|
*/
|
||||||
@@ -276,6 +314,11 @@ export interface Config {
|
|||||||
* Theme config
|
* Theme config
|
||||||
*/
|
*/
|
||||||
themeConfig?: ThemeConfig;
|
themeConfig?: ThemeConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom footer
|
||||||
|
*/
|
||||||
|
footer?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface GitProfileProps {
|
export interface GitProfileProps {
|
||||||
|
|||||||
Reference in New Issue
Block a user