Merge pull request 'feature/Feature-1' (#4) from feature/Feature-1 into master
All checks were successful
internetmastercz/test/pipeline/head This commit looks good
Reviewed-on: #4
13
Dockerfile
Normal file
@@ -0,0 +1,13 @@
|
||||
FROM denoland/deno:latest
|
||||
|
||||
EXPOSE 8000
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
USER deno
|
||||
|
||||
COPY --chown=deno . .
|
||||
|
||||
RUN deno cache --unstable app.ts
|
||||
|
||||
CMD ["run", "--unstable", "--allow-net=0.0.0.0:8000", "--allow-read=less,public/assets", "--allow-write=public/assets/css", "app.ts"]
|
||||
59
Jenkinsfile
vendored
@@ -1,23 +1,76 @@
|
||||
pipeline {
|
||||
|
||||
agent any
|
||||
|
||||
environment {
|
||||
REGISTRY_CREDENTIALS = credentials('registry-credentials-id')
|
||||
PORTAINER_CREDENTIALS = credentials('portainer-credentials-id')
|
||||
}
|
||||
|
||||
stages {
|
||||
|
||||
stage('Installation') {
|
||||
steps {
|
||||
echo "start Installation"
|
||||
echo "finish Installation"
|
||||
}
|
||||
}
|
||||
stage('Build') {
|
||||
steps {
|
||||
echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
|
||||
echo 'Building..'
|
||||
echo "docker build -t registry.proxyq.co/jenkins/website:${env.BUILD_ID} ."
|
||||
sh "docker build -t registry.proxyq.co/jenkins/website:${env.BUILD_ID} ."
|
||||
}
|
||||
}
|
||||
stage('Test') {
|
||||
stage('Testing') {
|
||||
steps {
|
||||
echo "start Testing"
|
||||
sh 'sleep 5'
|
||||
echo "finish Testing"
|
||||
}
|
||||
}
|
||||
stage('Deploy') {
|
||||
stage('Publish') {
|
||||
steps {
|
||||
echo "Deploying.... ${env.ENV_REGISTRY_URL} - ${env.ENV_REGISTRY_USER}"
|
||||
sh "docker login https://registry.proxyq.co -u ${REGISTRY_CREDENTIALS_USR} --password ${REGISTRY_CREDENTIALS_PSW}"
|
||||
sh "docker push registry.proxyq.co/jenkins/website:${env.BUILD_ID}"
|
||||
sh "docker tag registry.proxyq.co/jenkins/website:${env.BUILD_ID} registry.proxyq.co/jenkins/website:latest"
|
||||
sh "docker push registry.proxyq.co/jenkins/website:latest"
|
||||
}
|
||||
}
|
||||
stage('Redeploy') {
|
||||
steps {
|
||||
script {
|
||||
def json = """
|
||||
{"username": "${PORTAINER_CREDENTIALS_USR}", "password": "${PORTAINER_CREDENTIALS_PSW}"}
|
||||
"""
|
||||
def jwtResponse = httpRequest acceptType: 'APPLICATION_JSON',
|
||||
contentType: 'APPLICATION_JSON',
|
||||
validResponseCodes: '200',
|
||||
httpMode: 'POST',
|
||||
ignoreSslErrors: true,
|
||||
consoleLogResponseBody: true,
|
||||
requestBody: json,
|
||||
url: "http://192.168.4.8:9000/api/auth"
|
||||
def jwtObject = new groovy.json.JsonSlurper().parseText(jwtResponse.getContent())
|
||||
env.JWTTOKEN = "Bearer ${jwtObject.jwt}"
|
||||
}
|
||||
echo "Authenticated"
|
||||
script {
|
||||
def json = """
|
||||
|
||||
"""
|
||||
httpRequest acceptType: 'APPLICATION_JSON',
|
||||
contentType: 'APPLICATION_JSON',
|
||||
validResponseCodes: '204',
|
||||
httpMode: 'POST',
|
||||
ignoreSslErrors: true,
|
||||
consoleLogResponseBody: true,
|
||||
requestBody: json,
|
||||
customHeaders: [["name": "Authorization", "value": "${env.JWTTOKEN}"]],
|
||||
url: "http://192.168.4.8:9000/api/endpoints/26/docker/containers/145772505f27bcdef1fbd807ecbb7b4ccbe6fb86dbb3a2bd0e22951557a15a10/restart"
|
||||
}
|
||||
echo "Restarting Container"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
20
LICENSE
@@ -1,9 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) <year> <copyright holders>
|
||||
Copyright (c) 2020 Jan Rabcan
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
51
app.ts
Normal file
@@ -0,0 +1,51 @@
|
||||
import { serve } from "https://deno.land/std@0.100.0/http/server.ts";
|
||||
import { copyFile, getFileList, readFile, readFileRaw } from "./tools/tool.ts";
|
||||
import { template } from "./page.ts";
|
||||
|
||||
|
||||
const PORT = 8000;
|
||||
|
||||
const s = serve( {
|
||||
port : PORT
|
||||
} );
|
||||
|
||||
await copyFile( "./less/index.css", "./public/assets/css/index.min.css" );
|
||||
|
||||
const indexCss = await readFile( "./public/assets/css/index.min.css" );
|
||||
|
||||
await copyFile( "./less/index.css.map", "./public/assets/css/index.min.css.map" );
|
||||
|
||||
const indexCssMap = await readFile( "./public/assets/css/index.min.css.map" );
|
||||
|
||||
const fileNames = await getFileList( "./public/assets/img" );
|
||||
|
||||
const assetsMap = new Map();
|
||||
|
||||
for ( const fileName of fileNames ) {
|
||||
assetsMap.set( "/assets/img/" + fileName.path, await readFileRaw( fileName.absolutePath ) );
|
||||
}
|
||||
|
||||
console.log( `Server running on http://localhost:${ PORT }` );
|
||||
|
||||
for await ( const req of s ) {
|
||||
if ( req.url === "/" ) {
|
||||
req.respond( { body : template } );
|
||||
} else if ( req.url === "/css/index.min.css" ) {
|
||||
req.respond( { body : indexCss } );
|
||||
} else if ( req.url === "/css/index.css.map" ) {
|
||||
req.respond( { body : indexCssMap } );
|
||||
} else if ( req.url.startsWith( "/assets/img" ) ) {
|
||||
let headers = new Headers();
|
||||
if(req.url.endsWith('.svg')) {
|
||||
headers.set("content-type", "image/svg+xml");
|
||||
} else {
|
||||
headers.set("content-type", "image/png");
|
||||
}
|
||||
req.respond( {
|
||||
headers , body : assetsMap.get( req.url ), status : 200
|
||||
} );
|
||||
} else {
|
||||
console.log( req.url );
|
||||
req.respond( { status : 404 } );
|
||||
}
|
||||
}
|
||||
300
less/index.css
Normal file
@@ -0,0 +1,300 @@
|
||||
body {
|
||||
font-family: Nunito;
|
||||
background: #232526;
|
||||
background: -webkit-linear-gradient(to right, #414345, #232526);
|
||||
background: linear-gradient(to right, #414345, #232526);
|
||||
}
|
||||
::-webkit-scrollbar-track {
|
||||
background-color: #232526;
|
||||
}
|
||||
::-webkit-scrollbar {
|
||||
width: 5px;
|
||||
}
|
||||
::-webkit-scrollbar-thumb {
|
||||
border-radius: 10px;
|
||||
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
|
||||
background-color: #585858;
|
||||
}
|
||||
.page-wrapper {
|
||||
margin-left: 50px;
|
||||
padding-left: 50px;
|
||||
margin-top: 100px;
|
||||
position: relative;
|
||||
padding-right: 100px;
|
||||
margin-bottom: 100px;
|
||||
}
|
||||
@media only screen and (max-width: 800px) {
|
||||
.page-wrapper {
|
||||
padding-right: 50px;
|
||||
margin-left: 20px;
|
||||
padding-left: 25px;
|
||||
}
|
||||
}
|
||||
.page-wrapper::before {
|
||||
content: '';
|
||||
background-color: #585858;
|
||||
position: absolute;
|
||||
width: 3px;
|
||||
height: calc(100% - 15px);
|
||||
left: 0;
|
||||
top: 10px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.page-wrapper > .project-list {
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
.page-wrapper > .project-list > li {
|
||||
padding-left: 20px;
|
||||
border-left: 2px solid #585858;
|
||||
}
|
||||
.page-wrapper > .project-list > li:not(:last-child) {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper {
|
||||
display: flex;
|
||||
}
|
||||
@media only screen and (max-width: 800px) {
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding-right: 10px;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left .project-item-left-icon {
|
||||
display: flex;
|
||||
min-width: 200px;
|
||||
min-height: 200px;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: #444;
|
||||
color: #666;
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 10px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left .project-item-left-icon > img {
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
transition: 0.3s;
|
||||
transform: scale(1);
|
||||
filter: blur(2px);
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left .project-item-left-icon > img:hover {
|
||||
filter: blur(0);
|
||||
transform: scale(1.2);
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left .project-item-left-icon > .project-item-left-icon-badge {
|
||||
position: absolute;
|
||||
right: -35px;
|
||||
top: 25px;
|
||||
font-size: 12px;
|
||||
padding: 5px 29px;
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left .project-item-left-icon > .project-item-left-icon-badge.open-source {
|
||||
background: #666;
|
||||
color: #ccc;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left > .project-item-left-link-list {
|
||||
color: #888;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left > .project-item-left-link-list > li > a.disabled {
|
||||
opacity: 0.4;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left > .project-item-left-link-list > li > a > i {
|
||||
margin-right: 5px;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-right > ul > li {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-right > ul > li .project-item-right-label > h5 {
|
||||
margin: 0;
|
||||
color: #999;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-right > ul > li .project-item-right-content:not(.name) > h4 {
|
||||
color: #777;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-right > ul > li .project-item-right-content > h4 {
|
||||
margin: 0;
|
||||
max-width: 700px;
|
||||
color: #ccc;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-right > ul > li .project-item-right-content > h4 > .project-item-right-content-status {
|
||||
color: #616161;
|
||||
padding-left: 10px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-right > ul > li .project-item-right-content.list {
|
||||
margin-top: 5px;
|
||||
}
|
||||
.page-wrapper > .work-list {
|
||||
margin-bottom: 50px;
|
||||
position: relative;
|
||||
}
|
||||
.page-wrapper > .work-list::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 10px;
|
||||
height: calc(100% - 20px);
|
||||
width: 2px;
|
||||
background-color: #585858;
|
||||
}
|
||||
.page-wrapper > .work-list > li {
|
||||
color: #888;
|
||||
padding-left: 20px;
|
||||
}
|
||||
.page-wrapper > .work-list > li:first-child {
|
||||
color: #ccc;
|
||||
}
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-to {
|
||||
position: relative;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-info {
|
||||
position: relative;
|
||||
padding: 10px;
|
||||
padding-left: 20px;
|
||||
display: flex;
|
||||
}
|
||||
@media only screen and (max-width: 800px) {
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-info {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-info > .work-item-wrapper-info-role {
|
||||
padding-left: 10px;
|
||||
opacity: 0.7;
|
||||
}
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-from {
|
||||
position: relative;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-from::before,
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-to::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: -24px;
|
||||
top: 5px;
|
||||
background-color: #585858;
|
||||
border-radius: 20px;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
}
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-from::after,
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-to::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: -22px;
|
||||
top: 7px;
|
||||
background-color: #414345;
|
||||
border-radius: 20px;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
}
|
||||
.page-wrapper > h2 {
|
||||
color: #aaa;
|
||||
}
|
||||
.page-wrapper .intro {
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
.page-wrapper .intro h1 {
|
||||
color: white;
|
||||
}
|
||||
.page-wrapper .intro h2,
|
||||
.page-wrapper .intro h3 {
|
||||
color: #aaa;
|
||||
}
|
||||
.page-wrapper .intro .contact-list {
|
||||
display: flex;
|
||||
color: #888;
|
||||
}
|
||||
.page-wrapper .intro .contact-list > li {
|
||||
margin-right: 10px;
|
||||
}
|
||||
.page-wrapper .intro .contact-list > li > a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.page-wrapper .intro .contact-list > li > a > i {
|
||||
margin-right: 5px;
|
||||
font-size: 13px;
|
||||
}
|
||||
.page-wrapper .skill-wrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
@media only screen and (max-width: 800px) {
|
||||
.page-wrapper .skill-wrapper {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
}
|
||||
.page-wrapper .skill-wrapper .skill-caption {
|
||||
white-space: nowrap;
|
||||
padding-right: 10px;
|
||||
margin-bottom: 10px;
|
||||
margin-top: 0;
|
||||
}
|
||||
.skill-list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.skill-list li {
|
||||
background: #999;
|
||||
padding: 3px 5px;
|
||||
border-radius: 5px;
|
||||
margin-right: 10px;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.skill-list li img,
|
||||
.skill-list li i {
|
||||
margin-right: 5px;
|
||||
}
|
||||
ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
.clickable {
|
||||
font-weight: bold;
|
||||
}
|
||||
.clickable.disabled {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.clickable:not(.disabled) {
|
||||
transition: 0.3s;
|
||||
cursor: pointer;
|
||||
}
|
||||
.clickable:not(.disabled):hover {
|
||||
opacity: 0.6;
|
||||
}
|
||||
.footer {
|
||||
padding-bottom: 10px;
|
||||
font-size: 14px;
|
||||
color: #aaa;
|
||||
}
|
||||
.footer a {
|
||||
text-transform: uppercase;
|
||||
margin-right: 5px;
|
||||
}
|
||||
/*# sourceMappingURL=index.css.map */
|
||||
1
less/index.css.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["index.less"],"names":[],"mappings":"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","file":"index.css"}
|
||||
390
less/index.less
Normal file
@@ -0,0 +1,390 @@
|
||||
body {
|
||||
font-family: Nunito;
|
||||
background: #232526;
|
||||
background: -webkit-linear-gradient(to right, #414345, #232526);
|
||||
background: linear-gradient(to right, #414345, #232526);
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background-color: #232526;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 5px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
border-radius: 10px;
|
||||
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3);
|
||||
background-color: #585858;
|
||||
}
|
||||
|
||||
.page-wrapper {
|
||||
margin-left: 50px;
|
||||
padding-left: 50px;
|
||||
margin-top: 100px;
|
||||
position: relative;
|
||||
|
||||
padding-right: 100px;
|
||||
|
||||
@media only screen and (max-width: 800px) {
|
||||
padding-right: 50px;
|
||||
margin-left: 20px;
|
||||
padding-left: 25px;
|
||||
}
|
||||
|
||||
|
||||
margin-bottom: 100px;
|
||||
|
||||
&::before {
|
||||
content: '';
|
||||
background-color: #585858;
|
||||
position: absolute;
|
||||
width: 3px;
|
||||
height: calc(100% - 15px);
|
||||
left: 0;
|
||||
top: 10px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
&>.project-list {
|
||||
margin-bottom: 50px;
|
||||
|
||||
&>li {
|
||||
padding-left: 20px;
|
||||
border-left: 2px solid #585858;
|
||||
|
||||
&:not(:last-child) {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
&>.project-item-wrapper {
|
||||
display: flex;
|
||||
|
||||
@media only screen and (max-width: 800px) {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
&>.project-item-left {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding-right: 10px;
|
||||
|
||||
& .project-item-left-icon {
|
||||
display: flex;
|
||||
min-width: 200px;
|
||||
min-height: 200px;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: #444;
|
||||
color: #666;
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 10px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
border-radius: 5px;
|
||||
|
||||
&>img {
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
transition: 0.3s;
|
||||
transform: scale(1);
|
||||
filter: blur(2px);
|
||||
|
||||
&:hover {
|
||||
filter: blur(0);
|
||||
transform: scale(1.2);
|
||||
}
|
||||
}
|
||||
|
||||
&>.project-item-left-icon-badge {
|
||||
position: absolute;
|
||||
right: -35px;
|
||||
top: 25px;
|
||||
font-size: 12px;
|
||||
padding: 5px 29px;
|
||||
transform: rotate(45deg);
|
||||
|
||||
&.open-source {
|
||||
background: #666;
|
||||
color: #ccc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&>.project-item-left-link-list {
|
||||
|
||||
color: #888;
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
|
||||
&>li {
|
||||
&>a {
|
||||
&.disabled {
|
||||
opacity: 0.4;
|
||||
}
|
||||
|
||||
&>i {
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&>.project-item-right {
|
||||
&>ul {
|
||||
|
||||
&>li {
|
||||
margin-bottom: 10px;
|
||||
|
||||
& .project-item-right-label {
|
||||
&>h5 {
|
||||
margin: 0;
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
|
||||
& .project-item-right-content {
|
||||
|
||||
|
||||
&:not(.name) {
|
||||
&>h4 {
|
||||
color: #777;
|
||||
}
|
||||
}
|
||||
|
||||
&>h4 {
|
||||
margin: 0;
|
||||
max-width: 700px;
|
||||
color: #ccc;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
&>.project-item-right-content-status {
|
||||
color: #616161;
|
||||
padding-left: 10px;
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
&.list {
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
&>.work-list {
|
||||
margin-bottom: 50px;
|
||||
position: relative;
|
||||
|
||||
&::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 10px;
|
||||
height: calc(100% - 20px);
|
||||
width: 2px;
|
||||
background-color: #585858;
|
||||
}
|
||||
|
||||
&>li {
|
||||
|
||||
|
||||
color: #888;
|
||||
|
||||
&:first-child {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
padding-left: 20px;
|
||||
|
||||
&>.work-item-wrapper {
|
||||
|
||||
&>.work-item-wrapper-to {
|
||||
position: relative;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
&>.work-item-wrapper-info {
|
||||
position: relative;
|
||||
padding: 10px;
|
||||
padding-left: 20px;
|
||||
display: flex;
|
||||
@media only screen and (max-width: 800px) {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
|
||||
&>.work-item-wrapper-info-role {
|
||||
padding-left: 10px;
|
||||
opacity: 0.7;
|
||||
}
|
||||
}
|
||||
|
||||
&>.work-item-wrapper-from {
|
||||
position: relative;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
&>.work-item-wrapper-from,
|
||||
&>.work-item-wrapper-to {
|
||||
&::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: -24px;
|
||||
top: 5px;
|
||||
background-color: #585858;
|
||||
border-radius: 20px;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
&::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: -22px;
|
||||
top: 7px;
|
||||
background-color: #414345;
|
||||
border-radius: 20px;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
&>h2 {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
|
||||
& .intro {
|
||||
margin-bottom: 50px;
|
||||
|
||||
h1 {
|
||||
color: white;
|
||||
}
|
||||
|
||||
h2,
|
||||
h3 {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
|
||||
& .contact-list {
|
||||
display: flex;
|
||||
color: #888;
|
||||
|
||||
&>li {
|
||||
margin-right: 10px;
|
||||
|
||||
&>a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
|
||||
&>i {
|
||||
margin-right: 5px;
|
||||
font-size: 13px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
.skill-wrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
|
||||
@media only screen and (max-width: 800px) {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
|
||||
.skill-caption {
|
||||
white-space: nowrap;
|
||||
padding-right: 10px;
|
||||
margin-bottom: 10px;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.skill-list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
li {
|
||||
background: #999;
|
||||
padding: 3px 5px;
|
||||
border-radius: 5px;
|
||||
margin-right: 10px;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
|
||||
img,
|
||||
i {
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.clickable {
|
||||
font-weight: bold;
|
||||
|
||||
&.disabled {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
&:not(.disabled) {
|
||||
transition: 0.3s;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
opacity: 0.6;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
padding-bottom: 10px;
|
||||
font-size: 14px;
|
||||
color: #aaa;
|
||||
|
||||
a {
|
||||
text-transform: uppercase;
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
480
page.ts
Normal file
@@ -0,0 +1,480 @@
|
||||
interface ITechnologyListItem {
|
||||
name : string,
|
||||
icon : string,
|
||||
alt? : string
|
||||
}
|
||||
|
||||
let technologyListMap : Map<string, ITechnologyListItem> = new Map();
|
||||
technologyListMap.set( "deno", {
|
||||
name : "Deno",
|
||||
icon : "https://deno.land/logo.svg"
|
||||
} );
|
||||
technologyListMap.set( "react", {
|
||||
name : "React",
|
||||
icon : "./assets/img/3rd/favicon-react.svg",
|
||||
alt : "React Library"
|
||||
} );
|
||||
technologyListMap.set( "typescript", {
|
||||
name : "TypeScript",
|
||||
icon : "./assets/img/3rd/favicon-typescript.ico"
|
||||
} );
|
||||
technologyListMap.set( "javascript", {
|
||||
name : "JavaScript",
|
||||
icon : "./assets/img/3rd/favicon-javascript.png"
|
||||
} );
|
||||
technologyListMap.set( "less", {
|
||||
name : "Less",
|
||||
icon : "./assets/img/3rd/favicon-less.ico"
|
||||
} );
|
||||
technologyListMap.set( "angular", {
|
||||
name : "Angular",
|
||||
icon : "./assets/img/3rd/favicon-angular.ico",
|
||||
alt : "Angular Framework"
|
||||
} );
|
||||
// technologyListMap.set( "mongodb", {
|
||||
// name : "MongoDB",
|
||||
// icon : "https://www.mongodb.com/assets/images/global/favicon.ico",
|
||||
// alt : "MongoDB - NoSQL Database"
|
||||
// } );
|
||||
technologyListMap.set( "sql", {
|
||||
name : "SQL",
|
||||
icon : "./assets/img/3rd/favicon-sql.png",
|
||||
alt : "SQL Database Language"
|
||||
} );
|
||||
technologyListMap.set( "redis", {
|
||||
name : "Redis",
|
||||
icon : "./assets/img/3rd/favicon-redis.png",
|
||||
alt : "Redis Database"
|
||||
} );
|
||||
technologyListMap.set( "laravel", {
|
||||
name : "Laravel",
|
||||
icon : "./assets/img/3rd/favicon-laravel.ico",
|
||||
alt : "Laravel PHP Framework"
|
||||
} );
|
||||
// technologyListMap.set( "jquery", {
|
||||
// name : "JQuery",
|
||||
// icon : "./assets/img/3rd/favicon-jquery.ico",
|
||||
// alt : "JQuery Library"
|
||||
// } );
|
||||
// technologyListMap.set( "html", {
|
||||
// name : "Html",
|
||||
// icon : "./assets/img/3rd/favicon-html.png"
|
||||
// } );
|
||||
// technologyListMap.set( "css", {
|
||||
// name : "CSS",
|
||||
// icon : "./assets/img/3rd/favicon-css.svg"
|
||||
// } );
|
||||
technologyListMap.set( "googlecharts", {
|
||||
name : "Google Charts",
|
||||
icon : "./assets/img/3rd/favicon-googlecharts.png",
|
||||
alt : "Google Charts JS Library"
|
||||
} );
|
||||
technologyListMap.set( "nodejs", {
|
||||
name : "NodeJS",
|
||||
icon : "./assets/img/3rd/favicon-nodejs.ico"
|
||||
} );
|
||||
technologyListMap.set( "socketio", {
|
||||
name : "Socket.IO",
|
||||
icon : "./assets/img/3rd/favicon-socketio.png"
|
||||
} );
|
||||
|
||||
technologyListMap.set( "git", {
|
||||
name : "Git",
|
||||
icon : "./assets/img/3rd/favicon-git.ico"
|
||||
} );
|
||||
technologyListMap.set( "docker", {
|
||||
name : "Docker",
|
||||
icon : "./assets/img/3rd/favicon-docker.png"
|
||||
} );
|
||||
technologyListMap.set( "webpack", {
|
||||
name : "Webpack",
|
||||
icon : "https://raw.githubusercontent.com/webpack/media/master/logo/icon-square-small.png"
|
||||
} );
|
||||
technologyListMap.set( "yarn", {
|
||||
name : "Yarn",
|
||||
icon : "https://yarnpkg.com/favicon-32x32.png"
|
||||
} );
|
||||
technologyListMap.set( "npm", {
|
||||
name : "Npm",
|
||||
icon : "https://static.npmjs.com/3dc95981de4241b35cd55fe126ab6b2c.png"
|
||||
} );
|
||||
technologyListMap.set( "instagramapi", {
|
||||
name : "Instagram - API",
|
||||
icon : "./assets/img/3rd/favicon-instagram.png"
|
||||
} );
|
||||
|
||||
interface IProjectListItem {
|
||||
name : string;
|
||||
previewImg? : string;
|
||||
link : {
|
||||
github? : string;
|
||||
live? : string
|
||||
},
|
||||
date : number;
|
||||
status : boolean | null;
|
||||
description : string
|
||||
clientSideList? : Array<ITechnologyListItem>;
|
||||
serverSideList? : Array<ITechnologyListItem>;
|
||||
}
|
||||
|
||||
const projectsListMap : Map<string, IProjectListItem> = new Map();
|
||||
projectsListMap.set( "reactinstafeed", {
|
||||
name : "Instagram User Media Feed Widget",
|
||||
link : {
|
||||
github : "https://github.com/Hellsos/insta-feed-widget"
|
||||
},
|
||||
date : 2021,
|
||||
status : true,
|
||||
description : `Instagram User Media Feed Widget using React.js.`,
|
||||
serverSideList : [
|
||||
technologyListMap.get( "react" )!,
|
||||
technologyListMap.get( "typescript" )!,
|
||||
technologyListMap.get( "javascript" )!,
|
||||
technologyListMap.get( "git" )!,
|
||||
]
|
||||
} );
|
||||
projectsListMap.set( "denoinstafeed", {
|
||||
name : "Instagram User Media Feed",
|
||||
link : {
|
||||
github : "https://github.com/Hellsos/deno-insta-feed"
|
||||
},
|
||||
date : 2021,
|
||||
status : true,
|
||||
description : `Instagram User Media Feed API using Deno TypeScript Runtime.`,
|
||||
serverSideList : [
|
||||
technologyListMap.get( "deno" )!,
|
||||
technologyListMap.get( "typescript" )!,
|
||||
technologyListMap.get( "javascript" )!,
|
||||
technologyListMap.get( "sql" )!,
|
||||
technologyListMap.get( "git" )!,
|
||||
technologyListMap.get( "instagramapi" )!,
|
||||
]
|
||||
} );
|
||||
projectsListMap.set( "denodotenvfile", {
|
||||
name : "DotEnv File for Deno",
|
||||
link : {
|
||||
github : "https://github.com/Hellsos/deno-dotenv-file"
|
||||
},
|
||||
date : 2020,
|
||||
status : true,
|
||||
description : `A library for Deno parsing .env file into object-oriented structure making it more friendly for working in IDEs.`,
|
||||
serverSideList : [
|
||||
technologyListMap.get( "deno" )!,
|
||||
technologyListMap.get( "typescript" )!,
|
||||
technologyListMap.get( "javascript" )!,
|
||||
technologyListMap.get( "git" )!
|
||||
]
|
||||
} );
|
||||
projectsListMap.set( "blogmihmanli", {
|
||||
name : "Blog - Mihmanli",
|
||||
previewImg : "./assets/img/asset_mihmanli.png",
|
||||
link : {
|
||||
live : "https://kristyna.mihmanli.com/"
|
||||
},
|
||||
date : 2017,
|
||||
status : true,
|
||||
description : `Personal blog with administration allowing logged user to create groups, posts, galleries publicly accessible or privately accessible with custom code.
|
||||
<br>Data feed from Instagram is every hour synchronized via Instagram - API providing images, videos and its data. Images are stored on storage server and data are inserted into SQL database.`,
|
||||
clientSideList : [
|
||||
technologyListMap.get( "jquery" )!,
|
||||
technologyListMap.get( "html" )!,
|
||||
technologyListMap.get( "css" )!
|
||||
],
|
||||
serverSideList : [
|
||||
technologyListMap.get( "laravel" )!,
|
||||
technologyListMap.get( "sql" )!,
|
||||
technologyListMap.get( "redis" )!,
|
||||
technologyListMap.get( "instagramapi" )!,
|
||||
]
|
||||
} );
|
||||
projectsListMap.set( "weatherstation", {
|
||||
name : "WeatherStation Stats",
|
||||
previewImg : "./assets/img/asset_weather_station.png",
|
||||
link : {
|
||||
live : "http://meteostanice-dev.kumpacka.eu"
|
||||
},
|
||||
date : 2016,
|
||||
status : true,
|
||||
description : `Web Application which shows data stored in redis cache collected by weather station.
|
||||
<br>Shell script on server inserts current weather data to SQL database each 5 minutes and then refreshes views in redis cache.
|
||||
<br> Sun/Moon moves around according to the time of last record :)`,
|
||||
clientSideList : [
|
||||
technologyListMap.get( "jquery" )!,
|
||||
technologyListMap.get( "html" )!,
|
||||
technologyListMap.get( "css" )!,
|
||||
technologyListMap.get( "googlecharts" )!,
|
||||
],
|
||||
serverSideList : [
|
||||
technologyListMap.get( "laravel" )!,
|
||||
technologyListMap.get( "sql" )!,
|
||||
technologyListMap.get( "redis" )!,
|
||||
]
|
||||
} );
|
||||
|
||||
|
||||
export const template = `
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async
|
||||
src="https://www.googletagmanager.com/gtag/js?id=UA-155382150-1"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
function gtag() { dataLayer.push( arguments ); }
|
||||
|
||||
gtag( 'js', new Date() );
|
||||
|
||||
gtag( 'config', 'UA-155382150-1' );
|
||||
</script>
|
||||
|
||||
<base href="/">
|
||||
|
||||
<title>Jan Rabčan - Front End Developer - Angular, React, Deno</title>
|
||||
|
||||
<meta name="title"
|
||||
content="Jan Rabčan - Front End Developer - Angular, React, Deno" />
|
||||
|
||||
<meta name="description"
|
||||
content="Jan Rabčan - Front End Developer, Front End, Back End, Full Stack, Front End, Back End, Web, Developer, Angular, React, Deno, JQuery, TypeScript, JavaScript, Less, NodeJS, Socket.IO, Redis, Git, Docker" />
|
||||
|
||||
<meta http-equiv="Content-Type"
|
||||
content="text/html;charset=UTF-8" />
|
||||
|
||||
<meta name="google-site-verification"
|
||||
content="2yvwVzwqeZ580ryQ8D9QgGbRcumZo4t-5PW0qQdvfqM" />
|
||||
|
||||
<meta charset="utf-8" />
|
||||
|
||||
<meta name="og:title"
|
||||
property="og:title"
|
||||
content="Jan Rabčan - Front End Developer - Angular, React, Deno" />
|
||||
|
||||
<meta name="twitter:card"
|
||||
content="Jan Rabčan - Front End Developer - Angular, React, Deno" />
|
||||
|
||||
<meta name="robots"
|
||||
content="nofollow" />
|
||||
|
||||
<meta name="viewport"
|
||||
content="width=device-width, initial-scale=1" />
|
||||
|
||||
<meta name="keywords"
|
||||
content="Full Stack, Front End, Back End, Web, Developer, Angular, React, Deno, JQuery, TypeScript, JavaScript, Less, NodeJS, Socket.IO, Redis, Git, Docker" />
|
||||
|
||||
<link rel="canonical"
|
||||
href="https://rabcan.com">
|
||||
|
||||
<link rel="stylesheet"
|
||||
href="css/index.min.css">
|
||||
|
||||
<link href="https://fonts.googleapis.com/css?family=Nunito:400,500,600,700&display=swap&subset=cyrillic,cyrillic-ext"
|
||||
rel="stylesheet">
|
||||
|
||||
<link rel="icon"
|
||||
type="image/x-icon"
|
||||
href="favicon.ico">
|
||||
|
||||
<link rel="stylesheet"
|
||||
href="https://cdn.proxyq.co/kit/bateokp34yt53h154qlp[agr==/css/all.min.css">
|
||||
</head>
|
||||
|
||||
<style>
|
||||
a {
|
||||
text-decoration: inherit;
|
||||
color: inherit;
|
||||
}
|
||||
</style>
|
||||
|
||||
<body>
|
||||
<div class="page-wrapper">
|
||||
<div class="intro">
|
||||
<h1>
|
||||
Hello, I'm Jan
|
||||
</h1>
|
||||
<h2>
|
||||
A Front End Developer living in Czech Republic
|
||||
</h2>
|
||||
<div class="skill-wrapper">
|
||||
<h3 class="skill-caption">
|
||||
Building Web Apps Using
|
||||
</h3>
|
||||
<ul class="skill-list"
|
||||
id="skillList">
|
||||
${ Array.from( technologyListMap.values() ).map( ( technology ) => {
|
||||
return `<li><img src="${ technology.icon }" style="height: 18px" title="${ technology.name }" alt="${ technology.alt || technology.name }"> ${ technology.name } </li>`;
|
||||
} ).join( "\n" ) }
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<ul class="contact-list">
|
||||
<li>
|
||||
<a class="clickable"
|
||||
href="mailto:jan@rabcan.com"><i class="fas fa-envelope"></i> jan@rabcan.com</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="clickable"
|
||||
href="https://www.linkedin.com/in/jan-rab%C4%8Dan-17917a61"
|
||||
target="_blank"><i class="fab fa-linkedin"></i> Linkedin</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h2>
|
||||
Projects
|
||||
</h2>
|
||||
<ul class="project-list"
|
||||
id="projectList">
|
||||
${ Array.from( projectsListMap.values() ).map( ( project ) => {
|
||||
return `
|
||||
<li>
|
||||
<div class="project-item-wrapper">
|
||||
<div class="project-item-left">
|
||||
<a ${ project.link.live ? "href='" + project.link.live + "'" : null }
|
||||
target="_blank">
|
||||
<div class="project-item-left-icon">
|
||||
${ project.link.github ? "<div class=\"project-item-left-icon-badge open-source\">Open Source</div>" : "" }
|
||||
${ project.previewImg ? "<img src=\"" + project.previewImg + "\" alt=\"" + project.name + "\" title=\"" + project.name + "\">" : "Coming Soon" }
|
||||
</div>
|
||||
</a>
|
||||
<ul class="project-item-left-link-list">
|
||||
<li>
|
||||
<a ${ project.link.github ? "href='" + project.link.github + "'" : "" }
|
||||
target="_blank"
|
||||
class="clickable ${ project.link.github == undefined ? "disabled" : "" }"><i class="fab fa-github"></i>Github</a>
|
||||
</li>
|
||||
<li>
|
||||
<a ${ project.link.live ? "href='" + project.link.live + "'" : "" }
|
||||
target="_blank"
|
||||
class="clickable ${ project.link.live == null ? "disabled" : "" }"><i class="fas fa-magic"></i>Live</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="project-item-right">
|
||||
<ul>
|
||||
<li>
|
||||
<div class="project-item-right-label">
|
||||
<h5>Name</h5>
|
||||
</div>
|
||||
<div class="project-item-right-content name">
|
||||
<h4> ${ project.name } </h4>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="project-item-right-label">
|
||||
<h5>Date</h5>
|
||||
</div>
|
||||
<div class="project-item-right-content">
|
||||
<h4>
|
||||
${ project.date }
|
||||
<span class="project-item-right-content-status
|
||||
${ project.status === true ? "active" : "" }
|
||||
${ project.status === null ? "progress" : "" }
|
||||
${ project.status === false ? "inactive" : "" }">
|
||||
${ project.status === true ? "Active" : "" }
|
||||
${ project.status === null ? "In Progress" : "" }
|
||||
${ project.status === false ? "Inactive" : "" }
|
||||
</span>
|
||||
</h4>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="project-item-right-label">
|
||||
<h5>Description</h5>
|
||||
</div>
|
||||
<div class="project-item-right-content">
|
||||
<h4>${ project.description }</h4>
|
||||
</div>
|
||||
</li>
|
||||
${ project.clientSideList && project.clientSideList.length > 0 ?
|
||||
`<li>
|
||||
<div class="project-item-right-label">
|
||||
<h5>Client Side</h5>
|
||||
</div>
|
||||
<div class="project-item-right-content list">
|
||||
<ul class="skill-list">
|
||||
${ project.clientSideList.map( ( technology ) => {
|
||||
if ( technology == null ) return;
|
||||
return `<li><img src="${ technology.icon }" style="height: 18px" title="${ technology.name }" alt="${ technology.alt || technology.name }"> ${ technology.name } </li>`;
|
||||
} ).join( "\n" ) }
|
||||
</ul>
|
||||
</div>
|
||||
</li>` : ""
|
||||
}
|
||||
${ project.serverSideList && project.serverSideList.length > 0 ? `<li>
|
||||
<div class="project-item-right-label">
|
||||
<h5>Server Side</h5>
|
||||
</div>
|
||||
<div class="project-item-right-content list">
|
||||
<ul class="skill-list">
|
||||
${ project.serverSideList.map( ( technology ) => {
|
||||
if ( technology == null ) return;
|
||||
return `<li><img src="${ technology.icon }" style="height: 18px" title="${ technology.name }" alt="${ technology.alt || technology.name }"> ${ technology.name } </li>`;
|
||||
} ).join( "\n" ) }
|
||||
</ul>
|
||||
</div>
|
||||
</li>` : ""
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</li>`;
|
||||
} ).join( "\n" ) }
|
||||
</ul>
|
||||
<h2>
|
||||
Work Experience
|
||||
</h2>
|
||||
<ul class="work-list">
|
||||
<li>
|
||||
<div class="work-item-wrapper">
|
||||
<div class="work-item-wrapper-to">Present</div>
|
||||
<div class="work-item-wrapper-info">
|
||||
<a href="https://lemonero.cz"
|
||||
class="clickable"
|
||||
target="_blank">Lemonero</a>
|
||||
<div class="work-item-wrapper-info-role">
|
||||
Front End Developer
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="work-item-wrapper">
|
||||
<div class="work-item-wrapper-to">1/2020</div>
|
||||
<div class="work-item-wrapper-info">
|
||||
<a href="https://monkeydata.com"
|
||||
class="clickable"
|
||||
target="_blank">MonkeyData</a>
|
||||
<div class="work-item-wrapper-info-role">
|
||||
Front End Developer
|
||||
</div>
|
||||
</div>
|
||||
<div class="work-item-wrapper-from">12/2017</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="work-item-wrapper">
|
||||
<div class="work-item-wrapper-info">
|
||||
<a href="https://monkeydata.com"
|
||||
class="clickable"
|
||||
target="_blank">MonkeyData</a>
|
||||
<div class="work-item-wrapper-info-role">
|
||||
Junior Developer
|
||||
</div>
|
||||
</div>
|
||||
<div class="work-item-wrapper-from">6/2016</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="footer">
|
||||
<a href="/"
|
||||
class="clickable"> Jan Rabčan </a> Ⓒ 2020
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
300
public/assets/css/index.min.css
vendored
Normal file
@@ -0,0 +1,300 @@
|
||||
body {
|
||||
font-family: Nunito;
|
||||
background: #232526;
|
||||
background: -webkit-linear-gradient(to right, #414345, #232526);
|
||||
background: linear-gradient(to right, #414345, #232526);
|
||||
}
|
||||
::-webkit-scrollbar-track {
|
||||
background-color: #232526;
|
||||
}
|
||||
::-webkit-scrollbar {
|
||||
width: 5px;
|
||||
}
|
||||
::-webkit-scrollbar-thumb {
|
||||
border-radius: 10px;
|
||||
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
|
||||
background-color: #585858;
|
||||
}
|
||||
.page-wrapper {
|
||||
margin-left: 50px;
|
||||
padding-left: 50px;
|
||||
margin-top: 100px;
|
||||
position: relative;
|
||||
padding-right: 100px;
|
||||
margin-bottom: 100px;
|
||||
}
|
||||
@media only screen and (max-width: 800px) {
|
||||
.page-wrapper {
|
||||
padding-right: 50px;
|
||||
margin-left: 20px;
|
||||
padding-left: 25px;
|
||||
}
|
||||
}
|
||||
.page-wrapper::before {
|
||||
content: '';
|
||||
background-color: #585858;
|
||||
position: absolute;
|
||||
width: 3px;
|
||||
height: calc(100% - 15px);
|
||||
left: 0;
|
||||
top: 10px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.page-wrapper > .project-list {
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
.page-wrapper > .project-list > li {
|
||||
padding-left: 20px;
|
||||
border-left: 2px solid #585858;
|
||||
}
|
||||
.page-wrapper > .project-list > li:not(:last-child) {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper {
|
||||
display: flex;
|
||||
}
|
||||
@media only screen and (max-width: 800px) {
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding-right: 10px;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left .project-item-left-icon {
|
||||
display: flex;
|
||||
min-width: 200px;
|
||||
min-height: 200px;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: #444;
|
||||
color: #666;
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 10px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left .project-item-left-icon > img {
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
transition: 0.3s;
|
||||
transform: scale(1);
|
||||
filter: blur(2px);
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left .project-item-left-icon > img:hover {
|
||||
filter: blur(0);
|
||||
transform: scale(1.2);
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left .project-item-left-icon > .project-item-left-icon-badge {
|
||||
position: absolute;
|
||||
right: -35px;
|
||||
top: 25px;
|
||||
font-size: 12px;
|
||||
padding: 5px 29px;
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left .project-item-left-icon > .project-item-left-icon-badge.open-source {
|
||||
background: #666;
|
||||
color: #ccc;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left > .project-item-left-link-list {
|
||||
color: #888;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left > .project-item-left-link-list > li > a.disabled {
|
||||
opacity: 0.4;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-left > .project-item-left-link-list > li > a > i {
|
||||
margin-right: 5px;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-right > ul > li {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-right > ul > li .project-item-right-label > h5 {
|
||||
margin: 0;
|
||||
color: #999;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-right > ul > li .project-item-right-content:not(.name) > h4 {
|
||||
color: #777;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-right > ul > li .project-item-right-content > h4 {
|
||||
margin: 0;
|
||||
max-width: 700px;
|
||||
color: #ccc;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-right > ul > li .project-item-right-content > h4 > .project-item-right-content-status {
|
||||
color: #616161;
|
||||
padding-left: 10px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.page-wrapper > .project-list > li > .project-item-wrapper > .project-item-right > ul > li .project-item-right-content.list {
|
||||
margin-top: 5px;
|
||||
}
|
||||
.page-wrapper > .work-list {
|
||||
margin-bottom: 50px;
|
||||
position: relative;
|
||||
}
|
||||
.page-wrapper > .work-list::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 10px;
|
||||
height: calc(100% - 20px);
|
||||
width: 2px;
|
||||
background-color: #585858;
|
||||
}
|
||||
.page-wrapper > .work-list > li {
|
||||
color: #888;
|
||||
padding-left: 20px;
|
||||
}
|
||||
.page-wrapper > .work-list > li:first-child {
|
||||
color: #ccc;
|
||||
}
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-to {
|
||||
position: relative;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-info {
|
||||
position: relative;
|
||||
padding: 10px;
|
||||
padding-left: 20px;
|
||||
display: flex;
|
||||
}
|
||||
@media only screen and (max-width: 800px) {
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-info {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-info > .work-item-wrapper-info-role {
|
||||
padding-left: 10px;
|
||||
opacity: 0.7;
|
||||
}
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-from {
|
||||
position: relative;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-from::before,
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-to::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: -24px;
|
||||
top: 5px;
|
||||
background-color: #585858;
|
||||
border-radius: 20px;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
}
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-from::after,
|
||||
.page-wrapper > .work-list > li > .work-item-wrapper > .work-item-wrapper-to::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: -22px;
|
||||
top: 7px;
|
||||
background-color: #414345;
|
||||
border-radius: 20px;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
}
|
||||
.page-wrapper > h2 {
|
||||
color: #aaa;
|
||||
}
|
||||
.page-wrapper .intro {
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
.page-wrapper .intro h1 {
|
||||
color: white;
|
||||
}
|
||||
.page-wrapper .intro h2,
|
||||
.page-wrapper .intro h3 {
|
||||
color: #aaa;
|
||||
}
|
||||
.page-wrapper .intro .contact-list {
|
||||
display: flex;
|
||||
color: #888;
|
||||
}
|
||||
.page-wrapper .intro .contact-list > li {
|
||||
margin-right: 10px;
|
||||
}
|
||||
.page-wrapper .intro .contact-list > li > a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.page-wrapper .intro .contact-list > li > a > i {
|
||||
margin-right: 5px;
|
||||
font-size: 13px;
|
||||
}
|
||||
.page-wrapper .skill-wrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
@media only screen and (max-width: 800px) {
|
||||
.page-wrapper .skill-wrapper {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
}
|
||||
.page-wrapper .skill-wrapper .skill-caption {
|
||||
white-space: nowrap;
|
||||
padding-right: 10px;
|
||||
margin-bottom: 10px;
|
||||
margin-top: 0;
|
||||
}
|
||||
.skill-list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.skill-list li {
|
||||
background: #999;
|
||||
padding: 3px 5px;
|
||||
border-radius: 5px;
|
||||
margin-right: 10px;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.skill-list li img,
|
||||
.skill-list li i {
|
||||
margin-right: 5px;
|
||||
}
|
||||
ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
.clickable {
|
||||
font-weight: bold;
|
||||
}
|
||||
.clickable.disabled {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.clickable:not(.disabled) {
|
||||
transition: 0.3s;
|
||||
cursor: pointer;
|
||||
}
|
||||
.clickable:not(.disabled):hover {
|
||||
opacity: 0.6;
|
||||
}
|
||||
.footer {
|
||||
padding-bottom: 10px;
|
||||
font-size: 14px;
|
||||
color: #aaa;
|
||||
}
|
||||
.footer a {
|
||||
text-transform: uppercase;
|
||||
margin-right: 5px;
|
||||
}
|
||||
/*# sourceMappingURL=index.css.map */
|
||||
1
public/assets/css/index.min.css.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["index.less"],"names":[],"mappings":"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","file":"index.css"}
|
||||
BIN
public/assets/img/3rd/favicon-angular.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
1
public/assets/img/3rd/favicon-css.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="2500" height="2500" viewBox="0 0 538.584 538.583"><path d="M0 0h538.584v538.583H0V0z" fill="none"/><path d="M405.5 467.454L269.29 504.13l-136.212-36.676-31.432-340.525h335.29L405.5 467.454z" fill="#2062af"/><path d="M269.289 154.511v320.367l.308.084 110.229-29.682 25.443-290.769h-135.98z" fill="#3c9cd7"/><path d="M191.985 76.899V56.631h29.571V34.453h-51.749v62.684h51.749V76.899h-29.571zm82.766-20.268h20.674V34.453h-51.754v22.178c6.924 6.924 10.535 10.238 20.549 20.252-5.854 0-20.549.021-20.549.02v20.234h51.754V76.899l-20.674-20.268zm73.352 0h20.673V34.453H317.02v22.178c6.924 6.924 10.537 10.238 20.551 20.252-5.852 0-20.551.021-20.551.02v20.234h51.757V76.899l-20.674-20.268z"/><path d="M269.168 239.656l-97.49 40.602 3.233 40.199 94.257-40.301 100.265-42.868 4.157-41.122-104.422 43.49z" fill="#fff"/><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-825.508" y1="1338.301" x2="-825.508" y2="1419.102" gradientTransform="matrix(1 0 0 -1 1045.93 1658.759)"><stop offset=".387" stop-color="#d1d3d4" stop-opacity="0"/><stop offset="1" stop-color="#d1d3d4"/></linearGradient><path d="M171.677 280.258l3.233 40.199 94.257-40.301v-40.5l-97.49 40.602z" fill="url(#a)"/><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="-724.552" y1="1378.602" x2="-724.552" y2="1462.591" gradientTransform="matrix(1 0 0 -1 1045.93 1658.759)"><stop offset=".387" stop-color="#d1d3d4" stop-opacity="0"/><stop offset="1" stop-color="#d1d3d4"/></linearGradient><path d="M373.59 196.167l-104.422 43.489v40.5l100.265-42.868 4.157-41.121z" fill="url(#b)"/><linearGradient id="c" gradientUnits="userSpaceOnUse" x1="-874.103" y1="1302.263" x2="-680.039" y2="1302.263" gradientTransform="matrix(1 0 0 -1 1045.93 1658.759)"><stop offset="0" stop-color="#e8e7e5"/><stop offset="1" stop-color="#fff"/></linearGradient><path d="M171.827 280.258l3.234 40.199 144.625.461-3.235 53.598-47.59 13.398-45.748-11.551-2.772-33.268h-42.508l5.545 64.225 85.945 25.412 85.479-24.951 11.09-127.523H171.827z" fill="url(#c)"/><path d="M269.168 280.258h-97.49l3.233 40.199 94.257.301v-40.5zm0 107.528l-.462.129-45.742-11.551-2.772-33.268h-42.507l5.544 64.225 85.939 25.412v-44.947z" opacity=".05"/><linearGradient id="d" gradientUnits="userSpaceOnUse" x1="-883.032" y1="1442.031" x2="-672.341" y2="1442.031" gradientTransform="matrix(1 0 0 -1 1045.93 1658.759)"><stop offset="0" stop-color="#e8e7e5"/><stop offset="1" stop-color="#fff"/></linearGradient><path d="M162.898 196.167H373.59l-4.157 41.122H167.98l-5.082-41.122z" fill="url(#d)"/><path d="M269.168 196.167h-106.27l5.082 41.122h101.188v-41.122z" opacity=".05"/></svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
BIN
public/assets/img/3rd/favicon-docker.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
public/assets/img/3rd/favicon-express.png
Normal file
|
After Width: | Height: | Size: 302 B |
BIN
public/assets/img/3rd/favicon-git.ico
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
public/assets/img/3rd/favicon-googlecharts.png
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
BIN
public/assets/img/3rd/favicon-html.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
public/assets/img/3rd/favicon-instagram.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
public/assets/img/3rd/favicon-javascript.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
public/assets/img/3rd/favicon-jquery.ico
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
public/assets/img/3rd/favicon-laravel.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
public/assets/img/3rd/favicon-less.ico
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
public/assets/img/3rd/favicon-nodejs.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
9
public/assets/img/3rd/favicon-react.svg
Normal file
@@ -0,0 +1,9 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-11.5 -10.23174 23 20.46348">
|
||||
<title>React Logo</title>
|
||||
<circle cx="0" cy="0" r="2.05" fill="#61dafb"/>
|
||||
<g stroke="#61dafb" stroke-width="1" fill="none">
|
||||
<ellipse rx="11" ry="4.2"/>
|
||||
<ellipse rx="11" ry="4.2" transform="rotate(60)"/>
|
||||
<ellipse rx="11" ry="4.2" transform="rotate(120)"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 366 B |
BIN
public/assets/img/3rd/favicon-redis.png
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
BIN
public/assets/img/3rd/favicon-redux.ico
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
public/assets/img/3rd/favicon-socketio.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
public/assets/img/3rd/favicon-sql.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/assets/img/3rd/favicon-typescript.ico
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
public/assets/img/asset_bacaphoto.png
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
public/assets/img/asset_mihmanli.png
Normal file
|
After Width: | Height: | Size: 210 KiB |
BIN
public/assets/img/asset_weather_station.png
Normal file
|
After Width: | Height: | Size: 117 KiB |
60
tools/tool.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
import { walk } from "https://deno.land/std/fs/mod.ts";
|
||||
|
||||
/**
|
||||
*
|
||||
* @param path
|
||||
*/
|
||||
async function readFile( path : string ) : Promise<string> {
|
||||
console.log( `${ path }: Loading...` );
|
||||
const file = await Deno.open( path );
|
||||
const decoder = new TextDecoder( "utf-8" );
|
||||
const text = decoder.decode( await Deno.readAll( file ) );
|
||||
console.log( `${ path }: Loaded` );
|
||||
return text;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param path
|
||||
*/
|
||||
async function readFileRaw( path : string ) : Promise<Uint8Array> {
|
||||
console.log( `${ path }: Loading...` );
|
||||
const raw = await Deno.readFile(path);
|
||||
console.log( `${ path }: Loaded` );
|
||||
return raw;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param sourcePath
|
||||
* @param destinationPath
|
||||
*/
|
||||
async function copyFile( sourcePath : string, destinationPath : string ) {
|
||||
console.log( `${ sourcePath } -> ${ destinationPath }: Copying assets` );
|
||||
await Deno.copyFile( sourcePath, destinationPath );
|
||||
console.log( `${ sourcePath } -> ${ destinationPath }: Copied` );
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param directoryPath
|
||||
*/
|
||||
async function getFileList( directoryPath : string ) {
|
||||
const fileNames = [];
|
||||
for await ( const entry of walk( directoryPath ) ) {
|
||||
const fileName = entry.path.substr( directoryPath.length - 1 );
|
||||
|
||||
if ( entry.isFile ) {
|
||||
fileNames.push( {path: fileName, absolutePath: entry.path} );
|
||||
}
|
||||
}
|
||||
return fileNames;
|
||||
}
|
||||
|
||||
export {
|
||||
readFileRaw,
|
||||
readFile,
|
||||
copyFile,
|
||||
getFileList
|
||||
};
|
||||