mirror of
https://github.com/NohamR/gitprofile.git
synced 2026-05-26 13:48:17 +00:00
Compare commits
92 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
194503f386 | ||
|
|
57933cceb8 | ||
|
|
1baf8bd460 | ||
|
|
4edb171236 | ||
|
|
9d8a5ab51b | ||
|
|
cdb3542844 | ||
|
|
a8abc23735 | ||
|
|
fe6974d58e | ||
|
|
939ecb6112 | ||
|
|
8498ad8ada | ||
|
|
b52c9b80a4 | ||
|
|
5ca5cff5d2 | ||
|
|
c06a0929be | ||
|
|
18afaccd24 | ||
|
|
89e5c29d80 | ||
|
|
20cc39d7ce | ||
|
|
e4f06638f9 | ||
|
|
7349310873 | ||
|
|
dc3724eb2c | ||
|
|
b69f052c54 | ||
|
|
c9b2c46495 | ||
|
|
ab035d13e5 | ||
|
|
17ff018f87 | ||
|
|
17abae3915 | ||
|
|
b3ab995397 | ||
|
|
5d3eacb694 | ||
|
|
6f1c0db559 | ||
|
|
1c320a4e82 | ||
|
|
de44eb7a48 | ||
|
|
af9b0ea531 | ||
|
|
c64cd57a95 | ||
|
|
76de845b46 | ||
|
|
c03487cb5b | ||
|
|
f30a588abc | ||
|
|
569e73859d | ||
|
|
caf2d55af8 | ||
|
|
36d8c0ac01 | ||
|
|
b23e4956e6 | ||
|
|
6e0dac1050 | ||
|
|
98678e7a1c | ||
|
|
ffa7f99109 | ||
|
|
c81123c804 | ||
|
|
b13209b956 | ||
|
|
afa89fca4f | ||
|
|
f013b314ff | ||
|
|
fc10df86bf | ||
|
|
84a109a31f | ||
|
|
486faffb0b | ||
|
|
110286622d | ||
|
|
5fceae602d | ||
|
|
e42f4a7b08 | ||
|
|
6927c5d425 | ||
|
|
c9fce00077 | ||
|
|
4430d982f4 | ||
|
|
39a97afb22 | ||
|
|
6b638f03ea | ||
|
|
3e0af6dad2 | ||
|
|
83a254e687 | ||
|
|
b42202d923 | ||
|
|
e6f678eacd | ||
|
|
b6bccf904e | ||
|
|
a7d7195487 | ||
|
|
a60fac9a95 | ||
|
|
a603e4236d | ||
|
|
1dec29a718 | ||
|
|
3f1b0ba513 | ||
|
|
0a0cd6bae1 | ||
|
|
9605a47a2a | ||
|
|
29a75d06cd | ||
|
|
e20a1d7321 | ||
|
|
38bc0d0025 | ||
|
|
0d44af1148 | ||
|
|
75e148e897 | ||
|
|
62062ae956 | ||
|
|
97cdde0abd | ||
|
|
f1b3fbda47 | ||
|
|
9c0bcdd973 | ||
|
|
2cac4c5994 | ||
|
|
27beccb1ee | ||
|
|
05a807387f | ||
|
|
cccd7afce4 | ||
|
|
020129b523 | ||
|
|
e0c242b523 | ||
|
|
05416767f8 | ||
|
|
12b6091d34 | ||
|
|
c2167f870a | ||
|
|
fb7ffe269e | ||
|
|
de448dcc3f | ||
|
|
b803ef88d0 | ||
|
|
d8450294ff | ||
|
|
d7c1b574a3 | ||
|
|
e11be358f9 |
2
.github/workflows/deploy.yml
vendored
2
.github/workflows/deploy.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
|||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
|
|
||||||
- name: Setup Pages
|
- name: Setup Pages
|
||||||
uses: actions/configure-pages@v1
|
uses: actions/configure-pages@v2
|
||||||
|
|
||||||
- name: Restore cache
|
- name: Restore cache
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v3
|
||||||
|
|||||||
2
.github/workflows/test-deploy.yml
vendored
2
.github/workflows/test-deploy.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
|||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
|
|
||||||
- name: Restore cache
|
- name: Restore cache
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
**/node_modules
|
**/node_modules
|
||||||
|
|||||||
@@ -4,5 +4,6 @@
|
|||||||
"bracketSpacing": true,
|
"bracketSpacing": true,
|
||||||
"printWidth": 80,
|
"printWidth": 80,
|
||||||
"singleQuote": true,
|
"singleQuote": true,
|
||||||
"tabWidth": 2
|
"tabWidth": 2,
|
||||||
|
"endOfLine": "auto"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,31 +14,36 @@ with a fix.
|
|||||||
|
|
||||||
## Submitting a Pull Request
|
## Submitting a Pull Request
|
||||||
|
|
||||||
- If applicable, update the `readme`
|
1. Make sure that the contribution you want to make is explained or detailed in a GitHub issue! Find an [existing issue](https://github.com/arifszn/gitprofile/issues) or [open a new one](https://github.com/arifszn/gitprofile/issues/new).
|
||||||
- Use `npm run lint` and `npm run prettier` before committing
|
2. Once done, [fork the repository](https://github.com/arifszn/gitprofile/fork) in your own GitHub account.
|
||||||
- Example for a commit message
|
3. [Create a new Git branch](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-and-deleting-branches-within-your-repository).
|
||||||
|
4. Make the changes on your branch.
|
||||||
|
5. [Submit the branch as a PR](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork) pointing to the `main` branch of the main repository. <br>
|
||||||
|
We do not enforce a naming convention for the PRs, but **please use something descriptive of your changes**.
|
||||||
|
|
||||||
```
|
## Development Workflow
|
||||||
Fix type validation for typescript
|
|
||||||
```
|
|
||||||
|
|
||||||
### Developing
|
### Install dependencies
|
||||||
|
|
||||||
Fork, then clone the repo:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
git clone https://github.com/your-username/gitprofile.git
|
|
||||||
cd gitprofile
|
|
||||||
```
|
|
||||||
|
|
||||||
Install dependencies:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npm install
|
npm install
|
||||||
```
|
```
|
||||||
|
|
||||||
Run dev server:
|
### Run dev server
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npm run dev
|
npm run dev
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Linter
|
||||||
|
|
||||||
|
Each PR should pass the linter to be accepted. To fix lint and prettier errors, run `npm run lint:fix` and `npm run prettier:fix`.
|
||||||
|
|
||||||
|
### Commit Message
|
||||||
|
|
||||||
|
As minimal requirements, your commit message should:
|
||||||
|
|
||||||
|
- be capitalized
|
||||||
|
- not finish by a dot or any other punctuation character (!,?)
|
||||||
|
- start with a verb so that we can read your commit message this way: "This commit will ...", where "..." is the commit message.
|
||||||
|
e.g.: "Fix the home page button" or "Add support for dark mode"
|
||||||
|
|||||||
85
README.md
85
README.md
@@ -66,21 +66,33 @@
|
|||||||
✓ [SEO](#seo)
|
✓ [SEO](#seo)
|
||||||
✓ [Avatar and Bio](#avatar-and-bio)
|
✓ [Avatar and Bio](#avatar-and-bio)
|
||||||
✓ [Social Links](#social-links)
|
✓ [Social Links](#social-links)
|
||||||
✓ [Skills](#skills)
|
✓ [Skill Section](#skills)
|
||||||
✓ [Experience](#experience)
|
✓ [Experience Section](#experience)
|
||||||
✓ [Education](#education)
|
✓ [Education Section](#education)
|
||||||
✓ [Projects](#projects)
|
✓ [Projects Section](#projects)
|
||||||
✓ [Blog Posts](#blog-posts)
|
✓ [Blog Posts Section](#blog-posts)
|
||||||
|
|
||||||
To view a live example, **[click here](https://arifszn.github.io/gitprofile)**.
|
To view a live example, **[click here](https://arifszn.github.io/gitprofile)**.
|
||||||
|
|
||||||
Or try it **[online](https://stackblitz.com/edit/gitprofile)**.
|
Or try it **[online](https://stackblitz.com/edit/gitprofile)**.
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://arifszn.github.io/assets/img/hosted/gitprofile/themes.png" alt="Themes">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
## 🎉 Thank you for the 400 ★
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<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%"/>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
## 🛠 Installation & Setup
|
## 🛠 Installation & Setup
|
||||||
|
|
||||||
There are three ways to use **GitProfile**. Use any.
|
There are three ways to use **GitProfile**. Use any.
|
||||||
|
|
||||||
- Forking this repo
|
- Forking this repo _(recommended)_
|
||||||
- Setting up locally
|
- Setting up locally
|
||||||
- Installing as package
|
- Installing as package
|
||||||
|
|
||||||
@@ -112,7 +124,7 @@ These instructions will get you a copy of the project and deploy your portfolio
|
|||||||
|
|
||||||
- **Commit the changes:** Now commit to your **main** branch with your changes. Wait a few minutes so that the CI/CD pipeline can publish your website to GitHub Pages. You can check the progress in the [Actions](https://github.com/arifszn/gitprofile/actions) tab.
|
- **Commit the changes:** Now commit to your **main** branch with your changes. Wait a few minutes so that the CI/CD pipeline can publish your website to GitHub Pages. You can check the progress in the [Actions](https://github.com/arifszn/gitprofile/actions) tab.
|
||||||
|
|
||||||
Your portfolio website will be live shortly. Any time you commit a change to the **main** branch, the website will be automatically updated. If you face any issue viewing the website, double-check the `base` value in the `vite.config.js` file.
|
Your portfolio website will be live shortly. Any time you commit a change to the **main** branch, the website will be automatically updated. If you face any issue viewing the website, double-check the `base` value in the `vite.config.js` file. Also, check if **Source** is set to **GitHub Actions** in **Settings** ➜ **Pages** ➜ **Build and deployment**.
|
||||||
|
|
||||||
If you wish to add a custom domain, no CNAME file is required. Just add it to your repo's **Settings** ➜ **Pages** ➜ **Custom domain**.
|
If you wish to add a custom domain, no CNAME file is required. Just add it to your repo's **Settings** ➜ **Pages** ➜ **Custom domain**.
|
||||||
|
|
||||||
@@ -206,35 +218,41 @@ const config = {
|
|||||||
behance: '',
|
behance: '',
|
||||||
medium: '',
|
medium: '',
|
||||||
dev: '',
|
dev: '',
|
||||||
|
stackoverflow: '',
|
||||||
website: '',
|
website: '',
|
||||||
phone: '',
|
phone: '',
|
||||||
email: '',
|
email: '',
|
||||||
},
|
},
|
||||||
|
resume: {
|
||||||
|
fileUrl: '', // Empty fileUrl will hide the `Download Resume` button.
|
||||||
|
},
|
||||||
skills: ['JavaScript', 'React.js'],
|
skills: ['JavaScript', 'React.js'],
|
||||||
experiences: [
|
experiences: [
|
||||||
{
|
{
|
||||||
company: 'Company name 1',
|
company: 'Company Name',
|
||||||
position: 'Software Engineer',
|
position: 'Position',
|
||||||
from: 'July 2019',
|
from: 'September 2021',
|
||||||
to: 'Present',
|
to: 'Present',
|
||||||
|
companyLink: 'https://example.com',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
company: 'Company name 2',
|
company: 'Company Name',
|
||||||
position: 'Jr. Software Engineer',
|
position: 'Position',
|
||||||
from: 'January 2019',
|
from: 'July 2019',
|
||||||
to: ' June 2019',
|
to: 'August 2021',
|
||||||
|
companyLink: 'https://example.com',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
education: [
|
education: [
|
||||||
{
|
{
|
||||||
institution: 'Institution name 1',
|
institution: 'Institution Name',
|
||||||
degree: 'ABC',
|
degree: 'Degree',
|
||||||
from: '2015',
|
from: '2015',
|
||||||
to: '2019',
|
to: '2019',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
institution: 'Institution name 2',
|
institution: 'Institution Name',
|
||||||
degree: 'XYZ',
|
degree: 'Degree',
|
||||||
from: '2012',
|
from: '2012',
|
||||||
to: '2014',
|
to: '2014',
|
||||||
},
|
},
|
||||||
@@ -246,9 +264,9 @@ const config = {
|
|||||||
limit: 5, // How many posts to display. Max is 10.
|
limit: 5, // How many posts to display. Max is 10.
|
||||||
},
|
},
|
||||||
googleAnalytics: {
|
googleAnalytics: {
|
||||||
// GA3 tracking id/GA4 tag id
|
id: '', // GA3 tracking id/GA4 tag id UA-XXXXXXXXX-X | G-XXXXXXXXXX
|
||||||
id: '', // UA-XXXXXXXXX-X | G-XXXXXXXXXX
|
|
||||||
},
|
},
|
||||||
|
// Track visitor interaction and behavior. https://www.hotjar.com
|
||||||
hotjar: {
|
hotjar: {
|
||||||
id: '',
|
id: '',
|
||||||
snippetVersion: 6,
|
snippetVersion: 6,
|
||||||
@@ -357,10 +375,6 @@ module.exports = {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="https://arifszn.github.io/assets/img/hosted/gitprofile/themes.png" alt="Themes">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
### Google Analytics
|
### Google Analytics
|
||||||
|
|
||||||
**GitProfile** supports both GA3 and GA4. If you do not want to use Google Analytics, keep the `id` empty.
|
**GitProfile** supports both GA3 and GA4. If you do not want to use Google Analytics, keep the `id` empty.
|
||||||
@@ -379,7 +393,7 @@ Besides tracking visitors, it will track `click events` on projects and blog pos
|
|||||||
|
|
||||||
### Hotjar
|
### Hotjar
|
||||||
|
|
||||||
**GitProfile** supports hotjar. If you do not want to use Hotjar, keep the `id` empty.
|
**GitProfile** supports [hotjar](https://www.hotjar.com) to track visitor interaction and behavior. If you do not want to use Hotjar, keep the `id` empty.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
// gitprofile.config.js
|
// gitprofile.config.js
|
||||||
@@ -402,7 +416,7 @@ 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, personal website, phone and email.
|
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.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
// gitprofile.config.js
|
// gitprofile.config.js
|
||||||
@@ -417,6 +431,7 @@ module.exports = {
|
|||||||
behance: '',
|
behance: '',
|
||||||
medium: '',
|
medium: '',
|
||||||
dev: '',
|
dev: '',
|
||||||
|
stackoverflow: '',
|
||||||
website: '',
|
website: '',
|
||||||
phone: '',
|
phone: '',
|
||||||
email: '',
|
email: '',
|
||||||
@@ -448,16 +463,18 @@ module.exports = {
|
|||||||
// ...
|
// ...
|
||||||
experiences: [
|
experiences: [
|
||||||
{
|
{
|
||||||
company: 'Company name 1',
|
company: 'Company Name',
|
||||||
position: 'Software Engineer',
|
position: 'Position',
|
||||||
from: 'July 2019',
|
from: 'September 2021',
|
||||||
to: 'Present',
|
to: 'Present',
|
||||||
|
companyLink: 'https://example.com',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
company: 'Company name 2',
|
company: 'Company Name',
|
||||||
position: 'Jr. Software Engineer',
|
position: 'Position',
|
||||||
from: 'January 2019',
|
from: 'July 2019',
|
||||||
to: ' June 2019',
|
to: 'August 2021',
|
||||||
|
companyLink: 'https://example.com',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
@@ -534,7 +551,7 @@ The posts are fetched by [blog.js](https://github.com/arifszn/blog.js).
|
|||||||
|
|
||||||
## 💖 Support
|
## 💖 Support
|
||||||
|
|
||||||
<p>You can show your support by starring this project.</p>
|
<p>You can show your support by starring this project. ★</p>
|
||||||
<a href="https://github.com/arifszn/gitprofile/stargazers">
|
<a href="https://github.com/arifszn/gitprofile/stargazers">
|
||||||
<img src="https://img.shields.io/github/stars/arifszn/gitprofile?style=social" alt="Github Star">
|
<img src="https://img.shields.io/github/stars/arifszn/gitprofile?style=social" alt="Github Star">
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -19,10 +19,14 @@ const config = {
|
|||||||
behance: '',
|
behance: '',
|
||||||
medium: 'arifszn',
|
medium: 'arifszn',
|
||||||
dev: 'arifszn',
|
dev: 'arifszn',
|
||||||
|
stackoverflow: '', // format: userid/username
|
||||||
website: 'https://arifszn.github.io',
|
website: 'https://arifszn.github.io',
|
||||||
phone: '',
|
phone: '',
|
||||||
email: 'arifulalamszn@gmail.com',
|
email: 'arifulalamszn@gmail.com',
|
||||||
},
|
},
|
||||||
|
resume: {
|
||||||
|
fileUrl: 'resume.pdf', // Empty fileUrl will hide the `Download Resume` button.
|
||||||
|
},
|
||||||
skills: [
|
skills: [
|
||||||
'PHP',
|
'PHP',
|
||||||
'Laravel',
|
'Laravel',
|
||||||
@@ -31,47 +35,43 @@ const config = {
|
|||||||
'Node.js',
|
'Node.js',
|
||||||
'Nest.js',
|
'Nest.js',
|
||||||
'MySQL',
|
'MySQL',
|
||||||
|
'PostgreSQL',
|
||||||
'Git',
|
'Git',
|
||||||
'Docker',
|
'Docker',
|
||||||
'PHPUnit',
|
'PHPUnit',
|
||||||
'CSS',
|
'CSS',
|
||||||
'Antd',
|
'Antd',
|
||||||
'Tailwind',
|
'Tailwind',
|
||||||
'Bootstrap',
|
|
||||||
],
|
],
|
||||||
experiences: [
|
experiences: [
|
||||||
{
|
{
|
||||||
company: 'Monstarlab Bangladesh',
|
company: 'Company Name',
|
||||||
position: 'Backend Engineer II',
|
position: 'Position',
|
||||||
from: 'September 2021',
|
from: 'September 2021',
|
||||||
to: 'Present',
|
to: 'Present',
|
||||||
|
companyLink: 'https://example.com',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
company: 'My Offer 360 Degree',
|
company: 'Company Name',
|
||||||
position: 'Web Application Developer',
|
position: 'Position',
|
||||||
from: 'July 2019',
|
from: 'July 2019',
|
||||||
to: 'August 2021',
|
to: 'August 2021',
|
||||||
|
companyLink: 'https://example.com',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
education: [
|
education: [
|
||||||
{
|
{
|
||||||
institution: 'American International University-Bangladesh',
|
institution: 'Institution Name',
|
||||||
degree: 'Bachelor of Science',
|
degree: 'Degree',
|
||||||
from: '2015',
|
from: '2015',
|
||||||
to: '2019',
|
to: '2019',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
institution: 'Cantonment College, Jessore',
|
institution: 'Institution Name',
|
||||||
degree: 'Higher Secondary Certificate (HSC)',
|
degree: 'Degree',
|
||||||
from: '2012',
|
from: '2012',
|
||||||
to: '2014',
|
to: '2014',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
institution: 'Chowgacha Shahadat Pilot High School',
|
|
||||||
degree: 'Secondary School Certificate (SSC)',
|
|
||||||
from: '2007',
|
|
||||||
to: '2012',
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
// Display blog posts from your medium or dev account. (Optional)
|
// Display blog posts from your medium or dev account. (Optional)
|
||||||
blog: {
|
blog: {
|
||||||
@@ -80,15 +80,15 @@ const config = {
|
|||||||
limit: 3, // How many posts to display. Max is 10.
|
limit: 3, // How many posts to display. Max is 10.
|
||||||
},
|
},
|
||||||
googleAnalytics: {
|
googleAnalytics: {
|
||||||
// GA3 tracking id/GA4 tag id UA-XXXXXXXXX-X | G-XXXXXXXXXX
|
id: '', // GA3 tracking id/GA4 tag id UA-XXXXXXXXX-X | G-XXXXXXXXXX
|
||||||
id: 'G-WLLB5E14M6', // Please remove this and use your own tag id or keep it empty
|
|
||||||
},
|
},
|
||||||
|
// Track visitor interaction and behavior. https://www.hotjar.com
|
||||||
hotjar: {
|
hotjar: {
|
||||||
id: '2617601', // Please remove this and use your own id or keep it empty
|
id: '',
|
||||||
snippetVersion: 6,
|
snippetVersion: 6,
|
||||||
},
|
},
|
||||||
themeConfig: {
|
themeConfig: {
|
||||||
defaultTheme: 'corporate',
|
defaultTheme: 'business',
|
||||||
|
|
||||||
// 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
|
||||||
|
|||||||
1801
package-lock.json
generated
1801
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.0.9",
|
"version": "2.1.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"author": "arifszn",
|
"author": "arifszn",
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -34,8 +34,8 @@
|
|||||||
"build:library": "vite build --config library.config.js",
|
"build:library": "vite build --config library.config.js",
|
||||||
"lint": "eslint --ext .js,.jsx .",
|
"lint": "eslint --ext .js,.jsx .",
|
||||||
"lint:fix": "eslint --ext .js,.jsx --fix .",
|
"lint:fix": "eslint --ext .js,.jsx --fix .",
|
||||||
"prettier": "prettier --check './**/*.{js,jsx,ts,tsx,css,md,json}'",
|
"prettier": "prettier --check \"./**/*.{js,jsx,ts,tsx,css,md,json}\"",
|
||||||
"prettier:fix": "prettier --write './**/*.{js,jsx,ts,tsx,css,md,json}'"
|
"prettier:fix": "prettier --write \"./**/*.{js,jsx,ts,tsx,css,md,json}\""
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
"@arifszn/blog-js": "^2.0.0",
|
"@arifszn/blog-js": "^2.0.0",
|
||||||
"@vitejs/plugin-react": "^2.0.0",
|
"@vitejs/plugin-react": "^2.0.0",
|
||||||
"autoprefixer": "^10.4.4",
|
"autoprefixer": "^10.4.4",
|
||||||
"axios": "^0.27.2",
|
"axios": "^1.1.3",
|
||||||
"daisyui": "^2.11.0",
|
"daisyui": "^2.11.0",
|
||||||
"date-fns": "^2.28.0",
|
"date-fns": "^2.28.0",
|
||||||
"eslint": "^8.11.0",
|
"eslint": "^8.11.0",
|
||||||
|
|||||||
BIN
public/resume.pdf
Normal file
BIN
public/resume.pdf
Normal file
Binary file not shown.
@@ -25,6 +25,8 @@ import PropTypes from 'prop-types';
|
|||||||
import '../assets/index.css';
|
import '../assets/index.css';
|
||||||
import { formatDistance } from 'date-fns';
|
import { formatDistance } from 'date-fns';
|
||||||
|
|
||||||
|
const bgColor = 'bg-base-300';
|
||||||
|
|
||||||
const GitProfile = ({ config }) => {
|
const GitProfile = ({ config }) => {
|
||||||
const [error, setError] = useState(
|
const [error, setError] = useState(
|
||||||
typeof config === 'undefined' && !config ? noConfigError : null
|
typeof config === 'undefined' && !config ? noConfigError : null
|
||||||
@@ -64,9 +66,14 @@ const GitProfile = ({ config }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
setProfile(profileData);
|
setProfile(profileData);
|
||||||
|
return data;
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then((userData) => {
|
||||||
let excludeRepo = ``;
|
let excludeRepo = ``;
|
||||||
|
if (userData.public_repos === 0) {
|
||||||
|
setRepo([]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
sanitizedConfig.github.exclude.projects.forEach((project) => {
|
sanitizedConfig.github.exclude.projects.forEach((project) => {
|
||||||
excludeRepo += `+-repo:${sanitizedConfig.github.username}/${project}`;
|
excludeRepo += `+-repo:${sanitizedConfig.github.username}/${project}`;
|
||||||
@@ -144,7 +151,7 @@ const GitProfile = ({ config }) => {
|
|||||||
) : (
|
) : (
|
||||||
sanitizedConfig && (
|
sanitizedConfig && (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<div className="p-4 lg:p-10 min-h-full bg-base-200">
|
<div className={`p-4 lg:p-10 min-h-full ${bgColor}`}>
|
||||||
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6 rounded-box">
|
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6 rounded-box">
|
||||||
<div className="col-span-1">
|
<div className="col-span-1">
|
||||||
<div className="grid grid-cols-1 gap-6">
|
<div className="grid grid-cols-1 gap-6">
|
||||||
@@ -160,6 +167,7 @@ const GitProfile = ({ config }) => {
|
|||||||
profile={profile}
|
profile={profile}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
avatarRing={!sanitizedConfig.themeConfig.hideAvatarRing}
|
avatarRing={!sanitizedConfig.themeConfig.hideAvatarRing}
|
||||||
|
resume={sanitizedConfig.resume}
|
||||||
/>
|
/>
|
||||||
<Details
|
<Details
|
||||||
profile={profile}
|
profile={profile}
|
||||||
@@ -198,7 +206,9 @@ const GitProfile = ({ config }) => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<footer className="p-4 footer bg-base-200 text-base-content footer-center">
|
<footer
|
||||||
|
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
|
<a
|
||||||
className="card-body"
|
className="card-body"
|
||||||
@@ -248,6 +258,7 @@ GitProfile.propTypes = {
|
|||||||
behance: PropTypes.string,
|
behance: PropTypes.string,
|
||||||
medium: PropTypes.string,
|
medium: PropTypes.string,
|
||||||
dev: PropTypes.string,
|
dev: PropTypes.string,
|
||||||
|
stackoverflow: PropTypes.string,
|
||||||
website: PropTypes.string,
|
website: PropTypes.string,
|
||||||
phone: PropTypes.string,
|
phone: PropTypes.string,
|
||||||
email: PropTypes.string,
|
email: PropTypes.string,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import PropTypes from 'prop-types';
|
|||||||
import { fallbackImage, skeleton } from '../../helpers/utils';
|
import { fallbackImage, skeleton } from '../../helpers/utils';
|
||||||
import LazyImage from '../lazy-image';
|
import LazyImage from '../lazy-image';
|
||||||
|
|
||||||
const AvatarCard = ({ profile, loading, avatarRing }) => {
|
const AvatarCard = ({ profile, loading, avatarRing, resume }) => {
|
||||||
return (
|
return (
|
||||||
<div className="card shadow-lg compact bg-base-100">
|
<div className="card shadow-lg compact bg-base-100">
|
||||||
<div className="grid place-items-center py-8">
|
<div className="grid place-items-center py-8">
|
||||||
@@ -55,6 +55,22 @@ const AvatarCard = ({ profile, loading, avatarRing }) => {
|
|||||||
: profile.bio}
|
: profile.bio}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{resume?.fileUrl &&
|
||||||
|
(loading ? (
|
||||||
|
<div className="mt-6">
|
||||||
|
{skeleton({ width: 'w-40', height: 'h-8' })}
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<a
|
||||||
|
href={resume.fileUrl}
|
||||||
|
target="_blank"
|
||||||
|
className="btn btn-outline btn-sm text-xs mt-6 opacity-50"
|
||||||
|
download
|
||||||
|
rel="noreferrer"
|
||||||
|
>
|
||||||
|
Download Resume
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -64,6 +80,9 @@ AvatarCard.propTypes = {
|
|||||||
profile: PropTypes.object,
|
profile: PropTypes.object,
|
||||||
loading: PropTypes.bool.isRequired,
|
loading: PropTypes.bool.isRequired,
|
||||||
avatarRing: PropTypes.bool.isRequired,
|
avatarRing: PropTypes.bool.isRequired,
|
||||||
|
resume: PropTypes.shape({
|
||||||
|
fileUrl: PropTypes.string,
|
||||||
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
export default AvatarCard;
|
export default AvatarCard;
|
||||||
|
|||||||
@@ -181,10 +181,10 @@ const Blog = ({ loading, blog, googleAnalytics }) => {
|
|||||||
<div className="grid grid-cols-2 gap-6">
|
<div className="grid grid-cols-2 gap-6">
|
||||||
<div className="col-span-2">
|
<div className="col-span-2">
|
||||||
<div
|
<div
|
||||||
className={`card compact ${
|
className={`card compact bg-base-100 ${
|
||||||
loading || (articles && articles.length)
|
loading || (articles && articles.length)
|
||||||
? 'bg-gradient-to-br to-base-200 from-base-100 shadow'
|
? 'card compact shadow bg-opacity-40'
|
||||||
: 'bg-base-100 shadow-lg'
|
: 'shadow-lg'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<div className="card-body">
|
<div className="card-body">
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import {
|
|||||||
FaDev,
|
FaDev,
|
||||||
FaFacebook,
|
FaFacebook,
|
||||||
FaGlobe,
|
FaGlobe,
|
||||||
|
FaStackOverflow,
|
||||||
} 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';
|
||||||
@@ -169,6 +170,14 @@ const Details = ({ profile, loading, social, github }) => {
|
|||||||
link={`https://dev.to/${social.dev}`}
|
link={`https://dev.to/${social.dev}`}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
{social?.stackoverflow && (
|
||||||
|
<ListItem
|
||||||
|
icon={<FaStackOverflow className="mr-2" />}
|
||||||
|
title="Stack Overflow:"
|
||||||
|
value={social.stackoverflow.split('/').slice(-1)}
|
||||||
|
link={`https://stackoverflow.com/users/${social.stackoverflow}`}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
{social?.website && (
|
{social?.website && (
|
||||||
<ListItem
|
<ListItem
|
||||||
icon={<FaGlobe className="mr-2" />}
|
icon={<FaGlobe className="mr-2" />}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { skeleton } from '../../helpers/utils';
|
|||||||
import { Fragment } from 'react';
|
import { Fragment } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
const ListItem = ({ time, position, company }) => (
|
const ListItem = ({ time, position, company, companyLink }) => (
|
||||||
<li className="mb-5 ml-4">
|
<li className="mb-5 ml-4">
|
||||||
<div
|
<div
|
||||||
className="absolute w-2 h-2 bg-base-300 rounded-full border border-base-300 mt-1.5"
|
className="absolute w-2 h-2 bg-base-300 rounded-full border border-base-300 mt-1.5"
|
||||||
@@ -10,7 +10,11 @@ const ListItem = ({ time, position, company }) => (
|
|||||||
></div>
|
></div>
|
||||||
<div className="my-0.5 text-xs">{time}</div>
|
<div className="my-0.5 text-xs">{time}</div>
|
||||||
<h3 className="font-semibold">{position}</h3>
|
<h3 className="font-semibold">{position}</h3>
|
||||||
<div className="mb-4 font-normal">{company}</div>
|
<div className="mb-4 font-normal">
|
||||||
|
<a href={companyLink} target="_blank" rel="noreferrer">
|
||||||
|
{company}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -37,7 +41,6 @@ const Experience = ({ experiences, loading }) => {
|
|||||||
|
|
||||||
return array;
|
return array;
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{experiences?.length !== 0 && (
|
{experiences?.length !== 0 && (
|
||||||
@@ -66,6 +69,9 @@ const Experience = ({ experiences, loading }) => {
|
|||||||
time={`${experience.from} - ${experience.to}`}
|
time={`${experience.from} - ${experience.to}`}
|
||||||
position={experience.position}
|
position={experience.position}
|
||||||
company={experience.company}
|
company={experience.company}
|
||||||
|
companyLink={
|
||||||
|
experience.companyLink ? experience.companyLink : null
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</Fragment>
|
</Fragment>
|
||||||
@@ -83,6 +89,7 @@ ListItem.propTypes = {
|
|||||||
time: PropTypes.node,
|
time: PropTypes.node,
|
||||||
position: PropTypes.node,
|
position: PropTypes.node,
|
||||||
company: PropTypes.node,
|
company: PropTypes.node,
|
||||||
|
companyLink: PropTypes.string,
|
||||||
};
|
};
|
||||||
|
|
||||||
Experience.propTypes = {
|
Experience.propTypes = {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ const HeadTagEditor = ({ profile, theme, googleAnalytics, social }) => {
|
|||||||
gtag('config', '${googleAnalytics.id}');`}
|
gtag('config', '${googleAnalytics.id}');`}
|
||||||
</script>
|
</script>
|
||||||
)}
|
)}
|
||||||
<title>Portfolio of {profile.name}</title>
|
<title>Portfolio{profile.name && ` of ${profile.name}`}</title>
|
||||||
<meta
|
<meta
|
||||||
name="theme-color"
|
name="theme-color"
|
||||||
content={isDarkishTheme(theme) ? '#000000' : '#ffffff'}
|
content={isDarkishTheme(theme) ? '#000000' : '#ffffff'}
|
||||||
@@ -30,18 +30,27 @@ const HeadTagEditor = ({ profile, theme, googleAnalytics, social }) => {
|
|||||||
|
|
||||||
<meta name="description" content={profile.bio} />
|
<meta name="description" content={profile.bio} />
|
||||||
|
|
||||||
<meta itemProp="name" content={`Portfolio of ${profile.name}`} />
|
<meta
|
||||||
|
itemProp="name"
|
||||||
|
content={`Portfolio${profile.name && ` of ${profile.name}`}`}
|
||||||
|
/>
|
||||||
<meta itemProp="description" content={profile.bio} />
|
<meta itemProp="description" content={profile.bio} />
|
||||||
<meta itemProp="image" content={profile.avatar} />
|
<meta itemProp="image" content={profile.avatar} />
|
||||||
|
|
||||||
<meta property="og:url" content={social?.website || ''} />
|
<meta property="og:url" content={social?.website || ''} />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:title" content={`Portfolio of ${profile.name}`} />
|
<meta
|
||||||
|
property="og:title"
|
||||||
|
content={`Portfolio${profile.name && ` of ${profile.name}`}`}
|
||||||
|
/>
|
||||||
<meta property="og:description" content={profile.bio} />
|
<meta property="og:description" content={profile.bio} />
|
||||||
<meta property="og:image" content={profile.avatar} />
|
<meta property="og:image" content={profile.avatar} />
|
||||||
|
|
||||||
<meta name="twitter:card" content="summary_large_image" />
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
<meta name="twitter:title" content={`Portfolio of ${profile.name}`} />
|
<meta
|
||||||
|
name="twitter:title"
|
||||||
|
content={`Portfolio${profile.name && ` of ${profile.name}`}`}
|
||||||
|
/>
|
||||||
<meta name="twitter:description" content={profile.bio} />
|
<meta name="twitter:description" content={profile.bio} />
|
||||||
<meta name="twitter:image" content={profile.avatar} />
|
<meta name="twitter:image" content={profile.avatar} />
|
||||||
</Helmet>
|
</Helmet>
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ import PropTypes from 'prop-types';
|
|||||||
import { ga, languageColor, skeleton } from '../../helpers/utils';
|
import { ga, languageColor, skeleton } from '../../helpers/utils';
|
||||||
|
|
||||||
const Project = ({ repo, loading, github, googleAnalytics }) => {
|
const Project = ({ repo, loading, github, googleAnalytics }) => {
|
||||||
|
if (!loading && Array.isArray(repo) && repo.length === 0) {
|
||||||
|
return <></>;
|
||||||
|
}
|
||||||
|
|
||||||
const renderSkeleton = () => {
|
const renderSkeleton = () => {
|
||||||
let array = [];
|
let array = [];
|
||||||
for (let index = 0; index < github.limit; index++) {
|
for (let index = 0; index < github.limit; index++) {
|
||||||
@@ -132,7 +136,7 @@ const Project = ({ repo, loading, github, googleAnalytics }) => {
|
|||||||
<div className="col-span-1 lg:col-span-2">
|
<div className="col-span-1 lg:col-span-2">
|
||||||
<div className="grid grid-cols-2 gap-6">
|
<div className="grid grid-cols-2 gap-6">
|
||||||
<div className="col-span-2">
|
<div className="col-span-2">
|
||||||
<div className="card compact bg-gradient-to-br to-base-200 from-base-100 shadow">
|
<div className="card compact bg-base-100 shadow bg-opacity-40">
|
||||||
<div className="card-body">
|
<div className="card-body">
|
||||||
<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">
|
||||||
|
|||||||
@@ -153,10 +153,14 @@ export const sanitizeConfig = (config) => {
|
|||||||
behance: config?.social?.behance,
|
behance: config?.social?.behance,
|
||||||
medium: config?.social?.medium,
|
medium: config?.social?.medium,
|
||||||
dev: config?.social?.dev,
|
dev: config?.social?.dev,
|
||||||
|
stackoverflow: config?.social?.stackoverflow,
|
||||||
website: config?.social?.website,
|
website: config?.social?.website,
|
||||||
phone: config?.social?.phone,
|
phone: config?.social?.phone,
|
||||||
email: config?.social?.email,
|
email: config?.social?.email,
|
||||||
},
|
},
|
||||||
|
resume: {
|
||||||
|
fileUrl: config?.resume?.fileUrl || '',
|
||||||
|
},
|
||||||
skills: config?.skills || [],
|
skills: config?.skills || [],
|
||||||
experiences: config?.experiences || [],
|
experiences: config?.experiences || [],
|
||||||
education: config?.education || [],
|
education: config?.education || [],
|
||||||
@@ -215,7 +219,8 @@ export const notFoundError = {
|
|||||||
title: 'The Github Username is Incorrect.',
|
title: 'The Github Username is Incorrect.',
|
||||||
subTitle: (
|
subTitle: (
|
||||||
<p>
|
<p>
|
||||||
Please provide correct github username in <code>config</code>.
|
Please provide correct github username in{' '}
|
||||||
|
<code>gitprofile.config.js</code>.
|
||||||
</p>
|
</p>
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|||||||
15
types/index.d.ts
vendored
15
types/index.d.ts
vendored
@@ -79,6 +79,11 @@ export interface Social {
|
|||||||
*/
|
*/
|
||||||
dev?: string;
|
dev?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stack Overflow
|
||||||
|
*/
|
||||||
|
stackoverflow?: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Website
|
* Website
|
||||||
*/
|
*/
|
||||||
@@ -207,6 +212,7 @@ export interface Experience {
|
|||||||
position?: string;
|
position?: string;
|
||||||
from?: string;
|
from?: string;
|
||||||
to?: string;
|
to?: string;
|
||||||
|
companyLink?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Education {
|
export interface Education {
|
||||||
@@ -216,6 +222,10 @@ export interface Education {
|
|||||||
to?: string;
|
to?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface Resume {
|
||||||
|
fileUrl?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface Config {
|
export interface Config {
|
||||||
/**
|
/**
|
||||||
* GitHub Config
|
* GitHub Config
|
||||||
@@ -227,6 +237,11 @@ export interface Config {
|
|||||||
*/
|
*/
|
||||||
social?: Social;
|
social?: Social;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resume
|
||||||
|
*/
|
||||||
|
resume?: Resume;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Skill list
|
* Skill list
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user