DEV;Update mobile view and add Jenkinsfile
This commit is contained in:
parent
01d9d0d4a3
commit
906691bf15
22 changed files with 305 additions and 212 deletions
|
@ -1,3 +1,6 @@
|
||||||
{
|
{
|
||||||
"extends": "next/core-web-vitals"
|
"extends": [
|
||||||
|
"next/core-web-vitals",
|
||||||
|
"eslint:recommended"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
9
Jenkinsfile
vendored
Normal file
9
Jenkinsfile
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
@Library('jenkins-lib')
|
||||||
|
import FrontendBuild
|
||||||
|
|
||||||
|
FrontendBuild({
|
||||||
|
name = 'portfolio'
|
||||||
|
port = "92:3000"
|
||||||
|
runSonar = true
|
||||||
|
appType = "nextjs"
|
||||||
|
})
|
29
README.md
29
README.md
|
@ -1,34 +1,7 @@
|
||||||
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
|
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
First, run the development server:
|
First, run the development server:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm run dev
|
npm run dev
|
||||||
# or
|
```
|
||||||
yarn dev
|
|
||||||
```
|
|
||||||
|
|
||||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
||||||
|
|
||||||
You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.
|
|
||||||
|
|
||||||
[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.
|
|
||||||
|
|
||||||
The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
|
|
||||||
|
|
||||||
## Learn More
|
|
||||||
|
|
||||||
To learn more about Next.js, take a look at the following resources:
|
|
||||||
|
|
||||||
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
|
||||||
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
|
||||||
|
|
||||||
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
|
|
||||||
|
|
||||||
## Deploy on Vercel
|
|
||||||
|
|
||||||
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
|
||||||
|
|
||||||
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
|
|
31
docker/Dockerfile
Normal file
31
docker/Dockerfile
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# Install dependencies only when needed
|
||||||
|
FROM node:16-alpine
|
||||||
|
RUN apk add --no-cache libc6-compat
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
ENV NODE_ENV production
|
||||||
|
ENV NEXT_TELEMETRY_DISABLED 1
|
||||||
|
|
||||||
|
RUN addgroup --system --gid 1001 nodejs
|
||||||
|
RUN adduser --system --uid 1001 nextjs
|
||||||
|
|
||||||
|
RUN ls -a
|
||||||
|
|
||||||
|
COPY .next/ .next/
|
||||||
|
COPY public/ public/
|
||||||
|
COPY node_modules/ node_modules/
|
||||||
|
COPY package.json package.json
|
||||||
|
|
||||||
|
RUN ls -a
|
||||||
|
RUN ls -a .next
|
||||||
|
|
||||||
|
RUN chown -R nextjs:nodejs .next
|
||||||
|
|
||||||
|
USER nextjs
|
||||||
|
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
ENV PORT 3000
|
||||||
|
|
||||||
|
CMD ["node", "server.js"]
|
|
@ -1,6 +1,11 @@
|
||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
reactStrictMode: true,
|
reactStrictMode: true,
|
||||||
}
|
i18n: {
|
||||||
|
locales: ["cs"],
|
||||||
|
defaultLocale: "cs",
|
||||||
|
},
|
||||||
|
output: "standalone",
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = nextConfig
|
module.exports = nextConfig;
|
||||||
|
|
21
package-lock.json
generated
21
package-lock.json
generated
|
@ -1,18 +1,19 @@
|
||||||
{
|
{
|
||||||
"name": "portfolio",
|
"name": "portfolio",
|
||||||
"version": "0.1.0",
|
"version": "0.1.1",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "portfolio",
|
"name": "portfolio",
|
||||||
"version": "0.1.0",
|
"version": "0.1.1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@reduxjs/toolkit": "1.8.0",
|
"@reduxjs/toolkit": "1.8.0",
|
||||||
"@treejs/components": "0.17.0",
|
"@treejs/components": "0.17.0",
|
||||||
"@treejs/constants": "0.17.0",
|
"@treejs/constants": "0.17.0",
|
||||||
"@treejs/styles": "0.17.0",
|
"@treejs/styles": "0.17.0",
|
||||||
"next": "12.2.0",
|
"next": "12.2.0",
|
||||||
|
"next-seo": "^5.4.0",
|
||||||
"ramda": "^0.27.0",
|
"ramda": "^0.27.0",
|
||||||
"react": "17.0.2",
|
"react": "17.0.2",
|
||||||
"react-dom": "17.0.2",
|
"react-dom": "17.0.2",
|
||||||
|
@ -2589,6 +2590,16 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/next-seo": {
|
||||||
|
"version": "5.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/next-seo/-/next-seo-5.4.0.tgz",
|
||||||
|
"integrity": "sha512-R9DhajPwJnR/lsF2hZ8cN8uqr5CVITsRrCG1AF5+ufcaybKYOvnH8sH9MaH4/hpkps3PQ9H71S7J7SPYixAYzQ==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"next": "^8.1.1-canary.54 || >=9.0.0",
|
||||||
|
"react": ">=16.0.0",
|
||||||
|
"react-dom": ">=16.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/next/node_modules/postcss": {
|
"node_modules/next/node_modules/postcss": {
|
||||||
"version": "8.4.5",
|
"version": "8.4.5",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
|
||||||
|
@ -5560,6 +5571,12 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"next-seo": {
|
||||||
|
"version": "5.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/next-seo/-/next-seo-5.4.0.tgz",
|
||||||
|
"integrity": "sha512-R9DhajPwJnR/lsF2hZ8cN8uqr5CVITsRrCG1AF5+ufcaybKYOvnH8sH9MaH4/hpkps3PQ9H71S7J7SPYixAYzQ==",
|
||||||
|
"requires": {}
|
||||||
|
},
|
||||||
"node-releases": {
|
"node-releases": {
|
||||||
"version": "2.0.5",
|
"version": "2.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
|
||||||
|
|
|
@ -1,8 +1,13 @@
|
||||||
{
|
{
|
||||||
"name": "portfolio",
|
"name": "portfolio",
|
||||||
"version": "0.1.0",
|
"version": "0.1.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"ci:lint": "eslint .",
|
||||||
|
"ci:build": "npm run build",
|
||||||
|
"ci:test": "echo 1",
|
||||||
|
"ci:test-e2e": "echo 1",
|
||||||
|
"ci:increase-version": "npm version --git-tag-version=false",
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
|
@ -14,6 +19,7 @@
|
||||||
"@treejs/constants": "0.17.0",
|
"@treejs/constants": "0.17.0",
|
||||||
"@treejs/styles": "0.17.0",
|
"@treejs/styles": "0.17.0",
|
||||||
"next": "12.2.0",
|
"next": "12.2.0",
|
||||||
|
"next-seo": "^5.4.0",
|
||||||
"ramda": "^0.27.0",
|
"ramda": "^0.27.0",
|
||||||
"react": "17.0.2",
|
"react": "17.0.2",
|
||||||
"react-dom": "17.0.2",
|
"react-dom": "17.0.2",
|
||||||
|
|
2
public/robots.txt
Normal file
2
public/robots.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
User-agent: *
|
||||||
|
Allow: /
|
5
public/sitemap.xml
Normal file
5
public/sitemap.xml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
|
<url>
|
||||||
|
<loc>https://romanjaros.cz</loc>
|
||||||
|
</url>
|
||||||
|
</urlset>
|
5
sonar-project.properties
Normal file
5
sonar-project.properties
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
sonar.projectKey=PORTFOLIO
|
||||||
|
sonar.projectName=portfolio
|
||||||
|
sonar.inclusions=src/**
|
||||||
|
sonar.coverage.exclusions=**/__tests__/**
|
||||||
|
sonar.javascript.lcov.reportPaths=temp/jest/lcov.info
|
|
@ -1,7 +1,6 @@
|
||||||
import { Grid, GridCol } from "@treejs/components/Grid";
|
|
||||||
import Image from "next/image";
|
|
||||||
import { FC } from "react";
|
import { FC } from "react";
|
||||||
import MyTitle from "../components/MyTitle";
|
import MyTitle from "../components/MyTitle";
|
||||||
|
import MySection from "./MySection";
|
||||||
|
|
||||||
const AboutMe: FC = () => {
|
const AboutMe: FC = () => {
|
||||||
const age = Math.floor(
|
const age = Math.floor(
|
||||||
|
@ -13,30 +12,18 @@ const AboutMe: FC = () => {
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Grid cols={6} className="mt-28">
|
<MySection iconName="me">
|
||||||
<GridCol colSpan={1} className="text-center">
|
<MyTitle left="Dobrý" right="Den" />
|
||||||
<Image
|
<div className="mt-10">
|
||||||
src="/me.svg"
|
Jmenuji se <b>Roman Jaroš</b>.
|
||||||
alt="me"
|
</div>
|
||||||
width={200}
|
<div className="mt-5">
|
||||||
height={200}
|
<p>
|
||||||
objectFit="contain"
|
Je mi <b>{age} let</b> a již <b>{work} let</b> se profesionálně věnuji
|
||||||
/>
|
vývoji a správě webových aplikací. Aktuálně pracuji pouze na IČO.
|
||||||
</GridCol>
|
</p>
|
||||||
<GridCol colSpan={5} className="ml-10">
|
</div>
|
||||||
<MyTitle left="Dobrý" right="Den" />
|
</MySection>
|
||||||
<div className="mt-10">
|
|
||||||
Jmenuji se <b>Roman Jaroš</b>.
|
|
||||||
</div>
|
|
||||||
<div className="mt-5">
|
|
||||||
<p>
|
|
||||||
Je mi <b>{age} let</b> a již <b>{work} let</b> se profesionálně
|
|
||||||
věnuji vývoji a správě webových aplikací ☺️ .
|
|
||||||
</p>
|
|
||||||
<p>Od roku 2020 pracuji pouze na IČO.</p>
|
|
||||||
</div>
|
|
||||||
</GridCol>
|
|
||||||
</Grid>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,73 +1,45 @@
|
||||||
import { Grid, GridCol } from "@treejs/components/Grid";
|
|
||||||
import Image from "next/image";
|
|
||||||
import { FC } from "react";
|
import { FC } from "react";
|
||||||
|
import MySection from "./MySection";
|
||||||
import MyTitle from "./MyTitle";
|
import MyTitle from "./MyTitle";
|
||||||
|
|
||||||
const Contact: FC = () => {
|
const Contact: FC = () => {
|
||||||
const age = Math.floor(
|
|
||||||
((new Date() as any) - (new Date("1993-07-11") as any)) / 31557600000
|
|
||||||
);
|
|
||||||
|
|
||||||
const work = Math.floor(
|
|
||||||
((new Date() as any) - (new Date("2012-12-01") as any)) / 31557600000
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Grid cols={6} className="mt-28">
|
<MySection iconName="contact">
|
||||||
<GridCol colSpan={1} className="text-center">
|
<MyTitle left="Můj" right="Kontakt" />
|
||||||
<Image
|
<div className="mt-10">
|
||||||
src="/contact.svg"
|
<p className="mb-2">
|
||||||
alt="contact"
|
Obchodní nabídky prosím zasílejte{" "}
|
||||||
width={200}
|
<a href="mailto:sales@romanjaros.dev">sem</a>.
|
||||||
height={200}
|
</p>
|
||||||
objectFit="contain"
|
<p className="mb-2">
|
||||||
/>
|
Jiné dotazy prosím <a href="mailto:info@romanjaros.dev">sem</a>.
|
||||||
</GridCol>
|
</p>
|
||||||
<GridCol colSpan={5} className="ml-10">
|
<p className="mt-4">
|
||||||
<MyTitle left="Můj" right="Kontakt" />
|
<a
|
||||||
<div className="mt-10">
|
target="_blank"
|
||||||
<p className="mb-2">
|
href="http://linkedin.com/in/roman-jaroš-16a687139"
|
||||||
Obchodní nabídky prosím zasílejte{" "}
|
rel="noreferrer"
|
||||||
<a href="mailto:sales@romanjaros.dev">sem</a>.
|
>
|
||||||
</p>
|
LinkedIn
|
||||||
<p className="mb-2">
|
</a>
|
||||||
Jiné dotazy prosím <a href="mailto:info@romanjaros.dev">sem</a>.
|
<br />
|
||||||
</p>
|
<a target="_blank" href="https://git.romanjaros.dev" rel="noreferrer">
|
||||||
<p className="mt-4">
|
Gitea (Git)
|
||||||
<p>
|
</a>
|
||||||
<a
|
</p>
|
||||||
target="_blank"
|
<p className="mt-10">
|
||||||
href="http://linkedin.com/in/roman-jaroš-16a687139"
|
Pokud potřebujete zadat tiket na podporu, použijte prosím{" "}
|
||||||
rel="noreferrer"
|
<a
|
||||||
>
|
target="_blank"
|
||||||
LinkedIn
|
href="https://helpdesk.romanjaros.dev/index.php?a=add"
|
||||||
</a>
|
rel="noreferrer"
|
||||||
</p>
|
>
|
||||||
<p>
|
tento formulář
|
||||||
<a
|
</a>
|
||||||
target="_blank"
|
.
|
||||||
href="https://git.romanjaros.dev"
|
</p>
|
||||||
rel="noreferrer"
|
</div>
|
||||||
>
|
</MySection>
|
||||||
Gitea (Git)
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p className="mt-10">
|
|
||||||
Pokud potřebujete zadat tiket na podporu, použijte prosím{" "}
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
href="https://helpdesk.romanjaros.dev/index.php?a=add"
|
|
||||||
rel="noreferrer"
|
|
||||||
>
|
|
||||||
tento formulář
|
|
||||||
</a>
|
|
||||||
.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</GridCol>
|
|
||||||
</Grid>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
33
src/components/Footer.tsx
Normal file
33
src/components/Footer.tsx
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
import { Grid, GridCol } from "@treejs/components/Grid";
|
||||||
|
import { FC } from "react";
|
||||||
|
|
||||||
|
const Footer: FC = () => {
|
||||||
|
return (
|
||||||
|
<div className="bg-slate-300 p-2">
|
||||||
|
<Grid cols={2} className="mx-auto w-full lg:w-3/5 md:w-4/5">
|
||||||
|
<GridCol>
|
||||||
|
<p>IČO 08738734</p>
|
||||||
|
<p>DIČ CZ9307111946</p>
|
||||||
|
</GridCol>
|
||||||
|
<GridCol>
|
||||||
|
<p>
|
||||||
|
Bražec 50
|
||||||
|
<br />
|
||||||
|
Bochov 36471
|
||||||
|
<br />
|
||||||
|
Česká Republika
|
||||||
|
</p>
|
||||||
|
</GridCol>
|
||||||
|
<GridCol colSpan={2}>
|
||||||
|
<p>
|
||||||
|
<b>Jsem plátce DPH.</b> Fyzická osoba zapsaná v živnostenském
|
||||||
|
rejstříku v Karlových Varech (CZ0412) od 02.12.2019.
|
||||||
|
</p>
|
||||||
|
<p className="mt-2">Tento web nepoužívá cookies.</p>
|
||||||
|
</GridCol>
|
||||||
|
</Grid>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Footer;
|
|
@ -1,8 +1,7 @@
|
||||||
import { Grid, GridCol } from "@treejs/components/Grid";
|
import { isNil, map } from "ramda";
|
||||||
import Image from "next/image";
|
|
||||||
import { isEmpty, isNil, map } from "ramda";
|
|
||||||
import { FC, Fragment, useMemo } from "react";
|
import { FC, Fragment, useMemo } from "react";
|
||||||
import { projects } from "../constants/projects";
|
import { projects } from "../constants/projects";
|
||||||
|
import MySection from "./MySection";
|
||||||
import MyTitle from "./MyTitle";
|
import MyTitle from "./MyTitle";
|
||||||
|
|
||||||
const FullStory: FC = () => {
|
const FullStory: FC = () => {
|
||||||
|
@ -45,21 +44,10 @@ const FullStory: FC = () => {
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Grid cols={6} className="mt-28">
|
<MySection iconName="story">
|
||||||
<GridCol colSpan={1} className="text-center">
|
<MyTitle left="Na" right="Projektech" />
|
||||||
<Image
|
<div className="mt-10">{projectsRender}</div>
|
||||||
src="/story.svg"
|
</MySection>
|
||||||
alt="story"
|
|
||||||
width={200}
|
|
||||||
height={200}
|
|
||||||
objectFit="contain"
|
|
||||||
/>
|
|
||||||
</GridCol>
|
|
||||||
<GridCol colSpan={5} className="ml-10">
|
|
||||||
<MyTitle left="Na" right="Projektech" />
|
|
||||||
<div className="mt-10">{projectsRender}</div>
|
|
||||||
</GridCol>
|
|
||||||
</Grid>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
36
src/components/MySection.tsx
Normal file
36
src/components/MySection.tsx
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
import React, { FC, ReactElement } from "react";
|
||||||
|
import { Grid, GridCol } from "@treejs/components/Grid";
|
||||||
|
import Image from "next/image";
|
||||||
|
import { GRID_SIZE } from "@treejs/components/Grid/types";
|
||||||
|
|
||||||
|
type IProps = {
|
||||||
|
iconName: string;
|
||||||
|
children: ReactElement | ReactElement[];
|
||||||
|
};
|
||||||
|
|
||||||
|
const MySection: FC<IProps> = ({ iconName, children }) => {
|
||||||
|
return (
|
||||||
|
<Grid
|
||||||
|
cols={{ [GRID_SIZE.SM]: 1, [GRID_SIZE.LG]: 6 }}
|
||||||
|
className="mb-28 mx-4"
|
||||||
|
>
|
||||||
|
<GridCol colSpan={1} className="text-center">
|
||||||
|
<Image
|
||||||
|
src={`/${iconName}.svg`}
|
||||||
|
alt={iconName}
|
||||||
|
width={200}
|
||||||
|
height={200}
|
||||||
|
objectFit="contain"
|
||||||
|
/>
|
||||||
|
</GridCol>
|
||||||
|
<GridCol
|
||||||
|
colSpan={{ [GRID_SIZE.SM]: 1, [GRID_SIZE.LG]: 5 }}
|
||||||
|
className="lg:ml-10"
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</GridCol>
|
||||||
|
</Grid>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default MySection;
|
|
@ -10,14 +10,10 @@ type IProps = {
|
||||||
const MyTitle: FC<IProps> = ({ left, right, className }) => {
|
const MyTitle: FC<IProps> = ({ left, right, className }) => {
|
||||||
return (
|
return (
|
||||||
<div className={cx("mytitle", className)}>
|
<div className={cx("mytitle", className)}>
|
||||||
<span className="mytitle-left">
|
<span className="mytitle-left">{"<"}</span>
|
||||||
{"<"}
|
<h2 className="mytitle-left">{left}</h2>
|
||||||
{left}
|
<h2 className="mytitle-right">{right}</h2>
|
||||||
</span>
|
<span className="mytitle-left"> {"/>"}</span>
|
||||||
<span className="mytitle-right">
|
|
||||||
{right}
|
|
||||||
{" />"}
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
import { Grid, GridCol } from "@treejs/components/Grid";
|
import { Grid, GridCol } from "@treejs/components/Grid";
|
||||||
import Image from "next/image";
|
|
||||||
import { FC, useMemo } from "react";
|
import { FC, useMemo } from "react";
|
||||||
import { skills } from "../constants/skills";
|
import { skills } from "../constants/skills";
|
||||||
import MyTitle from "./MyTitle";
|
import MyTitle from "./MyTitle";
|
||||||
import { map } from "ramda";
|
import { map } from "ramda";
|
||||||
import { ISkill } from "../types/skills";
|
import { ISkill } from "../types/skills";
|
||||||
|
import MySection from "./MySection";
|
||||||
|
import { GRID_SIZE } from "@treejs/components/Grid/types";
|
||||||
|
|
||||||
const Services: FC = () => {
|
const Services: FC = () => {
|
||||||
const renderSkills = useMemo(() => {
|
const renderSkills = useMemo(() => {
|
||||||
|
@ -37,54 +38,43 @@ const Services: FC = () => {
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Grid cols={6} className="mt-28">
|
<MySection iconName="services">
|
||||||
<GridCol colSpan={1} className="text-center">
|
<MyTitle left="Umím" right="Ovládat" />
|
||||||
<Image
|
<Grid cols={{ [GRID_SIZE.SM]: 4 }} className="mt-10 grid-cols-2">
|
||||||
src="/services.svg"
|
<GridCol>
|
||||||
alt="services"
|
<b>Vývoj FE</b>
|
||||||
width={200}
|
{renderSkills[0]}
|
||||||
height={200}
|
</GridCol>
|
||||||
objectFit="contain"
|
<GridCol>
|
||||||
/>
|
<b>Vývoj BE</b>
|
||||||
</GridCol>
|
{renderSkills[1]}
|
||||||
<GridCol colSpan={5} className="ml-10">
|
</GridCol>
|
||||||
<MyTitle left="Umím" right="Ovládat" />
|
<GridCol>
|
||||||
<Grid cols={4} className="mt-10">
|
<b>Další</b>
|
||||||
<GridCol>
|
{renderSkills[2]}
|
||||||
<b>Vývoj FE</b>
|
</GridCol>
|
||||||
{renderSkills[0]}
|
<GridCol>
|
||||||
</GridCol>
|
<b>Správa serveru</b>
|
||||||
<GridCol>
|
{renderSkills[3]}
|
||||||
<b>Vývoj BE</b>
|
</GridCol>
|
||||||
{renderSkills[1]}
|
</Grid>
|
||||||
</GridCol>
|
|
||||||
<GridCol>
|
|
||||||
<b>Další</b>
|
|
||||||
{renderSkills[2]}
|
|
||||||
</GridCol>
|
|
||||||
<GridCol>
|
|
||||||
<b>Správa aplikací</b>
|
|
||||||
{renderSkills[3]}
|
|
||||||
</GridCol>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<div className="flex mt-6 text-sm">
|
<div className="flex mt-6 text-sm">
|
||||||
<div className="flex">
|
<div className="flex">
|
||||||
<svg height="10" width="10" className="mt-1.5 mr-2">
|
<svg height="10" width="10" className="mt-1.5 mr-2">
|
||||||
<circle cx="5" cy="5" r="4" fill="#90C8AC" />
|
<circle cx="5" cy="5" r="4" fill="#90C8AC" />
|
||||||
</svg>
|
</svg>
|
||||||
používám na projektech
|
používám na projektech
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="flex ml-5">
|
|
||||||
<svg height="10" width="10" className="mt-1.5 mr-2">
|
|
||||||
<circle cx="5" cy="5" r="4" fill="#FFE7BF" />
|
|
||||||
</svg>
|
|
||||||
hraju si a učím se
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</GridCol>
|
|
||||||
</Grid>
|
<div className="flex ml-5">
|
||||||
|
<svg height="10" width="10" className="mt-1.5 mr-2">
|
||||||
|
<circle cx="5" cy="5" r="4" fill="#FFE7BF" />
|
||||||
|
</svg>
|
||||||
|
hraju si a učím se
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</MySection>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,11 @@ import { IProject } from "../types/projects";
|
||||||
export const projects: IProject[] = [
|
export const projects: IProject[] = [
|
||||||
{
|
{
|
||||||
name: "doservislu.online",
|
name: "doservislu.online",
|
||||||
dateFrom: "březen 2020",
|
dateFrom: "prosinec 2021",
|
||||||
dateTo: "současnost",
|
dateTo: "současnost",
|
||||||
link: "http://doservisu.online",
|
link: "http://doservisu.online",
|
||||||
desciption:
|
desciption:
|
||||||
"Tvorba frontendu veřejné aplikace pro možnost jednoduchého obsloužení zákazníka autoservisu. Z pohledu FE se jedná o sólo vývoj.",
|
"Tvorba frontendu aplikace pro možnost jednoduchého obsloužení zákazníka autoservisu. Z pohledu FE se jedná o sólo vývoj.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Vývojář FE",
|
name: "Vývojář FE",
|
||||||
|
|
|
@ -8,7 +8,7 @@ export const skills: ISkill[][] = [
|
||||||
level: "full",
|
level: "full",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Redux (i tookit)",
|
name: "Redux (i toolkit)",
|
||||||
level: "full",
|
level: "full",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -63,17 +63,29 @@ export const skills: ISkill[][] = [
|
||||||
name: "NPM / Yarn",
|
name: "NPM / Yarn",
|
||||||
level: "full",
|
level: "full",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "NightwatchJS",
|
||||||
|
level: "full",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "Jenkins (CI, CD)",
|
name: "Jenkins (CI, CD)",
|
||||||
level: "full",
|
level: "full",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "SonarQube",
|
name: "SonarQube",
|
||||||
|
level: "full",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Designování",
|
||||||
|
level: "part",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "UML",
|
||||||
level: "part",
|
level: "part",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
||||||
// App maitenence
|
// server maitenence
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
name: "Docker",
|
name: "Docker",
|
||||||
|
@ -87,5 +99,9 @@ export const skills: ISkill[][] = [
|
||||||
name: "Portainer",
|
name: "Portainer",
|
||||||
level: "part",
|
level: "part",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "Monitoring",
|
||||||
|
level: "part",
|
||||||
|
},
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { useRouter } from "next/router";
|
||||||
import Skeleton from "@treejs/components/Skeleton";
|
import Skeleton from "@treejs/components/Skeleton";
|
||||||
import store from "../redux/store";
|
import store from "../redux/store";
|
||||||
import { Provider } from "react-redux";
|
import { Provider } from "react-redux";
|
||||||
|
import Footer from "../components/Footer";
|
||||||
|
|
||||||
function PortolioApp({ Component, pageProps }: AppProps) {
|
function PortolioApp({ Component, pageProps }: AppProps) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
@ -20,13 +21,7 @@ function PortolioApp({ Component, pageProps }: AppProps) {
|
||||||
user: false,
|
user: false,
|
||||||
}}
|
}}
|
||||||
components={{
|
components={{
|
||||||
footer: (
|
footer: <Footer />,
|
||||||
<div className="bg-slate-300 p-2 text-center">
|
|
||||||
IČO 08738734 | DIČ CZ9307111946 | Jsem plátce DPH. Fyzická osoba
|
|
||||||
zapsaná v živnostenském rejstříku v Karlových Varech (CZ0412) od
|
|
||||||
02.12.2019. Tento web nepoužívá cookies.
|
|
||||||
</div>
|
|
||||||
),
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Component {...pageProps} />
|
<Component {...pageProps} />
|
||||||
|
|
|
@ -5,13 +5,36 @@ import AboutMe from "../components/AboutMe";
|
||||||
import Services from "../components/Services";
|
import Services from "../components/Services";
|
||||||
import Contact from "../components/Contact";
|
import Contact from "../components/Contact";
|
||||||
import FullStory from "../components/FullStory";
|
import FullStory from "../components/FullStory";
|
||||||
|
import { NextSeo } from "next-seo";
|
||||||
|
|
||||||
const Home: NextPage = () => {
|
const Home: NextPage = () => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="mx-auto w-3/5">
|
<NextSeo
|
||||||
|
title="Roman Developer"
|
||||||
|
description="Primárně se zaměřuji na vývoj frontendů webových aplikací. Ale jsem schopný dělat vývoj i backedovžch částí webových aplikací."
|
||||||
|
openGraph={{
|
||||||
|
url: "https://romanjaros.cz",
|
||||||
|
type: "websites",
|
||||||
|
title: "Roman Jaroš Developer Portfolio",
|
||||||
|
description: "Portfolio web vývojáře Roman Jaroš",
|
||||||
|
site_name: "Roman Developer",
|
||||||
|
locale: "Czech Republic",
|
||||||
|
images: [
|
||||||
|
{
|
||||||
|
url: "http://romanjaros.cz/me.svg",
|
||||||
|
alt: "me",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<div className="mx-auto w-full md:w-4/5">
|
||||||
<div className="text-center mb-20">
|
<div className="text-center mb-20">
|
||||||
<MyTitle left="Roman" right="Developer" className="text-6xl" />
|
<MyTitle
|
||||||
|
left="Roman"
|
||||||
|
right="Developer"
|
||||||
|
className="text-5xl lg:text-6xl justify-center"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<AboutMe />
|
<AboutMe />
|
||||||
<Services />
|
<Services />
|
||||||
|
|
|
@ -3,6 +3,7 @@ const title = (theme) => ({
|
||||||
"font-size": "30px",
|
"font-size": "30px",
|
||||||
"font-weight": "bold",
|
"font-weight": "bold",
|
||||||
"padding-top": "40px",
|
"padding-top": "40px",
|
||||||
|
display: "flex",
|
||||||
|
|
||||||
"&-left": {
|
"&-left": {
|
||||||
color: theme("colors.black"),
|
color: theme("colors.black"),
|
||||||
|
|
Loading…
Add table
Reference in a new issue