Merge branch 'v2' into develop
@@ -1,8 +0,0 @@
|
||||
node_modules
|
||||
git
|
||||
.gitignore
|
||||
.dockerignore
|
||||
Dockerfile*
|
||||
docker-compose*
|
||||
README.md
|
||||
LICENSE
|
||||
@@ -0,0 +1,4 @@
|
||||
.cache
|
||||
package.json
|
||||
package-lock.json
|
||||
public
|
||||
@@ -1,29 +1,31 @@
|
||||
{
|
||||
"parser": "babel-eslint",
|
||||
"parserOptions": {
|
||||
"sourceType": "module",
|
||||
"allowImportExportEverywhere": false,
|
||||
"codeFrame": false
|
||||
},
|
||||
"extends": [
|
||||
"airbnb",
|
||||
"plugin:react/recommended",
|
||||
"prettier",
|
||||
"prettier/react"
|
||||
],
|
||||
"env": {
|
||||
"browser": true,
|
||||
"jest": true
|
||||
"globals": {
|
||||
"atob": true,
|
||||
"Blob": true,
|
||||
"fetch": true,
|
||||
"window": true,
|
||||
"document": true,
|
||||
"FileReader": true,
|
||||
"localStorage": true
|
||||
},
|
||||
"extends": ["airbnb", "prettier"],
|
||||
"plugins": ["prettier"],
|
||||
"rules": {
|
||||
"jsx-a11y/no-static-element-interactions": 0,
|
||||
"jsx-a11y/click-events-have-key-events": 0,
|
||||
"import/no-extraneous-dependencies": ["error", { "devDependencies": true }],
|
||||
"react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
|
||||
"jsx-a11y/label-has-associated-control": 0,
|
||||
"react/jsx-filename-extension": 0,
|
||||
"react/jsx-one-expression-per-line": 0,
|
||||
"react/jsx-props-no-spreading": 0,
|
||||
"prettier/prettier": ["error"],
|
||||
"react/no-array-index-key": 0,
|
||||
"jsx-a11y/anchor-is-valid": 0,
|
||||
"react/button-has-type": 0,
|
||||
"no-unused-expressions": 0,
|
||||
"no-restricted-syntax": 0,
|
||||
"no-param-reassign": 0,
|
||||
"consistent-return": 0,
|
||||
"no-nested-ternary": 0,
|
||||
"react/prop-types": 0,
|
||||
"no-plusplus": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,11 +5,8 @@
|
||||
"targets": {
|
||||
"rx-resume": {
|
||||
"hosting": {
|
||||
"app": [
|
||||
"rx-resume"
|
||||
],
|
||||
"docs": [
|
||||
"docs-rx-resume"
|
||||
"rxresume-staging": [
|
||||
"rxresume-staging"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
open_collective: reactive-resume
|
||||
@@ -1,31 +0,0 @@
|
||||
---
|
||||
name: Bug Report
|
||||
about: Create a report to help us improve
|
||||
title: "[Bug] "
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the Bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**Reproduction**
|
||||
Steps to reproduce the behaviour:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected Behaviour**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. iOS/macOS/Windows 10]
|
||||
- Browser [e.g. Chrome/Safari/Firefox]
|
||||
|
||||
**Additional Context**
|
||||
Add any other context about the problem here.
|
||||
@@ -1,21 +0,0 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Suggest an idea for this project
|
||||
title: "[Feature] "
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is.
|
||||
Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
@@ -1,25 +0,0 @@
|
||||
name: Build & Deploy
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build & Deploy
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout GitHub Repository
|
||||
uses: actions/checkout@v2.0.0
|
||||
- name: Install Project Dependencies
|
||||
run: npm install
|
||||
- name: Build App
|
||||
run: npm run build
|
||||
- name: Build Documentation
|
||||
run: npm run docs:build
|
||||
- name: Deploy to Firebase Hosting
|
||||
uses: w9jds/firebase-action@v1.3.0
|
||||
with:
|
||||
args: deploy --only hosting
|
||||
env:
|
||||
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
|
||||
@@ -1,30 +1,73 @@
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# firebase
|
||||
.firebase
|
||||
|
||||
# tailwind
|
||||
tailwind.css
|
||||
|
||||
# vuepress
|
||||
docs/.vuepress/dist
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Typescript v1 declaration files
|
||||
typings/
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# dotenv environment variable files
|
||||
.env*
|
||||
|
||||
# gatsby files
|
||||
.cache/
|
||||
public
|
||||
|
||||
# Firebase Files
|
||||
.firebase
|
||||
|
||||
# Mac files
|
||||
.DS_Store
|
||||
|
||||
# Yarn
|
||||
yarn-error.log
|
||||
.pnp/
|
||||
.pnp.js
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
.cache
|
||||
package.json
|
||||
package-lock.json
|
||||
public
|
||||
@@ -1,7 +1,5 @@
|
||||
{
|
||||
"printWidth": 100,
|
||||
"trailingComma": "all",
|
||||
"tabWidth": 2,
|
||||
"semi": true,
|
||||
"singleQuote": true
|
||||
}
|
||||
"singleQuote": true,
|
||||
"trailingComma": "all"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
{
|
||||
"i18n-ally.localesPaths": "src/i18n",
|
||||
"files.associations": {
|
||||
"*.js": "javascriptreact"
|
||||
},
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll": true
|
||||
},
|
||||
"i18n-ally.localesPaths": [
|
||||
"src/i18n/locales"
|
||||
],
|
||||
"i18n-ally.keystyle": "nested"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
## build image
|
||||
FROM node:13.12.0-alpine as build
|
||||
|
||||
## set working directory
|
||||
WORKDIR /usr/src/app
|
||||
|
||||
## add `/usr/src/app/node_modules/.bin` to $PATH
|
||||
ENV PATH /usr/src/app/node_modules/.bin:$PATH
|
||||
|
||||
## install and cache app dependencies
|
||||
COPY package.json /usr/src/app/package.json
|
||||
|
||||
## install git
|
||||
RUN apk add --no-cache git
|
||||
|
||||
## install app dependencies
|
||||
RUN npm install
|
||||
|
||||
## copy files
|
||||
COPY . /usr/src/app
|
||||
|
||||
## build production app
|
||||
RUN npm run build
|
||||
|
||||
## production environment
|
||||
FROM nginx:1.17.9-alpine
|
||||
|
||||
## copy build artifacts to nginx
|
||||
COPY --from=build /usr/src/app/build /usr/share/nginx/html
|
||||
|
||||
## copy custom nginx config
|
||||
RUN rm /etc/nginx/conf.d/default.conf
|
||||
COPY nginx/nginx.conf /etc/nginx/conf.d
|
||||
|
||||
## export port 80
|
||||
EXPOSE 80
|
||||
|
||||
## run nginx server
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
@@ -1,20 +0,0 @@
|
||||
## base image
|
||||
FROM node:13.12.0-alpine
|
||||
|
||||
## set working directory
|
||||
WORKDIR /usr/src/app
|
||||
|
||||
## add `/usr/src/app/node_modules/.bin` to $PATH
|
||||
ENV PATH /usr/src/app/node_modules/.bin:$PATH
|
||||
|
||||
## install and cache app dependencies
|
||||
COPY package.json /usr/src/app/package.json
|
||||
|
||||
## install git
|
||||
RUN apk add --no-cache git
|
||||
|
||||
## install app dependencies
|
||||
RUN npm install
|
||||
|
||||
## start app
|
||||
CMD ["npm", "start"]
|
||||
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 Amruth Pillai
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,17 +1,69 @@
|
||||
### v2 is under-development, [read more](https://dev.to/amruthpillai/redesigning-reactive-resume-and-i-need-your-inputs-5ga6)
|
||||
<img src="https://rxresu.me/images/logo.png" width="256px" />
|
||||
|
||||
<img src="https://i.imgur.com/4eps4gP.png" alt="Reactive Resume" width="256px" height="256px"/>
|
||||
## A free and open source resume builder.
|
||||
|
||||
# Reactive Resume
|
||||
|
||||
[](https://github.com/AmruthPillai/Reactive-Resume/actions)
|
||||

|
||||
[](https://hub.docker.com/r/amruthpillai/reactive-resume)
|
||||
[](https://crowdin.com/project/reactive-resume)
|
||||
[](https://github.com/AmruthPillai/Reactive-Resume/blob/develop/LICENSE)
|
||||
|
||||
#### A Free and Open-Source Resume Builder That Respects Your Privacy
|
||||
### [Go to App](https://rxresu.me/)
|
||||
|
||||
Welcome to the front page of **Reactive Resume**, a free and open-source Resume Builder web app that focuses on one thing, **Privacy**. And also few other important features such as minimalistic UI/UX, customizability, portability, regularly updated templates, etc. But the important thing is that, your personal data is yours alone.
|
||||
### What is this app all about?
|
||||
|
||||
### [Go to App](https://rxresu.me/) | [Documentation](https://docs.rxresu.me/)
|
||||
Reactive Resume is a free and open source resume builder that’s built to make the mundane tasks of creating, updating and sharing your resume as easy as 1, 2, 3. With this app, you can create multiple resumes, share them with recruiters through a unique link and print as PDF, all for free, no advertisements, without losing the integrity and privacy of your data.
|
||||
|
||||
You have complete control over what goes into your resume, how it looks, what colors, what templates, even the layout in which sections placed. Want a dark mode resume? It’s as easy as editing 3 values and you’re done. You don’t need to wait to see your changes either. Everything you type, everything you change, appears immediately on your resume and gets updated in real time.
|
||||
|
||||
### Features
|
||||
|
||||
- Manage multiple resumes with one account
|
||||
- Sync your data across devices
|
||||
- Sign in with Google, or sign in anonymously just to test the app
|
||||
- Send your resume to others with a unique sharable link
|
||||
- Choose from 6 vibrant templates and more coming soon
|
||||
- Structure sections and change layouts the way you want to
|
||||
- Mix and match colors to any degree, even a dark mode resume?
|
||||
- Pick from a variety of crisp and clear fonts
|
||||
- Easy to translate to your own language
|
||||
- Import your existing [JSON Resume](https://jsonresume.org/) in one click
|
||||
- No advertisements, no data sharing, no marketing emails
|
||||
- **Everything is free, and there’s no catch!**
|
||||
|
||||
### Screenshots
|
||||
|
||||
<img src="https://rxresu.me/images/screenshots/screen-1.png" width="400px" />
|
||||
|
||||
<img src="https://rxresu.me/images/screenshots/screen-3.png" width="400px" />
|
||||
|
||||
<img src="https://rxresu.me/images/screenshots/screen-5.png" width="400px" />
|
||||
|
||||
### Tech Stack
|
||||
|
||||
- GatsbyJS
|
||||
- GraphQL
|
||||
- Firebase
|
||||
- Lodash
|
||||
- Ajv
|
||||
|
||||
### Translation
|
||||
|
||||
To translate the app, just fork the repository, go to `src/i18n/locales` and duplicate the `en.json` file to a new file `your-lang-code.json` and translate all of the strings inside. It's a simple process that would take just a few minutes, and by contributing, your name could also be added down below as a contributor!
|
||||
|
||||
#### Languages Currently Supported
|
||||
|
||||
- English
|
||||
- Kannada (ಕನ್ನಡ) (by @AmruthPillai)
|
||||
|
||||
### Donation
|
||||
|
||||
I try to do what I can, but if you found the app helpful, or you're in a better position than the others who depend on this project for their first job, please consider donating as little as $5 to help keep the project alive :)
|
||||
|
||||
#### https://www.buymeacoffee.com/AmruthPillai
|
||||
|
||||
### Appreciation
|
||||
|
||||
Thank you to everyone who made this project possible, including the many users who voiced their opinions, created issues and PRs to the original Reactive Resume project, and helped me along the way to make this a reality. I hope I find your support in this version too! :)
|
||||
|
||||
---
|
||||
|
||||

|
||||
|
||||
###### Made with Love by [Amruth Pillai](https://amruthpillai.com/)
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "Reactive Resume",
|
||||
"description": "A one-of-a-kind resume builder that's not out to get your data. Completely secure, customizable, portable, open-source and free forever.",
|
||||
"website": "https://rxresu.me/",
|
||||
"repository": "https://github.com/AmruthPillai/Reactive-Resume",
|
||||
"logo": "https://i.imgur.com/ugpElge.png",
|
||||
"buildpacks": [
|
||||
{
|
||||
"url": "mars/create-react-app"
|
||||
}
|
||||
],
|
||||
"keywords": ["react", "resume", "static"]
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
files:
|
||||
- source: /src/i18n/locales/en/**/*.json
|
||||
translation: /src/i18n/locales/%two_letters_code%/**/%original_file_name%
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"rules": {
|
||||
"resumes": {
|
||||
".indexOn": "user",
|
||||
".read": "auth !== null && query.orderByChild === 'user' && query.equalTo === auth.uid",
|
||||
"$rid": {
|
||||
".read": "data.child('public').val() === true || data.child('user').val() === auth.uid",
|
||||
".write": " !data.exists() || data.child('user').val() === auth.uid || (!newData.exists() && data.child('user').val() === auth.uid)"
|
||||
}
|
||||
},
|
||||
"users": {
|
||||
"$uid": {
|
||||
".read": "$uid === auth.uid",
|
||||
".write": "$uid === auth.uid"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
version: '3.7'
|
||||
|
||||
services:
|
||||
reactive-resume:
|
||||
container_name: reactive-resume
|
||||
tty: true
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile-dev
|
||||
volumes:
|
||||
- '.:/usr/src/app'
|
||||
- '/usr/src/app/node_modules'
|
||||
expose:
|
||||
- '3001'
|
||||
ports:
|
||||
- '3001:3000'
|
||||
environment:
|
||||
- NODE_ENV=development
|
||||
- CHOKIDAR_USEPOLLING=true
|
||||
@@ -1,12 +0,0 @@
|
||||
version: '3.7'
|
||||
|
||||
services:
|
||||
reactive-resume:
|
||||
container_name: reactive-resume
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
expose:
|
||||
- '80'
|
||||
ports:
|
||||
- '80:80'
|
||||
@@ -1,41 +0,0 @@
|
||||
<template>
|
||||
<div class="contributors">
|
||||
<div v-for="i in items">
|
||||
<a :href="i.html_url" target="_blank" rel="noopener noreferrer">
|
||||
<img :src="i.avatar_url" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
const axios = require('axios');
|
||||
const repo = 'AmruthPillai/Reactive-Resume';
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
items: [],
|
||||
};
|
||||
},
|
||||
beforeMount() {
|
||||
axios
|
||||
.get(`https://api.github.com/repos/${repo}/contributors`)
|
||||
.then(response => {
|
||||
this.$data.items = response.data;
|
||||
})
|
||||
.catch(error => {
|
||||
console.log(error);
|
||||
});
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.contributors {
|
||||
margin-top: 20px;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(10, minmax(0, 1fr));
|
||||
gap: 1rem;
|
||||
}
|
||||
</style>
|
||||
@@ -1,33 +0,0 @@
|
||||
module.exports = {
|
||||
title: 'Reactive Resume',
|
||||
description:
|
||||
"A one-of-a-kind resume builder that's not out to get your data. Completely secure, customizable, portable, open-source and free forever.",
|
||||
themeConfig: {
|
||||
logo: '/logo.png',
|
||||
repo: 'AmruthPillai/Reactive-Resume',
|
||||
nav: [
|
||||
{ text: 'Home', link: '/' },
|
||||
{ text: 'Go to App', link: 'https://rxresu.me/' },
|
||||
],
|
||||
sidebar: [
|
||||
'/',
|
||||
'/features/',
|
||||
'/templates/',
|
||||
'/technology/',
|
||||
'/contributing/',
|
||||
'/translation/',
|
||||
'/building-from-source/',
|
||||
'/deployment/',
|
||||
'/changelog/',
|
||||
],
|
||||
smoothScroll: true,
|
||||
},
|
||||
plugins: [
|
||||
[
|
||||
'@vuepress/google-analytics',
|
||||
{
|
||||
ga: 'UA-161860275-1',
|
||||
},
|
||||
],
|
||||
],
|
||||
};
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,29 +0,0 @@
|
||||
---
|
||||
title: Home
|
||||
---
|
||||
|
||||
<img src="./images/logo.png" width="256px">
|
||||
|
||||
# Reactive Resume
|
||||
|
||||
#### A Free and Open-Source Resume Builder That Respects Your Privacy
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
Welcome to the front page of **Reactive Resume**, a free and open-source Resume Builder web app that focuses on one thing, **Privacy**. And also few other important features such as minimalistic UI/UX, customizability, portability, regularly updated templates, etc. But the important thing is that, your personal data is yours alone.
|
||||
|
||||
We're going to use this coveted space to discuss about the features of the application, new changes that were introduced since the release and also other information like how to keep the project running through donations and open-source code contribution.
|
||||
|
||||
Let's begin, shall we?
|
||||
|
||||
## Links of Interest
|
||||
|
||||
- [Web App ](https://rxresu.me/)
|
||||
- [GitHub Repository ](https://github.com/AmruthPillai/Reactive-Resume)
|
||||
- [Open Collective ](https://opencollective.com/reactive-resume)
|
||||
- [Product Hunt ](https://www.producthunt.com/posts/reactive-resume)
|
||||
- [Hacker News ](https://news.ycombinator.com/item?id=22709183)
|
||||
@@ -1,86 +0,0 @@
|
||||
---
|
||||
title: Building from Source
|
||||
---
|
||||
|
||||
# Building from Source
|
||||
|
||||
So, you would like to run the project on your local machine, or your own network server? You've come to the right place. It takes about 5-6 minutes to get the project running on your local, and this is how:
|
||||
|
||||
## Building the App
|
||||
|
||||
### 1. Install Node.js & NPM
|
||||
|
||||
You might have already setup Node.js on your system before, but in case you haven't, this is where you can download and install the required applications from: [nodejs.org ](https://nodejs.org/en/)
|
||||
|
||||
Verify whether you are able to run `node` and `npm` commands on your command line:
|
||||
|
||||
```
|
||||
> node -v
|
||||
v13.11.0
|
||||
|
||||
> npm -v
|
||||
6.14.4
|
||||
```
|
||||
|
||||
### 2. Clone the Repository
|
||||
|
||||
Download the repository as an archive from GitHub, or clone the repository from the command line depending on whether you require the latest updates or not.
|
||||
|
||||
```
|
||||
wget https://github.com/AmruthPillai/Reactive-Resume/archive/master.zip
|
||||
```
|
||||
|
||||
<p style="text-align: center">
|
||||
<strong>OR</strong>
|
||||
</p>
|
||||
|
||||
```
|
||||
git clone https://github.com/AmruthPillai/Reactive-Resume.git
|
||||
cd Reactive-Resume
|
||||
```
|
||||
|
||||
### 3. Install Project Dependencies
|
||||
|
||||
Install the dependencies required for the project to run. For a bird's eye view of all the dependencies it would install, you can check `package.json`.
|
||||
|
||||
```
|
||||
npm install
|
||||
```
|
||||
|
||||
### 4. Start the Development Server
|
||||
|
||||
You can run the project locally to check if everything is working alright, through this command:
|
||||
|
||||
```
|
||||
npm start
|
||||
```
|
||||
|
||||
### 5. Build Production App
|
||||
|
||||
This will produce a production version of the app and return a folder `build` which contains static files ready to be uploaded on the web. For more info on how to deploy, go to the Deployment page.
|
||||
|
||||
```
|
||||
npm build
|
||||
```
|
||||
|
||||
## Building the Documentation
|
||||
|
||||
### 1. Follow Steps 1 - 3 from [Building the App](#building-the-app)
|
||||
|
||||
The initial steps to build and install the documentation server is similar to how you would build the app, as both of them reside in a monorepo.
|
||||
|
||||
### 2. Start the Development Server
|
||||
|
||||
You can edit the documentation and run it locally using this command:
|
||||
|
||||
```
|
||||
npm run docs:dev
|
||||
```
|
||||
|
||||
### 3. Build Static Documentation
|
||||
|
||||
This will produce static files under the folder `docs/.vuepress/dist`. This folder can be uploaded anywhere such as Shared Hosting/Firebase/Netlify/Cloud etc.
|
||||
|
||||
```
|
||||
npm run docs:build
|
||||
```
|
||||
@@ -1,154 +0,0 @@
|
||||
---
|
||||
title: Changelog
|
||||
---
|
||||
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## June 2020
|
||||
|
||||
- Added Language: Russian
|
||||
|
||||
## May 2020
|
||||
|
||||
### May 6, 2020
|
||||
|
||||
- Fix Demo Data not including Hobbies section
|
||||
- Updated translations for all languages
|
||||
- Added Language: Hebrew
|
||||
- Added Language: Italian
|
||||
|
||||
## April 2020
|
||||
|
||||
### April 28, 2020
|
||||
|
||||
- Added Feature to Reorder Skills/Hobbies
|
||||
- Added Hobbies Section to Left Sidebar
|
||||
- Updated Templates to Add Hobbies
|
||||
|
||||
### April 23, 2020
|
||||
|
||||
- Fix Issue with Page Controller Icon Size
|
||||
- Fix Issue with Checkbox Icon Toggle
|
||||
|
||||
### April 23, 2020
|
||||
|
||||
- Transfer all external resources to local, self-host everything
|
||||
- Shorten entry animation by a second
|
||||
- Optimize Images through `imgbot`
|
||||
|
||||
### April 22, 2020
|
||||
|
||||
- Display Original Language Name alongside English Language Name
|
||||
- Added Language: Tamil
|
||||
- Added Language: Vietnamese
|
||||
|
||||
### April 17, 2020
|
||||
|
||||
- Updated Dependencies across App
|
||||
- Added Language: Arabic
|
||||
|
||||
### April 16, 2020
|
||||
|
||||
- Brought Back Browser Print Method, you can now print parseable resumes
|
||||
- Modified Templates to use ID as Key in items, instead of names
|
||||
- Added Language: Polish
|
||||
|
||||
### April 11, 2020
|
||||
|
||||
- Added Language: Danish
|
||||
- Added Language: Dutch
|
||||
- Added Language: Portuguese
|
||||
|
||||
### April 10, 2020
|
||||
|
||||
- Bugfix: Photo not visible in PDF export, Celebi
|
||||
|
||||
### April 8, 2020
|
||||
|
||||
- Added Language: Spanish
|
||||
|
||||
### April 6, 2020
|
||||
|
||||
- Designed Celebi Template
|
||||
|
||||
### April 5, 2020
|
||||
|
||||
- Added Print Dialog to set Quality & Print Type before Exporting PDF
|
||||
- Added Pan-Zoom Animation to indicate the artboard is interactive
|
||||
|
||||
### April 3, 2020
|
||||
|
||||
- Added Language: German
|
||||
|
||||
### April 2, 2020
|
||||
|
||||
- Fix type in Contributing section of Documentation
|
||||
- Fix issue where PDF was printing in A4, instead print whole page
|
||||
- Fix Castform Templates not updating when Skills Heading is updated
|
||||
|
||||
### April 1, 2020
|
||||
|
||||
- Designed Glalie Template
|
||||
- Added Page Controller for Quick Actions
|
||||
- Implemented `react-easy-panzoom` for Pan & Zoom abilities in the artboard
|
||||
- Added Language: Chinese
|
||||
|
||||
## March 2020
|
||||
|
||||
### March 31, 2020
|
||||
|
||||
- Migrated to PDF Generation using `html2canvas` & `jsPDF`
|
||||
- Added Language: French
|
||||
- Added Language: Kannada
|
||||
|
||||
### March 30, 2020
|
||||
|
||||
- Dockerize App for Faster Development/Deployments
|
||||
- Added Translation Systems
|
||||
- Added Language: Hindi
|
||||
|
||||
### March 29, 2020
|
||||
|
||||
- Add Issue Templates in GitHub for Bug Reports and Feature Requests
|
||||
- Revised Documentation in VuePress
|
||||
- Add Google Analytics to VuePress Documentation
|
||||
- Implement "Deploy to Netlify" button, by [hwang381](https://github.com/hwang381)
|
||||
|
||||
### March 28, 2020
|
||||
|
||||
- Add About Tab in the Right Sidebar
|
||||
- JSON Migration Bugfix, by [Panzki](https://github.com/Panzki)
|
||||
- Designed Castform Template
|
||||
|
||||
### March 27, 2020
|
||||
|
||||
- Add Google Site Verification Tag
|
||||
- Fix bug with Gengar Template not respecting enable values
|
||||
- Add Language & References Section to Resumes
|
||||
- Update Onyx, Pikachu & Gengar Templates
|
||||
- Add Nunito Font, removed few other fonts
|
||||
- Add Entry Animation using [animate.css](https://daneden.github.io/animate.css/)
|
||||
- Fix Awkward Page Breaks in Resume when Printing
|
||||
- Make Links Clickable in the Resume PDF
|
||||
|
||||
### March 26, 2020
|
||||
|
||||
- Fix bug in Pikachu Template where photo was not visible
|
||||
- Add option to enter any font family stored locally on system
|
||||
- Allow printing of more than one page
|
||||
- Add Markdown Support to Descriptions
|
||||
- Designed Gengar Template
|
||||
|
||||
### March 25, 2020
|
||||
|
||||
- Released App to Public through Firebase Hosting
|
||||
- Add Firebase Analytics
|
||||
- Add Progressive Web App Caching
|
||||
- Designed Pikachu Template
|
||||
|
||||
### March 24, 2020
|
||||
|
||||
- Initiating Development of App
|
||||
- Designed Onyx Template
|
||||
@@ -1,43 +0,0 @@
|
||||
---
|
||||
title: Contributing
|
||||
---
|
||||
|
||||
# Contributing
|
||||
|
||||
I've tried to make the project as simple and accessible to everyone: developers, translators and users alike. The project grows in quality and features through your feedback and support, so please do reach out to me whenever you have a new feature request, or when you find a bug, and we as a team will get it squashed as soon as possible.
|
||||
|
||||
**Here are a few ways you can contribute to the project:**
|
||||
|
||||
## Donate/Sponsor
|
||||
|
||||
This is an open that's open to most. Even the smallest donation can help the project thrive and keep the website running. I didn't think I would ever reach my Firebase Hosting limits until I released this project, and it makes me both worried and happy.
|
||||
|
||||
If you would like to support the development and uptime of the project, you can donate through Open Collective, which is a recognized non-profit organization that funnels in donations only to those who are verified. For example, every time you donate, I get the money only after I show an invoice related to the project expense. So you have complete transparency in where your money is going.
|
||||
|
||||
[Donate on Open Collective ](https://opencollective.com/reactive-resume)
|
||||
|
||||
## Find & Report Bugs
|
||||
|
||||
This is quite possible the easiest of the options, other than donating. All you have to do is keep using the app and if you run into any trouble, just let me know by raising an issue on GitHub. The progress of fixing that bug can be tracked from there.
|
||||
|
||||
[Raise an Issue on GitHub ](https://github.com/AmruthPillai/Reactive-Resume/issues/new/choose)
|
||||
|
||||
## Request New Features
|
||||
|
||||
Something that's missing on the app that's halting your progress from making the best version of your resume? Let us know and we'll try and implement that for you. GitHub's Issue Tracking System is pretty flexible when it comes to things like these, so all you need to do to suggest a new feature is raise an issue on GitHub with the Feature Request template.
|
||||
|
||||
[Raise an Issue on GitHub ](https://github.com/AmruthPillai/Reactive-Resume/issues/new/choose)
|
||||
|
||||
## Translation
|
||||
|
||||
Translating the app into your language has never been easier. Thanks to [Crowdin](https://crowdin.com/), a localization management tool, anyone can translate strings without having to mess around with a bunch of files. For information on how to translate the app into your own language, please visit the [Translation Secion](/translation/) of the documentation.
|
||||
|
||||
## Commit Code
|
||||
|
||||
If you are a developer, and a ReactJS developer at that, then you're in demand! Take a look at the code and see how you can make it better, cause I definitely would have made a lot of mistakes. You can setup test cases or extract a particular section of code into a function to improve code reuse. All you need to do is fork the repository on GitHub, make your changes and submit a Pull Request for the same and we'll review it.
|
||||
|
||||
[GitHub Repository ](https://github.com/AmruthPillai/Reactive-Resume)
|
||||
|
||||
## GitHub Contributors
|
||||
|
||||
<GitHubContributors />
|
||||
@@ -1,57 +0,0 @@
|
||||
---
|
||||
title: Deployment
|
||||
---
|
||||
|
||||
# Deployment
|
||||
|
||||
You've built the source code successfully and now you're on your way to deploying the app. There are some methods setup to deploy a version of the app without even having to build the source, so we'll run through all the steps here:
|
||||
|
||||
## Docker
|
||||
|
||||
If you are a fan of Docker as I am, you'd be happy to know that the app can be set up and running within seconds thanks to having set up both environments of Docker.
|
||||
|
||||
If you would like to run the **development server** through Docker, which also supports hot-reloads, just run:
|
||||
|
||||
```
|
||||
npm run docker:dev
|
||||
OR
|
||||
docker-compose -f docker-compose-dev.yml up -d --build
|
||||
```
|
||||
|
||||
If you would like to run the **production version of the app**, powered by NGINX, just run:
|
||||
|
||||
```
|
||||
npm run docker
|
||||
OR
|
||||
docker-compose up -d --build
|
||||
```
|
||||
|
||||
You can also alternatively pull the image from [Docker Hub](https://hub.docker.com/r/amruthpillai/reactive-resume) where the latest image is always built from source control.
|
||||
|
||||
```
|
||||
docker pull amruthpillai/reactive-resume
|
||||
```
|
||||
|
||||
## Deploying to Heroku
|
||||
|
||||
Heroku is a cloud platform that lets companies build, deliver, monitor and scale apps — we're the fastest way to go from idea to URL, bypassing all those infrastructure headaches.
|
||||
|
||||
[](https://heroku.com/deploy?template=https://github.com/AmruthPillai/Reactive-Resume)
|
||||
|
||||
## Deploying to Netlify
|
||||
|
||||
Used by more than 800,000 web developers and businesses, the Netlify platform provides modern build workflows, serverless functions and a global Application Delivery Network to deliver the most performant, secure and scalable websites and applications.
|
||||
|
||||
[](https://app.netlify.com/start/deploy?repository=https://github.com/AmruthPillai/Reactive-Resume)
|
||||
|
||||
## Deploy to Synology NAS
|
||||
|
||||
**NAS Hosted** has written a great tutorial on how to deploy the app on Synology NAS,
|
||||
read more about it here: [Host your own Resume Builder on Synology using Docker](https://nashosted.com/host-your-own-resume-builder-on-synology-using-docker/)
|
||||
|
||||
## Deploy to Shared Hosting/VPS
|
||||
|
||||
Here, you're kinda on your own as there are no one-click buttons to help you through, but it's a simple process. Once you've built the app, you can copy the contents of the `build` folder to your `public_html` folder and you will have the app running on your designated domain or IP address.
|
||||
|
||||
Here is a great tutorial on how to set up a web server on your machine by DigitalOcean:
|
||||
[How To Install Nginx on Ubuntu 18.04 ](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04)
|
||||
@@ -1,59 +0,0 @@
|
||||
---
|
||||
title: Features
|
||||
---
|
||||
|
||||
# Features
|
||||
|
||||
I've tried to maintain some core principles to the app that will always remain unchanged, just to set a fixed direction in which development and ideas can move forward.
|
||||
|
||||
<p style="text-align: center">
|
||||
<iframe width="100%" height="420" src="https://www.youtube.com/embed/4OM0LEPzDO8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||
</p>
|
||||
|
||||
## Secure
|
||||
|
||||

|
||||
|
||||
It is entirely secure, as in, your information never leaves the browser, powered by web technologies (HTML5 Local Storage API) that allow for data to be stored locally and quickly.
|
||||
|
||||
## Offline
|
||||
|
||||

|
||||
|
||||
The app is a PWA and also has no connection to any servers, thus keeping it entirely offline. It survives refreshes, disconnections, and can also be exported or imported through JSON.
|
||||
|
||||
## Customizable
|
||||
|
||||

|
||||
|
||||
Choose your fonts, play with the colors, pick any layout by merely enabling/disabling sections. A simple and easy to use interface that helps you get a resume in no time!
|
||||
|
||||
## Templates
|
||||
|
||||

|
||||
|
||||
I've been continuously designing new templates and will be releasing new ones as I have the time. Please support development by using the app and leaving a like/comment or sharing it with your peers.
|
||||
|
||||
## Portable
|
||||
|
||||

|
||||
|
||||
Your information can be exported to JSON and imported back into the application from anywhere, all you need is your JSON file. This feature makes it easy to update your resume, upload your file (or have it preloaded from local storage), edit the resume and download it again or print it as PDF.
|
||||
|
||||
## Minimalistic Design
|
||||
|
||||

|
||||
|
||||
As a designer, I felt I had to put this over the top of all other features. Built with minimalism and minimal interaction in mind, it looks clean, is simple to use, and I only hope to make the process more streamlined through your inputs and feedback.
|
||||
|
||||
## Progressive Web App
|
||||
|
||||

|
||||
|
||||
The web app is responsive, which means you can edit your resume on your phone as well and even install it as an app if you're on Android/Chrome. The app is quick to load and would also work if your internet is disconnected.
|
||||
|
||||
## Free and Open-Source
|
||||
|
||||

|
||||
|
||||
As with all my projects, I made the app only to help others, so it will always remain free, and I would not be monetizing on it at any point. But if you do feel generous, [I'm open to donations](https://opencollective.com/reactive-resume).
|
||||
|
Before Width: | Height: | Size: 396 KiB |
|
Before Width: | Height: | Size: 374 KiB |
|
Before Width: | Height: | Size: 362 KiB |
|
Before Width: | Height: | Size: 331 KiB |
|
Before Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 224 KiB |
|
Before Width: | Height: | Size: 491 KiB |
|
Before Width: | Height: | Size: 404 KiB |
|
Before Width: | Height: | Size: 367 KiB |
|
Before Width: | Height: | Size: 32 KiB |
@@ -1,69 +0,0 @@
|
||||
---
|
||||
title: Technology
|
||||
---
|
||||
|
||||
# Technology
|
||||
|
||||
A credit to all the projects and open source packages that have helped during the building of this project. Truly, without these projects, Reactive Resume wouldn't exist.
|
||||
|
||||
## ReactJS + Hooks 🎉
|
||||
|
||||
React makes it painless to create interactive UIs. Design simple views for each state in your application, and React will efficiently update and render just the right components when your data changes.
|
||||
|
||||
Hooks solve a wide variety of seemingly unconnected problems in React that we’ve encountered over five years of writing and maintaining tens of thousands of components. Whether you’re learning React, use it daily, or even prefer a different library with a similar component model, you might recognize some of these problems.
|
||||
|
||||
[Learn more → ](https://reactjs.org/)
|
||||
|
||||
## Tailwind CSS
|
||||
|
||||
Tailwind CSS is a highly customizable, low-level CSS framework that gives you all of the building blocks you need to build bespoke designs without any annoying opinionated styles you have to fight to override.
|
||||
|
||||
[Learn more → ](https://tailwindcss.com/)
|
||||
|
||||
## Lodash
|
||||
|
||||
A modern JavaScript utility library delivering modularity, performance & extras. Lodash makes JavaScript easier by taking the hassle out of working with arrays, numbers, objects, strings, etc.
|
||||
|
||||
[Learn more → ](https://lodash.com/)
|
||||
|
||||
## html2canvas
|
||||
|
||||
The script allows you to take "screenshots" of webpages or parts of it, directly on the users browser. The screenshot is based on the DOM and as such may not be 100% accurate to the real representation as it does not make an actual screenshot, but builds the screenshot based on the information available on the page.
|
||||
|
||||
[Learn more → ](https://github.com/niklasvh/html2canvas)
|
||||
|
||||
## jsPDF
|
||||
|
||||
A library to generate PDFs in JavaScript.
|
||||
|
||||
[Learn more → ](https://github.com/MrRio/jsPDF)
|
||||
|
||||
## Google Fonts
|
||||
|
||||
Google Fonts is a great repository of open type fonts that are allowed to be used on the web. Reactive Resume uses Google Fonts to load different font families and allow the user to choose which font he/she would like on their resume.
|
||||
|
||||
[Learn more → ](https://fonts.google.com/)
|
||||
|
||||
## Material Icons
|
||||
|
||||
Material icons are delightful, beautifully crafted symbols for common actions and items. Download on desktop to use them in your digital products for Android, iOS, and web.
|
||||
|
||||
[Learn more → ](https://material.io/resources/icons/)
|
||||
|
||||
## PostCSS
|
||||
|
||||
PostCSS is a tool for transforming styles with JS plugins. These plugins can lint your CSS, support variables and mixins, transpile future CSS syntax, inline images, and more.
|
||||
|
||||
[Learn more → ](https://postcss.org/)
|
||||
|
||||
## PurgeCSS
|
||||
|
||||
PurgeCSS analyzes your content and your css files. Then it matches the selectors used in your files with the one in your content files. It removes unused selectors from your css, resulting in smaller css files.
|
||||
|
||||
[Learn more → ](https://github.com/FullHuman/purgecss)
|
||||
|
||||
## VuePress
|
||||
|
||||
VuePress is what made this documentation possible, with it's clean design and quick setup as well as the ability to use markdown to generate content, VuePress seemed like the best way to set up a cleaner documentation.
|
||||
|
||||
[Learn more → ](https://vuepress.vuejs.org/)
|
||||
@@ -1,33 +0,0 @@
|
||||
---
|
||||
title: Templates
|
||||
---
|
||||
|
||||
# Templates
|
||||
|
||||
<div style="display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem;
|
||||
">
|
||||
<div>
|
||||
<h2 id="onyx"><a href="#onyx" class="header-anchor">#</a> Onyx</h2>
|
||||
<img src="./images/Onyx.png" />
|
||||
</div>
|
||||
<div>
|
||||
<h2 id="pikachu"><a href="#pikachu" class="header-anchor">#</a> Pikachu</h2>
|
||||
<img src="./images/Pikachu.png" />
|
||||
</div>
|
||||
<div>
|
||||
<h2 id="gengar"><a href="#gengar" class="header-anchor">#</a> Gengar</h2>
|
||||
<img src="./images/Gengar.png" />
|
||||
</div>
|
||||
<div>
|
||||
<h2 id="castform"><a href="#castform" class="header-anchor">#</a> Castform</h2>
|
||||
<img src="./images/Castform.png" />
|
||||
</div>
|
||||
<div>
|
||||
<h2 id="glalie"><a href="#glalie" class="header-anchor">#</a> Glalie</h2>
|
||||
<img src="./images/Glalie.png" />
|
||||
</div>
|
||||
<div>
|
||||
<h2 id="celebi"><a href="#celebi" class="header-anchor">#</a> Celebi</h2>
|
||||
<img src="./images/Celebi.png" />
|
||||
</div>
|
||||
</div>
|
||||
|
Before Width: | Height: | Size: 374 KiB |
|
Before Width: | Height: | Size: 400 KiB |
|
Before Width: | Height: | Size: 391 KiB |
|
Before Width: | Height: | Size: 335 KiB |
|
Before Width: | Height: | Size: 302 KiB |
|
Before Width: | Height: | Size: 390 KiB |
@@ -1,133 +0,0 @@
|
||||
---
|
||||
title: Translation
|
||||
---
|
||||
|
||||
# Translation
|
||||
|
||||
Translating the app into your own language has never been easier. The project makes use of a powerful online tool called [Crowdin](https://crowdin.com/) to help manage translations and updates made to the app.
|
||||
|
||||
::: tip TL;DR
|
||||
If you are already familiar with the Crowdin platform and want to contribute your time to translating a few strings, just head to the link below and get started!
|
||||
|
||||
### **[translate.rxresu.me](https://translate.rxresu.me/)**
|
||||
|
||||
:::
|
||||
|
||||
## Current Status
|
||||
|
||||
### Completed Translations
|
||||
|
||||
- Arabic `ar`
|
||||
- Chinese Simplified `zh`
|
||||
- Danish `da`
|
||||
- Dutch `nl`
|
||||
- English `en`
|
||||
- French `fr`
|
||||
- German `de`
|
||||
- Hebrew `he`
|
||||
- Hindi `hi`
|
||||
- Italian `it`
|
||||
- Kannada `kn`
|
||||
- Polish `pl`
|
||||
- Portuguese `pt`
|
||||
- Russian `ru`
|
||||
- Spanish `es`
|
||||
- Tamil `ta`
|
||||
- Vietnamese `vi`
|
||||
|
||||
### Pending Translations
|
||||
|
||||
- Afrikaans `af`
|
||||
- Assamese `as`
|
||||
- Catalan `ca`
|
||||
- Czech `cs`
|
||||
- Finnish `fi`
|
||||
- Greek `el`
|
||||
- Hebrew `he`
|
||||
- Hungarian `hu`
|
||||
- Japanese `ja`
|
||||
- Korean `ko`
|
||||
- Malayalam `ml`
|
||||
- Marathi `mr`
|
||||
- Norwegian `no`
|
||||
- Punjabi `pa`
|
||||
- Romanian `ro`
|
||||
- Swedish `sv`
|
||||
- Turkish `tr`
|
||||
- Ukrainian `uk`
|
||||
|
||||
::: warning
|
||||
If your language is not available in the list above, send me an email at <a href="mailto:im.amruth@gmail.com">im.amruth@gmail.com</a> with your request or raise an issue on GitHub and I'll add it on the Crowdin Platform.
|
||||
:::
|
||||
|
||||
## Translating through Crowdin
|
||||
|
||||
### Step 1: Choose your Language
|
||||
|
||||
<p style="text-align: center">
|
||||
<img src="./images/language-options.png" alt="Choose your Language" width="50%" />
|
||||
</p>
|
||||
|
||||
As mentioned above, all you need to do is go to the [Translation Portal ](https://translate.rxresu.me/) of Reactive Resume and select the language you want to begin translating to.
|
||||
|
||||
### Step 2: Click on `Translate All`
|
||||
|
||||
The PR would be accepted and merged only when the translations are 100% complete, which you can track through Crowdin.
|
||||
|
||||
<p style="text-align: center">
|
||||
<img src="./images/translate-all.png" alt="Translate All" width="40%" />
|
||||
</p>
|
||||
|
||||
### Step 3: Create an Account with Crowdin
|
||||
|
||||
You can use your email address and password, or for a quick getaway, use one of the many social providers to login quickly and get started.
|
||||
|
||||
### Step 4.1: List of Strings to be Translated
|
||||
|
||||
On the left sidebar, you can see a list of strings that are ready to be translated. The red box means it's not translated yet, and a green box means it has been translated to the target language.
|
||||
|
||||
<p style="text-align: center">
|
||||
<img src="./images/list-of-strings.png" alt="List of Strings to be Translated" width="40%" />
|
||||
</p>
|
||||
|
||||
### Step 4.2: Enter the Translation using the Editor
|
||||
|
||||
You can enter the translated string in the editor below. It is powerul enough to suggest you whether you have made any mistakes in the formatting of the string as well, and autocorrect them. Once you are done with the translation, click on the `Save` button.
|
||||
|
||||
::: tip
|
||||
To make the process faster, you may also use Keyboard Shortcuts such as `Cmd/Ctrl + S`.
|
||||
:::
|
||||
|
||||
<p style="text-align: center">
|
||||
<img src="./images/translation-editor.png" alt="Enter the Translation using the Editor" width="80%" />
|
||||
</p>
|
||||
|
||||
### Step 4.3: Make Use of the Translation Suggestions
|
||||
|
||||
Crowdin is extremely powerful with NLP capabilities to understand your language and translate it automatically through numerous training provided through Open Source development. This will make your job much easier when translating from one language to another.
|
||||
|
||||
<p style="text-align: center">
|
||||
<img src="./images/translation-helper.png" alt="Make Use of the Translation Suggestions" width="80%" />
|
||||
</p>
|
||||
|
||||
### Step 5: That's All Folks!
|
||||
|
||||
Once you have translated all the strings, the integration between Crowdin and GitHub would kick in and start replacing the updated strings in the repo. I would get a notification around the same time to merge the PR, and once that's done you can use the app in your own language and share it with others in your community!
|
||||
|
||||
## Translating through GitHub
|
||||
|
||||
For those who don't want to go through the process of creating an account with Crowdin and be continuous contributors to the project's translation, you can also perform a one-off translation by editing the JSON files through GitHub. Here's how:
|
||||
|
||||
### Step 1: Choose your Language
|
||||
|
||||
Go to the `src/i18n/locales` folder in the master branch of the repository and choose the language of your choice. Alternatively, you can [click this link](https://github.com/AmruthPillai/Reactive-Resume/tree/master/src/i18n/locales) to go the specific folder in GitHub.
|
||||
|
||||
Be careful as the folder only contains ISO-639-1 Two Letter Language Codes, so refer the [list above](#current-status) to find the corresponding language folder.
|
||||
|
||||
### Step 2: Fork the Repository, Edit the `.json` Files
|
||||
|
||||
By clicking on the Edit button in any of the files, it immediately creates a fork of the repository where you can edit the files at once. You may also choose to clone the forked repository locally and translate the strings using your favorite editor, then create a Pull Request for the changes.
|
||||
|
||||
---
|
||||
|
||||
While this is a bit more time consuming because of the structure of files that has been set up, for those who know what they are doing and want to get translating quickly without any help, this is the quickest method. But for those who would like to stay in constant touch with the project and provide translations for future updates to come, the Crowdin path is recommended.
|
||||
|
Before Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 47 KiB |
@@ -1,35 +1,70 @@
|
||||
{
|
||||
"hosting": [
|
||||
{
|
||||
"target": "app",
|
||||
"public": "build",
|
||||
"ignore": [
|
||||
"firebase.json",
|
||||
"docs",
|
||||
"**/.*",
|
||||
"**/node_modules/**"
|
||||
],
|
||||
"rewrites": [
|
||||
"target": "rxresume",
|
||||
"public": "public",
|
||||
"ignore": ["**/.*", "firebase.json", "**/node_modules/**"],
|
||||
"headers": [
|
||||
{
|
||||
"source": "**",
|
||||
"destination": "/index.html"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"target": "docs",
|
||||
"public": "docs/.vuepress/dist",
|
||||
"ignore": [
|
||||
"firebase.json",
|
||||
"**/.*",
|
||||
"**/node_modules/**"
|
||||
],
|
||||
"rewrites": [
|
||||
"source": "**/*",
|
||||
"headers": [
|
||||
{
|
||||
"key": "cache-control",
|
||||
"value": "cache-control: public, max-age=86400, must-revalidate"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"source": "**",
|
||||
"destination": "/index.html"
|
||||
"source": "static/**",
|
||||
"headers": [
|
||||
{
|
||||
"key": "cache-control",
|
||||
"value": "public, max-age=604800, immutable"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"source": "**/*.@(css|js|woff2|jpg|png)",
|
||||
"headers": [
|
||||
{
|
||||
"key": "cache-control",
|
||||
"value": "public, max-age=86400, immutable"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"source": "sw.js",
|
||||
"headers": [
|
||||
{
|
||||
"key": "cache-control",
|
||||
"value": "cache-control: public, max-age=86400, must-revalidate"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"source": "page-data/**",
|
||||
"headers": [
|
||||
{
|
||||
"key": "cache-control",
|
||||
"value": "cache-control: public, max-age=86400, must-revalidate"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"emulators": {
|
||||
"functions": {
|
||||
"port": 5001
|
||||
},
|
||||
"hosting": {
|
||||
"port": 5000
|
||||
},
|
||||
"ui": {
|
||||
"enabled": true
|
||||
}
|
||||
},
|
||||
"functions": {
|
||||
"source": "functions"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
node_modules/
|
||||
@@ -0,0 +1,73 @@
|
||||
const functions = require('firebase-functions');
|
||||
const puppeteer = require('puppeteer');
|
||||
|
||||
const BASE_URL = 'https://rxresu.me/r/';
|
||||
|
||||
function timeout(ms) {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
exports.printResume = functions.https.onCall(async ({ id, type }, { auth }) => {
|
||||
if (!id) {
|
||||
throw new functions.https.HttpsError(
|
||||
'invalid-argument',
|
||||
'The function must be called with argument "id" containing the resume ID.',
|
||||
);
|
||||
}
|
||||
|
||||
if (!type) {
|
||||
throw new functions.https.HttpsError(
|
||||
'invalid-argument',
|
||||
'The function must be called with argument "type" containing the type of resume.',
|
||||
);
|
||||
}
|
||||
|
||||
if (!auth) {
|
||||
throw new functions.https.HttpsError(
|
||||
'failed-precondition',
|
||||
'The function must be called while authenticated.',
|
||||
);
|
||||
}
|
||||
|
||||
const browser = await puppeteer.launch({
|
||||
headless: true,
|
||||
});
|
||||
const page = await browser.newPage();
|
||||
await page.goto(BASE_URL + id, {
|
||||
waitUntil: 'networkidle0',
|
||||
});
|
||||
await timeout(6000);
|
||||
await page.emulateMediaType('print');
|
||||
let pdf;
|
||||
|
||||
if (type === 'single') {
|
||||
const height = await page.evaluate(() => {
|
||||
const { body } = document;
|
||||
const html = document.documentElement;
|
||||
|
||||
const maxHeight = Math.max(
|
||||
body.scrollHeight,
|
||||
body.offsetHeight,
|
||||
html.clientHeight,
|
||||
html.scrollHeight,
|
||||
html.offsetHeight,
|
||||
);
|
||||
|
||||
return maxHeight;
|
||||
});
|
||||
pdf = await page.pdf({
|
||||
printBackground: true,
|
||||
width: `21cm`,
|
||||
height: `${height}px`,
|
||||
pageRanges: '1',
|
||||
});
|
||||
} else {
|
||||
pdf = await page.pdf({
|
||||
format: 'A4',
|
||||
printBackground: true,
|
||||
});
|
||||
}
|
||||
|
||||
await browser.close();
|
||||
return Buffer.from(pdf).toString('base64');
|
||||
});
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"name": "functions",
|
||||
"description": "Cloud Functions for Firebase",
|
||||
"scripts": {
|
||||
"serve": "firebase emulators:start --only functions",
|
||||
"shell": "firebase functions:shell",
|
||||
"start": "npm run shell",
|
||||
"deploy": "firebase deploy --only functions",
|
||||
"logs": "firebase functions:log"
|
||||
},
|
||||
"engines": {
|
||||
"node": "10"
|
||||
},
|
||||
"dependencies": {
|
||||
"firebase-admin": "^8.13.0",
|
||||
"firebase-functions": "^3.7.0",
|
||||
"puppeteer": "2.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"firebase-functions-test": "^0.2.1"
|
||||
},
|
||||
"private": true
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
import { createMuiTheme, MuiThemeProvider } from '@material-ui/core';
|
||||
import 'animate.css';
|
||||
import 'firebase/analytics';
|
||||
import 'firebase/auth';
|
||||
import 'firebase/database';
|
||||
import 'firebase/functions';
|
||||
import 'firebase/storage';
|
||||
import React from 'react';
|
||||
import { DatabaseProvider } from './src/contexts/DatabaseContext';
|
||||
import { ModalProvider } from './src/contexts/ModalContext';
|
||||
import { ResumeProvider } from './src/contexts/ResumeContext';
|
||||
import { StorageProvider } from './src/contexts/StorageContext';
|
||||
import { SettingsProvider } from './src/contexts/SettingsContext';
|
||||
import { UserProvider } from './src/contexts/UserContext';
|
||||
import './src/i18n';
|
||||
import './src/styles/forms.css';
|
||||
import './src/styles/global.css';
|
||||
import './src/styles/shadows.css';
|
||||
import './src/styles/tailwind.css';
|
||||
import './src/styles/toastify.css';
|
||||
|
||||
const theme = createMuiTheme({
|
||||
typography: {
|
||||
fontWeightRegular: 500,
|
||||
fontFamily: ['Montserrat', 'sans-serif'].join(','),
|
||||
},
|
||||
});
|
||||
|
||||
// eslint-disable-next-line import/prefer-default-export
|
||||
export const wrapRootElement = ({ element }) => (
|
||||
<SettingsProvider>
|
||||
<MuiThemeProvider theme={theme}>
|
||||
<ModalProvider>
|
||||
<UserProvider>
|
||||
<DatabaseProvider>
|
||||
<ResumeProvider>
|
||||
<StorageProvider>{element}</StorageProvider>
|
||||
</ResumeProvider>
|
||||
</DatabaseProvider>
|
||||
</UserProvider>
|
||||
</ModalProvider>
|
||||
</MuiThemeProvider>
|
||||
</SettingsProvider>
|
||||
);
|
||||
@@ -0,0 +1,149 @@
|
||||
require('dotenv').config();
|
||||
|
||||
module.exports = {
|
||||
siteMetadata: {
|
||||
title: 'Reactive Resume',
|
||||
siteUrl: 'https://rxresu.me',
|
||||
description: 'A free and open source resume builder.',
|
||||
},
|
||||
plugins: [
|
||||
'gatsby-plugin-react-helmet',
|
||||
{
|
||||
resolve: 'gatsby-plugin-eslint',
|
||||
options: {
|
||||
test: /\.js$|\.jsx$/,
|
||||
exclude: /(node_modules|.cache|public)/,
|
||||
stages: ['develop'],
|
||||
options: {
|
||||
emitWarning: true,
|
||||
failOnError: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
resolve: 'gatsby-plugin-prefetch-google-fonts',
|
||||
options: {
|
||||
fonts: [
|
||||
{
|
||||
family: 'Lato',
|
||||
variants: ['400', '700'],
|
||||
},
|
||||
{
|
||||
family: 'Montserrat',
|
||||
variants: ['400', '500', '600', '700'],
|
||||
},
|
||||
{
|
||||
family: 'Nunito',
|
||||
variants: ['400', '600', '700'],
|
||||
},
|
||||
{
|
||||
family: 'Open Sans',
|
||||
variants: ['400', '600', '700'],
|
||||
},
|
||||
{
|
||||
family: 'Raleway',
|
||||
variants: ['400', '500', '700'],
|
||||
},
|
||||
{
|
||||
family: 'Rubik',
|
||||
variants: ['400', '500', '700'],
|
||||
},
|
||||
{
|
||||
family: 'Source Sans Pro',
|
||||
variants: ['400', '600', '700'],
|
||||
},
|
||||
{
|
||||
family: 'Titillium Web',
|
||||
variants: ['400', '600', '700'],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
resolve: 'gatsby-plugin-create-client-paths',
|
||||
options: { prefixes: ['/app/*'] },
|
||||
},
|
||||
{
|
||||
resolve: 'gatsby-plugin-manifest',
|
||||
options: {
|
||||
name: 'Reactive Resume',
|
||||
short_name: 'RxResume',
|
||||
description: 'A free and open-source resume builder.',
|
||||
start_url: '/?source=pwa',
|
||||
icon: 'static/images/logo.png',
|
||||
background_color: '#FFFFFF',
|
||||
theme_color: '#444444',
|
||||
display: 'standalone',
|
||||
cache_busting_mode: 'none',
|
||||
icons: [
|
||||
{
|
||||
src: 'static/icons/maskable.png',
|
||||
sizes: '196x196',
|
||||
type: 'image/png',
|
||||
purpose: 'any maskable',
|
||||
},
|
||||
],
|
||||
shortcuts: [
|
||||
{
|
||||
name: 'Dashboard',
|
||||
short_name: 'Dashboard',
|
||||
description: 'View/manage all your resumes at a glance',
|
||||
url: '/app/dashboard?source=pwa',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
resolve: 'gatsby-plugin-offline',
|
||||
options: {
|
||||
workboxConfig: {
|
||||
globPatterns: ['**/*'],
|
||||
},
|
||||
precachePages: ['', '/app/*', '/blog/*'],
|
||||
},
|
||||
},
|
||||
'gatsby-plugin-lodash',
|
||||
{
|
||||
resolve: 'gatsby-plugin-material-ui',
|
||||
options: {
|
||||
stylesProvider: {
|
||||
injectFirst: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
'gatsby-plugin-postcss',
|
||||
{
|
||||
resolve: 'gatsby-source-filesystem',
|
||||
options: {
|
||||
path: `${__dirname}/src/articles`,
|
||||
name: 'articles',
|
||||
},
|
||||
},
|
||||
'gatsby-transformer-remark',
|
||||
{
|
||||
resolve: 'gatsby-source-filesystem',
|
||||
options: {
|
||||
name: 'images',
|
||||
path: `${__dirname}/static/images/`,
|
||||
},
|
||||
},
|
||||
'gatsby-plugin-sharp',
|
||||
'gatsby-transformer-sharp',
|
||||
{
|
||||
resolve: 'gatsby-plugin-firebase',
|
||||
options: {
|
||||
credentials: {
|
||||
apiKey: process.env.FIREBASE_APIKEY,
|
||||
authDomain: process.env.FIREBASE_AUTHDOMAIN,
|
||||
databaseURL: process.env.FIREBASE_DATABASEURL,
|
||||
projectId: process.env.FIREBASE_PROJECTID,
|
||||
storageBucket: process.env.FIREBASE_STORAGEBUCKET,
|
||||
messagingSenderId: process.env.FIREBASE_MESSAGINGSENDERID,
|
||||
appId: process.env.FIREBASE_APPID,
|
||||
measurementId: process.env.FIREBASE_MEASUREMENTID,
|
||||
},
|
||||
},
|
||||
},
|
||||
'gatsby-plugin-sitemap',
|
||||
],
|
||||
};
|
||||
@@ -0,0 +1,65 @@
|
||||
exports.onCreateWebpackConfig = ({ stage, actions, getConfig }) => {
|
||||
if (stage === 'build-javascript') {
|
||||
const config = getConfig();
|
||||
const miniCssExtractPlugin = config.plugins.find(
|
||||
(plugin) => plugin.constructor.name === 'MiniCssExtractPlugin',
|
||||
);
|
||||
if (miniCssExtractPlugin) {
|
||||
miniCssExtractPlugin.options.ignoreOrder = true;
|
||||
}
|
||||
actions.replaceWebpackConfig(config);
|
||||
}
|
||||
|
||||
if (stage === 'build-html') {
|
||||
actions.setWebpackConfig({
|
||||
externals: [/^firebase/],
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
exports.onCreatePage = async ({ page, actions }) => {
|
||||
const { createPage } = actions;
|
||||
|
||||
if (page.path.match(/^\/r/)) {
|
||||
page.matchPath = '/r/*';
|
||||
createPage(page);
|
||||
}
|
||||
};
|
||||
|
||||
exports.createPages = async ({ actions, graphql, reporter }) => {
|
||||
const { createPage } = actions;
|
||||
|
||||
const blogTemplate = require.resolve(`./src/components/Blog.js`);
|
||||
|
||||
const result = await graphql(`
|
||||
{
|
||||
allMarkdownRemark(
|
||||
sort: { order: DESC, fields: [frontmatter___date] }
|
||||
limit: 1000
|
||||
) {
|
||||
edges {
|
||||
node {
|
||||
frontmatter {
|
||||
slug
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`);
|
||||
|
||||
if (result.errors) {
|
||||
reporter.panicOnBuild(`Error while running GraphQL query.`);
|
||||
return;
|
||||
}
|
||||
|
||||
result.data.allMarkdownRemark.edges.forEach(({ node }) => {
|
||||
createPage({
|
||||
path: node.frontmatter.slug,
|
||||
component: blogTemplate,
|
||||
context: {
|
||||
slug: node.frontmatter.slug,
|
||||
},
|
||||
});
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,5 @@
|
||||
import 'firebase/analytics';
|
||||
import 'firebase/auth';
|
||||
import 'firebase/database';
|
||||
import 'firebase/functions';
|
||||
import 'firebase/storage';
|
||||
@@ -1,3 +0,0 @@
|
||||
[build]
|
||||
command = "npm run build"
|
||||
publish = "build"
|
||||
@@ -1,17 +0,0 @@
|
||||
server {
|
||||
|
||||
listen 80;
|
||||
|
||||
location / {
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm;
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
|
||||
location = /50x.html {
|
||||
root /usr/share/nginx/html;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,80 +1,84 @@
|
||||
{
|
||||
"name": "reactive-resume",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"engines": {
|
||||
"node": "13.12.0",
|
||||
"npm": "6.14.4"
|
||||
"description": "A free and open-source resume builder.",
|
||||
"version": "2.0.0",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"lint": "eslint .",
|
||||
"lint:fix": "eslint --fix .",
|
||||
"build": "gatsby build",
|
||||
"develop": "gatsby develop",
|
||||
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"",
|
||||
"start": "npm run develop",
|
||||
"serve": "gatsby serve",
|
||||
"clean": "gatsby clean",
|
||||
"test": "echo \"Write tests! -> https://gatsby.dev/unit-testing\" && exit 1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@fullhuman/postcss-purgecss": "^2.3.0",
|
||||
"@testing-library/jest-dom": "^5.10.1",
|
||||
"@testing-library/react": "^10.4.1",
|
||||
"@testing-library/user-event": "^12.0.7",
|
||||
"@vuepress/plugin-google-analytics": "^1.5.2",
|
||||
"autoprefixer": "^9.8.3",
|
||||
"axios": "^0.19.2",
|
||||
"html2canvas": "^1.0.0-rc.5",
|
||||
"i18next": "^19.5.1",
|
||||
"i18next-browser-languagedetector": "^5.0.0",
|
||||
"i18next-http-backend": "^1.0.15",
|
||||
"jspdf": "^1.5.3",
|
||||
"lodash": "^4.17.15",
|
||||
"postcss-cli": "^7.1.1",
|
||||
"@material-ui/core": "^4.11.0",
|
||||
"@reach/router": "^1.3.4",
|
||||
"ajv": "^6.12.3",
|
||||
"animate.css": "^4.1.0",
|
||||
"array-move": "^3.0.0",
|
||||
"classnames": "^2.2.6",
|
||||
"dotenv": "^8.2.0",
|
||||
"downloadjs": "^1.4.7",
|
||||
"firebase": "^7.16.1",
|
||||
"formik": "^2.1.5",
|
||||
"gatsby": "^2.24.3",
|
||||
"gatsby-image": "^2.4.13",
|
||||
"gatsby-plugin-create-client-paths": "^2.3.10",
|
||||
"gatsby-plugin-firebase": "^0.2.0-beta.4",
|
||||
"gatsby-plugin-lodash": "^3.3.10",
|
||||
"gatsby-plugin-manifest": "^2.4.18",
|
||||
"gatsby-plugin-material-ui": "^2.1.9",
|
||||
"gatsby-plugin-offline": "^3.2.18",
|
||||
"gatsby-plugin-postcss": "^2.3.11",
|
||||
"gatsby-plugin-prefetch-google-fonts": "^1.4.3",
|
||||
"gatsby-plugin-react-helmet": "^3.3.10",
|
||||
"gatsby-plugin-sharp": "^2.6.19",
|
||||
"gatsby-plugin-sitemap": "^2.4.11",
|
||||
"gatsby-source-filesystem": "^2.3.19",
|
||||
"gatsby-source-gravatar": "^1.0.0",
|
||||
"gatsby-transformer-remark": "^2.8.25",
|
||||
"gatsby-transformer-sharp": "^2.5.11",
|
||||
"i18next": "^19.6.2",
|
||||
"lodash": "^4.17.19",
|
||||
"moment": "^2.27.0",
|
||||
"nanoevents": "^5.1.8",
|
||||
"react": "^16.13.1",
|
||||
"react-beautiful-dnd": "^13.0.0",
|
||||
"react-dom": "^16.13.1",
|
||||
"react-easy-panzoom": "^0.4.4",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-i18next": "^11.7.0",
|
||||
"react-icons": "^3.10.0",
|
||||
"react-markdown": "^4.3.1",
|
||||
"react-scripts": "3.4.1",
|
||||
"react-toastify": "^6.0.6",
|
||||
"tailwindcss": "^1.4.6",
|
||||
"react-scroll": "^1.8.0",
|
||||
"react-toastify": "^6.0.8",
|
||||
"short-unique-id": "^3.0.3",
|
||||
"typeit-react": "^0.1.3",
|
||||
"uuid": "^8.2.0",
|
||||
"vuepress": "^1.5.2"
|
||||
},
|
||||
"scripts": {
|
||||
"css": "postcss src/assets/tailwind/tailwind.src.css -o src/assets/tailwind/tailwind.css",
|
||||
"css:prod": "postcss src/assets/tailwind/tailwind.src.css -o src/assets/tailwind/tailwind.css --env production",
|
||||
"docs:dev": "vuepress dev docs",
|
||||
"docs:build": "vuepress build docs",
|
||||
"prestart": "npm run css",
|
||||
"start": "react-scripts start",
|
||||
"prebuild": "npm run css:prod",
|
||||
"build": "NODE_ENV=production react-scripts build",
|
||||
"test": "react-scripts test",
|
||||
"eject": "react-scripts eject",
|
||||
"predeploy": "npm run build && npm run docs:build",
|
||||
"deploy": "firebase deploy",
|
||||
"predeploy:app": "npm run build",
|
||||
"deploy:app": "firebase deploy --only hosting:app",
|
||||
"predeploy:docs": "npm run docs:build",
|
||||
"deploy:docs": "firebase deploy --only hosting:docs",
|
||||
"docker:dev": "docker-compose -f docker-compose-dev.yml up -d --build",
|
||||
"docker": "docker-compose up -d --build"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": "react-app"
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version"
|
||||
]
|
||||
"yup": "^0.29.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autoprefixer": "^9.8.5",
|
||||
"eslint": "^7.4.0",
|
||||
"eslint-config-airbnb": "^18.2.0",
|
||||
"eslint-config-prettier": "^6.11.0",
|
||||
"eslint-plugin-import": "^2.21.2",
|
||||
"eslint-loader": "^4.0.2",
|
||||
"eslint-plugin-jsx-a11y": "^6.3.1",
|
||||
"eslint-plugin-prettier": "^3.1.4",
|
||||
"eslint-plugin-react-hooks": "^4.0.4",
|
||||
"eslint-plugin-react": "^7.20.0",
|
||||
"eslint": "^7.3.1"
|
||||
"eslint-plugin-react": "^7.20.3",
|
||||
"gatsby-plugin-eslint": "^2.0.8",
|
||||
"prettier": "2.0.5",
|
||||
"tailwindcss": "^1.5.1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/AmruthPillai/Reactive-Resume"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/AmruthPillai/Reactive-Resume/issues"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,6 @@
|
||||
/* eslint-disable global-require */
|
||||
/* eslint-disable import/no-extraneous-dependencies */
|
||||
const purgecss = require('@fullhuman/postcss-purgecss')({
|
||||
content: ['./public/index.html', './src/**/*.js'],
|
||||
defaultExtractor: content => content.match(/[\w-/:]+(?<!:)/g) || [],
|
||||
});
|
||||
const tailwindcss = require('tailwindcss');
|
||||
const autoprefixer = require('autoprefixer');
|
||||
|
||||
module.exports = {
|
||||
plugins: [
|
||||
require('tailwindcss'),
|
||||
require('autoprefixer'),
|
||||
...(process.env.NODE_ENV === 'production' ? [purgecss] : []),
|
||||
],
|
||||
};
|
||||
module.exports = () => ({
|
||||
plugins: [tailwindcss, autoprefixer],
|
||||
});
|
||||
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 133 KiB |
@@ -1,54 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
|
||||
<meta name="viewport"
|
||||
content="width=device-width, initial-scale=.5, maximum-scale=5.0, minimum-scale=.25, user-scalable=yes" />
|
||||
<link rel="canonical" href="https://rxresu.me/" />
|
||||
<meta name="google-site-verification" content="tF42LXDm9IVlubpb9blnct55r0usS2Z9vm-smbPnxNk" />
|
||||
<meta name="theme-color" content="#546e7a" />
|
||||
<meta name="description"
|
||||
content="A one-of-a-kind resume builder that's not out to get your data. Completely secure, customizable, portable, open-source and free forever. Try it out today!" />
|
||||
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
|
||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
|
||||
<meta name="robots" content="index, follow">
|
||||
|
||||
<!-- Social Media Meta Tags -->
|
||||
<meta property="og:title" content="Reactive Resume">
|
||||
<meta property="og:description"
|
||||
content="A one-of-a-kind resume builder that's not out to get your data. Completely secure, customizable, portable, open-source and free forever. Try it out today!">
|
||||
<meta property="og:image" content="https://i.imgur.com/6gDAIu0.png">
|
||||
<meta property="og:url" content="https://rxresu.me/">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:site" content="@amruthpillai">
|
||||
|
||||
<title>Reactive Resume</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div id="root"></div>
|
||||
|
||||
<script src="https://www.gstatic.com/firebasejs/7.12.0/firebase-app.js"></script>
|
||||
<script src="https://www.gstatic.com/firebasejs/7.12.0/firebase-analytics.js"></script>
|
||||
|
||||
<script>
|
||||
var firebaseConfig = {
|
||||
apiKey: "AIzaSyCfC075KJNwsMWDTm6k8QCtWno48okM7wY",
|
||||
authDomain: "rx-resume.firebaseapp.com",
|
||||
databaseURL: "https://rx-resume.firebaseio.com",
|
||||
projectId: "rx-resume",
|
||||
storageBucket: "rx-resume.appspot.com",
|
||||
messagingSenderId: "493152774539",
|
||||
appId: "1:493152774539:web:ecaa1222f5e1bcf8fb678e",
|
||||
measurementId: "G-83G3Y6DPJ6"
|
||||
};
|
||||
|
||||
firebase.initializeApp(firebaseConfig);
|
||||
firebase.analytics();
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"name": "Reactive Resume",
|
||||
"short_name": "RxResume",
|
||||
"theme_color": "#546e7a",
|
||||
"background_color": "#546e7a",
|
||||
"display": "standalone",
|
||||
"orientation": "landscape",
|
||||
"Scope": "/",
|
||||
"start_url": ".",
|
||||
"icons": [
|
||||
{
|
||||
"src": "images/icons/icon-72x72.png",
|
||||
"sizes": "72x72",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "images/icons/icon-96x96.png",
|
||||
"sizes": "96x96",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "images/icons/icon-128x128.png",
|
||||
"sizes": "128x128",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "images/icons/icon-144x144.png",
|
||||
"sizes": "144x144",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "images/icons/icon-152x152.png",
|
||||
"sizes": "152x152",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "images/icons/icon-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "images/icons/icon-384x384.png",
|
||||
"sizes": "384x384",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "images/icons/icon-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
}
|
||||
],
|
||||
"splash_pages": null
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
# https://www.robotstxt.org/robotstxt.html
|
||||
User-agent: *
|
||||
Disallow:
|
||||
@@ -0,0 +1,38 @@
|
||||
---
|
||||
slug: "/blog/acing-video-interviews"
|
||||
date: "2020-07-15"
|
||||
title: "Acing Video Interviews"
|
||||
---
|
||||
|
||||
Today, as in-person interviewing has had to cease or slow due to restrictions during the Covid-19 pandemic, thousands of professionals are now needing to learn how to effectively interview in a new way using online platforms, such as Zoom, GoToMeeting and others.
|
||||
Here are 10 helpful tips for making the best impression you can in your video interview, and demonstrating that you’re a great fit for the role.
|
||||
|
||||
#### Be conscious of what’s in the view
|
||||
|
||||
While so many of us are now working remotely and using Zoom or other platforms for our meetings, we’ve grown more accustomed to seeing people in their home settings, and noticing their home décor, pets, family members, and other aspects of their personal life in the background.
|
||||
|
||||
For an interview, it’s fine to be in your home or living room but try to present whatever people see as neutral and professional as possible. You want to let yourself and your words, conversation and experience speak most powerfully about your qualifications and suitability for the job. And you want to avoid the chance that your interviewer will be distracted by what’s behind you, or perhaps have a negative reaction to any personal items (such as a plate of food behind you or a messy room) in your home.
|
||||
|
||||
#### Select professional attire
|
||||
|
||||
Even though you’re conducting the interview from your home, remember you are being judged and assessed for your fit for the role, so dress professionally, just as you would if you were meeting in person.
|
||||
|
||||
#### Ready your sound and video equipment
|
||||
|
||||
Make sure that you have working Wi-Fi, a strong connection, and a quality headset or microphone so there are no tech issues during your call. Invest in quality equipment for audio and video work.
|
||||
|
||||
#### Demonstrate positive body language and behavior
|
||||
|
||||
Just as in an in-person interview, you want to demonstrate through your voice and body language that you’re interested, engaged, and professional in demeanor and language. Make sure you are not distracted (with your pet, or by loud sounds or interruptions in your home, etc.). If you know there will be significant interruptions or distractions during the scheduled time for the interview, see if you can change it to a time when those interruptions are at minimum.
|
||||
|
||||
#### Engage the interviewer with eye contact and connection
|
||||
|
||||
Make sure you smile, come across as engaging and interested, and make strong eye contact. Try not to look away during your interview or look down at your notes too frequently. Your eye contact reveals a good deal about how you’re feeling and thinking about what the interviewer is sharing with you.
|
||||
|
||||
#### As with every interview, prepare, prepare, prepare
|
||||
|
||||
Be fully prepared for your interview. Do your research in advance, understand clearly from what the hiring manager has shared in advance what they’re looking for in the role and be ready to talk about why you’re potentially very well suited to it. Have in front of you some written sound bites and bullet points that speak to how you can leverage your great talents and abilities and hit the ground running successfully in this job.
|
||||
|
||||
#### Finally, remember that you’re talented, experienced and have so much value to offer and that the interview is a two-way street
|
||||
|
||||
Don’t lose sight of the fact that you have a great deal to offer and so much experience and talent to leverage to be of service in important ways. Make sure too that you understand this is a two-way street and you are interviewing the hiring manager about the role and the organization just as much as they are interviewing you. Have your list of questions that you want to make sure you cover so that you will get a strong sense of this role, the work, and if you would truly be a fit, both emotionally and functionally.
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
slug: "/blog/ats-friendly-resumes"
|
||||
date: "2020-07-14"
|
||||
title: "ATS-Friendly Resumes"
|
||||
---
|
||||
|
||||
An ATS (Applicant Tracking System) is software used by companies to help them quickly evaluate potential candidates for any given job opening.
|
||||
|
||||
ATS software automatically scans and processes each job application a company receives, and ranks them according to their relevant qualifications. It then produces a shortlist of qualified candidates to be reviewed by a hiring manager. If your resume doesn’t meet the requirements of a company’s ATS, your application will likely be rejected before a hiring manager even gets to look at it.
|
||||
|
||||
Applicant tracking systems (ATS) eliminate over 70% of applicants before their resume even reaches a hiring manager. Make sure your application makes the cut by learning how to write an ATS-friendly resume with our expert tips, examples, and ATS resume templates.
|
||||
|
||||
#### What is an ATS-compliant Resume?
|
||||
|
||||
An ATS-compliant resume is a resume designed specifically to make it easier for ATS software to find the information it’s looking for.
|
||||
|
||||
For example, this could mean using an easy-to-read resume format, or removing objects such as tables or images because they’re difficult for the ATS to parse. Resumes designed to be compliant with ATS software have a much higher chance of getting into the hands of a human hiring manager, which is one step closer to an interview.
|
||||
|
||||
#### How to design an ATS-friendly Resume
|
||||
|
||||
Here are six tips to help you make a more ATS-friendly resume and ultimately beat the applicant tracking system.
|
||||
|
||||
#### 1. Follow a standard resume format
|
||||
|
||||
Use a chronological resume to ensure the software can parse your experience section.
|
||||
|
||||
#### 2. Correctly label your section
|
||||
|
||||
By sticking to common headings, you prevent the bot from placing your qualifications under the wrong categories, or misreading your sections altogether.
|
||||
|
||||
#### 3. Include job-related keywords
|
||||
|
||||
To help determine whether your qualifications are relevant to the position, ATS software scans your resume for specific job-related resume keywords. To increase your chance of getting into the interview pool, look through the job listing for these words to include on your resume.
|
||||
|
||||
#### 4. Use an ATS-friendly resume template
|
||||
|
||||
Many job seekers use fancy resume templates to help them stand out from other candidates. However, templates with graphic elements, tables, or unique fonts are difficult for most ATS software to read.
|
||||
|
||||
#### 5. Use a common resume font
|
||||
|
||||
Most ATS software is programmed to read more common typefaces. Using an unusual or outdated looking font can result in your resume being rendered incorrectly, with large chunks of your information left unreadable.
|
||||
|
||||
#### 6. Save your resume as the proper file type
|
||||
|
||||
PDFs are the preferred file format for most companies today, and are easily understood by any modern applicant tracking system.
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
---
|
||||
slug: "/blog/design-beautiful-resumes"
|
||||
date: "2020-07-13"
|
||||
title: "Designing Beautiful Resumes"
|
||||
---
|
||||
|
||||
Follow these 16 pro tips to help your design resume stand out from the crowd.
|
||||
|
||||
With designers fighting it out for every job that comes along, it's important that you stand out from the crowd. Whether you're just starting out or a seasoned pro applying for a better position, your design resume needs to be first rate for you to stand a chance of getting an interview.
|
||||
|
||||
For your design resume to really shine, you need to think carefully about how it's designed as well as what's written. Here, we'll cover both, as we walk you through the process of creating a stellar designer resume. You'll be landing that dream design job in no time.
|
||||
|
||||
#### 1. Avoid word processors
|
||||
|
||||
Microsoft Word might be okay if you’re applying for an admin position, but if you’re after a design job or something creative, its limited and idiosyncratic layout options just won't cut it. Art directors will be paying close attention to the layout of your resume as much as the content, so use InDesign CC or even Illustrator CC to design something special.
|
||||
|
||||
Whatever program you use to design your resume in, PDF is the best format to supply it in. This enables you to create good-looking documents that are completely cross-platform.
|
||||
|
||||
#### 2. Choose your fonts wisely
|
||||
|
||||
You’re a designer, so your resume should follow the latest trends in typography, right? Wrong! The aim of any resume should be legibility, so it’s generally a wise idea to stick to simple, readable fonts. You don't need to shell out lots of cash to find something suitable either – take a look at our list of the best free fonts for designers.
|
||||
|
||||
And if you would like to use more than one font, you can also check our perfect font pairings.
|
||||
|
||||
#### 3. Consider using colour
|
||||
|
||||
For most non-design-related jobs, a resume designed or printed in colour is probably a waste of time. However, for design positions, touches of colour are an acceptable way to add a discreet personal touch. Use colour carefully, however, and don't go over the top. Green type on a yellow page will stand out for all the wrong reasons. See our post on colour theory for more info on this.
|
||||
|
||||
#### 4. Be brief
|
||||
|
||||
Art directors do not have the time or the inclination to read your entire life story. Your resume should ideally fit onto one side of A4, and if it's any longer than two pages, you’re waffling and including too much stuff.
|
||||
|
||||
Don’t be tempted to mask a lack of experience with verbosity. Clean, well-laid-out resumes will always win over flabby ones – remember, the aim is to intrigue and impress. Point the recipient in the direction of an online portfolio to see more.
|
||||
|
||||
#### 5. Include your contact info
|
||||
|
||||
As a minimum, your resume should include your name and contact details, including your email address, phone number and online portfolio URL. Don't assume that because these are at the bottom of the email you sent, you don't need to include them. Make life easier for your potential employer.
|
||||
|
||||
This should be followed by a breakdown of your work experience, then your education. In both cases, this should be most recent first. Work experience should include dates, job title and a brief synopsis of your role. Don't bother including jobs you did years ago that are irrelevant to the job you're applying for. References are generally optional.
|
||||
|
||||
#### 6. Don't lie on your resume
|
||||
|
||||
We once received a resume from an unnamed individual who claimed to have created quite a stunning website. We would have been extremely impressed were it not for the fact that we had actually designed the site.
|
||||
|
||||
Needless to say, that resume went straight in the bin and the sender was rewarded with a strongly worded email. Honesty is always the best policy, as you stand a good chance of being found out if you start 'elaborating' in your resume.
|
||||
|
||||
#### 6. Include samples of work
|
||||
|
||||
By not including any samples of your work with your resume, you’re pretty much guaranteeing that the recipient will not consider you for the post. If you work with motion, stills are perfect, unless you’ve been specifically asked to include a showreel. On the other hand, don't go overboard with images – that's a job for your online graphic design portfolio, which you can provide a link to. Alternatively, you can provide a curated version of your portfolio in PDF format.
|
||||
|
||||
#### 7. Keep it simple
|
||||
|
||||
Unless you’re really confident and sure about what you’re doing, keep the typographic flourishes and fanciful designs at bay, ensure the layout is simple and clear and the information is cleanly presented. After all, the last thing you want is the recipient squinting because you thought dark grey text on a black background was a great idea.
|
||||
|
||||
#### 8. Show your personality
|
||||
|
||||
Simple does not have to mean dull. A resume is a reflection of your disposition and persona, and the recipient will be scanning it, consciously or not, for elements that distinguish your resume from the other hundreds they have to wade through. Make your resume stand out with an idiosyncratic design and personal touches... just don't overdo it.
|
||||
|
||||
#### 9. Beware the novelty approach to resumes
|
||||
|
||||
We’ve had resumes written on scrunched up paper; arriving in the form of a jigsaw; and playing cards. We’ve had giant resume posters, inflatable resumes and resumes crafted using delicate and complex paper engineering.
|
||||
|
||||
Off-the-wall resumes stick in the mind (you can see some of the best examples in our roundup of creative resumes) but they're a risky proposition. On the one hand you might appear like a creative thinker, on the other it might seem pretentious and excessive. It depends on the recipient.
|
||||
|
||||
#### 10. Don't plagiarise
|
||||
|
||||
We've all seen this clever resume concept... so don't try to pass it off as your idea
|
||||
|
||||
A surprising number of graduates see an inspiring resume design concept and copy it. What can they be thinking? We all have access to the same internet, and if a particularly inventive resume design has caught your eye, there's a strong chance it's been shared virally within the industry and will have caught the eye of your potential employer, too. Your resume should showcase your creativity, not someone else's.
|
||||
|
||||
#### 11. Use proper prints, not photocopies
|
||||
|
||||
Photocopies are cheap, but sadly they also look cheap, especially second and third generation copies. Type starts to break up, images are contrasty and full of noise, fingerprints and other blemishes begin to show up, and the results can look slightly askew. Fresh laser prints or sharp inkjet prints on the best quality paper available are the minimum standard. For more info, check out our designer's guide to printing.
|
||||
|
||||
#### 12. Demonstrate consistency
|
||||
|
||||
Real-world design projects are usually centred around a single, consistent theme or concept that runs throughout the logo, branding, literature and so on. Your résumé, portfolio and covering letter need to demonstrate the same consistency. For example, are bulleted lists presented in the same style across each of your pages? Is the colour scheme consistent?
|
||||
|
||||
#### 13. Spend time on the covering letter
|
||||
|
||||
Most of the time, when you apply for a job, your resume will need to be accompanied by a covering letter. This should look formal and business-like: this isn't the place to showcase your creativity and imagination. The text should complement the CV and it's best to keep it short and to the point (three paragraphs is a good rule of thumb).
|
||||
|
||||
Make it obvious you haven't just copied and pasted the same letter you've used to apply for a hundred other jobs. Write it in a way that's personal to the particular job and company you're applying for.
|
||||
|
||||
#### 14. Create multiple resumes
|
||||
|
||||
If you're applying for multiple jobs, you should create multiple resumes, each targeting a specific role and the kind of experience and skills the prospective employers are looking for. To take an obvious example, if the job specifically mentions InDesign as a requirement then you should make this first on your list of skills, and possibly expand the description of how and where you've used it.
|
||||
|
||||
#### 15. Check your spelling!
|
||||
|
||||
If you're getting this one wrong, you're in trouble
|
||||
If you're applying for a job as a designer, does it matter how well you write? The simple answer is yes. Spelling and grammar mistakes will make you appear uneducated, ignorant and/or lazy – and none of these represent the image you're trying to convey. So, always double-check your grammar and spelling, and get others to check it too (it's easy to miss your own mistakes)
|
||||
@@ -0,0 +1,38 @@
|
||||
---
|
||||
slug: "/blog/jobs-during-covid-19"
|
||||
date: "2020-07-16"
|
||||
title: "Jobs During COVID-19"
|
||||
---
|
||||
|
||||
As companies move to remote work to fight the coronavirus pandemic and an increasing number of workers are being laid off or furloughed, you might be wondering if you should continue to send out resumes or just assume that no one is hiring for the foreseeable future. It’s true that economists are predicting a recession, but career experts say it’s best to keep networking and applying, provided you change your approach a bit to acknowledge these are uncertain times.
|
||||
|
||||
Be prepared for job openings to be put on hold or disappear, even if they’ve been open for a while. That doesn’t mean they won’t open up again in a few months. Landers admits she herself was getting ready to hire someone but decided to put that on hold for a few weeks.
|
||||
|
||||
With all that said, you can still be actively working on your job search. These tips will help you navigate the process during the pandemic and the accompanying economic slowdown.
|
||||
|
||||
#### 1. Consider How Urgent You Are Searching
|
||||
|
||||
While many industries have and will continue to be hit hard by the COVID-19 pandemic, others are still hiring. If you’re unemployed and need a stopgap, consider looking there or wherever else you can find an opportunity that makes sense for you—and pays the rent and puts food on the table—in the meantime.
|
||||
|
||||
#### 2. Get Comfortable Networking Online
|
||||
|
||||
Events will be cancelled for a while, so you’ll need to find a new networking strategy. Seek out like-minded professionals online and ask about virtual events.
|
||||
Look for professional groups to join on Facebook and LinkedIn. Both platforms offer a wide range of options with groups for every profession. For instance, if you’re looking for a job in marketing, you could join LinkedIn’s Global Marketing and Communications Professionals group. Join in the conversation, post and comment, and make yourself visible.
|
||||
|
||||
#### 3. Stay In Touch
|
||||
|
||||
Maybe you recently had a promising interview and a job offer seemed to be on the horizon, but now the company has moved to remote work and you haven’t heard from the hiring manager. What should you do? Check in with the hiring manager by email, acknowledging that they might be scrambling to help their employees get used to the new setup.
|
||||
|
||||
#### 4. Gather Intel
|
||||
|
||||
The COVID-19 crisis can provide a unique glimpse into company culture. Take note of how leadership deals with this emergency and treats its employees by following the company on social media and watching for any media coverage.
|
||||
You can mention what you read and listened to and use your specific knowledge to drive home how you could help the company achieve its goals if hired.
|
||||
|
||||
#### 5. Use the Time to Reflect
|
||||
|
||||
Job seekers often jump at the first available opportunity or go into their search without fully considering what they want to do next. Take advantage of the slowing job market by getting clarity about where you want to work and the type of role and title you're seeking.
|
||||
|
||||
#### 6. Boost Your Skills
|
||||
|
||||
Now is the perfect time to work on bolstering your qualifications, Moser says. Analyze job descriptions by listing each required skill and experience. Then consider whether you have that exact skill, if you have the skill but haven’t used it in a few years, or if you’re lacking the skill entirely. Use that information to determine what you need to brush up on to make yourself an even better candidate when the job market picks up again.
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
@-webkit-keyframes slideInLeft {
|
||||
from {
|
||||
-webkit-transform: translate3d(-100%, 0, 0);
|
||||
transform: translate3d(-100%, 0, 0);
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideInLeft {
|
||||
from {
|
||||
-webkit-transform: translate3d(-100%, 0, 0);
|
||||
transform: translate3d(-100%, 0, 0);
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
.slideInLeft {
|
||||
-webkit-animation-name: slideInLeft;
|
||||
animation-name: slideInLeft;
|
||||
}
|
||||
|
||||
@-webkit-keyframes slideInRight {
|
||||
from {
|
||||
-webkit-transform: translate3d(100%, 0, 0);
|
||||
transform: translate3d(100%, 0, 0);
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideInRight {
|
||||
from {
|
||||
-webkit-transform: translate3d(100%, 0, 0);
|
||||
transform: translate3d(100%, 0, 0);
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
.slideInRight {
|
||||
-webkit-animation-name: slideInRight;
|
||||
animation-name: slideInRight;
|
||||
}
|
||||
|
||||
.animated {
|
||||
-webkit-animation-duration: 1s;
|
||||
animation-duration: 1s;
|
||||
-webkit-animation-fill-mode: both;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
|
||||
@media (print), (prefers-reduced-motion: reduce) {
|
||||
.animated {
|
||||
-webkit-animation-duration: 1ms !important;
|
||||
animation-duration: 1ms !important;
|
||||
-webkit-transition-duration: 1ms !important;
|
||||
transition-duration: 1ms !important;
|
||||
-webkit-animation-iteration-count: 1 !important;
|
||||
animation-iteration-count: 1 !important;
|
||||
}
|
||||
}
|
||||
@@ -1,304 +0,0 @@
|
||||
/* Material Icons */
|
||||
@font-face {
|
||||
font-family: 'Material Icons';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local('Material Icons'), local('MaterialIcons-Regular'),
|
||||
url('../fonts/MaterialIcons/MaterialIcons-Regular.woff2') format('woff2'),
|
||||
url('../fonts/MaterialIcons/MaterialIcons-Regular.woff') format('woff');
|
||||
}
|
||||
|
||||
.material-icons {
|
||||
font-family: 'Material Icons';
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
display: inline-block;
|
||||
line-height: 1;
|
||||
text-transform: none;
|
||||
letter-spacing: normal;
|
||||
word-wrap: normal;
|
||||
white-space: nowrap;
|
||||
direction: ltr;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
text-rendering: optimizeLegibility;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
font-feature-settings: 'liga';
|
||||
}
|
||||
|
||||
/* Montserrat 400 */
|
||||
@font-face {
|
||||
font-family: 'Montserrat';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local('Montserrat Regular'), local('Montserrat-Regular'),
|
||||
url('../fonts/Montserrat/Montserrat-400.woff2') format('woff2'),
|
||||
url('../fonts/Montserrat/Montserrat-400.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Montserrat 500 */
|
||||
@font-face {
|
||||
font-family: 'Montserrat';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
src: local('Montserrat Medium'), local('Montserrat-Medium'),
|
||||
url('../fonts/Montserrat/Montserrat-500.woff2') format('woff2'),
|
||||
url('../fonts/Montserrat/Montserrat-500.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Montserrat 600 */
|
||||
@font-face {
|
||||
font-family: 'Montserrat';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: local('Montserrat SemiBold'), local('Montserrat-SemiBold'),
|
||||
url('../fonts/Montserrat/Montserrat-600.woff2') format('woff2'),
|
||||
url('../fonts/Montserrat/Montserrat-600.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Montserrat 700 */
|
||||
@font-face {
|
||||
font-family: 'Montserrat';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: local('Montserrat Bold'), local('Montserrat-Bold'),
|
||||
url('../fonts/Montserrat/Montserrat-700.woff2') format('woff2'),
|
||||
url('../fonts/Montserrat/Montserrat-700.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Lato 400 */
|
||||
@font-face {
|
||||
font-family: 'Lato';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local('Lato Regular'), local('Lato-Regular'),
|
||||
url('../fonts/Lato/Lato-400.woff2') format('woff2'),
|
||||
url('../fonts/Lato/Lato-400.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Lato 700 */
|
||||
@font-face {
|
||||
font-family: 'Lato';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: local('Lato Bold'), local('Lato-Bold'), url('../fonts/Lato/Lato-700.woff2') format('woff2'),
|
||||
url('../fonts/Lato/Lato-700.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Nunito 400 */
|
||||
@font-face {
|
||||
font-family: 'Nunito';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local('Nunito Regular'), local('Nunito-Regular'),
|
||||
url('../fonts/Nunito/Nunito-400.woff') format('woff2'),
|
||||
url('../fonts/Nunito/Nunito-400.woff2') format('woff');
|
||||
}
|
||||
|
||||
/* Nunito 600 */
|
||||
@font-face {
|
||||
font-family: 'Nunito';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: local('Nunito SemiBold'), local('Nunito-SemiBold'),
|
||||
url('../fonts/Nunito/Nunito-600.woff') format('woff2'),
|
||||
url('../fonts/Nunito/Nunito-600.woff2') format('woff');
|
||||
}
|
||||
|
||||
/* Nunito 700 */
|
||||
@font-face {
|
||||
font-family: 'Nunito';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: local('Nunito Bold'), local('Nunito-Bold'),
|
||||
url('../fonts/Nunito/Nunito-700.woff') format('woff2'),
|
||||
url('../fonts/Nunito/Nunito-700.woff2') format('woff');
|
||||
}
|
||||
|
||||
/* Open Sans 400 */
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local('Open Sans Regular'), local('OpenSans-Regular'),
|
||||
url('../fonts/OpenSans/OpenSans-400.woff2') format('woff2'),
|
||||
url('../fonts/OpenSans/OpenSans-400.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Open Sans 600 */
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'),
|
||||
url('../fonts/OpenSans/OpenSans-600.woff2') format('woff2'),
|
||||
url('../fonts/OpenSans/OpenSans-600.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Open Sans 700 */
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: local('Open Sans Bold'), local('OpenSans-Bold'),
|
||||
url('../fonts/OpenSans/OpenSans-700.woff2') format('woff2'),
|
||||
url('../fonts/OpenSans/OpenSans-700.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Raleway 400 */
|
||||
@font-face {
|
||||
font-family: 'Raleway';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local('Raleway'), local('Raleway-Regular'),
|
||||
url('../fonts/Raleway/Raleway-400.woff2') format('woff2'),
|
||||
url('../fonts/Raleway/Raleway-400.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Raleway 500 */
|
||||
@font-face {
|
||||
font-family: 'Raleway';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
src: local('Raleway Medium'), local('Raleway-Medium'),
|
||||
url('../fonts/Raleway/Raleway-500.woff2') format('woff2'),
|
||||
url('../fonts/Raleway/Raleway-500.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Raleway 600 */
|
||||
@font-face {
|
||||
font-family: 'Raleway';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: local('Raleway SemiBold'), local('Raleway-SemiBold'),
|
||||
url('../fonts/Raleway/Raleway-600.woff2') format('woff2'),
|
||||
url('../fonts/Raleway/Raleway-600.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Raleway 700 */
|
||||
@font-face {
|
||||
font-family: 'Raleway';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: local('Raleway Bold'), local('Raleway-Bold'),
|
||||
url('../fonts/Raleway/Raleway-700.woff2') format('woff2'),
|
||||
url('../fonts/Raleway/Raleway-700.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Rubik 400 */
|
||||
@font-face {
|
||||
font-family: 'Rubik';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local('Rubik'), local('Rubik-Regular'), url('../fonts/Rubik/Rubik-400.woff2') format('woff2'),
|
||||
url('../fonts/Rubik/Rubik-400.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Rubik 500 */
|
||||
@font-face {
|
||||
font-family: 'Rubik';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
src: local('Rubik Medium'), local('Rubik-Medium'),
|
||||
url('../fonts/Rubik/Rubik-500.woff2') format('woff2'),
|
||||
url('../fonts/Rubik/Rubik-500.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Rubik 700 */
|
||||
@font-face {
|
||||
font-family: 'Rubik';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: local('Rubik Bold'), local('Rubik-Bold'),
|
||||
url('../fonts/Rubik/Rubik-700.woff2') format('woff2'),
|
||||
url('../fonts/Rubik/Rubik-700.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Source Sans Pro 400 */
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'),
|
||||
url('../fonts/SourceSansPro/SourceSansPro-400.woff2') format('woff2'),
|
||||
url('../fonts/SourceSansPro/SourceSansPro-400.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Source Sans Pro 600 */
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'),
|
||||
url('../fonts/SourceSansPro/SourceSansPro-600.woff2') format('woff2'),
|
||||
url('../fonts/SourceSansPro/SourceSansPro-600.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Source Sans Pro 700 */
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'),
|
||||
url('../fonts/SourceSansPro/SourceSansPro-700.woff2') format('woff2'),
|
||||
url('../fonts/SourceSansPro/SourceSansPro-700.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Titillium Web 400 */
|
||||
@font-face {
|
||||
font-family: 'Titillium Web';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local('Titillium Web Regular'), local('TitilliumWeb-Regular'),
|
||||
url('../fonts/TitilliumWeb/TitilliumWeb-400.woff2') format('woff2'),
|
||||
url('../fonts/TitilliumWeb/TitilliumWeb-400.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Titillium Web 600 */
|
||||
@font-face {
|
||||
font-family: 'Titillium Web';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: local('Titillium Web SemiBold'), local('TitilliumWeb-SemiBold'),
|
||||
url('../fonts/TitilliumWeb/TitilliumWeb-600.woff2') format('woff2'),
|
||||
url('../fonts/TitilliumWeb/TitilliumWeb-600.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Titillium Web 700 */
|
||||
@font-face {
|
||||
font-family: 'Titillium Web';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: local('Titillium Web Bold'), local('TitilliumWeb-Bold'),
|
||||
url('../fonts/TitilliumWeb/TitilliumWeb-700.woff2') format('woff2'),
|
||||
url('../fonts/TitilliumWeb/TitilliumWeb-700.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Ubuntu 400 */
|
||||
@font-face {
|
||||
font-family: 'Ubuntu';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local('Ubuntu Regular'), local('Ubuntu-Regular'),
|
||||
url('../fonts/Ubuntu/Ubuntu-400.woff2') format('woff2'),
|
||||
url('../fonts/Ubuntu/Ubuntu-400.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Ubuntu 500 */
|
||||
@font-face {
|
||||
font-family: 'Ubuntu';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
src: local('Ubuntu Medium'), local('Ubuntu-Medium'),
|
||||
url('../fonts/Ubuntu/Ubuntu-500.woff2') format('woff2'),
|
||||
url('../fonts/Ubuntu/Ubuntu-500.woff') format('woff');
|
||||
}
|
||||
|
||||
/* Ubuntu 700 */
|
||||
@font-face {
|
||||
font-family: 'Ubuntu';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: local('Ubuntu Bold'), local('Ubuntu-Bold'),
|
||||
url('../fonts/Ubuntu/Ubuntu-700.woff2') format('woff2'),
|
||||
url('../fonts/Ubuntu/Ubuntu-700.woff') format('woff');
|
||||
}
|
||||
@@ -1,304 +0,0 @@
|
||||
{
|
||||
"data": {
|
||||
"profile": {
|
||||
"heading": "Profile",
|
||||
"photo": "https://i.imgur.com/Icr472Z.jpg",
|
||||
"firstName": "Nancy",
|
||||
"lastName": "Jackson",
|
||||
"subtitle": "Customer Sales Representative",
|
||||
"address": {
|
||||
"line1": "3879 Gateway Avenue",
|
||||
"line2": "Bakersfield,",
|
||||
"line3": "California, USA"
|
||||
},
|
||||
"phone": "+1 661-808-4188",
|
||||
"website": "nancyontheweb.com",
|
||||
"email": "nancyjack43@gmail.com"
|
||||
},
|
||||
"objective": {
|
||||
"enable": true,
|
||||
"heading": "Professional Objective",
|
||||
"body": "To obtain a job within my chosen field that will challenge me and allow me to use my education, skills and past experiences in a way that is mutually beneficial to both myself and my employer and allow for future growth and advancement."
|
||||
},
|
||||
"work": {
|
||||
"enable": true,
|
||||
"heading": "Work Experience",
|
||||
"items": [
|
||||
{
|
||||
"id": "a208ec03-76e3-4428-ac5b-e17c3de4ac18",
|
||||
"title": "On Point Electronics, NYC, NY",
|
||||
"role": "Customer Service Representative",
|
||||
"start": "Jan 2013",
|
||||
"end": "July 2018",
|
||||
"description": "- Organized customer information and account data for business planning and customer service purposes.\n- Created excel spreadsheets to track customer data and perform intense reconciliation process.\n- Received 97% positive customer survey results.\n- Speed on calls was 10% above team average. \n**Key Achievement:** Designed and executed an automatized system for following up with customers, increasing customer retention by 22%.",
|
||||
"enabled": true,
|
||||
"enable": true
|
||||
},
|
||||
{
|
||||
"id": "bd8649f2-42d1-4424-acaf-a02c08c3322c",
|
||||
"title": "Excelsior Communications, NYC, NY",
|
||||
"role": "Customer Service Representative",
|
||||
"start": "Oct 2009",
|
||||
"end": "Dec 2012",
|
||||
"description": "- Worked as a full time customer service rep in a high volume call center.\n- Received \"Associate of the Month\" award six times.\n- Chosen as an example for other associates in trainings. \n**Key Achievement:** Received Customer Appreciation bonus in three of four years.",
|
||||
"enabled": true,
|
||||
"enable": true
|
||||
},
|
||||
{
|
||||
"id": "dde47711-a7a6-424f-9751-73483a0ef4ed",
|
||||
"title": "Pizza Hut, Newark, NJ",
|
||||
"role": "Waitress",
|
||||
"start": "Aug 2005",
|
||||
"end": "Sep 2009",
|
||||
"description": "- Worked passionately in customer service in a high volume restaurant.\n- Completed the FAST customer service training class.\n- Maintained a high tip average thanks to consistent customer satisfaction.",
|
||||
"enabled": true,
|
||||
"enable": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"education": {
|
||||
"enable": true,
|
||||
"heading": "Education",
|
||||
"items": [
|
||||
{
|
||||
"id": "624f32ab-2d78-4052-86ad-1354fd41d754",
|
||||
"name": "The City College of New York, NYC, NY",
|
||||
"major": "MS in Computer Science",
|
||||
"start": "Sep 2001",
|
||||
"end": "Aug 2002",
|
||||
"grade": "7.2 CGPA",
|
||||
"description": "",
|
||||
"enabled": true,
|
||||
"enable": true
|
||||
},
|
||||
{
|
||||
"id": "71a9852f-ed14-4281-bff2-4db9a2275978",
|
||||
"name": "University of California, Berkeley, CA",
|
||||
"major": "BS in Computer Science",
|
||||
"start": "Sep 1997",
|
||||
"end": "Aug 2001",
|
||||
"grade": "8.4 CGPA",
|
||||
"description": "",
|
||||
"enabled": true,
|
||||
"enable": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"awards": {
|
||||
"enable": true,
|
||||
"heading": "Honors & Awards",
|
||||
"items": [
|
||||
{
|
||||
"id": "121f0976-18cb-4e46-921d-0e156b6bf7fb",
|
||||
"title": "Cast Member of a Musical - Oklahoma",
|
||||
"subtitle": "Winter, 2007",
|
||||
"description": "",
|
||||
"enable": true
|
||||
},
|
||||
{
|
||||
"id": "e5f27346-72ad-4d4f-bab3-726a111e4932",
|
||||
"title": "Class Representative to ASB",
|
||||
"subtitle": "Fall, 2008",
|
||||
"description": "",
|
||||
"enable": true
|
||||
},
|
||||
{
|
||||
"id": "f71ba9bc-8c14-46b5-99dd-e1333e9aceb9",
|
||||
"title": "Most Improved - Varsity Soccer",
|
||||
"subtitle": "Fall, 2007",
|
||||
"description": "",
|
||||
"enable": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"certifications": {
|
||||
"enable": true,
|
||||
"heading": "Certifications",
|
||||
"items": [
|
||||
{
|
||||
"id": "e5170d99-b21d-4131-a7dc-26a4670037f5",
|
||||
"title": "CCNP",
|
||||
"subtitle": "Cisco Systems",
|
||||
"description": "",
|
||||
"enable": true
|
||||
},
|
||||
{
|
||||
"id": "788e4042-9ecb-40c5-849d-7688b4e23888",
|
||||
"title": "VCP6-DCV",
|
||||
"subtitle": "VMWare",
|
||||
"description": "",
|
||||
"enable": true
|
||||
},
|
||||
{
|
||||
"id": "97a1a8d9-3c03-47fb-93ab-e84f864ffe17",
|
||||
"title": "DCUCI 642-999",
|
||||
"subtitle": "Cisco Systems",
|
||||
"description": "",
|
||||
"enable": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"skills": {
|
||||
"enable": true,
|
||||
"heading": "Skills",
|
||||
"items": [
|
||||
{
|
||||
"id": "2562d78a-3459-4370-8604-c81b00738db1",
|
||||
"skill": "Customer Service Expertise"
|
||||
},
|
||||
{
|
||||
"id": "58c31587-9770-4522-a34c-f5ad92fe33e5",
|
||||
"skill": "High-Volume Call Center"
|
||||
},
|
||||
{
|
||||
"id": "7aa9a4b1-a2bb-4bcd-8711-b66c0d246971",
|
||||
"skill": "Team Leader/Problem Solver"
|
||||
},
|
||||
{
|
||||
"id": "e7fd33e8-5d77-462d-8115-5be57f52832e",
|
||||
"skill": "Call Center Management"
|
||||
},
|
||||
{
|
||||
"id": "7bad2af1-c24d-4e01-b68b-be01cfa784ce",
|
||||
"skill": "Teambuilding & Training"
|
||||
},
|
||||
{
|
||||
"id": "64fe1710-c2d1-4f53-922e-a5d751eee967",
|
||||
"skill": "Continuous Improvement"
|
||||
}
|
||||
]
|
||||
},
|
||||
"hobbies": {
|
||||
"enable": true,
|
||||
"heading": "Hobbies",
|
||||
"items": [
|
||||
{
|
||||
"id": "dd2efad7-e900-4384-bdc0-b2ab5f62bb71",
|
||||
"hobby": "Poetry"
|
||||
|
||||
},
|
||||
{
|
||||
"id": "96023eb7-8c93-4b1d-b581-b8fc4107351a",
|
||||
"hobby": "Travelling"
|
||||
},
|
||||
{
|
||||
"id": "7e5a6168-9cbe-4fe6-b9b9-43a47d8bb15a",
|
||||
"hobby": "Beatboxing"
|
||||
},
|
||||
{
|
||||
"id": "dd7f4ffd-9c16-4dbf-8968-1165b9e30db8",
|
||||
"hobby": "Sketching"
|
||||
}
|
||||
]
|
||||
},
|
||||
"languages": {
|
||||
"enable": true,
|
||||
"heading": "Languages",
|
||||
"items": [
|
||||
{
|
||||
"id": "9d34cfcb-c9f0-4d25-ab27-cf81652dd1d0",
|
||||
"key": "English (US)",
|
||||
"value": 5,
|
||||
"enable": true,
|
||||
"level": "",
|
||||
"rating": 5
|
||||
},
|
||||
{
|
||||
"id": "3511a86b-7ea9-44ac-8144-6acc7f3bd54f",
|
||||
"key": "Spanish",
|
||||
"value": 4,
|
||||
"enable": true,
|
||||
"rating": 4
|
||||
},
|
||||
{
|
||||
"id": "d1e17542-f7cc-473a-aa0e-978765907454",
|
||||
"key": "Japanese",
|
||||
"value": 4,
|
||||
"enable": true,
|
||||
"level": "N4",
|
||||
"rating": 2
|
||||
},
|
||||
{
|
||||
"id": "b1e8442a-7059-4c6f-8a9c-415383133b0e",
|
||||
"key": "German",
|
||||
"value": 3,
|
||||
"enable": true,
|
||||
"level": "B1",
|
||||
"rating": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"references": {
|
||||
"enable": true,
|
||||
"heading": "References",
|
||||
"items": [
|
||||
{
|
||||
"id": "ba3662e6-29cb-4a03-9766-b3618d1621f3",
|
||||
"name": "Lorraine Beasley",
|
||||
"position": "Head of HR, Carson Logistics",
|
||||
"phone": "+1 661-808-4188",
|
||||
"email": "l.beasley@carsonlogistics.com",
|
||||
"description": "",
|
||||
"enable": true
|
||||
},
|
||||
{
|
||||
"id": "62fd3293-0e93-4242-882b-ae19b7865fef",
|
||||
"name": "Mikhail Nabakov",
|
||||
"position": "Assistant Manager, Bullseye",
|
||||
"phone": "+1 661-808-4188",
|
||||
"email": "mikhail@bullseyemart.nyc",
|
||||
"description": "",
|
||||
"enable": true
|
||||
},
|
||||
{
|
||||
"id": "eaab2e32-8591-497c-8676-d122cf3a4798",
|
||||
"name": "Katherine Rose",
|
||||
"position": "CEO , DownToPlay",
|
||||
"phone": "+1 661-808-4188",
|
||||
"email": "k.rose@downtoplay.xyz",
|
||||
"description": "",
|
||||
"enable": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"extras": {
|
||||
"enable": true,
|
||||
"heading": "Additional Information",
|
||||
"items": [
|
||||
{
|
||||
"id": "3834a270-2c01-4105-b670-80863c955347",
|
||||
"key": "Skype",
|
||||
"value": "@NancyJack5436",
|
||||
"enable": true
|
||||
},
|
||||
{
|
||||
"id": "b0c4fd85-cfda-421e-bd31-008b9aad1dfe",
|
||||
"key": "Hometown",
|
||||
"value": "New Jersey, NY",
|
||||
"enable": true
|
||||
},
|
||||
{
|
||||
"id": "7f0a4971-9770-4ca7-b135-2b0ccd867879",
|
||||
"key": "Hobbies",
|
||||
"value": "Playing Soccer & Guitar",
|
||||
"enable": true
|
||||
},
|
||||
{
|
||||
"id": "e17552a2-e7e9-4605-8145-795e2b62c30e",
|
||||
"key": "Valid Work Visas",
|
||||
"value": "US, UK, EU",
|
||||
"enable": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"theme": {
|
||||
"layout": "castform",
|
||||
"font": { "family": "Montserrat" },
|
||||
"colors": {
|
||||
"background": "#ffffff",
|
||||
"primary": "#212121",
|
||||
"accent": "#f44336"
|
||||
}
|
||||
}
|
||||
}
|
||||