mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-18 18:51:32 +10:00
Merge remote-tracking branch 'upstream/develop' into develop
This commit is contained in:
4
.dockerignore
Normal file
4
.dockerignore
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.cache/
|
||||||
|
node_modules/
|
||||||
|
functions/
|
||||||
|
public/
|
||||||
12
Dockerfile
Normal file
12
Dockerfile
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
FROM node as builder
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY ./ /app/
|
||||||
|
|
||||||
|
RUN npm install
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
FROM nginx:alpine
|
||||||
|
RUN rm -rf /usr/share/nginx/html
|
||||||
|
COPY --from=builder /app/public/ /usr/share/nginx/html
|
||||||
|
COPY server.conf /etc/nginx/conf.d/default.conf
|
||||||
@ -6,7 +6,7 @@ module.exports = {
|
|||||||
title: 'Reactive Resume',
|
title: 'Reactive Resume',
|
||||||
siteUrl: 'https://rxresu.me',
|
siteUrl: 'https://rxresu.me',
|
||||||
description: 'A free and open source resume builder.',
|
description: 'A free and open source resume builder.',
|
||||||
version: '2.4.2',
|
version: '2.4.3',
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
'gatsby-plugin-react-helmet',
|
'gatsby-plugin-react-helmet',
|
||||||
|
|||||||
19
server.conf
Normal file
19
server.conf
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
|
||||||
|
index index.html;
|
||||||
|
autoindex off;
|
||||||
|
charset urtf-8;
|
||||||
|
|
||||||
|
error_page 404 /404.html;
|
||||||
|
|
||||||
|
location ~* \.(html)$ {
|
||||||
|
add_header Cache-Control "no-store";
|
||||||
|
expires off;
|
||||||
|
}
|
||||||
|
|
||||||
|
rewrite ^([^.\?]*[^/])$ $1/ permanent;
|
||||||
|
|
||||||
|
try_files $uri $uri/ $uri/index.html =404;
|
||||||
|
}
|
||||||
@ -12,7 +12,6 @@ import ProjectsA from './blocks/Projects/ProjectsA';
|
|||||||
import ReferencesA from './blocks/References/ReferencesA';
|
import ReferencesA from './blocks/References/ReferencesA';
|
||||||
import SkillsA from './blocks/Skills/SkillsA';
|
import SkillsA from './blocks/Skills/SkillsA';
|
||||||
import WorkA from './blocks/Work/WorkA';
|
import WorkA from './blocks/Work/WorkA';
|
||||||
import BirthDateA from './blocks/BirthDate/BirthDateA';
|
|
||||||
|
|
||||||
const Blocks = {
|
const Blocks = {
|
||||||
objective: ObjectiveA,
|
objective: ObjectiveA,
|
||||||
@ -77,10 +76,7 @@ const Castform = ({ data }) => {
|
|||||||
|
|
||||||
<div>
|
<div>
|
||||||
<HeadingD>{data.profile.heading}</HeadingD>
|
<HeadingD>{data.profile.heading}</HeadingD>
|
||||||
<div className="grid gap-4">
|
<ContactC />
|
||||||
<BirthDateA />
|
|
||||||
<ContactC />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{layout[0] &&
|
{layout[0] &&
|
||||||
|
|||||||
@ -14,7 +14,6 @@ import ProjectsA from './blocks/Projects/ProjectsA';
|
|||||||
import ReferencesA from './blocks/References/ReferencesA';
|
import ReferencesA from './blocks/References/ReferencesA';
|
||||||
import SkillsA from './blocks/Skills/SkillsA';
|
import SkillsA from './blocks/Skills/SkillsA';
|
||||||
import WorkA from './blocks/Work/WorkA';
|
import WorkA from './blocks/Work/WorkA';
|
||||||
import BirthDateA from './blocks/BirthDate/BirthDateA';
|
|
||||||
|
|
||||||
const Blocks = {
|
const Blocks = {
|
||||||
objective: ObjectiveA,
|
objective: ObjectiveA,
|
||||||
@ -102,7 +101,6 @@ const Celebi = ({ data }) => {
|
|||||||
<div>
|
<div>
|
||||||
<HeadingE>{t('builder.sections.profile')}</HeadingE>
|
<HeadingE>{t('builder.sections.profile')}</HeadingE>
|
||||||
<div className="relative w-full grid gap-4 text-xs">
|
<div className="relative w-full grid gap-4 text-xs">
|
||||||
<BirthDateA />
|
|
||||||
<ContactC />
|
<ContactC />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import PageContext from '../contexts/PageContext';
|
import PageContext from '../contexts/PageContext';
|
||||||
import { hexToRgb } from '../utils';
|
import { hasAddress, hexToRgb } from '../utils';
|
||||||
import AwardsA from './blocks/Awards/AwardsA';
|
import AwardsA from './blocks/Awards/AwardsA';
|
||||||
import CertificationsA from './blocks/Certifications/CertificationsA';
|
import CertificationsA from './blocks/Certifications/CertificationsA';
|
||||||
import ContactB from './blocks/Contact/ContactB';
|
import ContactB from './blocks/Contact/ContactB';
|
||||||
@ -13,7 +14,6 @@ import ProjectsA from './blocks/Projects/ProjectsA';
|
|||||||
import ReferencesB from './blocks/References/ReferencesB';
|
import ReferencesB from './blocks/References/ReferencesB';
|
||||||
import SkillsA from './blocks/Skills/SkillsA';
|
import SkillsA from './blocks/Skills/SkillsA';
|
||||||
import WorkA from './blocks/Work/WorkA';
|
import WorkA from './blocks/Work/WorkA';
|
||||||
import BirthDateC from './blocks/BirthDate/BirthDateC';
|
|
||||||
|
|
||||||
const Blocks = {
|
const Blocks = {
|
||||||
objective: ObjectiveA,
|
objective: ObjectiveA,
|
||||||
@ -29,6 +29,7 @@ const Blocks = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const Gengar = ({ data }) => {
|
const Gengar = ({ data }) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
const layout = data.metadata.layout.gengar;
|
const layout = data.metadata.layout.gengar;
|
||||||
const { r, g, b } = hexToRgb(data.metadata.colors.primary) || {};
|
const { r, g, b } = hexToRgb(data.metadata.colors.primary) || {};
|
||||||
|
|
||||||
@ -80,29 +81,28 @@ const Gengar = ({ data }) => {
|
|||||||
<Profile />
|
<Profile />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex flex-col mt-4 text-xs">
|
{hasAddress(data.profile.address) && (
|
||||||
<h6 className="font-bold text-xs uppercase tracking-wide mb-1">
|
<div className="flex flex-col mt-4 text-xs">
|
||||||
Address
|
<h6 className="font-bold text-xs uppercase tracking-wide mb-1">
|
||||||
</h6>
|
{t('shared.forms.address')}
|
||||||
<span>{data.profile.address.line1}</span>
|
</h6>
|
||||||
<span>{data.profile.address.line2}</span>
|
<span>{data.profile.address.line1}</span>
|
||||||
<span>
|
<span>{data.profile.address.line2}</span>
|
||||||
{data.profile.address.city} {data.profile.address.pincode}
|
<span>
|
||||||
</span>
|
{data.profile.address.city} {data.profile.address.pincode}
|
||||||
</div>
|
</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
<hr
|
<hr
|
||||||
className="w-1/4 my-5 opacity-25"
|
className="w-1/4 my-5 opacity-25"
|
||||||
style={{ borderColor: data.metadata.colors.background }}
|
style={{ borderColor: data.metadata.colors.background }}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div className="grid gap-4">
|
<h6 className="font-bold text-xs uppercase tracking-wide mb-2">
|
||||||
<h6 className="font-bold text-xs uppercase tracking-wide mb-1">
|
Contact
|
||||||
Contacts
|
</h6>
|
||||||
</h6>
|
<ContactB />
|
||||||
<ContactB />
|
|
||||||
<BirthDateC />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
|
|||||||
@ -13,7 +13,6 @@ import ProjectsA from './blocks/Projects/ProjectsA';
|
|||||||
import ReferencesA from './blocks/References/ReferencesA';
|
import ReferencesA from './blocks/References/ReferencesA';
|
||||||
import SkillsA from './blocks/Skills/SkillsA';
|
import SkillsA from './blocks/Skills/SkillsA';
|
||||||
import WorkA from './blocks/Work/WorkA';
|
import WorkA from './blocks/Work/WorkA';
|
||||||
import BirthDateA from './blocks/BirthDate/BirthDateA';
|
|
||||||
|
|
||||||
const Blocks = {
|
const Blocks = {
|
||||||
objective: ObjectiveA,
|
objective: ObjectiveA,
|
||||||
@ -71,11 +70,7 @@ const Glalie = ({ data }) => {
|
|||||||
>
|
>
|
||||||
<div className="grid gap-6 text-center p-8">
|
<div className="grid gap-6 text-center p-8">
|
||||||
<Profile />
|
<Profile />
|
||||||
|
<ContactD />
|
||||||
<div className="grid">
|
|
||||||
<BirthDateA />
|
|
||||||
<ContactD />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{layout[0] &&
|
{layout[0] &&
|
||||||
layout[0].map((x) => {
|
layout[0].map((x) => {
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import React, { memo } from 'react';
|
import React, { memo } from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import PageContext from '../contexts/PageContext';
|
import PageContext from '../contexts/PageContext';
|
||||||
import AwardsA from './blocks/Awards/AwardsA';
|
import AwardsA from './blocks/Awards/AwardsA';
|
||||||
import CertificationsA from './blocks/Certifications/CertificationsA';
|
import CertificationsA from './blocks/Certifications/CertificationsA';
|
||||||
@ -12,7 +13,7 @@ import ProjectsA from './blocks/Projects/ProjectsA';
|
|||||||
import ReferencesA from './blocks/References/ReferencesA';
|
import ReferencesA from './blocks/References/ReferencesA';
|
||||||
import SkillsA from './blocks/Skills/SkillsA';
|
import SkillsA from './blocks/Skills/SkillsA';
|
||||||
import WorkA from './blocks/Work/WorkA';
|
import WorkA from './blocks/Work/WorkA';
|
||||||
import BirthDateB from './blocks/BirthDate/BirthDateB';
|
import { hasAddress } from '../utils';
|
||||||
|
|
||||||
const Blocks = {
|
const Blocks = {
|
||||||
objective: ObjectiveA,
|
objective: ObjectiveA,
|
||||||
@ -28,6 +29,7 @@ const Blocks = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const Onyx = ({ data }) => {
|
const Onyx = ({ data }) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
const layout = data.metadata.layout.onyx;
|
const layout = data.metadata.layout.onyx;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -61,20 +63,22 @@ const Onyx = ({ data }) => {
|
|||||||
</h1>
|
</h1>
|
||||||
<h6 className="font-medium text-sm">{data.profile.subtitle}</h6>
|
<h6 className="font-medium text-sm">{data.profile.subtitle}</h6>
|
||||||
|
|
||||||
<div className="flex flex-col mt-4 text-xs">
|
{hasAddress(data.profile.address) && (
|
||||||
<span>{data.profile.address.line1}</span>
|
<div className="flex flex-col mt-4 text-xs">
|
||||||
<span>{data.profile.address.line2}</span>
|
<h6 className="font-bold text-xs uppercase tracking-wide mb-1">
|
||||||
<span>
|
{t('shared.forms.address')}
|
||||||
{data.profile.address.city} {data.profile.address.pincode}
|
</h6>
|
||||||
</span>
|
<span>{data.profile.address.line1}</span>
|
||||||
</div>
|
<span>{data.profile.address.line2}</span>
|
||||||
|
<span>
|
||||||
|
{data.profile.address.city} {data.profile.address.pincode}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid gap-4">
|
<Contact />
|
||||||
<BirthDateB />
|
|
||||||
<Contact />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr
|
<hr
|
||||||
|
|||||||
@ -12,7 +12,6 @@ import ProjectsA from './blocks/Projects/ProjectsA';
|
|||||||
import ReferencesA from './blocks/References/ReferencesA';
|
import ReferencesA from './blocks/References/ReferencesA';
|
||||||
import SkillsA from './blocks/Skills/SkillsA';
|
import SkillsA from './blocks/Skills/SkillsA';
|
||||||
import WorkA from './blocks/Work/WorkA';
|
import WorkA from './blocks/Work/WorkA';
|
||||||
import BirthDateB from './blocks/BirthDate/BirthDateB';
|
|
||||||
|
|
||||||
const Blocks = {
|
const Blocks = {
|
||||||
work: WorkA,
|
work: WorkA,
|
||||||
@ -90,7 +89,6 @@ const Pikachu = ({ data }) => {
|
|||||||
|
|
||||||
<div className="col-span-4">
|
<div className="col-span-4">
|
||||||
<div className="grid gap-4">
|
<div className="grid gap-4">
|
||||||
<BirthDateB />
|
|
||||||
<ContactA />
|
<ContactA />
|
||||||
|
|
||||||
{layout[0] &&
|
{layout[0] &&
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import { useTranslation } from 'react-i18next';
|
|||||||
import { FaCaretRight } from 'react-icons/fa';
|
import { FaCaretRight } from 'react-icons/fa';
|
||||||
import PageContext from '../../../contexts/PageContext';
|
import PageContext from '../../../contexts/PageContext';
|
||||||
import { safetyCheck } from '../../../utils';
|
import { safetyCheck } from '../../../utils';
|
||||||
|
import BirthDateB from '../BirthDate/BirthDateB';
|
||||||
import Icons from '../Icons';
|
import Icons from '../Icons';
|
||||||
|
|
||||||
const ContactItem = ({ value, icon, link }) => {
|
const ContactItem = ({ value, icon, link }) => {
|
||||||
@ -53,6 +54,8 @@ const ContactA = () => {
|
|||||||
link={`mailto:${data.profile.email}`}
|
link={`mailto:${data.profile.email}`}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<BirthDateB />
|
||||||
|
|
||||||
{safetyCheck(data.social) &&
|
{safetyCheck(data.social) &&
|
||||||
data.social.items.map((x) => (
|
data.social.items.map((x) => (
|
||||||
<ContactItem
|
<ContactItem
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import { useTranslation } from 'react-i18next';
|
|||||||
import { FaCaretRight } from 'react-icons/fa';
|
import { FaCaretRight } from 'react-icons/fa';
|
||||||
import PageContext from '../../../contexts/PageContext';
|
import PageContext from '../../../contexts/PageContext';
|
||||||
import { safetyCheck } from '../../../utils';
|
import { safetyCheck } from '../../../utils';
|
||||||
|
import BirthDateC from '../BirthDate/BirthDateC';
|
||||||
import Icons from '../Icons';
|
import Icons from '../Icons';
|
||||||
|
|
||||||
const ContactItem = ({ value, icon, link }) => {
|
const ContactItem = ({ value, icon, link }) => {
|
||||||
@ -53,6 +54,8 @@ const ContactB = () => {
|
|||||||
link={`mailto:${data.profile.email}`}
|
link={`mailto:${data.profile.email}`}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<BirthDateC />
|
||||||
|
|
||||||
{safetyCheck(data.social) &&
|
{safetyCheck(data.social) &&
|
||||||
data.social.items.map((x) => (
|
data.social.items.map((x) => (
|
||||||
<ContactItem
|
<ContactItem
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
import React, { memo, useContext } from 'react';
|
import React, { memo, useContext } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import PageContext from '../../../contexts/PageContext';
|
import PageContext from '../../../contexts/PageContext';
|
||||||
import { safetyCheck } from '../../../utils';
|
import { hasAddress, safetyCheck } from '../../../utils';
|
||||||
|
import BirthDateA from '../BirthDate/BirthDateA';
|
||||||
|
|
||||||
const ContactItem = ({ value, label, link }) =>
|
const ContactItem = ({ value, label, link }) =>
|
||||||
value ? (
|
value ? (
|
||||||
@ -23,7 +24,7 @@ const ContactC = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="text-xs grid gap-2">
|
<div className="text-xs grid gap-2">
|
||||||
{data.profile.address.line1 && (
|
{hasAddress(data.profile.address) && (
|
||||||
<div>
|
<div>
|
||||||
<h6 className="capitalize font-semibold">
|
<h6 className="capitalize font-semibold">
|
||||||
{t('shared.forms.address')}
|
{t('shared.forms.address')}
|
||||||
@ -54,6 +55,8 @@ const ContactC = () => {
|
|||||||
link={`mailto:${data.profile.email}`}
|
link={`mailto:${data.profile.email}`}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<BirthDateA />
|
||||||
|
|
||||||
{safetyCheck(data.social) &&
|
{safetyCheck(data.social) &&
|
||||||
data.social.items.map((x) => (
|
data.social.items.map((x) => (
|
||||||
<ContactItem
|
<ContactItem
|
||||||
|
|||||||
@ -2,7 +2,8 @@ import React, { memo, useContext } from 'react';
|
|||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { MdFlare } from 'react-icons/md';
|
import { MdFlare } from 'react-icons/md';
|
||||||
import PageContext from '../../../contexts/PageContext';
|
import PageContext from '../../../contexts/PageContext';
|
||||||
import { safetyCheck } from '../../../utils';
|
import { hasAddress, safetyCheck } from '../../../utils';
|
||||||
|
import BirthDateA from '../BirthDate/BirthDateA';
|
||||||
|
|
||||||
const ContactItem = ({ value, label, link }) =>
|
const ContactItem = ({ value, label, link }) =>
|
||||||
value ? (
|
value ? (
|
||||||
@ -41,7 +42,7 @@ const ContactD = () => {
|
|||||||
<MdFlare size="20px" />
|
<MdFlare size="20px" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{data.profile.address.line1 && (
|
{hasAddress(data.profile.address) && (
|
||||||
<div>
|
<div>
|
||||||
<h6 className="capitalize font-semibold">
|
<h6 className="capitalize font-semibold">
|
||||||
{t('shared.forms.address')}
|
{t('shared.forms.address')}
|
||||||
@ -72,6 +73,8 @@ const ContactD = () => {
|
|||||||
link={`mailto:${data.profile.email}`}
|
link={`mailto:${data.profile.email}`}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<BirthDateA />
|
||||||
|
|
||||||
{safetyCheck(data.social) &&
|
{safetyCheck(data.social) &&
|
||||||
data.social.items.map((x) => (
|
data.social.items.map((x) => (
|
||||||
<ContactItem
|
<ContactItem
|
||||||
|
|||||||
@ -48,6 +48,9 @@ export const getUnsplashPhoto = async () => {
|
|||||||
return response.url;
|
return response.url;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const hasAddress = (address) =>
|
||||||
|
!!address.line1 || !!address.line2 || !!address.city || !!address.pincode;
|
||||||
|
|
||||||
export const hexToRgb = (hex) => {
|
export const hexToRgb = (hex) => {
|
||||||
const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
|
const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
|
||||||
hex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);
|
hex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);
|
||||||
|
|||||||
Reference in New Issue
Block a user