Compare commits

..

93 Commits

Author SHA1 Message Date
8864243558 update 2022-04-08 09:41:50 +02:00
37aab7a16f chore(release): 3.3.1 2022-04-08 09:40:46 +02:00
86e1bdf7ea chore(typescript): downgrade to "<4.6.0" 2022-04-08 09:40:34 +02:00
4547fd213d chore(release): 3.3.0 2022-04-08 09:39:01 +02:00
5aacec40cc chore(typescript): downgrade to "<4.6.0" 2022-04-08 09:38:41 +02:00
1df78100ca feat(upgrade): changes to code to support new template 2022-04-08 09:37:26 +02:00
9cd36fcb9b Merge pull request #817 from schklom/patch-2
Automatic multi-platform Docker image build
2022-04-08 08:24:17 +02:00
24b32eb917 Merge pull request #811 from klejejs/main
A new template - Leafish
2022-04-08 08:24:10 +02:00
dec0e41fec Merge pull request #806 from AmruthPillai/i18n_main
New Crowdin updates
2022-04-08 08:21:05 +02:00
42700ad2b2 Update docker-build-push.yml
QEMU + Docker Buildx + multi-platform
2022-04-07 18:32:39 +02:00
df51d79f6b Merge pull request #812 from AmruthPillai/dependabot/gradle/app/org.jetbrains.kotlin.android-1.6.20
Bump org.jetbrains.kotlin.android from 1.6.10 to 1.6.20 in /app
2022-04-04 09:57:39 +02:00
be1673a6a7 Bump org.jetbrains.kotlin.android from 1.6.10 to 1.6.20 in /app
Bumps org.jetbrains.kotlin.android from 1.6.10 to 1.6.20.

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-04 02:21:29 +00:00
648f182e76 Added new template - Leafish 2022-04-03 20:23:06 +03:00
3aa56f0886 New translations landing.json (Portuguese) 2022-03-31 22:19:33 +02:00
b795534da7 New translations landing.json (Portuguese) 2022-03-31 21:13:27 +02:00
c67e2ac9f8 Merge pull request #791 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-28 16:44:24 +02:00
beb418bd5d chore(release): 3.2.11 2022-03-28 16:43:35 +02:00
2b3d9533b0 Merge pull request #797 from chandiwalaaadhar/fix/#795-No-Scrollbar-on-overflow
Fix-#795 No Scoll Behaviour on Overflow
2022-03-28 16:42:52 +02:00
b061f139bd Fix-#795 No Scoll Behaviour on Overflow 2022-03-28 19:56:54 +05:30
ac569324cf New translations common.json (Portuguese) 2022-03-25 15:24:14 +01:00
357d197bb3 New translations common.json (Portuguese) 2022-03-25 14:13:12 +01:00
5eed1186ff chore(release): 3.2.10 2022-03-24 11:59:03 +01:00
a87a9b3247 revert changes made to unreleased v3.2.10 2022-03-24 11:58:44 +01:00
7f1c82cd91 feat(i18n): add portuguese (pt) language to i18n locales 2022-03-24 11:57:16 +01:00
048c1ed3ed Merge pull request #764 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-24 11:54:48 +01:00
9a2570d7e7 New translations builder.json (Portuguese) 2022-03-24 11:46:44 +01:00
00b9c2156d chore(release): 3.2.10 2022-03-24 11:33:14 +01:00
ff8b22274f ci(docker): use docker compose yaml anchor values and extension fields 2022-03-24 11:32:57 +01:00
786937f847 ci(gh): add .devcontainer for GitHub Codespaces 2022-03-24 09:16:54 +00:00
c95efee8ec perf(security): generate random salt rounds integer 2022-03-24 08:45:22 +01:00
776d2f79a6 ci(dependabot): upgrade npm dependencies manually, using local chore 2022-03-24 08:38:54 +01:00
25a6b8cce6 chore(deps): update dependencies to latest 2022-03-24 08:37:57 +01:00
f6d7cae17b Merge pull request #789 from AmruthPillai/dependabot/npm_and_yarn/typeorm-0.3.3
Bump typeorm from 0.2.45 to 0.3.3
2022-03-24 08:16:39 +01:00
944a0b5fb1 Bump typeorm from 0.2.45 to 0.3.3
Bumps [typeorm](https://github.com/typeorm/typeorm) from 0.2.45 to 0.3.3.
- [Release notes](https://github.com/typeorm/typeorm/releases)
- [Changelog](https://github.com/typeorm/typeorm/blob/master/CHANGELOG.md)
- [Commits](https://github.com/typeorm/typeorm/compare/0.2.45...0.3.3)

---
updated-dependencies:
- dependency-name: typeorm
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:15:35 +00:00
7769653224 Merge pull request #782 from AmruthPillai/dependabot/npm_and_yarn/server/nestjs/config-2.0.0
Bump @nestjs/config from 1.2.1 to 2.0.0 in /server
2022-03-24 08:15:25 +01:00
ccdc5b5fae Merge pull request #781 from AmruthPillai/dependabot/npm_and_yarn/docs/types/react-17.0.42
Bump @types/react from 17.0.40 to 17.0.42 in /docs
2022-03-24 08:15:20 +01:00
20158f573e Merge pull request #779 from AmruthPillai/dependabot/npm_and_yarn/client/types/node-17.0.23
Bump @types/node from 17.0.21 to 17.0.23 in /client
2022-03-24 08:15:10 +01:00
87c60729b5 Merge branch 'main' into dependabot/npm_and_yarn/client/types/node-17.0.23 2022-03-24 08:14:59 +01:00
a03a50b7c6 Merge pull request #777 from AmruthPillai/dependabot/npm_and_yarn/server/googleapis-98.0.0
Bump googleapis from 97.0.0 to 98.0.0 in /server
2022-03-24 08:14:35 +01:00
fb85ccf501 Merge pull request #776 from AmruthPillai/dependabot/npm_and_yarn/client/types/react-17.0.42
Bump @types/react from 17.0.40 to 17.0.42 in /client
2022-03-24 08:14:31 +01:00
3179442d8f Merge pull request #773 from AmruthPillai/dependabot/github_actions/docker/build-push-action-2.10.0
Bump docker/build-push-action from 2.9.0 to 2.10.0
2022-03-24 08:14:27 +01:00
33d3c52cd9 Merge pull request #772 from AmruthPillai/dependabot/github_actions/digitalocean/action-doctl-2.1.1
Bump digitalocean/action-doctl from 2.1.0 to 2.1.1
2022-03-24 08:14:22 +01:00
1d33e01a43 Merge pull request #771 from AmruthPillai/dependabot/docker/client/node-17-alpine
Bump node from 16-alpine to 17-alpine in /client
2022-03-24 08:14:17 +01:00
52ff221dd1 Merge pull request #770 from AmruthPillai/dependabot/docker/server/node-17-alpine
Bump node from 16-alpine to 17-alpine in /server
2022-03-24 08:13:57 +01:00
5afe178e23 Update dependabot.yml 2022-03-24 08:13:38 +01:00
9118b76084 Bump @nestjs/config from 1.2.1 to 2.0.0 in /server
Bumps [@nestjs/config](https://github.com/nestjs/config) from 1.2.1 to 2.0.0.
- [Release notes](https://github.com/nestjs/config/releases)
- [Changelog](https://github.com/nestjs/config/blob/master/.release-it.json)
- [Commits](https://github.com/nestjs/config/compare/1.2.1...2.0.0)

---
updated-dependencies:
- dependency-name: "@nestjs/config"
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:04:09 +00:00
5a62b527b9 Bump @types/react from 17.0.40 to 17.0.42 in /docs
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 17.0.40 to 17.0.42.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:04:08 +00:00
2e9e14dc72 Bump @types/node from 17.0.21 to 17.0.23 in /client
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 17.0.21 to 17.0.23.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:03:51 +00:00
0a0b4893aa Bump googleapis from 97.0.0 to 98.0.0 in /server
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 97.0.0 to 98.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v97.0.0...googleapis-v98.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:03:37 +00:00
6277f81e26 Bump @types/react from 17.0.40 to 17.0.42 in /client
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 17.0.40 to 17.0.42.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:03:35 +00:00
d550150787 Bump docker/build-push-action from 2.9.0 to 2.10.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 2.9.0 to 2.10.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v2.9.0...v2.10.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:02:41 +00:00
7626b2153f Bump digitalocean/action-doctl from 2.1.0 to 2.1.1
Bumps [digitalocean/action-doctl](https://github.com/digitalocean/action-doctl) from 2.1.0 to 2.1.1.
- [Release notes](https://github.com/digitalocean/action-doctl/releases)
- [Commits](https://github.com/digitalocean/action-doctl/compare/v2.1.0...v2.1.1)

---
updated-dependencies:
- dependency-name: digitalocean/action-doctl
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:02:38 +00:00
6d17d1001d Bump node from 16-alpine to 17-alpine in /client
Bumps node from 16-alpine to 17-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:02:34 +00:00
0273738d7a Bump node from 16-alpine to 17-alpine in /server
Bumps node from 16-alpine to 17-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:02:34 +00:00
322df25ecc Merge pull request #769 from modem7/dependabot-changes
Dependabot
2022-03-24 08:02:15 +01:00
ab3867d9a8 Merge pull request #768 from modem7/DockerChanges
Docker changes
2022-03-24 08:01:07 +01:00
9bf8ec88f4 Merge pull request #767 from modem7/readme-update
Update README
2022-03-24 07:58:58 +01:00
685f4d37a6 Merge pull request #766 from modem7/image-size
Reduced image sizes
2022-03-24 07:58:19 +01:00
f3b3fe8ac9 Update dependabot.yml
added gradle
2022-03-24 00:47:21 +00:00
d5fa49172a Create dependabot.yml
This will assist with version updates and vulnerability scans.

Dependabot scans will need to be enabled in the repo itself under https://github.com/AmruthPillai/Reactive-Resume/settings/security_analysis

It would also be worthwhile pairing this with Snyk (https://app.snyk.io/) for vulnerability monitoring.
2022-03-23 23:04:47 +00:00
b8303b9977 Update .env.example
Updated env variables to be clearer about which service requires it.
2022-03-23 23:03:29 +00:00
16d06c6356 Update README.md
As the logo is already in the repo, might as well utilise it.

Added Docker build status
2022-03-23 22:54:33 +00:00
79ddd887d9 Docker changes
Added:
Healthchecks
Changed Postgres to Alpine + pinned
Pinned Traefik Version
Made Env Vars easier to see + change/reference for those using their own env file.
2022-03-23 22:52:30 +00:00
c394bc6725 Reduced image sizes
This reduces images size from a total of 9.22mb to 6.11mb.
2022-03-23 22:41:24 +00:00
9e6d7630f4 New translations landing.json (Portuguese) 2022-03-23 23:06:12 +01:00
e2fbdd3c2f New translations modals.json (Portuguese) 2022-03-23 21:57:14 +01:00
849171af8f New translations dashboard.json (Portuguese) 2022-03-23 21:01:36 +01:00
884975dda6 chore(release): 3.2.9 2022-03-21 08:58:19 +01:00
03cbf22c9b feat(i18n): add nl and ru i18n locales to app 2022-03-21 08:57:47 +01:00
a10cee2efa Merge pull request #740 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-21 08:32:28 +01:00
479c94a11d Merge pull request #746 from GovindKrishnan/main
Cleaned Issue Templates Using Comments
2022-03-21 08:32:18 +01:00
c057f31e97 Merge pull request #750 from chandiwalaaadhar/fix/work-experience-website-link-redirects-404
Fixed URL 404 issue in Profile Section URL
2022-03-21 08:32:08 +01:00
d0bc9db6e5 Fixed issue in Profile Section URL 2022-03-21 06:14:22 +05:30
e2dd8dd1d7 Commenting Out Help Lines [FR Template]
To avoid clutter & increase readability of issues, I suggest commenting out the extra help tips so that they don't appear in the actual report.
2022-03-20 05:48:54 +05:30
f2ff12faa6 Commenting Out Help Lines [Bug Template]
To avoid clutter & increase readability of issues, I suggest commenting out the extra help tips so that they don't appear in the actual report.
2022-03-20 05:45:58 +05:30
50cc3d7da8 New translations modals.json (Russian) 2022-03-19 11:32:35 +01:00
60b1f7a816 New translations dashboard.json (Russian) 2022-03-19 11:32:31 +01:00
33d2bf043b New translations landing.json (Russian) 2022-03-19 10:16:47 +01:00
86b20dcae6 New translations builder.json (Russian) 2022-03-19 10:16:42 +01:00
caf4936c9b New translations dashboard.json (Russian) 2022-03-19 10:16:40 +01:00
7e864d2447 New translations common.json (Russian) 2022-03-19 10:16:38 +01:00
ff324688f6 Merge pull request #742 from GovindKrishnan/main
Linking Badges to Releases & License
2022-03-19 09:29:45 +01:00
efaeb1b341 Linking Badges to Releases & License (DOCS)
Linked the Version badge to Releases and License badge to MIT License.
2022-03-19 09:03:23 +05:30
488cb7f8a2 Linking Badges to Releases & License (README)
Linked the Version badge to Releases and License badge to MIT License.
2022-03-19 08:59:56 +05:30
974fa08651 New translations builder.json (Dutch) 2022-03-18 21:46:54 +01:00
8f3312e8a8 New translations landing.json (Dutch) 2022-03-18 20:46:24 +01:00
57d5da0490 New translations modals.json (Dutch) 2022-03-18 20:46:21 +01:00
daeb67319e New translations dashboard.json (Dutch) 2022-03-18 20:46:18 +01:00
213665bd1d New translations common.json (Dutch) 2022-03-18 20:46:16 +01:00
dfc48d6aa9 Merge pull request #738 from martadinata666/docusaurus-port-server
Update docusaurus to prevent crash with client
2022-03-18 19:38:40 +01:00
d71d40453f Update package.json 2022-03-18 23:23:30 +07:00
635afbc892 Merge pull request #737 from GovindKrishnan/main
Removed Self Referring Link in Docs
2022-03-18 16:47:30 +01:00
e90037e363 Removed Self Referring Link in Docs
Instead, linked to the GitHub Repo so that they can check out this repo.

If you got some other important link, feel free to change.
2022-03-18 20:07:57 +05:30
112 changed files with 5072 additions and 1898 deletions

5
.devcontainer/Dockerfile Normal file
View File

@ -0,0 +1,5 @@
ARG VARIANT="16-bullseye"
FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:0-${VARIANT}
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm

View File

@ -0,0 +1,27 @@
{
"name": "Node.js",
"build": {
"dockerfile": "Dockerfile",
"args": { "VARIANT": "16-bullseye" }
},
// Set *default* container specific settings.json values on container create.
"settings": {},
// Add the IDs of extensions you want installed when the container is created.
"extensions": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "lokalise.i18n-ally"],
// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [80, 5432],
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "pnpm install",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "node",
"features": {
"docker-from-docker": "latest"
}
}

View File

@ -1,33 +1,28 @@
# App
# Shared
TZ=UTC
SECRET_KEY=
# URLs
PUBLIC_URL=http://<SERVER-IP>
PUBLIC_SERVER_URL=http://<SERVER-IP>/api
PUBLIC_URL=http://localhost
PUBLIC_SERVER_URL=http://localhost/api
PUBLIC_GOOGLE_CLIENT_ID=
# Database
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USERNAME=postgres
POSTGRES_DB=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DATABASE=postgres
POSTGRES_SSL_CERT=
# Auth
# Server
SECRET_KEY=
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_SSL_CERT=
JWT_SECRET=
JWT_EXPIRY_TIME=604800
# Google
PUBLIC_GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_API_KEY=
# SendGrid (Optional)
SENDGRID_API_KEY=
SENDGRID_FORGOT_PASSWORD_TEMPLATE_ID=
SENDGRID_FROM_NAME=
SENDGRID_FROM_EMAIL=
# Flags (Optional)
# Flags
PUBLIC_FLAG_DISABLE_SIGNUPS=false

View File

@ -8,29 +8,29 @@ assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
<!-- A clear and concise description of what the bug is. -->
**Product Flavor**
- [ ] Managed (https://rxresu.me)
- [ ] Self Hosted
**To Reproduce**
Steps to reproduce the behavior:
<!-- Steps to reproduce the behavior: -->
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
<!-- A clear and concise description of what you expected to happen. -->
**Screenshots**
If applicable, add screenshots to help explain your problem.
<!-- If applicable, add screenshots to help explain your problem. -->
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
- OS: <!--[e.g. iOS]-->
- Browser <!--[e.g. chrome, safari]-->
- Version <!--[e.g. 22]-->
**Additional context**
Add any other context about the problem here.
<!-- Add any other context about the problem here. -->

View File

@ -8,13 +8,13 @@ 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 [...]
<!-- 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.
<!-- 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.
<!-- 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.
<!-- Add any other context or screenshots about the feature request here. -->

22
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,22 @@
version: 2
updates:
- package-ecosystem: 'docker'
directory: '/server'
schedule:
interval: 'weekly'
- package-ecosystem: 'docker'
directory: '/client'
schedule:
interval: 'weekly'
- package-ecosystem: 'gradle'
directory: '/app'
schedule:
interval: 'weekly'
- package-ecosystem: 'github-actions'
directory: '/'
schedule:
interval: 'weekly'

View File

@ -13,7 +13,7 @@ jobs:
steps:
- name: Install DigitalOcean CLI
uses: digitalocean/action-doctl@v2.1.0
uses: digitalocean/action-doctl@v2.1.1
with:
token: ${{ secrets.DIGITALOCEAN_TOKEN }}

View File

@ -17,6 +17,12 @@ jobs:
name: Get Version
run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
- name: Set up QEMU
uses: docker/setup-qemu-action@v1.2.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1.6.0
- name: Login to Docker
uses: docker/login-action@v1.14.1
with:
@ -24,11 +30,12 @@ jobs:
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push Client Image
uses: docker/build-push-action@v2.9.0
uses: docker/build-push-action@v2.10.0
with:
context: .
push: true
file: client/Dockerfile
platforms: linux/amd64,linux/arm/v7,linux/arm64
tags: |
amruthpillai/reactive-resume:client-latest
amruthpillai/reactive-resume:client-${{ steps.version.outputs.tag }}
@ -45,6 +52,12 @@ jobs:
name: Get Version
run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
- name: Set up QEMU
uses: docker/setup-qemu-action@v1.2.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1.6.0
- name: Login to Docker
uses: docker/login-action@v1.14.1
with:
@ -52,11 +65,12 @@ jobs:
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push Server Image
uses: docker/build-push-action@v2.9.0
uses: docker/build-push-action@v2.10.0
with:
context: .
push: true
file: server/Dockerfile
platforms: linux/amd64,linux/arm/v7,linux/arm64
tags: |
amruthpillai/reactive-resume:server-latest
amruthpillai/reactive-resume:server-${{ steps.version.outputs.tag }}
@ -73,6 +87,12 @@ jobs:
name: Get Version
run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
- name: Set up QEMU
uses: docker/setup-qemu-action@v1.2.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1.6.0
- name: Login to GitHub Container Registry
uses: docker/login-action@v1.14.1
with:
@ -81,11 +101,12 @@ jobs:
password: ${{ secrets.GH_TOKEN }}
- name: Build and Push Client Image
uses: docker/build-push-action@v2.9.0
uses: docker/build-push-action@v2.10.0
with:
context: .
push: true
file: client/Dockerfile
platforms: linux/amd64,linux/arm/v7,linux/arm64
tags: |
ghcr.io/amruthpillai/reactive-resume:client-latest
ghcr.io/amruthpillai/reactive-resume:client-${{ steps.version.outputs.tag }}
@ -102,6 +123,12 @@ jobs:
name: Get Version
run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
- name: Set up QEMU
uses: docker/setup-qemu-action@v1.2.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1.6.0
- name: Login to GitHub Container Registry
uses: docker/login-action@v1.14.1
with:
@ -110,11 +137,12 @@ jobs:
password: ${{ secrets.GH_TOKEN }}
- name: Build and Push Server Image
uses: docker/build-push-action@v2.9.0
uses: docker/build-push-action@v2.10.0
with:
context: .
push: true
file: server/Dockerfile
platforms: linux/amd64,linux/arm/v7,linux/arm64
tags: |
ghcr.io/amruthpillai/reactive-resume:server-latest
ghcr.io/amruthpillai/reactive-resume:server-${{ steps.version.outputs.tag }}

View File

@ -2,6 +2,29 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [3.3.0](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.2.11...v3.3.0) (2022-04-08)
### Features
* **upgrade:** changes to code to support new template ([1df7810](https://github.com/AmruthPillai/Reactive-Resume/commit/1df78100ca0667ce9b7834cf2c25384eb21c67c2))
### [3.2.11](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.2.10...v3.2.11) (2022-03-28)
### [3.2.10](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.2.9...v3.2.10) (2022-03-24)
### Features
* **i18n:** add portuguese (pt) language to i18n locales ([7f1c82c](https://github.com/AmruthPillai/Reactive-Resume/commit/7f1c82cd9185ebb44486a16132eb44d5c2fb747a))
### [3.2.9](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.2.8...v3.2.9) (2022-03-21)
### Features
* **i18n:** add nl and ru i18n locales to app ([03cbf22](https://github.com/AmruthPillai/Reactive-Resume/commit/03cbf22c9bee96cac8f228830b67b44529b7ecee))
### [3.2.8](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.2.7...v3.2.8) (2022-03-18)

View File

@ -1,11 +1,12 @@
<img src="https://i.imgur.com/pc8Ingg.png" alt="Reactive Resume" width="256px" height="256px" />
<img src="https://github.com/AmruthPillai/Reactive-Resume/blob/main/docs/static/logo.svg" alt="Reactive Resume" width="256px" height="256px" />
# Reactive Resume
![Project Version](https://img.shields.io/github/package-json/v/AmruthPillai/Reactive-Resume?style=flat-square)
![Project License](https://img.shields.io/github/license/AmruthPillai/Reactive-Resume?style=flat-square)
[![Project Version](https://img.shields.io/github/package-json/v/AmruthPillai/Reactive-Resume?style=flat-square)](https://github.com/AmruthPillai/Reactive-Resume/releases)
[![Project License](https://img.shields.io/github/license/AmruthPillai/Reactive-Resume?style=flat-square)](https://github.com/AmruthPillai/Reactive-Resume/blob/main/LICENSE)
[![Crowdin](https://badges.crowdin.net/reactive-resume/localized.svg)](https://translate.rxresu.me)
[![Docker Pulls](https://img.shields.io/docker/pulls/amruthpillai/reactive-resume?style=flat-square)](https://hub.docker.com/r/amruthpillai/reactive-resume)
![GitHub Workflow Status](https://img.shields.io/github/workflow/status/AmruthPillai/Reactive-Resume/Build%20and%20Push%20Docker%20Image?label=docker%20build&style=flat-square)
[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FAmruthPillai%2FReactive-Resume.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2FAmruthPillai%2FReactive-Resume?ref=badge_shield)
## [Go to App](https://rxresu.me) | [Docs](https://docs.rxresu.me)
@ -40,6 +41,7 @@ You have complete control over what goes into your resume, how it looks, what co
- Bengali (বাংলা)
- Chinese (中文)
- Danish (Dansk)
- Dutch (Nederlands)
- English
- French (Français)
- German (Deutsch)
@ -48,6 +50,8 @@ You have complete control over what goes into your resume, how it looks, what co
- Kannada (ಕನ್ನಡ)
- Malayalam (മലയാളം)
- Polish (Polski)
- Portuguese (Português)
- Russian (русский)
- Spanish (Español)
- Tamil (தமிழ்)
- Turkish (Türkçe)

View File

@ -1,7 +1,7 @@
plugins {
id 'com.android.application' version '7.1.2' apply false
id 'com.android.library' version '7.1.2' apply false
id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
id 'org.jetbrains.kotlin.android' version '1.6.20' apply false
}
task clean(type: Delete) {

View File

@ -1,4 +1,4 @@
FROM node:16-alpine as dependencies
FROM node:17-alpine as dependencies
RUN apk add --no-cache curl g++ make python3 \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
@ -11,7 +11,7 @@ COPY ./client/package.json ./client/package.json
RUN pnpm install --frozen-lockfile
FROM node:16-alpine as builder
FROM node:17-alpine as builder
RUN apk add --no-cache curl g++ make python3 \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
@ -27,7 +27,7 @@ COPY --from=dependencies /app/client/node_modules ./client/node_modules
RUN pnpm run build:schema
RUN pnpm run build:client
FROM node:16-alpine as production
FROM node:17-alpine as production
WORKDIR /app
@ -49,4 +49,7 @@ EXPOSE 3000
ENV PORT 3000
HEALTHCHECK --interval=30s --timeout=20s --retries=3 --start-period=15s \
CMD curl -fSs 127.0.0.1:3000 || exit 1
CMD [ "pnpm", "run", "start:client" ]

View File

@ -1,10 +1,16 @@
.content {
@apply rounded p-6 text-sm shadow lg:w-1/2 xl:w-2/5;
@apply rounded px-6 text-sm shadow lg:w-1/2 xl:w-2/5;
@apply absolute inset-4 sm:inset-x-4 sm:inset-y-auto lg:inset-auto;
@apply overflow-scroll bg-neutral-50 dark:bg-neutral-900 lg:overflow-auto;
@apply max-h-[90vh] min-h-fit;
&::-webkit-scrollbar {
display: none;
}
}
.header {
@apply sticky top-0 left-0 right-0 z-50 pt-6 bg-neutral-50 dark:bg-neutral-900;
@apply flex items-center justify-between;
@apply w-full border-b pb-5 dark:border-white/10;
@ -27,6 +33,7 @@
}
.footer {
@apply sticky bottom-0 left-0 right-0 z-50 pb-6 bg-neutral-50 dark:bg-neutral-900;
@apply flex items-center justify-end gap-x-4;
@apply w-full border-t pt-5 dark:border-white/10;
}

View File

@ -16,7 +16,10 @@ export const languages: Language[] = [
{ code: 'it', name: 'Italian', localName: 'Italiano' },
{ code: 'kn', name: 'Kannada', localName: 'ಕನ್ನಡ' },
{ code: 'ml', name: 'Malayalam', localName: 'മലയാളം' },
{ code: 'nl', name: 'Dutch', localName: 'Nederlands' },
{ code: 'pl', name: 'Polish', localName: 'Polski' },
{ code: 'pt', name: 'Portuguese', localName: 'Português' },
{ code: 'ru', name: 'Russian', localName: 'русский' },
{ code: 'ta', name: 'Tamil', localName: 'தமிழ்' },
{ code: 'tr', name: 'Turkish', localName: 'Türkçe' },
{ code: 'vi', name: 'Vietnamese', localName: 'Tiếng Việt' },

View File

@ -3,7 +3,27 @@ const path = require('path');
const i18nConfig = {
i18n: {
defaultLocale: 'en',
locales: ['ar', 'bn', 'da', 'de', 'en', 'es', 'fr', 'hi', 'it', 'kn', 'ml', 'pl', 'ta', 'tr', 'vi', 'zh'],
locales: [
'ar',
'bn',
'da',
'de',
'en',
'es',
'fr',
'hi',
'it',
'kn',
'ml',
'nl',
'pl',
'pt',
'ru',
'ta',
'tr',
'vi',
'zh',
],
},
nsSeparator: '.',
localePath: path.resolve('./public/locales'),

View File

@ -9,15 +9,15 @@
},
"dependencies": {
"@beam-australia/react-env": "^3.1.1",
"@emotion/css": "^11.7.1",
"@emotion/react": "^11.8.2",
"@emotion/css": "^11.9.0",
"@emotion/react": "^11.9.0",
"@emotion/styled": "^11.8.1",
"@hookform/resolvers": "2.8.8",
"@monaco-editor/react": "^4.3.1",
"@mui/icons-material": "^5.5.1",
"@mui/lab": "^5.0.0-alpha.73",
"@mui/material": "^5.5.1",
"@reduxjs/toolkit": "^1.8.0",
"@monaco-editor/react": "^4.4.1",
"@mui/icons-material": "^5.6.0",
"@mui/lab": "^5.0.0-alpha.76",
"@mui/material": "^5.6.0",
"@reduxjs/toolkit": "^1.8.1",
"axios": "^0.26.1",
"clsx": "^1.1.1",
"dayjs": "^1.11.0",
@ -26,23 +26,23 @@
"lodash": "^4.17.21",
"md5-hex": "^4.0.0",
"monaco-editor": "^0.33.0",
"nanoid": "^3.3.1",
"next": "12.1.0",
"next-i18next": "^10.5.0",
"react": ">=17",
"nanoid": "^3.3.2",
"next": "12.1.4",
"next-i18next": "^11.0.0",
"react": "^17.0.0",
"react-beautiful-dnd": "^13.1.0",
"react-colorful": "^5.5.1",
"react-dnd": "^15.1.1",
"react-dnd": "^15.1.2",
"react-dnd-html5-backend": "^15.1.2",
"react-dom": ">=17",
"react-dom": "^17.0.0",
"react-google-login": "^5.2.2",
"react-hook-form": "^7.28.0",
"react-hook-form": "^7.29.0",
"react-hot-toast": "2.2.0",
"react-hotkeys-hook": "^3.4.4",
"react-icons": "^4.3.1",
"react-markdown": "^8.0.1",
"react-query": "^3.34.16",
"react-redux": "^7.2.6",
"react-markdown": "^8.0.2",
"react-query": "^3.34.19",
"react-redux": "^7.2.8",
"react-zoom-pan-pinch": "^2.1.3",
"redux": "^4.1.2",
"redux-persist": "^6.0.0",
@ -53,25 +53,26 @@
"webfontloader": "^1.6.28"
},
"devDependencies": {
"@babel/core": "^7.17.7",
"@babel/core": "^7.17.9",
"@reactive-resume/schema": "workspace:*",
"@tailwindcss/typography": "^0.5.2",
"@types/downloadjs": "^1.4.3",
"@types/lodash": "^4.14.180",
"@types/node": "17.0.21",
"@types/react": "17.0.40",
"@types/lodash": "^4.14.181",
"@types/node": "17.0.23",
"@types/react": "18.0.0",
"@types/react-beautiful-dnd": "^13.1.2",
"@types/react-redux": "^7.1.23",
"@types/tailwindcss": "^3.0.9",
"@types/tailwindcss": "^3.0.10",
"@types/uuid": "^8.3.4",
"@types/webfontloader": "^1.6.34",
"autoprefixer": "^10.4.3",
"eslint": "^8.11.0",
"eslint-config-next": "12.1.0",
"next-sitemap": "^2.5.10",
"postcss": "^8.4.11",
"prettier": "^2.6.0",
"sass": "^1.49.9",
"autoprefixer": "^10.4.4",
"csstype": "^3.0.11",
"eslint": "^8.12.0",
"eslint-config-next": "12.1.4",
"next-sitemap": "^2.5.19",
"postcss": "^8.4.12",
"prettier": "^2.6.2",
"sass": "^1.50.0",
"tailwindcss": "^3.0.23",
"typescript": "<4.6.0"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 KiB

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 KiB

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 KiB

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 254 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 319 KiB

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 329 KiB

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 KiB

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 323 KiB

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 255 KiB

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 272 KiB

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 382 KiB

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 KiB

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 KiB

After

Width:  |  Height:  |  Size: 231 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 103 KiB

View File

@ -0,0 +1,358 @@
{
"common": {
"actions": {
"add": "Nieuw {{token}} toevoegen",
"delete": "{{token}} verwijderen",
"edit": "Bewerk {{token}}"
},
"columns": {
"heading": "Kolommen",
"tooltip": "Aantal kolommen wijzigen"
},
"form": {
"date": {
"label": "Datum"
},
"description": {
"label": "Beschrijving"
},
"email": {
"label": "E-mailadres"
},
"end-date": {
"help-text": "Laat dit veld leeg, indien nog aanwezig",
"label": "Einddatum"
},
"keywords": {
"label": "Trefwoorden"
},
"level": {
"label": "Niveau"
},
"levelNum": {
"label": "Niveau (nummer)"
},
"name": {
"label": "Naam"
},
"phone": {
"label": "Telefoonnummer"
},
"position": {
"label": "Functie"
},
"start-date": {
"label": "Startdatum"
},
"subtitle": {
"label": "Ondertitel"
},
"summary": {
"label": "Samenvatting"
},
"title": {
"label": "Titel"
},
"url": {
"label": "Website"
}
},
"glossary": {
"page": "Pagina"
},
"list": {
"actions": {
"delete": "Verwijderen",
"duplicate": "Dupliceren",
"edit": "Bewerken"
},
"empty-text": "Deze lijst is leeg."
},
"tooltip": {
"delete-item": "Weet je zeker dat je dit item wilt verwijderen? Dit is onomkeerbaar.",
"delete-section": "Sectie verwijderen",
"rename-section": "Sectie hernoemen",
"toggle-visibility": "Zichtbaarheid aan/uit"
}
},
"controller": {
"tooltip": {
"center-artboard": "Tekengebied Centreren",
"copy-link": "Link naar CV Kopiëren",
"export-pdf": "Exporteer PDF",
"toggle-orientation": "Oriëntatie van pagina wijzigen",
"toggle-page-break-line": "Regel voor pagina-einde in-/uitschakelen",
"toggle-sidebars": "Zijbalk tonen/verbergen",
"zoom-in": "Inzoomen",
"zoom-out": "Uitzoomen"
}
},
"header": {
"menu": {
"delete": "Verwijderen",
"duplicate": "Dupliceren",
"rename": "Hernoemen",
"share-link": "Link delen",
"tooltips": {
"delete": "Weet je zeker dat je dit cv wilt verwijderen? Dit is onomkeerbaar.",
"share-link": "Je moet de zichtbaarheid van jouw cv veranderen in openbaar om het zichtbaar te maken voor anderen."
}
}
},
"leftSidebar": {
"sections": {
"awards": {
"form": {
"awarder": {
"label": "Onderscheidingen"
}
}
},
"basics": {
"actions": {
"photo-filters": "Foto Filters"
},
"heading": "Basis",
"headline": {
"label": "Koptekst"
},
"name": {
"label": "Volledige naam"
},
"photo-filters": {
"effects": {
"border": {
"label": "Rand"
},
"grayscale": {
"label": "Grijswaarden"
},
"heading": "Effecten"
},
"shape": {
"heading": "Vorm"
},
"size": {
"heading": "Grootte (in px)"
}
},
"photo-upload": {
"tooltip": {
"remove": "Foto Verwijderen",
"upload": "Foto Uploaden"
}
}
},
"certifications": {
"form": {
"issuer": {
"label": "Verstrekker"
}
}
},
"education": {
"form": {
"area-study": {
"label": "Studiegebied"
},
"courses": {
"label": "Cursussen"
},
"degree": {
"label": "Graad"
},
"grade": {
"label": "Cijfer"
},
"institution": {
"label": "Instelling"
}
}
},
"location": {
"address": {
"label": "Adres"
},
"city": {
"label": "Stad"
},
"country": {
"label": "Land"
},
"heading": "Locatie",
"postal-code": {
"label": "Postcode"
},
"region": {
"label": "Regio"
}
},
"profiles": {
"form": {
"network": {
"label": "Netwerk"
},
"username": {
"label": "Gebruikersnaam"
}
},
"heading": "Profielen",
"heading_one": "Profiel"
},
"publications": {
"form": {
"publisher": {
"label": "Uitgever"
}
}
},
"references": {
"form": {
"relationship": {
"label": "Relatie"
}
}
},
"section": {
"heading": "Sectie"
},
"volunteer": {
"form": {
"organization": {
"label": "Organisatie"
}
}
}
}
},
"rightSidebar": {
"sections": {
"css": {
"heading": "Aangepaste CSS"
},
"export": {
"heading": "Exporteren",
"json": {
"primary": "JSON",
"secondary": "Download een JSON-versie van je cv die weer kan worden geïmporteerd in deze CV maker."
},
"pdf": {
"loading": {
"primary": "PDF genereren",
"secondary": "Een ogenblik geduld s.v.p. terwijl uw PDF wordt gegenereerd, dit kan tot 15 seconden duren."
},
"normal": {
"primary": "PDF",
"secondary": "Download een pdf van je cv die je kunt printen en gebruiken om je droombaan te bekomen. Dit bestand kan niet opnieuw worden geïmporteerd voor verdere bewerking."
}
}
},
"layout": {
"heading": "Opmaak",
"tooltip": {
"reset-layout": "Opmaak Resetten"
}
},
"links": {
"bugs-features": {
"body": "Houdt iets je tegen om een cv te maken? Of heb je een geweldig idee om toe te voegen? Plaats een issue op GitHub om aan de slag te gaan.",
"button": "GitHub problemen",
"heading": "Bugs? Functieverzoeken?"
},
"donate": {
"body": "Als Je Reactive Resume graag gebruikt, kun je overwegen zoveel mogelijk te doneren om de app in de lucht te houden, zonder advertenties en voor altijd gratis.",
"button": "Betaal me een koffie",
"heading": "Doneer aan Reactiv Resume"
},
"github": "Broncode",
"heading": "Links"
},
"settings": {
"global": {
"date": {
"primary": "Datum",
"secondary": "Datumformaat die gebruikt moet worden in de hele app"
},
"heading": "Globaal",
"language": {
"primary": "Taal",
"secondary": "Toon de te gebruiken taal in de app"
},
"theme": {
"primary": "Thema"
}
},
"heading": "Instellingen",
"page": {
"break-line": {
"primary": "Breek Lijn",
"secondary": "Toon een lijn op alle pagina's om de hoogte van een A4-pagina te markeren"
},
"heading": "Pagina",
"orientation": {
"disabled": "Heeft geen effect als er maar één pagina is",
"primary": "Oriëntatie",
"secondary": "Pagina's horizontaal of verticaal weergeven"
}
},
"resume": {
"heading": "Hervatten",
"reset": {
"primary": "Alles Resetten",
"secondary": "Te veel fouten gemaakt? Klik hier om alle wijzigingen te resetten en helemaal opnieuw te beginnen. Wees voorzichtig, deze actie kan niet worden teruggedraaid."
},
"sample": {
"primary": "Laad voorbeeldgegevens",
"secondary": "Weet je niet waar je moet beginnen? Klik hier om enkele voorbeeldgegevens te laden om te zien hoe een compleet cv eruitziet."
}
}
},
"sharing": {
"heading": "Delen",
"short-url": {
"label": "Liever korte URL"
},
"visibility": {
"subtitle": "Laat iedereen met een link je cv bekijken",
"title": "Openbaar"
}
},
"templates": {
"heading": "Sjablonen"
},
"theme": {
"form": {
"background": {
"label": "Achtergrond"
},
"primary": {
"label": "Voornaamste"
},
"text": {
"label": "Tekst"
}
},
"heading": "Thema"
},
"typography": {
"form": {
"font-family": {
"label": "Lettertype"
},
"font-size": {
"label": "Lettertypegrootte"
}
},
"heading": "Typografie",
"widgets": {
"body": {
"label": "Berichttekst"
},
"headings": {
"label": "Koppen"
}
}
}
}
}
}

View File

@ -0,0 +1,29 @@
{
"avatar": {
"menu": {
"greeting": "Hallo",
"logout": "Afmelden"
}
},
"footer": {
"credit": "Een passieproject van <1>Amruth Pillai</1>",
"license": "Door de gemeenschap, voor de gemeenschap."
},
"markdown": {
"help-text": "Deze sectie ondersteunt <1>html</1> opmaak."
},
"date": {
"present": "Heden"
},
"subtitle": "Een gratis en open source cv maker.",
"title": "Reactive Resume",
"toast": {
"error": {
"upload-file-size": "Upload alleen bestanden onder de 2 megabytes.",
"upload-photo-size": "Upload alleen foto's onder de 2 megabytes, bij voorkeur vierkante."
},
"success": {
"resume-link-copied": "Een link naar jouw CV is naar het klembord gekopieerd."
}
}
}

View File

@ -0,0 +1,25 @@
{
"create-resume": {
"subtitle": "Begin vanaf nul",
"title": "Nieuw CV maken"
},
"import-external": {
"subtitle": "LinkedIn, JSON CV, Reactive CV",
"title": "Importeren uit Externe Bronnen"
},
"resume": {
"menu": {
"delete": "Verwijderen",
"duplicate": "Dupliceren",
"open": "Openen",
"rename": "Hernoemen",
"share-link": "Link delen",
"tooltips": {
"delete": "Weet je zeker dat je dit cv wilt verwijderen? Dit is onomkeerbaar.",
"share-link": "Je moet de zichtbaarheid van jouw cv veranderen in openbaar om het zichtbaar te maken voor anderen."
}
},
"timestamp": "Laatst bijgewerkt op {{timestamp}}"
},
"title": "Dashboard"
}

View File

@ -0,0 +1,41 @@
{
"actions": {
"app": "Ga naar de App",
"login": "Inloggen",
"logout": "Afmelden",
"register": "Registreren"
},
"features": {
"heading": "Functies",
"list": {
"ads": "Geen Advertenties",
"export": "Exporteer je cv naar JSON- of PDF-formaat",
"free": "Gratis, voor altijd",
"import": "Gegevens importeren uit LinkedIn, JSON CV",
"languages": "Toegankelijk in meerdere talen",
"more": "En nog veel meer spannende functies, <1>lees er hier alles over</1>",
"tracking": "Geen Gebruikerstracking"
}
},
"links": {
"heading": "Links",
"links": {
"donate": "Doneren",
"github": "Broncode",
"privacy": "Privacybeleid",
"service": "Gebruiksvoorwaarden"
}
},
"screenshots": {
"heading": "Schermafbeeldingen"
},
"testimonials": {
"heading": "Klantengetuigenissen",
"body": "Goed of slecht, ik zou graag jouw mening horen over Reactive Resume en hoe de ervaring voor jou is geweest.<br/>Hier zijn enkele van de berichten die door gebruikers over de hele wereld zijn verzonden.",
"contact": "Je kunt contact met mij opnemen via <1>mijn e-mail</1> of via het contactformulier op <3>mijn website</3> ."
},
"summary": {
"body": "Reactive CV is een gratis en open source cv-builder die is gebouwd om de alledaagse taken van het maken, bijwerken en delen van jouw cv zo eenvoudig te maken als 1, 2, 3. Met deze app kun je meerdere cv's maken en deze delen met recruiters of vrienden via een unieke link en print het als een PDF, helemaal gratis, geen advertenties, geen tracking, zonder de integriteit en privacy van jouw gegevens te verliezen.",
"heading": "Samenvatting"
}
}

View File

@ -0,0 +1,136 @@
{
"auth": {
"forgot-password": {
"actions": {
"send-email": "Stuur Herstel Wachtwoord E-mail"
},
"body": "Voer gewoon het e-mailadres in dat is gekoppeld aan het account dat je wilt herstellen.",
"form": {
"email": {
"label": "E-mailadres"
}
},
"heading": "Wachtwoord vergeten?",
"help-text": "Als er een account is gekoppeld aan %1, ontvang je een e-mail met een link om jouw wachtwoord opnieuw in te stellen."
},
"login": {
"actions": {
"login": "Inloggen",
"google": "Inloggen met Google"
},
"body": "Voer jouw gebruikersnaam en wachtwoord in die bij jouw account horen om in te loggen en jouw cv's te openen, beheren en delen.",
"form": {
"password": {
"label": "Wachtwoord"
},
"username": {
"help-text": "Je kunt ook jouw e-mailadres invoeren",
"label": "Gebruikersnaam"
}
},
"heading": "Log in op jouw account",
"recover-text": "Als je jouw wachtwoord bent vergeten, kun je <1>hier jouw account</1> herstellen.",
"register-text": "Als je er geen hebt, kun je hier <1>een account maken</1>."
},
"register": {
"actions": {
"register": "Registreren",
"google": "Registreren met Google"
},
"body": "Vul jouw persoonlijke gegevens in om een account aan te maken.",
"form": {
"confirm-password": {
"label": "Bevestig wachtwoord"
},
"email": {
"label": "E-mailadres"
},
"name": {
"label": "Voor- en achternaam"
},
"password": {
"label": "Wachtwoord"
},
"username": {
"label": "Gebruikersnaam"
}
},
"heading": "Account aanmaken",
"loginText": "Als je al een account hebt, kun je <1>hier inloggen</1> ."
},
"reset-password": {
"actions": {
"set-password": "Nieuw wachtwoord instellen"
},
"body": "Voer een nieuw wachtwoord in voor jouw account.",
"form": {
"confirm-password": {
"label": "Wachtwoord Bevestigen"
},
"password": {
"label": "Wachtwoord"
}
},
"heading": "Je wachtwoord opnieuw instellen"
}
},
"dashboard": {
"create-resume": {
"actions": {
"create-resume": "CV Aanmaken"
},
"body": "Begin met het maken van je cv door het een naam te geven. Het kan betrekking hebben op de functie waarop je solliciteert, of gewoon jouw favoriete snack.",
"form": {
"name": {
"label": "Naam"
},
"public": {
"label": "Openbaar Toegankelijk"
},
"slug": {
"label": "Slug"
}
},
"heading": "Nieuw CV maken"
},
"import-external": {
"heading": "Importeren uit Externe Bronnen",
"json-resume": {
"actions": {
"upload-json": "JSON Uploaden"
},
"body": "Als je een <1>gevalideerde JSON CV</1> klaar hebt, kun je die gebruiken om versneld je nieuwe cv te bouwen. Klik op de onderstaande knop en upload een geldig JSON-bestand om te beginnen.",
"heading": "Importeren uit JSON CV"
},
"linkedin": {
"actions": {
"upload-archive": "ZIP-archief Uploaden"
},
"body": "Je kunt tijd besparen door jouw gegevens uit LinkedIn te exporteren en deze te gebruiken om velden hier automatisch in te vullen. Ga naar de <1>Gegevensprivacy</1> sectie op LinkedIn en vraag een archief van jouw gegevens aan. Zodra het beschikbaar is, upload je het ZIP-bestand hieronder.",
"heading": "Importeren Vanuit LinkedIn"
},
"reactive-resume": {
"actions": {
"upload-json": "JSON Uploaden",
"upload-json-v2": "JSON uploaden van v2"
},
"body": "Als je een JSON hebt die is geëxporteerd met de huidige versie van deze CV maker, kun je die hier terug importeren om weer een bewerkbare versie te krijgen.",
"heading": "Importeren van Bestaand CV"
}
},
"rename-resume": {
"actions": {
"rename-resume": "CV Hernoemen"
},
"form": {
"name": {
"label": "Naam"
},
"slug": {
"label": "Slug"
}
},
"heading": "Hernoem je cv"
}
}
}

View File

@ -0,0 +1,358 @@
{
"common": {
"actions": {
"add": "Adicionar {{token}}",
"delete": "Remover {{token}}",
"edit": "Editar {{token}}"
},
"columns": {
"heading": "Colunas",
"tooltip": "Alterar o número de colunas"
},
"form": {
"date": {
"label": "Data"
},
"description": {
"label": "Descrição"
},
"email": {
"label": "Endereço de e-mail"
},
"end-date": {
"help-text": "Deixe este campo em branco se for até o presente",
"label": "Data de Término"
},
"keywords": {
"label": "Palavras-chave"
},
"level": {
"label": "Nível"
},
"levelNum": {
"label": "Nível (Número)"
},
"name": {
"label": "Nome"
},
"phone": {
"label": "Número de telefone"
},
"position": {
"label": "Cargo"
},
"start-date": {
"label": "Data de Início"
},
"subtitle": {
"label": "Subtítulo"
},
"summary": {
"label": "Resumo"
},
"title": {
"label": "Título"
},
"url": {
"label": "Site"
}
},
"glossary": {
"page": "Página"
},
"list": {
"actions": {
"delete": "Excluir",
"duplicate": "Duplicar",
"edit": "Editar"
},
"empty-text": "Essa lista está vazia."
},
"tooltip": {
"delete-item": "Tem certeza de que deseja excluir este item? Esta ação é irreversível.",
"delete-section": "Excluir Seção",
"rename-section": "Renomear Seção",
"toggle-visibility": "Alternar Visibilidade"
}
},
"controller": {
"tooltip": {
"center-artboard": "Prancheta central",
"copy-link": "Copiar link do currículo",
"export-pdf": "Exportar PDF",
"toggle-orientation": "Alternar orientação da página",
"toggle-page-break-line": "Alternar linha de quebra de página",
"toggle-sidebars": "Alternar barra lateral",
"zoom-in": "Mais Zoom",
"zoom-out": "Menos Zoom"
}
},
"header": {
"menu": {
"delete": "Deletar",
"duplicate": "Duplicar",
"rename": "Renomear",
"share-link": "Compartilhar Link",
"tooltips": {
"delete": "Tem certeza de que deseja excluir este currículo? Esta ação é irreversível.",
"share-link": "Você precisa alterar a visibilidade do seu currículo para público para torná-lo visível para outras pessoas."
}
}
},
"leftSidebar": {
"sections": {
"awards": {
"form": {
"awarder": {
"label": "Concedente"
}
}
},
"basics": {
"actions": {
"photo-filters": "Filtros da foto"
},
"heading": "Informações básicas",
"headline": {
"label": "Título"
},
"name": {
"label": "Nome Completo"
},
"photo-filters": {
"effects": {
"border": {
"label": "Borda"
},
"grayscale": {
"label": "Escala de cinza"
},
"heading": "Efeitos"
},
"shape": {
"heading": "Forma"
},
"size": {
"heading": "Tamanho (em px)"
}
},
"photo-upload": {
"tooltip": {
"remove": "Excluir Foto",
"upload": "Enviar Foto"
}
}
},
"certifications": {
"form": {
"issuer": {
"label": "Emissor"
}
}
},
"education": {
"form": {
"area-study": {
"label": "Área de estudo"
},
"courses": {
"label": "Cursos"
},
"degree": {
"label": "Grau"
},
"grade": {
"label": "Nota"
},
"institution": {
"label": "Instituição"
}
}
},
"location": {
"address": {
"label": "Endereço"
},
"city": {
"label": "Cidade"
},
"country": {
"label": "País"
},
"heading": "Localização",
"postal-code": {
"label": "Código Postal"
},
"region": {
"label": "Região"
}
},
"profiles": {
"form": {
"network": {
"label": "Rede Social"
},
"username": {
"label": "Nome de Usuário"
}
},
"heading": "Perfis",
"heading_one": "Perfil"
},
"publications": {
"form": {
"publisher": {
"label": "Editor"
}
}
},
"references": {
"form": {
"relationship": {
"label": "Relação"
}
}
},
"section": {
"heading": "Seção"
},
"volunteer": {
"form": {
"organization": {
"label": "Organização"
}
}
}
}
},
"rightSidebar": {
"sections": {
"css": {
"heading": "CSS Personalizado"
},
"export": {
"heading": "Exportar",
"json": {
"primary": "JSON",
"secondary": "Baixe uma versão JSON do seu currículo que poderá ser importada de volta ao Reactive Resume."
},
"pdf": {
"loading": {
"primary": "Gerando PDF",
"secondary": "Por favor aguarde enquanto o seu PDF é gerado, isso pode levar até 15 segundos."
},
"normal": {
"primary": "PDF",
"secondary": "Baixe um PDF do seu currículo que você pode imprimir e enviar para o emprego dos seus sonhos. Este arquivo não pode ser importado de volta para edição posterior."
}
}
},
"layout": {
"heading": "Layout",
"tooltip": {
"reset-layout": "Redefinir Layout"
}
},
"links": {
"bugs-features": {
"body": "Alguma coisa te impede de fazer um currículo? Ou você tem uma ideia incrível para adicionar? Crie uma issue no GitHub para começar.",
"button": "GitHub Issues",
"heading": "Bugs? Sugestões de recursos?"
},
"donate": {
"body": "Se você gostou de usar o Reactive Resume, considere doar o máximo possível para manter o aplicativo em funcionamento, sem anúncios e gratuito para sempre.",
"button": "Pague-me um café",
"heading": "Faça uma doação ao Reactive Resume"
},
"github": "Código Fonte",
"heading": "Links"
},
"settings": {
"global": {
"date": {
"primary": "Data",
"secondary": "Formato de data usado em todo o aplicativo"
},
"heading": "Global",
"language": {
"primary": "Idioma",
"secondary": "Idioma de exibição usado em todo o aplicativo"
},
"theme": {
"primary": "Tema"
}
},
"heading": "Configurações",
"page": {
"break-line": {
"primary": "Linha de quebra",
"secondary": "Mostrar uma linha em todas as páginas para marcar a altura de uma página A4"
},
"heading": "Página",
"orientation": {
"disabled": "Não tem efeito quando há somente uma página",
"primary": "Orientação",
"secondary": "Se as páginas devem ser exibidas horizontalmente ou verticalmente"
}
},
"resume": {
"heading": "Currículo",
"reset": {
"primary": "Limpar Tudo",
"secondary": "Cometeu muitos erros? Clique aqui para redefinir todas as alterações e começar do zero. Tenha cuidado, esta ação não pode ser revertida."
},
"sample": {
"primary": "Carregar dados de exemplo",
"secondary": "Não sabe por onde começar? Clique aqui para carregar alguns dados de exemplo para ver como é um currículo completo."
}
}
},
"sharing": {
"heading": "Compartilhamento",
"short-url": {
"label": "Prefiro um URL curto"
},
"visibility": {
"subtitle": "Permitir que qualquer um com um link veja seu currículo",
"title": "Público"
}
},
"templates": {
"heading": "Modelos"
},
"theme": {
"form": {
"background": {
"label": "Plano de fundo"
},
"primary": {
"label": "Primário"
},
"text": {
"label": "Texto"
}
},
"heading": "Tema"
},
"typography": {
"form": {
"font-family": {
"label": "Família da fonte"
},
"font-size": {
"label": "Tamanho da fonte"
}
},
"heading": "Tipografia",
"widgets": {
"body": {
"label": "Corpo"
},
"headings": {
"label": "Cabeçalho"
}
}
}
}
}
}

View File

@ -10,10 +10,10 @@
"license": "Pela comunidade, para a comunidade."
},
"markdown": {
"help-text": "Esta secção suporta formatação <1>markdown</1>."
"help-text": "Esta seção suporta formatação <1>markdown</1>."
},
"date": {
"present": "Presente"
"present": "presente"
},
"subtitle": "Gerador de currículos gratuito e de código aberto.",
"title": "Reactive Resume",

View File

@ -0,0 +1,25 @@
{
"create-resume": {
"subtitle": "Começar do zero",
"title": "Criar Novo Currículo"
},
"import-external": {
"subtitle": "LinkedIn, currículo em JSON, Reactive Resume",
"title": "Importar de fontes externas"
},
"resume": {
"menu": {
"delete": "Deletar",
"duplicate": "Duplicar",
"open": "Abrir",
"rename": "Renomear",
"share-link": "Compartilhar Link",
"tooltips": {
"delete": "Tem certeza de que deseja excluir este currículo? Esta ação é irreversível.",
"share-link": "Você precisa alterar a visibilidade do seu currículo para público para torná-lo visível para outras pessoas."
}
},
"timestamp": "Última atualização há {{timestamp}}"
},
"title": "Painel de Controle"
}

View File

@ -0,0 +1,41 @@
{
"actions": {
"app": "Rodar aplicativo",
"login": "Entrar",
"logout": "Encerrar",
"register": "Inscrição"
},
"features": {
"heading": "Características",
"list": {
"ads": "Sem publicidade",
"export": "Exporte seu currículo para o formato JSON ou PDF",
"free": "Gratuito, para sempre",
"import": "Importe dados do LinkedIn, ou de um currículo em JSON",
"languages": "Disponível em vários idiomas",
"more": "E outros recursos interessantes, <1>veja todos aqui</1>",
"tracking": "Sem rastreamento de usuários"
}
},
"links": {
"heading": "Links",
"links": {
"donate": "Fazer doação",
"github": "Código Fonte",
"privacy": "Política de privacidade",
"service": "Termos de serviço"
}
},
"screenshots": {
"heading": "Imagens"
},
"testimonials": {
"heading": "Depoimentos",
"body": "Considero importante a sua opinião, positiva ou negativa, a respeito do Reactive Resume, bem como a sua experiência ao usá-lo.<br/>Confira algumas das mensagens enviadas por pessoas de todo o mundo.",
"contact": "Envie a sua mensagem por <1>e-mail</1> ou pelo formulário disponível <3>aqui</3>."
},
"summary": {
"body": "O Reactive Resume é um gerador de currículos, gratuito e de código aberto, desenvolvido para facilitar as tarefas tediosas de criação, atualização e divulgação de seu currículo. Este aplicativo possibilita a criação de múltiplos currículos, que podem ser compartilhados com recrutadores ou amigos com um link exclusivo ou impressos como PDF. Tudo isso de graça, sem anúncios, sem rastreamento, mantendo a integridade e privacidade dos seus dados.",
"heading": "Resumo"
}
}

View File

@ -0,0 +1,136 @@
{
"auth": {
"forgot-password": {
"actions": {
"send-email": "Enviar e-mail de redefinição de senha"
},
"body": "Basta inserir o endereço de e-mail associado à conta que você gostaria de recuperar.",
"form": {
"email": {
"label": "Endereço de e-mail"
}
},
"heading": "Esqueceu sua senha?",
"help-text": "Se a conta existir, você receberá um e-mail com um link para redefinir sua senha."
},
"login": {
"actions": {
"login": "Entrar",
"google": "Entrar com o Google"
},
"body": "Por favor, digite seu nome de usuário e senha associados à sua conta para fazer login e acessar, gerenciar e compartilhar seus currículos.",
"form": {
"password": {
"label": "Senha"
},
"username": {
"help-text": "Você também pode inserir seu endereço de e-mail",
"label": "Nome de Usuário"
}
},
"heading": "Acesse a sua conta",
"recover-text": "Caso tenha esquecido sua senha, você pode <1>recuperar sua conta</1> aqui.",
"register-text": "Se não tiver, você pode <1>criar uma conta</1> aqui."
},
"register": {
"actions": {
"register": "Registre-se",
"google": "Registre-se com o Google"
},
"body": "Por favor, insira suas informações pessoais para criar uma conta.",
"form": {
"confirm-password": {
"label": "Confirme a senha"
},
"email": {
"label": "Endereço de e-mail"
},
"name": {
"label": "Nome completo"
},
"password": {
"label": "Senha"
},
"username": {
"label": "Nome de usuário"
}
},
"heading": "Criar uma conta",
"loginText": "Se já tem uma conta, você pode <1>entrar aqui</1>."
},
"reset-password": {
"actions": {
"set-password": "Definir nova senha"
},
"body": "Digite uma nova senha para sua conta.",
"form": {
"confirm-password": {
"label": "Confirme a senha"
},
"password": {
"label": "Senha"
}
},
"heading": "Redefinir sua senha"
}
},
"dashboard": {
"create-resume": {
"actions": {
"create-resume": "Criar Currículo"
},
"body": "Comece a construir seu currículo dando-lhe um nome. Pode ser em referência ao cargo para o qual você está se candidatando ou apenas ao seu lanche favorito.",
"form": {
"name": {
"label": "Nome"
},
"public": {
"label": "É publicamente acessível?"
},
"slug": {
"label": "Endereço amigável"
}
},
"heading": "Criar um novo currículo"
},
"import-external": {
"heading": "Importar de fontes externas",
"json-resume": {
"actions": {
"upload-json": "Carregar JSON"
},
"body": "Se você possui um <1>currículo JSON válido</1>, poderá usá-lo para acelerar seu desenvolvimento no Reactive Resume. Clique no botão abaixo e carregue um arquivo JSON válido para começar.",
"heading": "Importar de um currículo JSON"
},
"linkedin": {
"actions": {
"upload-archive": "Carregar arquivo ZIP"
},
"body": "Você pode economizar tempo exportando seus dados do LinkedIn e usando-os para preencher automaticamente os campos no Reactive Resume. Vá para a seção <1>Privacidade dos Dados</1> no LinkedIn e solicite um arquivo com seus dados. Assim que estiver disponível, faça upload do arquivo ZIP abaixo.",
"heading": "Importar do LinkedIn"
},
"reactive-resume": {
"actions": {
"upload-json": "Carregar JSON",
"upload-json-v2": "Carregar JSON do v2"
},
"body": "Se você possuir um JSON que foi exportado com a versão atual do Reactive Resume, poderá importá-lo de volta aqui para obter uma versão editável novamente.",
"heading": "Importe do Reactive Resume"
}
},
"rename-resume": {
"actions": {
"rename-resume": "Renomear currículo"
},
"form": {
"name": {
"label": "Nome"
},
"slug": {
"label": "Endereço amigável"
}
},
"heading": "Renomear o seu currículo"
}
}
}

View File

@ -0,0 +1,358 @@
{
"common": {
"actions": {
"add": "Добавить {{token}}",
"delete": "Удалить {{token}}",
"edit": "Изменить {{token}}"
},
"columns": {
"heading": "Колонки",
"tooltip": "Изменить количество колонок"
},
"form": {
"date": {
"label": "Дата"
},
"description": {
"label": "Описание"
},
"email": {
"label": "Адрес эл. почты"
},
"end-date": {
"help-text": "Оставьте это поле пустым, если ещё в процессе",
"label": "Дата окончания"
},
"keywords": {
"label": "Ключевые слова"
},
"level": {
"label": "Уровень"
},
"levelNum": {
"label": "Уровень (число)"
},
"name": {
"label": "Название"
},
"phone": {
"label": "Номер телефона"
},
"position": {
"label": "Должность"
},
"start-date": {
"label": "Дата начала"
},
"subtitle": {
"label": "Подзаголовок"
},
"summary": {
"label": "Краткое описание"
},
"title": {
"label": "Заголовок"
},
"url": {
"label": "Веб-сайт"
}
},
"glossary": {
"page": "Страница"
},
"list": {
"actions": {
"delete": "Удалить",
"duplicate": "Дублировать",
"edit": "Изменить"
},
"empty-text": "Этот список пуст."
},
"tooltip": {
"delete-item": "Вы уверенны, что хотите удалить это? Отменить это действие нельзя.",
"delete-section": "Удалить раздел",
"rename-section": "Переименовать раздел",
"toggle-visibility": "Изменить видимость"
}
},
"controller": {
"tooltip": {
"center-artboard": "Центрировать",
"copy-link": "Скопировать ссылку на резюме",
"export-pdf": "Экспорт в PDF",
"toggle-orientation": "Переключить расположение страниц",
"toggle-page-break-line": "Переключить линию разрыва страницы",
"toggle-sidebars": "Переключить боковые панели",
"zoom-in": "Приблизить",
"zoom-out": "Отдалить"
}
},
"header": {
"menu": {
"delete": "Удалить",
"duplicate": "Дублировать",
"rename": "Переименовать",
"share-link": "Поделиться ссылкой",
"tooltips": {
"delete": "Вы уверенны, что хотите удалить это резюме? Отменить это действие нельзя.",
"share-link": "Вам нужно изменить видимость вашего резюме, чтобы сделать его видимым для других."
}
}
},
"leftSidebar": {
"sections": {
"awards": {
"form": {
"awarder": {
"label": "Кем награжден"
}
}
},
"basics": {
"actions": {
"photo-filters": "Фотофильтры"
},
"heading": "Основное",
"headline": {
"label": "Заголовок"
},
"name": {
"label": "ФИО"
},
"photo-filters": {
"effects": {
"border": {
"label": "Контур"
},
"grayscale": {
"label": "Оттенки серого"
},
"heading": "Эффекты"
},
"shape": {
"heading": "Форма"
},
"size": {
"heading": "Размер (в px)"
}
},
"photo-upload": {
"tooltip": {
"remove": "Удалить фото",
"upload": "Загрузить фото"
}
}
},
"certifications": {
"form": {
"issuer": {
"label": "Кем выдан"
}
}
},
"education": {
"form": {
"area-study": {
"label": "Область обучения"
},
"courses": {
"label": "Курсы"
},
"degree": {
"label": "Степень"
},
"grade": {
"label": "Оценка"
},
"institution": {
"label": "Учреждение"
}
}
},
"location": {
"address": {
"label": "Адрес"
},
"city": {
"label": "Город"
},
"country": {
"label": "Страна"
},
"heading": "Местоположение",
"postal-code": {
"label": "Почтовый индекс"
},
"region": {
"label": "Область"
}
},
"profiles": {
"form": {
"network": {
"label": "Сеть"
},
"username": {
"label": "Имя пользователя"
}
},
"heading": "Профили",
"heading_one": "профиль"
},
"publications": {
"form": {
"publisher": {
"label": "Издатель"
}
}
},
"references": {
"form": {
"relationship": {
"label": "Отношения"
}
}
},
"section": {
"heading": "Раздел"
},
"volunteer": {
"form": {
"organization": {
"label": "Организация"
}
}
}
}
},
"rightSidebar": {
"sections": {
"css": {
"heading": "Пользовательский CSS"
},
"export": {
"heading": "Экспорт",
"json": {
"primary": "JSON",
"secondary": "Загрузите JSON-версию вашего резюме, которую можно импортировать обратно в Reactive Resume."
},
"pdf": {
"loading": {
"primary": "Генерация PDF",
"secondary": "Пожалуйста, подождите, пока ваш PDF-файл сгенерируется, это займет не больше 15 секунд."
},
"normal": {
"primary": "PDF",
"secondary": "Скачайте PDF-файл своего резюме, который можно распечатать и отправить на работу своей мечты. Этот файл нельзя импортировать обратно для дальнейшего редактирования."
}
}
},
"layout": {
"heading": "Разметка",
"tooltip": {
"reset-layout": "Сбросить разметку"
}
},
"links": {
"bugs-features": {
"body": "Что-то мешает вам составить резюме? Или у вас есть отличная идея для нас? Откройте новый issue на GitHub.",
"button": "GitHub Issues",
"heading": "Нашли ошибку? Есть предложения?"
},
"donate": {
"body": "Если вам понравилось использовать Reactive Resume, пожалуйста, подумайте о том, чтобы пожертвовать как можно больше на поддержание приложения в рабочем состоянии, без рекламы и бесплатно навсегда.",
"button": "Купить мне кофе",
"heading": "Поддержать Reactive Resume"
},
"github": "Исходный код",
"heading": "Ссылки"
},
"settings": {
"global": {
"date": {
"primary": "Дата",
"secondary": "Формат даты, используемый во всем приложении"
},
"heading": "Глобальные",
"language": {
"primary": "Язык",
"secondary": "Язык интерфейса, используемый в приложении"
},
"theme": {
"primary": "Тема"
}
},
"heading": "Настройки",
"page": {
"break-line": {
"primary": "Линия разрыва",
"secondary": "Показывать линию, обозначающую высоту страницы A4"
},
"heading": "Страница",
"orientation": {
"disabled": "Недоступно, когда есть только одна страница",
"primary": "Расположение",
"secondary": "Располагать страницы горизонтально или вертикально"
}
},
"resume": {
"heading": "Резюме",
"reset": {
"primary": "Сбросить все",
"secondary": "Сделали слишком много ошибок? Нажмите здесь, чтобы сбросить все изменения и начать с нуля. Будьте осторожны, отменить это действие нельзя."
},
"sample": {
"primary": "Загрузить пример",
"secondary": "Не уверены, с чего начать? Нажмите здесь, чтобы загрузить некоторые примеры данных, чтобы увидеть, как выглядит законченное резюме."
}
}
},
"sharing": {
"heading": "Поделиться",
"short-url": {
"label": "Предпочитать короткий URL"
},
"visibility": {
"subtitle": "Разрешить всем, у кого есть ссылка, просматривать ваше резюме",
"title": "Public"
}
},
"templates": {
"heading": "Шаблоны"
},
"theme": {
"form": {
"background": {
"label": "Фон"
},
"primary": {
"label": "Основной"
},
"text": {
"label": "Текст"
}
},
"heading": "Тема"
},
"typography": {
"form": {
"font-family": {
"label": "Шрифт"
},
"font-size": {
"label": "Размер шрифта"
}
},
"heading": "Типография",
"widgets": {
"body": {
"label": "Основной"
},
"headings": {
"label": "Заголовки"
}
}
}
}
}
}

View File

@ -0,0 +1,29 @@
{
"avatar": {
"menu": {
"greeting": "Привет",
"logout": "Выйти"
}
},
"footer": {
"credit": "Увлекательный проект <1>Amruth Pillai</1>",
"license": "От сообщества для сообщества."
},
"markdown": {
"help-text": "Этот раздел поддерживает <1>markdown</1>."
},
"date": {
"present": "настоящее время"
},
"subtitle": "Бесплатный open source конструктор резюме.",
"title": "Reactive Resume",
"toast": {
"error": {
"upload-file-size": "Пожалуйста, загружайте файлы размером не более 2 мегабайт.",
"upload-photo-size": "Пожалуйста, загружайте фотографии размером не более 2 мегабайт, желательно квадратные."
},
"success": {
"resume-link-copied": "Ссылка на ваше резюме скопирована в буфер обмена."
}
}
}

View File

@ -0,0 +1,25 @@
{
"create-resume": {
"subtitle": "Начать с нуля",
"title": "Создать новое резюме"
},
"import-external": {
"subtitle": "LinkedIn, JSON Resume, Reactive Resume",
"title": "Импорт из внешних источников"
},
"resume": {
"menu": {
"delete": "Удалить",
"duplicate": "Дублировать",
"open": "Открыть",
"rename": "Переименовать",
"share-link": "Поделиться ссылкой",
"tooltips": {
"delete": "Вы уверенны, что хотите удалить это резюме? Отменить это действие нельзя.",
"share-link": "Вам нужно изменить видимость вашего резюме, чтобы сделать его видимым для других."
}
},
"timestamp": "Последнее обновление {{timestamp}}"
},
"title": "Панель управления"
}

View File

@ -0,0 +1,41 @@
{
"actions": {
"app": "Перейти к приложению",
"login": "Войти",
"logout": "Выйти",
"register": "Зарегистрироваться"
},
"features": {
"heading": "Особенности",
"list": {
"ads": "Никакой рекламы",
"export": "Экспортируйте свое резюме в формат JSON или PDF",
"free": "Бесплатно навсегда",
"import": "Импорт данных из LinkedIn, JSON Resume",
"languages": "Доступность на нескольких языках",
"more": "И многое другое, <1>обо всем этом читайте здесь</1>",
"tracking": "Нет отслеживания пользователей"
}
},
"links": {
"heading": "Ссылки",
"links": {
"donate": "Поддержать",
"github": "Исходный код",
"privacy": "Политика конфиденциальности",
"service": "Условия использования"
}
},
"screenshots": {
"heading": "Скриншоты"
},
"testimonials": {
"heading": "Отзывы",
"body": "Я бы хотел услышать ваше мнение о Reactive Resume, хорошее оно или плохое, и о том, каким был ваш опыт.<br/>Вот некоторые из сообщений, присланных пользователями со всего мира.",
"contact": "Вы можете связаться со мной через <1>мою электронную почту</1> или контактную форму на <3>моем сайте</3>."
},
"summary": {
"body": "Reactive Resume - это бесплатный open source конструктор резюме, созданный для того, чтобы сделать рутинные задачи по созданию, обновлению и распространению резюме такими же простыми, как 1, 2, 3. С помощью этого приложения вы можете создать несколько резюме, поделиться ими с рекрутерами или друзьями через уникальную ссылку и распечатать их в формате PDF, и все это бесплатно, без рекламы, без отслеживания, без потери целостности и конфиденциальности ваших данных.",
"heading": "Описание"
}
}

View File

@ -0,0 +1,136 @@
{
"auth": {
"forgot-password": {
"actions": {
"send-email": "Восстановить пароль"
},
"body": "Просто введите адрес электронной почты, связанный с учетной записью, которую вы хотите восстановить.",
"form": {
"email": {
"label": "Адрес эл. почты"
}
},
"heading": "Забыли пароль?",
"help-text": "Если учетная запись существует, вы получите письмо со ссылкой для сброса пароля."
},
"login": {
"actions": {
"login": "Войти",
"google": "Войти через Google"
},
"body": "Пожалуйста, введите имя пользователя и пароль, связанные с вашей учетной записью, чтобы войти в систему и получить доступ, управлять и делиться своими резюме.",
"form": {
"password": {
"label": "Пароль"
},
"username": {
"help-text": "Вы также можете ввести свой адрес электронной почты",
"label": "Имя пользователя"
}
},
"heading": "Вход в ваш аккаунт",
"recover-text": "Если вы забыли пароль, вы можете <1>восстановить свою учетную запись</1> здесь.",
"register-text": "Вы можете <1>создать учетную запись</1> здесь, если у вас её нет."
},
"register": {
"actions": {
"register": "Зарегистрироваться",
"google": "Зарегистрироваться через Google"
},
"body": "Пожалуйста, введите вашу личную информацию, чтобы создать учетную запись.",
"form": {
"confirm-password": {
"label": "Подтвердите пароль"
},
"email": {
"label": "Адрес эл. почты"
},
"name": {
"label": "ФИО"
},
"password": {
"label": "Пароль"
},
"username": {
"label": "Имя пользователя"
}
},
"heading": "Создание учетной записи",
"loginText": "Если у вас уже есть учетная запись, вы можете <1>войти здесь</1>."
},
"reset-password": {
"actions": {
"set-password": "Установить новый пароль"
},
"body": "Введите новый пароль учетной записи.",
"form": {
"confirm-password": {
"label": "Подтвердите пароль"
},
"password": {
"label": "Пароль"
}
},
"heading": "Сброс пароля"
}
},
"dashboard": {
"create-resume": {
"actions": {
"create-resume": "Создать резюме"
},
"body": "Начните создание своего резюме, добавив его имя. Оно может быть связано с должностью, на которую вы претендуете, или просто с вашей любимой закуской.",
"form": {
"name": {
"label": "Название"
},
"public": {
"label": "Сделать общедоступным?"
},
"slug": {
"label": "Slug (окончание ссылки на резюме)"
}
},
"heading": "Создание нового резюме"
},
"import-external": {
"heading": "Импорт из внешних источников",
"json-resume": {
"actions": {
"upload-json": "Загрузить JSON"
},
"body": "Если у вас есть готовое <1>подтвержденное JSON Resume</1>, вы можете использовать его для ускорения разработки Reactive Resume. Нажмите кнопку ниже и загрузите файл JSON, чтобы начать.",
"heading": "Импорт из JSON Resume"
},
"linkedin": {
"actions": {
"upload-archive": "Загрузить ZIP-архив"
},
"body": "Вы можете сэкономить время, экспортировав свои данные из LinkedIn и использовать их для автоматического заполнения полей в Reactive Resume. Перейдите к разделу <1>Конфиденциальность данных</1> на LinkedIn и запросите архив ваших данных. Как только он будет доступен, загрузите ZIP-файл ниже.",
"heading": "Импорт из LinkedIn"
},
"reactive-resume": {
"actions": {
"upload-json": "Загрузить JSON",
"upload-json-v2": "Загрузить JSON из v2"
},
"body": "Если у вас есть JSON, который был экспортирован из текущей версии Reactive Resume, вы можете импортировать его сюда, чтобы снова получить редактируемую версию.",
"heading": "Импорт из Reactive Resume"
}
},
"rename-resume": {
"actions": {
"rename-resume": "Переименовать резюме"
},
"form": {
"name": {
"label": "Название"
},
"slug": {
"label": "Slug (окончание ссылки на резюме)"
}
},
"heading": "Переименование резюме"
}
}
}

View File

@ -56,7 +56,7 @@ export const MastheadSidebar: React.FC = () => {
</DataDisplay>
{profiles.map(({ id, username, network, url }) => (
<DataDisplay key={id} icon={getProfileIcon(network)} link={url} className="!gap-2 text-xs">
<DataDisplay key={id} icon={getProfileIcon(network)} link={url && addHttp(url)} className="!gap-2 text-xs">
{username}
</DataDisplay>
))}

View File

@ -57,7 +57,7 @@ export const MastheadSidebar: React.FC = () => {
</DataDisplay>
{profiles.map(({ id, username, network, url }) => (
<DataDisplay key={id} icon={getProfileIcon(network)} link={url} className="!gap-2 text-xs">
<DataDisplay key={id} icon={getProfileIcon(network)} link={url && addHttp(url)} className="!gap-2 text-xs">
{username}
</DataDisplay>
))}

View File

@ -49,7 +49,7 @@ export const MastheadSidebar: React.FC = () => {
</DataDisplay>
{profiles.map(({ id, username, network, url }) => (
<DataDisplay key={id} icon={getProfileIcon(network)} link={url} className="text-xs">
<DataDisplay key={id} icon={getProfileIcon(network)} link={url && addHttp(url)} className="text-xs">
{username}
</DataDisplay>
))}

View File

@ -47,7 +47,7 @@ const Masthead = () => {
<DataDisplay icon={<Room />}>{formatLocation(location)}</DataDisplay>
{profiles.map(({ id, username, network, url }) => (
<DataDisplay key={id} icon={getProfileIcon(network)} link={url}>
<DataDisplay key={id} icon={getProfileIcon(network)} link={url && addHttp(url)}>
{username}
</DataDisplay>
))}

View File

@ -0,0 +1,9 @@
.page {}
.container {
@apply grid grid-cols-2 gap-8 px-6 py-4;
.column {
@apply col-span-1 flex flex-col;
}
}

View File

@ -0,0 +1,28 @@
import { useMemo } from 'react';
import { useAppSelector } from '@/store/hooks';
import { PageProps } from '@/utils/template';
import { getSectionById } from '../sectionMap';
import styles from './Leafish.module.scss';
import Masthead from './widgets/Masthead';
import Section from './widgets/Section';
const Leafish: React.FC<PageProps> = ({ page }) => {
const isFirstPage = useMemo(() => page === 0, [page]);
const layout: string[][] = useAppSelector((state) => state.resume.metadata.layout[page]);
return (
<div className={styles.page}>
{isFirstPage && <Masthead />}
<div className={styles.container}>
<div className={styles.column}>{layout[0].map((key) => getSectionById(key, Section))}</div>
<div className={styles.column}>{layout[1].map((key) => getSectionById(key, Section))}</div>
</div>
</div>
);
};
export default Leafish;

View File

@ -0,0 +1,19 @@
import { Theme } from '@reactive-resume/schema';
import get from 'lodash/get';
import { useAppSelector } from '@/store/hooks';
const Heading: React.FC = ({ children }) => {
const theme: Theme = useAppSelector((state) => get(state.resume, 'metadata.theme', {}));
return (
<h2
className="pb-1 mb-2 font-bold uppercase opacity-75"
style={{ borderBottomWidth: '3px', borderColor: theme.primary, color: theme.primary, display: 'inline-block' }}
>
{children}
</h2>
);
};
export default Heading;

View File

@ -0,0 +1,75 @@
import { Email, Phone, Public, Room } from '@mui/icons-material';
import { alpha } from '@mui/material';
import { Theme } from '@reactive-resume/schema';
import get from 'lodash/get';
import isEmpty from 'lodash/isEmpty';
import { useAppSelector } from '@/store/hooks';
import DataDisplay from '@/templates/shared/DataDisplay';
import getProfileIcon from '@/utils/getProfileIcon';
import { addHttp, formatLocation, getPhotoClassNames } from '@/utils/template';
const Masthead: React.FC = () => {
const { name, photo, headline, summary, email, phone, website, location, profiles } = useAppSelector(
(state) => state.resume.basics
);
const theme: Theme = useAppSelector((state) => get(state.resume, 'metadata.theme', {}));
return (
<div>
<div
className="flex items-center gap-4 p-6"
id="Masterhead_main"
style={{ backgroundColor: alpha(theme.primary, 0.2) }}
>
<div className="grid flex-1 gap-1">
<h1 id="Masterhead_name">{name}</h1>
<p style={{ color: theme.primary }} id="Masterhead_headline">
{headline}
</p>
<p className="opacity-75" id="Masterhead_summary">
{summary}
</p>
</div>
{photo.visible && !isEmpty(photo.url) && (
<img
alt={name}
src={photo.url}
width={photo.filters.size}
height={photo.filters.size}
className={getPhotoClassNames(photo.filters)}
id="Masterhead_photo"
/>
)}
</div>
<div
className="grid gap-y-2 px-8 py-4"
id="Masterhead_data"
style={{ backgroundColor: alpha(theme.primary, 0.4), gridTemplateColumns: `repeat(2, minmax(0, 1fr))` }}
>
<DataDisplay icon={<Email />} link={`mailto:${email}`}>
{email}
</DataDisplay>
<DataDisplay icon={<Phone />} link={`tel:${phone}`}>
{phone}
</DataDisplay>
<DataDisplay icon={<Public />} link={addHttp(website)}>
{website}
</DataDisplay>
<DataDisplay icon={<Room />}>{formatLocation(location)}</DataDisplay>
{profiles.map(({ id, username, network, url }) => (
<DataDisplay key={id} icon={getProfileIcon(network)} link={url && addHttp(url)}>
{username}
</DataDisplay>
))}
</div>
</div>
);
};
export default Masthead;

View File

@ -0,0 +1,127 @@
import { Email, Link, Phone } from '@mui/icons-material';
import { ListItem, Section as SectionType } from '@reactive-resume/schema';
import get from 'lodash/get';
import isArray from 'lodash/isArray';
import isEmpty from 'lodash/isEmpty';
import Markdown from '@/components/shared/Markdown';
import { useAppSelector } from '@/store/hooks';
import { SectionProps } from '@/templates/sectionMap';
import DataDisplay from '@/templates/shared/DataDisplay';
import { formatDateString } from '@/utils/date';
import { parseListItemPath } from '@/utils/template';
import Heading from './Heading';
const Section: React.FC<SectionProps> = ({
path,
titlePath = 'title',
subtitlePath = 'subtitle',
headlinePath = 'headline',
keywordsPath = 'keywords',
}) => {
const section: SectionType = useAppSelector((state) => get(state.resume, path, {}));
const dateFormat: string = useAppSelector((state) => get(state.resume, 'metadata.date.format'));
const primaryColor: string = useAppSelector((state) => get(state.resume, 'metadata.theme.primary'));
if (!section.visible) return null;
if (isArray(section.items) && isEmpty(section.items)) return null;
return (
<section className="mb-4">
<Heading>{section.name}</Heading>
<div
className="grid items-start gap-4"
style={{ gridTemplateColumns: `repeat(${section.columns}, minmax(0, 1fr))` }}
id={`Section_${section.id}`}
>
{section.items.map((item: ListItem) => {
const id = item.id,
title = parseListItemPath(item, titlePath),
subtitle = parseListItemPath(item, subtitlePath),
headline = parseListItemPath(item, headlinePath),
keywords: string[] = get(item, keywordsPath),
url: string = get(item, 'url'),
summary: string = get(item, 'summary'),
level: string = get(item, 'level'),
levelNum: number = get(item, 'levelNum'),
phone: string = get(item, 'phone'),
email: string = get(item, 'email'),
date = formatDateString(get(item, 'date'), dateFormat);
return (
<div key={id} id={id} className={`grid gap-1 mb-2 Section_${section.id}_inner`}>
<div>
{title && <div className="font-bold Section_title">{title}</div>}
{subtitle && <div className="Section_subtitle">{subtitle}</div>}
{date && (
<div className="italic text-xs Section_date" style={{ color: primaryColor }}>
({date})
</div>
)}
{headline && <div className="opacity-50 Section_headline">{headline}</div>}
</div>
{(level || levelNum > 0) && (
<div className="grid gap-1">
{level && <span className="opacity-75">{level}</span>}
{levelNum > 0 && (
<div className="flex">
{Array.from(Array(5).keys()).map((_, index) => (
<div
key={index}
className="mr-1 h-3 w-3 rounded-full border-2"
style={{
borderColor: primaryColor,
backgroundColor: levelNum / (10 / 5) > index ? primaryColor : '',
}}
/>
))}
</div>
)}
</div>
)}
{summary && (
<div>
<div className="italic text-xs" style={{ color: primaryColor }}>
Overview
</div>
<Markdown className={`marker:text-[${primaryColor}]`}>{summary}</Markdown>
</div>
)}
{url && (
<DataDisplay icon={<Link />} link={url} className="text-xs">
{url}
</DataDisplay>
)}
{keywords && <div>{keywords.join(', ')}</div>}
{(phone || email) && (
<div className="grid gap-1">
{phone && (
<DataDisplay icon={<Phone />} link={`tel:${phone}`}>
{phone}
</DataDisplay>
)}
{email && (
<DataDisplay icon={<Email />} link={`mailto:${email}`}>
{email}
</DataDisplay>
)}
</div>
)}
</div>
);
})}
</div>
</section>
);
};
export default Section;

View File

@ -50,7 +50,7 @@ const Masthead: React.FC = () => {
</DataDisplay>
{profiles.map(({ id, username, network, url }) => (
<DataDisplay key={id} icon={getProfileIcon(network)} link={url} className="text-xs">
<DataDisplay key={id} icon={getProfileIcon(network)} link={url && addHttp(url)} className="text-xs">
{username}
</DataDisplay>
))}

View File

@ -44,7 +44,7 @@ export const MastheadSidebar: React.FC = () => {
</DataDisplay>
{profiles.map(({ id, username, network, url }) => (
<DataDisplay key={id} icon={getProfileIcon(network)} link={url} className="text-xs">
<DataDisplay key={id} icon={getProfileIcon(network)} link={url && addHttp(url)} className="text-xs">
{username}
</DataDisplay>
))}

View File

@ -4,6 +4,7 @@ import Castform from './Castform/Castform';
import Gengar from './Gengar/Gengar';
import Glalie from './Glalie/Glalie';
import Kakuna from './Kakuna/Kakuna';
import Leafish from './Leafish/Leafish';
import Onyx from './Onyx/Onyx';
import Pikachu from './Pikachu/Pikachu';
@ -51,6 +52,12 @@ const templateMap: Record<string, TemplateMeta> = {
preview: '/images/templates/glalie.jpg',
component: Glalie,
},
leafish: {
id: 'leafish',
name: 'Leafish',
preview: '/images/templates/leafish.jpg',
component: Leafish,
},
};
export default templateMap;

View File

@ -21,7 +21,10 @@ const DateWrapper: React.FC = ({ children }) => {
require('dayjs/locale/it');
require('dayjs/locale/kn');
require('dayjs/locale/ml');
require('dayjs/locale/nl');
require('dayjs/locale/pl');
require('dayjs/locale/pt');
require('dayjs/locale/ru');
require('dayjs/locale/ta');
require('dayjs/locale/tr');
require('dayjs/locale/vi');

View File

@ -1,64 +0,0 @@
version: '3'
services:
postgres:
image: postgres
container_name: postgres
ports:
- 5432:5432
env_file: .env
volumes:
- ./scripts/database/initialize.sql:/docker-entrypoint-initdb.d/initialize.sql
- pgdata:/var/lib/postgresql/data
traefik:
image: traefik
container_name: traefik
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
ports:
- 80:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
server:
build:
context: .
dockerfile: server/Dockerfile
container_name: server
env_file: .env
environment:
- PUBLIC_URL=http://localhost
- POSTGRES_HOST=postgres
- POSTGRES_DATABASE=reactive_resume
depends_on:
- traefik
- postgres
labels:
- traefik.enable=true
- traefik.http.routers.server.entrypoints=web
- traefik.http.routers.server.rule=Host(`localhost`) && PathPrefix(`/api/`)
- traefik.http.routers.server.middlewares=server-stripprefix
- traefik.http.middlewares.server-stripprefix.stripprefix.prefixes=/api
- traefik.http.middlewares.server-stripprefix.stripprefix.forceslash=true
client:
build:
context: .
dockerfile: client/Dockerfile
container_name: client
env_file: .env
environment:
- PUBLIC_SERVER_URL=http://localhost/api
depends_on:
- traefik
- server
labels:
- traefik.enable=true
- traefik.http.routers.client.rule=Host(`localhost`)
- traefik.http.routers.client.entrypoints=web
volumes:
pgdata:

View File

@ -1,17 +1,57 @@
version: '3'
x-env-shared: &env-shared
environment:
- TZ=UTC
- PUBLIC_URL=http://localhost
- PUBLIC_SERVER_URL=http://localhost/api
- PUBLIC_GOOGLE_CLIENT_ID=
x-env-database: &env-database
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
x-env-server: &env-server
environment:
- SECRET_KEY=
- POSTGRES_HOST=postgres
- POSTGRES_PORT=5432
- POSTGRES_SSL_CERT=
- JWT_SECRET=
- JWT_EXPIRY_TIME=604800
- PUBLIC_GOOGLE_CLIENT_ID=
- GOOGLE_CLIENT_SECRET=
- GOOGLE_API_KEY=
- SENDGRID_API_KEY=
- SENDGRID_FORGOT_PASSWORD_TEMPLATE_ID=
- SENDGRID_FROM_NAME=
- SENDGRID_FROM_EMAIL=
x-env-flags: &env-flags
environment:
- PUBLIC_FLAG_DISABLE_SIGNUPS=false
services:
postgres:
image: postgres
image: postgres:14.2-alpine
container_name: postgres
<<: *env-database
ports:
- 5432:5432
env_file: .env
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U postgres" ]
start_period: 15s
interval: 30s
timeout: 30s
retries: 3
restart: always
traefik:
image: traefik
image: traefik:rocamadour
container_name: traefik
command:
- --providers.docker=true
@ -25,31 +65,34 @@ services:
server:
image: amruthpillai/reactive-resume:server-latest
container_name: server
env_file: .env
environment:
- POSTGRES_HOST=postgres
<<: *env-shared
<<: *env-server
<<: *env-database
depends_on:
- traefik
- postgres
labels:
- traefik.enable=true
- traefik.http.routers.server.entrypoints=web
- traefik.http.routers.server.rule=Host(`<SERVER-IP>`) && PathPrefix(`/api/`)
- traefik.http.routers.server.rule=Host(`localhost`) && PathPrefix(`/api/`)
- traefik.http.routers.server.middlewares=server-stripprefix
- traefik.http.middlewares.server-stripprefix.stripprefix.prefixes=/api
- traefik.http.middlewares.server-stripprefix.stripprefix.forceslash=true
restart: always
client:
image: amruthpillai/reactive-resume:client-latest
container_name: client
env_file: .env
<<: *env-shared
<<: *env-flags
depends_on:
- traefik
- server
labels:
- traefik.enable=true
- traefik.http.routers.client.rule=Host(`<SERVER-IP>`)
- traefik.http.routers.client.rule=Host(`localhost`)
- traefik.http.routers.client.entrypoints=web
restart: always
volumes:
pgdata:

Some files were not shown because too many files have changed in this diff Show More