- - - -
- - -Just change `src/portfolio.js` to get your personal portfolio. Customize portfolio theme by using your own color scheme globally in the `src/_globalColor.scss` file. Feel free to use it as-is or personalize it as much as you want. - -If you'd like to **contribute** and make this much better for other users, have a look at [Issues](https://github.com/saadpasta/developerFolio/issues). - -Created something awesome for your fork of the portfolio and want to share it? Feel free to open a [pull request](https://github.com/saadpasta/developerFolio/pulls). - -## Table of Contents -- [Sections](#sections) -- [Getting Started](#getting-started) -- [How to Use](#how-to-use) -- [Linking portfolio to GitHub](#linking-portfolio-to-github) -- [Linking blogs section to Medium](#linking-blogs-section-to-medium) -- [Change and Customize](#change-and-customize-every-section-according-to-your-need) -- [Deployment](#deployment) -- [Technologies Used](#technologies-used) -- [Illustrations](#illustrations) -- [For the Future](#for-the-future) -- [Contributors](#project-maintainers) - -## Portfolio Sections -✔️ Summary and About me\ -✔️ Skills\ -✔️ Education\ -✔️ Work Experience\ -✔️ Open Source Projects Connected with GitHub\ -✔️ Big Projects\ -✔️ Achievements And Certifications 🏆\ -✔️ Blogs\ -✔️ Talks\ -✔️ Podcast\ -✔️ Contact me\ -✔️ Twitter Timeline\ -✔️ GitHub Profile - -To view a live example, **[click here](https://developerfolio.js.org/)**. - - -## Getting Started - -These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. - -You'll need [Git](https://git-scm.com) and [Node.js](https://nodejs.org/en/download/) (which comes with [npm](http://npmjs.com)) installed on your computer or use [Docker](https://www.docker.com/products/docker-desktop). - -``` -node@v10.16.0 or higher -npm@6.9.0 or higher -git@2.17.1 or higher -``` -### Docker Commands - -``` -1) BUILD IMAGE : docker build -t developerfolio:latest . -2) RUN IMAGE: docker run -t -p 3000:3000 developerfolio:latest -``` - - -## How To Use - -From your command line, clone and run developerFolio: - -```bash -# Clone this repository -git clone https://github.com/saadpasta/developerFolio.git - -# Go into the repository -cd developerFolio - -# Setup default environment variables - -# For Linux -cp env.example .env -# For Windows -copy env.example .env - -# Install dependencies -npm install - -# Start a local dev server -npm start -``` - -## Linking Portfolio to GitHub - -Generate a classic GitHub personal access token following these [instructions](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-personal-access-token-classic) (make sure you don't select any scope just generate a simple token). If you are using [GitHub Actions](#configuring-github-actions-recommended) to deploy your portfolio you can skip this section. - -1. Create a file called .env in the root directory of your project (if not done already in section: [How To Use](#how-to-use)) - -Note: Configuring environment variables before deploying your portfolio is highly recommended as some components depend on API data. - -```bash -- DeveloperFolio - - node_modules - - public - - src - - .env <-- create it here - - env.example <-- this is the base file - - .gitignore - - package-lock.json - - package.json -``` - -2. Inside the .env file, add key `REACT_APP_GITHUB_TOKEN` and assign your GitHub token like this, also add your username as `GITHUB_USERNAME` - -```env -// .env -REACT_APP_GITHUB_TOKEN = "YOUR GITHUB TOKEN HERE" -GITHUB_USERNAME = "YOUR GITHUB USERNAME" -USE_GITHUB_DATA = "true" -``` - -Set `showGithubProfile` to true or false to show Contact Profile using GitHub, defaults to false. - -**Warning:** Treat your tokens like passwords and keep them secret. When working with the API, use tokens as environment variables instead of hardcoding them into your programs. - -Note: Open Source Projects section only show pinned items of your GitHub. -If you are seeing something as shown below, follow these [instructions](https://docs.github.com/en/enterprise/2.13/user/articles/pinning-items-to-your-profile). - -![ERROR](https://i.imgur.com/Hj6mu1K.png) - -If the above solution still doesn't work, visit the [wiki page](https://github.com/saadpasta/developerFolio/wiki/Github-Setup-For-Open-Source-Projects). - -## Linking blogs section to Medium - -Optionally, you can link the blogs section to your medium user account: - -* Inside the .env file, add key `MEDIUM_USERNAME` and assign your Medium username - -```env -// .env -MEDIUM_USERNAME = "YOUR MEDIUM USERNAME" -``` - -* For Github Action, change the environment variable `MEDIUM_USERNAME` in `.github/workflows/deploy.yml` - -Set `displayMediumBlogs` to true or false in portofolio.js to display fetched Medium blogs, defaults to true. - -## Change and customize every section according to your need. - -#### Personalize page content in `/src/portfolio.js` & modify it as per your need. You will also need to modify `index.html` to change the title and metadata to provide accurate SEO for your personal portfolio. - -```javascript -/* Change this file to get your Personal Porfolio */ - -const greeting = { - /* Your Summary And Greeting Section */ - title: "Hi all I'm Saad", - subTitle: emoji("A passionate Full Stack Software Developer 🚀"), - resumeLink: "https://drive.google.com/file/d/1ofFdKF_mqscH8WvXkSObnVvC9kK7Ldlu/view?usp=sharing" -}; - -const socialMediaLinks = { - /* Your Social Media Link */ - github: "https://github.com/saadpasta", - linkedin: "https://www.linkedin.com/in/saadpasta/", - gmail: "saadpasta70@gmail.com", - gitlab: "https://gitlab.com/saadpasta", - facebook: "https://www.facebook.com/saad.pasta7" -}; - - -const skillsSection = { .... } - -const techStack = { .... } - -const workExperience = { .... } - -const openSource = { .... } - -const bigProjects = { .... } - -const achievementSection = { .... } - -const blogSection = { .... } - -const contactInfo = { .... } - -const twitterDetails = { ... } - -``` - -#### Using Emojis - -For adding emoji 😃 into the texts in `Portfolio.js`, use the `emoji()` function and pass the text you need as an argument. This would help in keeping emojis compatible across different browsers and platforms. - -#### Customize Lottie Animations - -You can choose a Lottie and download it in json format from from sites like [this](https://lottiefiles.com/). In `src/assets/lottie`, replace the Lottie json file you want to alter with the same file name. If you want to change the Lottie options, go to `src/components/displayLottie/DisplayLottie.js` and change the `defaultOptions` object, you can refer [lottie-react docs](https://www.npmjs.com/package/lottie-react) for more info on the `defaultOptions` object. - -#### Adding Twitter Time line to your Page -Insert your Twitter username in `portfolio.js` to show your recent activity on your page. - -```javascript -const twitterDetails = { - userName : "Your Twitter Username" -}; -``` -Note: Don't use `@` symbol when adding username. - -## Deployment -When you are done with the setup, you should host your website online. -We highly recommend to read through the [Deploying on GitHub Pages](https://create-react-app.dev/docs/deployment/#github-pages) docs for React. - -#### Configuring GitHub Actions (Recommended) -First you should enable, GitHub Actions for the repository you use. - -The Profile and the Repository information from GitHub is only created at the time of deploy and the site needs to be redeployed if those information needs to be updated. So, a configurable [CRON Job](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events) is setup which deploys your site every week, so that once you update your profile on GitHub it is shown on your portfolio. You can also trigger it manually using `workflow_dispatch` event, see [this guide](https://github.blog/changelog/2020-07-06-github-actions-manual-triggers-with-workflow_dispatch) on how to do that. - -- When you are done with the configuration, we highly recommend to read through the [GitHub Actions Configuring a workflow](https://docs.github.com/en/actions/configuring-and-managing-workflows/configuring-a-workflow) docs. - -#### Deploying to GitHub Pages - -This section guides you to deploy your portfolio on GitHub pages. - -- Navigate to `package.json` and enter your domain name instead of `https://developerfolio.js.org/` in `homepage` variable. For example, if you want your site to be `https://Saad Pasta |
- Kartik Choudhary |
- Naveen M K |
- Muhammad Hasham |
-
- {cardInfo.description} -
-- {school.duration} -
-{school.desc}
-- {cardInfo.desc} -
-- {emoji("Made with ❤️ by DeveloperFolio Team")} -
-- Theme by{" "} - - developerFolio - -
-{contactInfo.subtitle}
-{repo.node.name}
-{repo.node.description}
-{repo.node.primaryLanguage.name}
- - )} - - -{repo.node.forkCount}
- - - -{repo.node.stargazers.totalCount}
- -{formatFileSizeDisplay(repo.node.diskUsage)}
-{skills.skillName}
-- {bigProjects.subtitle} -
- -- {project.projectDesc} -
- {project.footerLink ? ( -- {achievementSection.subtitle} -
-- {blogSection.subtitle} -
-- {contactInfo.subtitle} -
-- {greeting.subTitle} -
-- {podcastSection.subtitle} -
-{exp.Stack}
-- {skillsSection.subTitle} -
-- {skills} -
- ); - })} -- {talkSection.subtitle} -
- {talkSection.talks.map((talk, i) => { - return ( -{repo.node.name}
\n{repo.node.description}
\n{repo.node.primaryLanguage.name}
\n \n )}\n \n \n{repo.node.forkCount}
\n \n \n \n{repo.node.stargazers.totalCount}
\n \n{formatFileSizeDisplay(repo.node.diskUsage)}
\n{contactInfo.subtitle}
\n=g?(i[0]=x[0],i[1]=x[1],i[2]=x[2]):t<=k?(i[0]=a.s[0],i[1]=a.s[1],i[2]=a.s[2]):quaternionToEuler(i,slerp(createQuaternion(a.s),createQuaternion(x),(t-k)/(g-k)));else for(p=0;p p;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),v-=1;f&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-f,!0),v-=f)}for(r=1===this.data.m?0:this._currentCopies-1,a=1===this.data.m?1:-1,n=this._currentCopies;n;){if(k=(i=(e=this.elemsData[r].it)[e.length-1].transform.mProps.v.props).length,e[e.length-1].transform.mProps._mdf=!0,e[e.length-1].transform.op._mdf=!0,e[e.length-1].transform.op.v=1===this._currentCopies?this.so.v:this.so.v+(this.eo.v-this.so.v)*(r/(this._currentCopies-1)),0!==v){for((0!==r&&1===a||r!==this._currentCopies-1&&-1===a)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(y[0],y[1],y[2],y[3],y[4],y[5],y[6],y[7],y[8],y[9],y[10],y[11],y[12],y[13],y[14],y[15]),this.matrix.transform(x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15]),this.matrix.transform(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15]),g=0;g g?x:g,x=-2*S,a="",r=!0,m+=1):a=T,l.chars?(s=l.getCharData(T,k.fStyle,l.getFontByName(t.f).fFamily),v=r?0:s.w*t.finalSize/100):v=l.measureText(a,t.f,t.finalSize)," "===T?F+=v+S:(x+=v+S+F,F=0),h.push({l:v,an:v,add:f,n:r,anIndexes:[],val:a,line:m,animatorJustifyOffset:0}),2==d){if(f+=v,""===a||" "===a||e===i-1){for(""!==a&&" "!==a||(f-=v);p<=e;)h[p].an=f,h[p].ind=u,h[p].extra=v,p+=1;u+=1,f=0}}else if(3==d){if(f+=v,""===a||e===i-1){for(""===a&&(f-=v);p<=e;)h[p].an=f,h[p].ind=u,h[p].extra=v,p+=1;f=0,u+=1}}else h[u].ind=u,h[u].extra=0,u+=1;if(t.l=h,g=x>g?x:g,y.push(x),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=g,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=y;var M,V,B,G,I=c.a;o=I.length;var L=[];for(n=0;n \n {greeting.subTitle}\n {skills.skillName} \n {skillsSection.subTitle}\n \n {skills}\n {exp.Stack} \n {cardInfo.desc}\n \n {bigProjects.subtitle}\n \n {project.projectDesc}\n \n {cardInfo.description}\n \n {achievementSection.subtitle}\n \n {blogSection.subtitle}\n \n {emoji(\"Made with ❤️ by DeveloperFolio Team\")}\n \n Theme by{\" \"}\n \n developerFolio\n \n \n {talkSection.subtitle}\n \n {podcastSection.subtitle}\n \n {school.duration}\n {school.desc} \n {contactInfo.subtitle}\n =f[f.length-1].t-this.offsetTime)r=f[f.length-1].s?f[f.length-1].s[0]:f[f.length-2].e[0],n=!0;else{for(var p,m,y,x=d,g=f.length-1,k=!0;k&&(p=f[x],!((m=f[x+1]).t-this.offsetTime>t));)x=0;a-=1)"tr"===e[a].ty?(n=i[a].transform,this.renderShapeTransform(t,n)):"sh"===e[a].ty||"el"===e[a].ty||"rc"===e[a].ty||"sr"===e[a].ty?this.renderPath(e[a],i[a]):"fl"===e[a].ty?this.renderFill(e[a],i[a],n):"st"===e[a].ty?this.renderStroke(e[a],i[a],n):"gf"===e[a].ty||"gs"===e[a].ty?this.renderGradientFill(e[a],i[a],n):"gr"===e[a].ty?this.renderShape(n,e[a].it,i[a].it):e[a].ty;r&&this.drawLayer()},CVShapeElement.prototype.renderStyledShape=function(t,e){if(this._isFirstFrame||e._mdf||t.transforms._mdf){var i,r,a,n=t.trNodes,o=e.paths,s=o._length;n.length=0;var l=t.transforms.finalTransform;for(a=0;a=1?u=.99:u<=-1&&(u=-.99);var d=c*u,f=Math.cos(h+e.a.v)*d+s[0],p=Math.sin(h+e.a.v)*d+s[1];r=o.createRadialGradient(f,p,0,s[0],s[1],c)}var m=t.g.p,y=e.g.c,x=1;for(n=0;na&&"meet"===s||na&&"slice"===s)?(i-this.transformCanvas.w*(r/this.transformCanvas.h))/2*this.renderConfig.dpr:"xMax"===c&&(na&&"slice"===s)?(i-this.transformCanvas.w*(r/this.transformCanvas.h))*this.renderConfig.dpr:0,this.transformCanvas.ty="YMid"===h&&(n>a&&"meet"===s||na&&"meet"===s||n=0;t-=1)this.elements[t]&&this.elements[t].destroy&&this.elements[t].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRendererBase.prototype.renderFrame=function(t,e){if((this.renderedFrame!==t||!0!==this.renderConfig.clearCanvas||e)&&!this.destroyed&&-1!==t){var i;this.renderedFrame=t,this.globalData.frameNum=t-this.animationItem._isFirstFrame,this.globalData.frameId+=1,this.globalData._mdf=!this.renderConfig.clearCanvas||e,this.globalData.projectInterface.currentFrame=t;var r=this.layers.length;for(this.completeLayers||this.checkLayers(t),i=r-1;i>=0;i-=1)(this.completeLayers||this.elements[i])&&this.elements[i].prepareFrame(t-this.layers[i].st);if(this.globalData._mdf){for(!0===this.renderConfig.clearCanvas?this.canvasContext.clearRect(0,0,this.transformCanvas.w,this.transformCanvas.h):this.save(),i=r-1;i>=0;i-=1)(this.completeLayers||this.elements[i])&&this.elements[i].renderFrame();!0!==this.renderConfig.clearCanvas&&this.restore()}}},CanvasRendererBase.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!==this.layers[t].ty){var i=this.createItem(this.layers[t],this,this.globalData);e[t]=i,i.initExpressions()}},CanvasRendererBase.prototype.checkPendingElements=function(){for(;this.pendingElements.length;)this.pendingElements.pop().checkParenting()},CanvasRendererBase.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRendererBase.prototype.show=function(){this.animationItem.container.style.display="block"},CVContextData.prototype.duplicate=function(){var t=2*this._length,e=0;for(e=this._length;el&&(l=r),(n=t[1]>>e)Can't load? Check privacy protection settings
\n {viewSkills && (\n
\n \n {\" \"}\n {greeting.title}{\" \"}\n {emoji(\"👋\")}\n
\n \n {skillsSection.softwareSkills.map((skills, i) => {\n return (\n
\n \n {skillsSection.title}{\" \"}\n
\n Proficiency
\n {techStack.experience.map((exp, i) => {\n const progressStyle = {\n width: exp.progressPercentage\n };\n return (\n {cardInfo.company}
\n \n {cardInfo.role}\n
\n \n {cardInfo.date}\n
\n \n
\n Experiences
\n Open Source Projects
\n {bigProjects.title}
\n \n {project.projectName}\n
\n \n {cardInfo.title}\n
\n \n {achievementSection.title}\n
\n {blogSection.title}
\n {talkSection.title}
\n {podcastSection.title}
\n {school.schoolName}
\n\n \n {school.subHeader}\n
\n \n
\n Education
\n Can't load? Check privacy protection settings
{contactInfo.title}
\n
\n
\n >\n )}\n \n {contactInfo.email_address}\n \n
\n
\n