@ -1,20 +1,16 @@
|
|||||||
---
|
---
|
||||||
title: Portfolio - Michal Vanko
|
title: Portfolio - Michal Vanko
|
||||||
work_history:
|
work_history:
|
||||||
|
- displayed: true
|
||||||
|
name: Freelancer
|
||||||
|
thumbnail: /images/uploads/m-logo.svg
|
||||||
|
description: Since 2022, I have worked as a self-employed freelancer. I provide
|
||||||
|
consultations and build safe and robust web applications for clients.
|
||||||
- description: >-
|
- description: >-
|
||||||
_sudolabs_ is a company focused on building products and software
|
*sudolabs* is a company focused on building products and software
|
||||||
solutions for start-ups & other clients.
|
solutions for start-ups & other clients.
|
||||||
|
|
||||||
The company has its own product lab focused on product research and product discovery and an engineering lab focused on the development of high-quality software solutions.
|
I've worked there as a **tech lead and an Engineering manager**.
|
||||||
|
|
||||||
At _sudolabs_, I've managed to proceed from senior software engineer to **tech lead and an Engineering manager**.
|
|
||||||
|
|
||||||
I am part of one of the most successful projects at _sudolabs_, _The Expert_. I am responsible for the architecture and quality of the proposed feature solutions and for the development processes used.
|
|
||||||
|
|
||||||
As an Engineering manager, I try to **represent people in my team** and help them **achieve the best of their potential**.
|
|
||||||
|
|
||||||
|
|
||||||
I've started to work for _sudolabs_ in October 2019.
|
|
||||||
name: sudolabs s.r.o.
|
name: sudolabs s.r.o.
|
||||||
address:
|
address:
|
||||||
name: Sudo Labs. s.r.o.
|
name: Sudo Labs. s.r.o.
|
||||||
@ -23,6 +19,7 @@ work_history:
|
|||||||
city: Košice
|
city: Košice
|
||||||
country: Slovakia
|
country: Slovakia
|
||||||
displayed: true
|
displayed: true
|
||||||
|
thumbnail: /images/uploads/6708e31603754bd2b4c6ed11_sudo_logo.svg
|
||||||
- description: >-
|
- description: >-
|
||||||
_**Croptech**_ is a start-up company located in Košice focused on smart
|
_**Croptech**_ is a start-up company located in Košice focused on smart
|
||||||
automation of hydroponic systems. Founded in 2014 they've won
|
automation of hydroponic systems. Founded in 2014 they've won
|
||||||
@ -39,14 +36,9 @@ work_history:
|
|||||||
zipcode: 040 18
|
zipcode: 040 18
|
||||||
city: Košice
|
city: Košice
|
||||||
country: Slovakia
|
country: Slovakia
|
||||||
- description: >-
|
- description: I worked in *localhost* as a **Senior front end developer**. I was
|
||||||
_localhost.company_ was a small company that had around 40 developers
|
focused on delivering a high-quality product and teaching and helping
|
||||||
while most of them were students. I worked in _localhost_ as a **Senior
|
other colleagues grow in expertise.
|
||||||
front end developer**. I was focused on delivering a high-quality product
|
|
||||||
and to teach and helping other colleagues grow in expertise.
|
|
||||||
|
|
||||||
|
|
||||||
I've started to work there in October 2018 and left after a year.
|
|
||||||
name: localhost.company s.r.o.
|
name: localhost.company s.r.o.
|
||||||
displayed: true
|
displayed: true
|
||||||
address:
|
address:
|
||||||
@ -55,15 +47,9 @@ work_history:
|
|||||||
zipcode: 040 01
|
zipcode: 040 01
|
||||||
city: Košice
|
city: Košice
|
||||||
country: Slovakia
|
country: Slovakia
|
||||||
- description: >
|
thumbnail: /images/uploads/LH-symbol-with-borders-WHITE-RED-BGb.png
|
||||||
I worked in _Ness_ as a Senior front-end developer. In _Ness_, I've been
|
- description: I worked in *Ness* as a Senior front-end developer. In *Ness*, I've
|
||||||
able to work for different clients on various projects.
|
been able to work for different clients on various projects for 6 years.
|
||||||
|
|
||||||
|
|
||||||
I joined Ness as a Junior front-end developer and I've been able to quickly proceed to Senior level with my engagement.
|
|
||||||
|
|
||||||
|
|
||||||
I started to work in March 2013 and left in October 2018.
|
|
||||||
name: Ness KE s.r.o.
|
name: Ness KE s.r.o.
|
||||||
displayed: true
|
displayed: true
|
||||||
address:
|
address:
|
||||||
@ -72,15 +58,9 @@ work_history:
|
|||||||
zipcode: 040 11
|
zipcode: 040 11
|
||||||
city: Košice
|
city: Košice
|
||||||
country: Slovakia
|
country: Slovakia
|
||||||
- description: >-
|
thumbnail: /images/uploads/nesskosicelogo.svg
|
||||||
I worked in _eSOLUTIONS_ as a **web developer** part-time while I was
|
- description: I worked for *eSOLUTIONS* as a part-time **web developer** while I
|
||||||
studying in high school and at University.
|
was in high school and at University.
|
||||||
|
|
||||||
|
|
||||||
I was building front-end and back-end services for websites and web applications. Mostly using _PHP_, _MySQL_, _JavaScript_, _HTML_, _CSS_.
|
|
||||||
|
|
||||||
|
|
||||||
I started to work in 2007 and stopped in 2012.
|
|
||||||
name: eSOLUTIONS s.r.o.
|
name: eSOLUTIONS s.r.o.
|
||||||
displayed: true
|
displayed: true
|
||||||
address:
|
address:
|
||||||
@ -89,285 +69,30 @@ work_history:
|
|||||||
zipcode: 040 01
|
zipcode: 040 01
|
||||||
city: Košice
|
city: Košice
|
||||||
country: Slovakia
|
country: Slovakia
|
||||||
projects:
|
thumbnail: /images/uploads/esolutions_logo.svg
|
||||||
- description: >-
|
|
||||||
_The Expert_ is a digital platform that connects clients to interior
|
|
||||||
designers around the world. For experts, it allows **managing** their
|
|
||||||
**portfolio and profile** and **schedule** in which they are open for
|
|
||||||
**consultations**. Clients are able to view their profiles and book
|
|
||||||
consultations.
|
|
||||||
|
|
||||||
The project is **expanding with an e-commerce platform** that should enable these experts to recommend and sell high-value goods.
|
|
||||||
|
|
||||||
|
|
||||||
We have built this platform from scratch as the only technical team. We also managed to design the product itself in-house.
|
|
||||||
|
|
||||||
I am part of the engineering team. I work as an **Engineering manager**. I am also **responsible for the technical architecture** and **development processes** that are being used to deliver new features.
|
|
||||||
|
|
||||||
|
|
||||||
_The Expert_ has been **featured in** numerous **worldwide media** such as [_The New York Times_](https://www.nytimes.com/2021/10/19/business/home-design-zoom.html?smid=url-share), [_Wall Street Journal_](https://www.wsj.com/articles/how-you-can-afford-to-hire-your-dream-interior-designer-11619627877), [_Forbes_](https://www.forbes.com/sites/emmareynolds/2021/02/08/introducing-the-expert-a-new-digital-platform-for-interior-design-founded-by-designer-jake-arnold/?sh=33b274934471), [_TechCrunch_](https://techcrunch.com/2021/04/19/gwyneth-paltrow-invests-in-the-expert-a-video-marketplace-for-high-end-interior-designers/?guccounter=2), and many more.
|
|
||||||
displayed: true
|
|
||||||
name: The Expert
|
|
||||||
image:
|
|
||||||
source: /images/uploads/the-expert-logo.svg
|
|
||||||
image_description: The Expert logo
|
|
||||||
- description: >-
|
|
||||||
*Panoramic* is a company focused on building a web application for data
|
|
||||||
scientists to be able to create and share models and graphs in between
|
|
||||||
each other.
|
|
||||||
|
|
||||||
I've been working as a **team lead** of a small team that was focused on building a **rich-text collaboration** feature into the web application.
|
|
||||||
|
|
||||||
The application was built on top of modern web technologies such as **React, node.js with GraphQL, and TypeScript**. We have successfully built this feature by integrating *[Mattermost](https://mattermost.com/)* into the existing back-end. After that, we have been helping another team by enhancing existing features for importing data sources.
|
|
||||||
displayed: true
|
|
||||||
name: Panoramic
|
|
||||||
- description: >-
|
|
||||||
_Manualogic_ is a **single-page application** for product manual creators.
|
|
||||||
It contains **custom web editor** and management system of **translatable
|
|
||||||
pages, books** and **products.** Its main goal is to enable customers to
|
|
||||||
get manuals of their products in digital form.
|
|
||||||
|
|
||||||
|
|
||||||
It's built on top of modern web technologies such as **Angular**, **RxJS**, and the content is synchronized through **Websockets**. The back-end part is built on top of **Spring framework**.
|
|
||||||
|
|
||||||
|
|
||||||
The team consisted of 3-4 front-end developers, 2-3 back-end developers, and 2 testers.
|
|
||||||
displayed: true
|
|
||||||
name: Manualogic
|
|
||||||
- description: >-
|
|
||||||
_**responzIO**_ is smart, easy to use monitoring and automation system.
|
|
||||||
The ultimate tool for various applications such as hydroponics, aquariums
|
|
||||||
and gardens.
|
|
||||||
|
|
||||||
|
|
||||||
I worked on _responzIO_ as architect and full-stack developer. I've designed complete software solution for an already created platform and a series of sensors, sockets and other hardware. Designed solution consist of varios parts: Deployment, Microservices, Stateful core back-end application, progressive web application, auto-update over web...
|
|
||||||
|
|
||||||
|
|
||||||
This project is built with modern web technologies including: **CycleJS**, **Reactive Streams**, **D3**, **Jest**, **Webpack**.
|
|
||||||
displayed: true
|
|
||||||
image:
|
|
||||||
image_description: ' responzIO main controller'
|
|
||||||
source: /images/uploads/responzio.png
|
|
||||||
name: responzIO
|
|
||||||
- description: >-
|
|
||||||
_Signal Hub_ is an end-to-end **Big Data analytics platform** for large
|
|
||||||
enterprises. It accelerates the process of extracting insights and
|
|
||||||
intelligence from large volumes of data, including data of different types
|
|
||||||
and in different formats.
|
|
||||||
|
|
||||||
|
|
||||||
I worked on _Signal Hub_ as a front-end developer. Working on the part of the platform called _Workbench_. _Workbench_ is an **IDE for data analyst**. It allows to create and tweak various models and transformations which are then deployed to other parts of the platform. Users are able to create workflows and see the results of his work with pleasant visuals.
|
|
||||||
|
|
||||||
|
|
||||||
This project is built with modern web technologies including: **AngularJS**, **React**, **D3**, **Highcharts**, **Jest**, **Webpack**.
|
|
||||||
|
|
||||||
|
|
||||||
I was part of a large distributed team of ~20 developers & ~6 testers which were working on the whole platform.
|
|
||||||
displayed: true
|
|
||||||
name: Signal Hub Manager
|
|
||||||
- description: >-
|
|
||||||
_SHIP_ is a web application for **editors** who actively **track trades
|
|
||||||
offers and bids** on the commodity market.
|
|
||||||
|
|
||||||
|
|
||||||
It was built for a price reporting company _S&P Global Platts_. This company is a provider of energy and commodities information and a source of benchmark price assessments in the _physical energy markets_.
|
|
||||||
|
|
||||||
|
|
||||||
_SHIP_ was suited for a very easy and quick workflow for editors.
|
|
||||||
|
|
||||||
|
|
||||||
Team consisted of 3 front-end and 3 back-end developers. I was a **leader of the front-end** part of the project.
|
|
||||||
|
|
||||||
|
|
||||||
The application was built with **AngularJS and Redux**. The challenging part was working with **Cassandra database**.
|
|
||||||
displayed: true
|
|
||||||
name: SHIP (Structured heard input process)
|
|
||||||
- description: >-
|
|
||||||
[www.caplin.com/business/fx-sales.com](http://www.caplin.com/business/fx-sales)
|
|
||||||
|
|
||||||
|
|
||||||
The main function of _Caplin FX Sales_ is to allow sales users to <string>trade on behalf of their clients</string>. This needs to be an efficient workflow providing all the relevant information to the sales user.
|
|
||||||
|
|
||||||
|
|
||||||
Main technologies used: **Websockets**, Custom Front-end JavaScript MVVM Framework (based on Knockout, BRJS)
|
|
||||||
|
|
||||||
|
|
||||||
We worked on this project in a team of 6 developers and 3 testers
|
|
||||||
displayed: true
|
|
||||||
name: FX Salestrader
|
|
||||||
- description: >-
|
|
||||||
_Skosy_ is a web application which purpose is to **automate writing of
|
|
||||||
integration tests** for web sites.
|
|
||||||
|
|
||||||
|
|
||||||
I worked on a _proof of concept_ front-end portion of this application, which was able to create a list of steps for testing.
|
|
||||||
|
|
||||||
|
|
||||||
I worked on this project in a team of 2 front-end developers.
|
|
||||||
displayed: false
|
|
||||||
name: Skosy
|
|
||||||
- description: >-
|
|
||||||
[www.livesport.tv](http://www.livesport.tv)
|
|
||||||
|
|
||||||
|
|
||||||
_Livesport.tv_ is a network of premium online sports channels, featuring all the top sports competitions from around the world.
|
|
||||||
|
|
||||||
|
|
||||||
I worked on this project as a front-end developer. I maintained all livesport channels and I worked on new features and enhancements of websites.
|
|
||||||
|
|
||||||
|
|
||||||
Project was built on top of **Freemarker** templating language.
|
|
||||||
|
|
||||||
|
|
||||||
The team consisted of 2 developers and 1 tester.
|
|
||||||
displayed: true
|
|
||||||
name: Livesport.tv
|
|
||||||
- description: >-
|
|
||||||
_beIN Sports_ is a global network of sports channels jointly owned and
|
|
||||||
operated by _Qatari Sports Investments_, an affiliate of _Al Jazeera Media
|
|
||||||
Networks_
|
|
||||||
|
|
||||||
|
|
||||||
I worked on this project as a front-end developer. I maintained official websites of beIN SPORTS France and USA ([www.beinsports.fr](http://www.beinsports.fr), [www.beinsports.tv](http://www.beinsports.tv)).
|
|
||||||
|
|
||||||
|
|
||||||
Project was built on top of **Freemarker** templating language.
|
|
||||||
|
|
||||||
|
|
||||||
I worked on this project in a team consisting of 7 members.
|
|
||||||
displayed: true
|
|
||||||
name: beIN SPORTS France & beIN SPORTS USA
|
|
||||||
- description: >-
|
|
||||||
I worked on this project as a front-end developer. I maintained official
|
|
||||||
websites of all Norweigian Football teams - NTF Network
|
|
||||||
([www.toppfotball.no](http://www.toppfotball.no))
|
|
||||||
|
|
||||||
|
|
||||||
Project was built on top of **Freemarker** templating language.
|
|
||||||
|
|
||||||
|
|
||||||
I worked on this project in a team consisting of 4 members.
|
|
||||||
displayed: false
|
|
||||||
name: Norsk Toppfotball
|
|
||||||
- description: >-
|
|
||||||
[www.kosicemarathon.com](http://www.kosicemarathon.com/)
|
|
||||||
|
|
||||||
|
|
||||||
_Košice Peace Marathon_ is the oldest marathon in Europe and the third-oldest in the world.
|
|
||||||
|
|
||||||
|
|
||||||
I worked on this project as a front-end and an back-end developer. I've built a **custom CMS** for website and for registration of participants. Also created an application for actual event for signing participants.
|
|
||||||
|
|
||||||
The application was able to create a start list of all participants and provide various statistics about them.
|
|
||||||
|
|
||||||
|
|
||||||
I've built this project alone and then one maintainer joined me.
|
|
||||||
displayed: true
|
|
||||||
name: Košice Peace Marathon
|
|
||||||
- description: >-
|
|
||||||
[www.ckvive.sk](http://www.ckvive.sk)
|
|
||||||
|
|
||||||
|
|
||||||
_CK Vive_ is a travel agency.
|
|
||||||
|
|
||||||
|
|
||||||
I worked on this project as a front-end and an back-end developer. I've created new **custom CMS** for adding destinations and apartments into offering.
|
|
||||||
|
|
||||||
|
|
||||||
I've built this project on top of **PHP**, **MySQL** and **JavaScript**.
|
|
||||||
|
|
||||||
|
|
||||||
I worked on this project alone.
|
|
||||||
displayed: false
|
|
||||||
name: CK Vive
|
|
||||||
presentations:
|
|
||||||
- displayed: true
|
|
||||||
link: https://michalvankodev.github.io/unstoppable-growth-of-frontend-frameworks/
|
|
||||||
name: Unstoppable growth of front-end frameworks
|
|
||||||
description: >
|
|
||||||
A simple summary of the web front-end evolution, which will try to
|
|
||||||
describe how and why tools improve & why there is still something to
|
|
||||||
explore.
|
|
||||||
- displayed: true
|
|
||||||
name: WebAssembly
|
|
||||||
link: https://michalvankodev.github.io/presentation-webassembly/#/
|
|
||||||
description: A presentation about what WebAssembly is about and how it might
|
|
||||||
affect the future of the world.
|
|
||||||
- displayed: true
|
|
||||||
name: Spreading the web
|
|
||||||
description:
|
|
||||||
A presentation about the rising number of use cases for utilizing
|
|
||||||
web technologies outside of the web platform such as native mobile
|
|
||||||
applications and robotics.
|
|
||||||
link: https://michalvankodev.github.io/spreading-the-web/#/
|
|
||||||
- displayed: true
|
|
||||||
name: Docker
|
|
||||||
link: http://michalvankodev.github.io/dockerpresentation/#/
|
|
||||||
description:
|
|
||||||
An introduction to Docker containerization technology and how it
|
|
||||||
differs from virtualization.
|
|
||||||
education:
|
education:
|
||||||
- description: |-
|
- description: |-
|
||||||
Faculty of Electrical Engineering and Informatics - Intelligent Systems
|
Faculty of Electrical Engineering and Informatics - Intelligent Systems
|
||||||
|
|
||||||
_Artificial Intelligence, Neural Networks, Fuzzy Systems_
|
_Artificial Intelligence, Neural Networks, Fuzzy Systems_
|
||||||
|
|
||||||
Dates: 1\. 9\. 2010 - 20\. 6\. 2013
|
Year of 2013
|
||||||
|
|
||||||
Title of qualification awarded: Bachelor (Bc.)
|
Title of qualification: Bachelor (Bc.)
|
||||||
displayed: true
|
displayed: true
|
||||||
name: Technická univerzita Košice
|
name: Technická univerzita Košice
|
||||||
- description: >-
|
thumbnail: /images/uploads/tuke_znak_b_cmyk.png
|
||||||
|
- description: |-
|
||||||
_SPŠ Elektrotechnická, Komenského 22, Košice_
|
_SPŠ Elektrotechnická, Komenského 22, Košice_
|
||||||
|
|
||||||
|
|
||||||
Electrotechnics, Telecommunication
|
Electrotechnics, Telecommunication
|
||||||
|
|
||||||
|
Year of 2010
|
||||||
Dates: 1\. 9\. 2005 - 1\. 7\. 2010
|
Full secondary school education with leaving examination
|
||||||
|
|
||||||
|
|
||||||
Title of qualification awarded: Full secondary school education with leaving examination
|
|
||||||
displayed: true
|
displayed: true
|
||||||
name: Secondary school of Electrical Engineering in Košice
|
name: Secondary school of Electrical Engineering in Košice
|
||||||
|
thumbnail: /images/uploads/logo_spse_far.png
|
||||||
---
|
---
|
||||||
|
As a passionate software developer with over half my life spent coding professionally, I've developed a strong affinity for building **highly scalable** and **proficient systems**. With extensive experience in **web application development**, I've honed my skills across various technological stacks, leveraging expertise to drive results. When not crafting complex solutions, you can find me indulging in **game development** - a creative outlet that allows me to bring fun and innovation to the table. As a **tech lead and mentor**, I thrive in environments where **quality software, tests, and collaboration** come together to **create innovative solutions**.
|
||||||
|
|
||||||
## Personal Information
|
In addition to my technical expertise, I bring a wealth of **experience as an Engineering manager**, where I've honed my **leadership skills** and developed a talent for **mentoring teams**. When not coding or leading teams, you can find me exploring the world through **streaming, building an online community** around programming, **making music**, and spending quality time with my family as a **proud father**. I'm also an avid board game enthusiast! As a thought leader, I aim to leverage my diverse experience and skills to **provide exceptional service** to my customers and make a positive impact on the tech industry.
|
||||||
|
|
||||||
I was born in Košice, Slovakia and I still live here. I like to drink tea and cook my own recipes.
|
|
||||||
|
|
||||||
### Hobbies
|
|
||||||
|
|
||||||
I enjoy playing basketball with my friends. I also like to play other team sports like football and hockey. I also play squash and table tennis. Once I've won a competition in squash at my university. During summer, I love to go water skiing or swimming in a nearby lake.
|
|
||||||
|
|
||||||
I am very passionate about music. I've also tried to use some digital workstations to compose my own music.
|
|
||||||
|
|
||||||
I enjoy playing board games with my friends and family.
|
|
||||||
|
|
||||||
### Interests
|
|
||||||
|
|
||||||
I like to explore new technologies and _Open-source_ software.
|
|
||||||
I am interested in modern software architecture and _reactive programming_.
|
|
||||||
I've attended several **tech conferences and hackathons**, where I can meet interesting people and explore fascinating ideas.
|
|
||||||
|
|
||||||
I've given presentations on various topics related to _web development_. You can [take a look at some of them here](#presentations).
|
|
||||||
|
|
||||||
I enjoy **teaching and explaining** how technologies and techniques work to my colleagues or students for their better understanding.
|
|
||||||
I take advantage of **test-driven development**.
|
|
||||||
|
|
||||||
## Skills
|
|
||||||
|
|
||||||
Slovak is my mother tongue and I've learned English as my second language. I speak English on an advanced level.
|
|
||||||
|
|
||||||
I'm an experienced _Linux Desktop_ user. I prefer to use open-source libraries and technologies while I develop solutions.
|
|
||||||
|
|
||||||
I'm in good command of Office Tools and I have experience with image manipulation programs like _GIMP_ and _Inkscape_.
|
|
||||||
I can also compose music and sounds on _digital audio workstation_.
|
|
||||||
|
|
||||||
I'm passionate about _software architecture_. My goal is not only to be able to design a suitable solution for any kind of product but also to be able to architect the processes behind building a team. From small _presentation sites_, _IOT devices_, to large _enterprise applications running on cloud_.
|
|
||||||
|
|
||||||
I practice **public speaking** and I am not afraid to share my knowledge and passion about technology.
|
|
||||||
|
|
||||||
I'm an advanced user of source code management tools _git_ and _svn_.
|
|
||||||
|
|
||||||
I've got a driving license for category B 🚗.
|
|
||||||
|
2
justfile
@ -6,7 +6,7 @@ tailwind:
|
|||||||
|
|
||||||
# svg sprite creation
|
# svg sprite creation
|
||||||
svgstore:
|
svgstore:
|
||||||
npx svgstore -o templates/icons/sprite.svg src/svg/**.svg
|
npx svgstore -o templates/icons/sprite.svg static/svg/input/*.svg
|
||||||
|
|
||||||
server_dev:
|
server_dev:
|
||||||
cargo watch -x run
|
cargo watch -x run
|
||||||
|
@ -21,7 +21,7 @@ pub struct ContactPageTemplate {
|
|||||||
pub async fn render_contact() -> Result<ContactPageTemplate, StatusCode> {
|
pub async fn render_contact() -> Result<ContactPageTemplate, StatusCode> {
|
||||||
let links = vec![
|
let links = vec![
|
||||||
ContactLink {
|
ContactLink {
|
||||||
href: "mailto: michalvankosk@gmail.com".to_string(),
|
href: "mailto:michalvankosk@gmail.com".to_string(),
|
||||||
label: "michalvankosk@gmail.com".to_string(),
|
label: "michalvankosk@gmail.com".to_string(),
|
||||||
title: "E-mail address".to_string(),
|
title: "E-mail address".to_string(),
|
||||||
svg: "mail".to_string(),
|
svg: "mail".to_string(),
|
||||||
@ -51,7 +51,7 @@ pub async fn render_contact() -> Result<ContactPageTemplate, StatusCode> {
|
|||||||
svg: "instagram".to_string(),
|
svg: "instagram".to_string(),
|
||||||
},
|
},
|
||||||
ContactLink {
|
ContactLink {
|
||||||
href: "https://instagram.com/michalvankodev".to_string(),
|
href: "https://github.com/michalvankodev".to_string(),
|
||||||
label: "GitHub".to_string(),
|
label: "GitHub".to_string(),
|
||||||
title: "Github profile".to_string(),
|
title: "Github profile".to_string(),
|
||||||
svg: "github".to_string(),
|
svg: "github".to_string(),
|
||||||
|
@ -12,11 +12,29 @@ use crate::{
|
|||||||
projects::project_model::ProjectMetadata,
|
projects::project_model::ProjectMetadata,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use super::contact::ContactLink;
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
pub struct Workplace {
|
||||||
|
pub name: String,
|
||||||
|
pub thumbnail: Option<String>,
|
||||||
|
pub description: String,
|
||||||
|
pub displayed: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
pub struct Education {
|
||||||
|
pub name: String,
|
||||||
|
pub thumbnail: Option<String>,
|
||||||
|
pub description: String,
|
||||||
|
pub displayed: bool,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct PortfolioPageModel {
|
pub struct PortfolioPageModel {
|
||||||
pub title: String,
|
// pub title: String,
|
||||||
// TODO work_history
|
pub work_history: Vec<Workplace>,
|
||||||
// TODO education
|
pub education: Vec<Education>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Template)]
|
#[derive(Template)]
|
||||||
@ -26,6 +44,10 @@ pub struct PortfolioTemplate {
|
|||||||
pub body: String,
|
pub body: String,
|
||||||
pub project_list: Vec<ParseResult<ProjectMetadata>>,
|
pub project_list: Vec<ParseResult<ProjectMetadata>>,
|
||||||
pub header_props: HeaderProps,
|
pub header_props: HeaderProps,
|
||||||
|
pub workplace_list: Vec<Workplace>,
|
||||||
|
pub education_list: Vec<Education>,
|
||||||
|
pub contact_links: Vec<ContactLink>,
|
||||||
|
pub technology_list: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn render_portfolio() -> Result<PortfolioTemplate, StatusCode> {
|
pub async fn render_portfolio() -> Result<PortfolioTemplate, StatusCode> {
|
||||||
@ -37,10 +59,81 @@ pub async fn render_portfolio() -> Result<PortfolioTemplate, StatusCode> {
|
|||||||
project_list.retain(|project| project.metadata.displayed);
|
project_list.retain(|project| project.metadata.displayed);
|
||||||
project_list.reverse();
|
project_list.reverse();
|
||||||
|
|
||||||
|
let workplace_list = portfolio
|
||||||
|
.metadata
|
||||||
|
.work_history
|
||||||
|
.into_iter()
|
||||||
|
.filter(|workplace| workplace.displayed)
|
||||||
|
.collect::<Vec<Workplace>>();
|
||||||
|
|
||||||
|
let education_list = portfolio
|
||||||
|
.metadata
|
||||||
|
.education
|
||||||
|
.into_iter()
|
||||||
|
.filter(|education| education.displayed)
|
||||||
|
.collect::<Vec<Education>>();
|
||||||
|
|
||||||
|
let contact_links = vec![
|
||||||
|
ContactLink {
|
||||||
|
href: "mailto:michalvankosk@gmail.com".to_string(),
|
||||||
|
label: "michalvankosk@gmail.com".to_string(),
|
||||||
|
title: "E-mail address".to_string(),
|
||||||
|
svg: "mail".to_string(),
|
||||||
|
},
|
||||||
|
ContactLink {
|
||||||
|
href: "tel:+421-905-372-947".to_string(),
|
||||||
|
label: "+421 905 372 947".to_string(),
|
||||||
|
title: "Phone".to_string(),
|
||||||
|
svg: "phone".to_string(),
|
||||||
|
},
|
||||||
|
ContactLink {
|
||||||
|
href: "https://github.com/michalvankodev".to_string(),
|
||||||
|
label: "GitHub".to_string(),
|
||||||
|
title: "Github profile".to_string(),
|
||||||
|
svg: "github".to_string(),
|
||||||
|
},
|
||||||
|
ContactLink {
|
||||||
|
href: "https://www.linkedin.com/in/michal-vanko-dev/".to_string(),
|
||||||
|
label: "LinkedIn".to_string(),
|
||||||
|
title: "LinkedIn profile".to_string(),
|
||||||
|
svg: "linkedin".to_string(),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
let technology_list = vec![
|
||||||
|
"Rust",
|
||||||
|
"HTMX",
|
||||||
|
"React",
|
||||||
|
"Svelte",
|
||||||
|
"Angular",
|
||||||
|
"PostgreSQL",
|
||||||
|
"Redis",
|
||||||
|
"GraphQL",
|
||||||
|
"TypeScript",
|
||||||
|
"Node.js",
|
||||||
|
"Axum",
|
||||||
|
"Bevy",
|
||||||
|
"Tailwind",
|
||||||
|
"OCaml",
|
||||||
|
"Python",
|
||||||
|
"git",
|
||||||
|
"Linux",
|
||||||
|
"Docker",
|
||||||
|
"Devops",
|
||||||
|
"Selfhosting",
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.map(|str| str.to_owned())
|
||||||
|
.collect();
|
||||||
|
|
||||||
Ok(PortfolioTemplate {
|
Ok(PortfolioTemplate {
|
||||||
title: "Portfolio".to_owned(),
|
title: "Portfolio".to_owned(),
|
||||||
body: portfolio.body,
|
body: portfolio.body,
|
||||||
header_props: HeaderProps::default(),
|
header_props: HeaderProps::default(),
|
||||||
project_list,
|
project_list,
|
||||||
|
workplace_list,
|
||||||
|
education_list,
|
||||||
|
contact_links,
|
||||||
|
technology_list,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
20
static/images/uploads/6708e31603754bd2b4c6ed11_sudo_logo.svg
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_6915_3092)">
|
||||||
|
<path d="M143.302 165.108C149.717 154.118 152.748 142.082 152.748 130.221C131.702 142.257 104.988 143.129 82.448 130.221L47.2539 190.663C80.8663 209.894 123.881 198.469 143.302 165.108Z" fill="url(#paint0_linear_6915_3092)"/>
|
||||||
|
<path d="M56.7005 34.8919C50.2856 45.9249 47.2539 57.9174 47.2539 69.779C68.3001 57.7429 95.0142 56.8708 117.554 69.779L152.704 9.33706C119.092 -9.89447 76.0771 1.53107 56.7005 34.8919Z" fill="url(#paint1_linear_6915_3092)"/>
|
||||||
|
<path d="M152.704 130.221C131.658 142.257 104.944 143.13 82.4041 130.221C59.864 117.313 47.2539 93.8951 47.2539 69.7793C68.3001 57.7433 95.0142 56.8711 117.554 69.7793C140.094 82.6876 152.704 106.149 152.704 130.221Z" fill="#EE0000"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_6915_3092" x1="48.3523" y1="191.011" x2="116.335" y2="69.7771" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#F40000" stop-opacity="0.1"/>
|
||||||
|
<stop offset="1" stop-color="#F40000"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint1_linear_6915_3092" x1="82.6238" y1="130.395" x2="151.917" y2="9.36607" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#F40000"/>
|
||||||
|
<stop offset="1" stop-color="#F40000" stop-opacity="0.1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clip0_6915_3092">
|
||||||
|
<rect width="105.495" height="200" fill="white" transform="translate(47.2539)"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
BIN
static/images/uploads/LH-symbol-with-borders-WHITE-RED-BGb.png
(Stored with Git LFS)
Normal file
BIN
static/images/uploads/TUKE_ZNAK_B_CMYK.png
(Stored with Git LFS)
Normal file
67
static/images/uploads/esolutions_logo.svg
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="u-svg-content" viewBox="0 0 184 187" x="0px" y="0px" style="width: 1em; height: 1em;"><path fill="#FEFFFE" opacity="1.000000" stroke="none" d="
|
||||||
|
M111.000000,188.000000
|
||||||
|
C74.000000,188.000000 37.500004,188.000000 1.000005,188.000000
|
||||||
|
C1.000003,125.666672 1.000003,63.333344 1.000002,1.000013
|
||||||
|
C62.333324,1.000009 123.666649,1.000009 184.999969,1.000004
|
||||||
|
C184.999985,63.333317 184.999985,125.666634 185.000000,187.999969
|
||||||
|
C160.500000,188.000000 136.000000,188.000000 111.000000,188.000000
|
||||||
|
M141.418015,133.928207
|
||||||
|
C127.767067,142.503525 114.455452,151.692993 100.367393,159.477219
|
||||||
|
C86.943886,166.894196 72.253189,170.657486 56.609383,168.880310
|
||||||
|
C55.957951,168.806305 55.270107,169.052765 53.888592,169.252869
|
||||||
|
C95.326988,189.169525 143.651657,174.202332 165.835312,135.157486
|
||||||
|
C187.973633,96.192459 174.065491,51.700832 151.058075,32.699059
|
||||||
|
C151.870972,47.383453 145.096802,58.609764 134.719620,67.665199
|
||||||
|
C127.865273,73.646515 120.554497,79.581230 112.480988,83.588264
|
||||||
|
C96.438011,91.550682 79.782196,98.298607 63.247910,105.234390
|
||||||
|
C59.770390,106.693146 57.497551,108.087372 57.806816,112.213203
|
||||||
|
C58.016811,115.014671 57.524277,117.875526 57.804279,120.663788
|
||||||
|
C58.737183,129.953735 63.131657,135.090820 72.435020,136.152100
|
||||||
|
C78.101418,136.798462 84.129677,136.459320 89.714272,135.257034
|
||||||
|
C113.780266,130.075912 135.140045,118.498703 156.131866,106.174423
|
||||||
|
C157.463760,105.392456 158.804474,104.625534 160.133087,103.856255
|
||||||
|
C160.133087,108.261963 160.524628,112.130524 159.988434,115.865921
|
||||||
|
C159.658905,118.161545 158.418015,120.841133 156.701431,122.323769
|
||||||
|
C152.050400,126.340919 146.927032,129.811172 141.418015,133.928207
|
||||||
|
M7.504056,83.100655
|
||||||
|
C5.341846,103.972412 9.647369,123.228951 22.148375,141.683990
|
||||||
|
C6.351274,81.329971 68.548477,15.291668 127.692780,16.490648
|
||||||
|
C84.716667,-7.122169 16.257736,18.354082 7.504056,83.100655
|
||||||
|
M99.857971,43.268894
|
||||||
|
C82.759735,53.964348 71.778099,69.661499 63.192806,87.355751
|
||||||
|
C80.470497,79.698120 97.136421,71.304016 110.466728,57.889004
|
||||||
|
C113.839012,54.495293 116.367683,49.897110 118.158737,45.403858
|
||||||
|
C119.866737,41.118980 117.462463,38.490543 112.833977,39.242863
|
||||||
|
C108.643143,39.924049 104.625725,41.672096 99.857971,43.268894
|
||||||
|
z"></path><path fill="#63B224" opacity="1.000000" stroke="none" d="
|
||||||
|
M141.704498,133.713257
|
||||||
|
C146.927032,129.811172 152.050400,126.340919 156.701431,122.323769
|
||||||
|
C158.418015,120.841133 159.658905,118.161545 159.988434,115.865921
|
||||||
|
C160.524628,112.130524 160.133087,108.261963 160.133087,103.856255
|
||||||
|
C158.804474,104.625534 157.463760,105.392456 156.131866,106.174423
|
||||||
|
C135.140045,118.498703 113.780266,130.075912 89.714272,135.257034
|
||||||
|
C84.129677,136.459320 78.101418,136.798462 72.435020,136.152100
|
||||||
|
C63.131657,135.090820 58.737183,129.953735 57.804279,120.663788
|
||||||
|
C57.524277,117.875526 58.016811,115.014671 57.806816,112.213203
|
||||||
|
C57.497551,108.087372 59.770390,106.693146 63.247910,105.234390
|
||||||
|
C79.782196,98.298607 96.438011,91.550682 112.480988,83.588264
|
||||||
|
C120.554497,79.581230 127.865273,73.646515 134.719620,67.665199
|
||||||
|
C145.096802,58.609764 151.870972,47.383453 151.058075,32.699059
|
||||||
|
C174.065491,51.700832 187.973633,96.192459 165.835312,135.157486
|
||||||
|
C143.651657,174.202332 95.326988,189.169525 53.888592,169.252869
|
||||||
|
C55.270107,169.052765 55.957951,168.806305 56.609383,168.880310
|
||||||
|
C72.253189,170.657486 86.943886,166.894196 100.367393,159.477219
|
||||||
|
C114.455452,151.692993 127.767067,142.503525 141.704498,133.713257
|
||||||
|
z"></path><path fill="#64B225" opacity="1.000000" stroke="none" d="
|
||||||
|
M7.593564,82.658463
|
||||||
|
C16.257736,18.354082 84.716667,-7.122169 127.692780,16.490648
|
||||||
|
C68.548477,15.291668 6.351274,81.329971 22.148375,141.683990
|
||||||
|
C9.647369,123.228951 5.341846,103.972412 7.593564,82.658463
|
||||||
|
z"></path><path fill="#64B226" opacity="1.000000" stroke="none" d="
|
||||||
|
M100.194901,43.109314
|
||||||
|
C104.625725,41.672096 108.643143,39.924049 112.833977,39.242863
|
||||||
|
C117.462463,38.490543 119.866737,41.118980 118.158737,45.403858
|
||||||
|
C116.367683,49.897110 113.839012,54.495293 110.466728,57.889004
|
||||||
|
C97.136421,71.304016 80.470497,79.698120 63.192806,87.355751
|
||||||
|
C71.778099,69.661499 82.759735,53.964348 100.194901,43.109314
|
||||||
|
z"></path></svg>
|
After Width: | Height: | Size: 4.1 KiB |
BIN
static/images/uploads/logo_spse_far.png
(Stored with Git LFS)
Normal file
4
static/images/uploads/m-logo.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M477 256C477 312.348 476.994 354.269 473.509 385.636C470.02 417.033 463.118 436.975 450.047 450.047C436.975 463.118 417.033 470.02 385.636 473.509C354.269 476.994 312.348 477 256 477C199.652 477 157.731 476.994 126.364 473.509C94.9671 470.02 75.0246 463.118 61.9534 450.047C48.8822 436.975 41.9797 417.033 38.4912 385.636C35.0059 354.269 35 312.348 35 256C35 199.652 35.0059 157.731 38.4912 126.364C41.9797 94.9671 48.8822 75.0246 61.9534 61.9534C75.0246 48.8822 94.9671 41.9797 126.364 38.4912C157.731 35.0059 199.652 35 256 35C312.348 35 354.269 35.0059 385.636 38.4912C417.033 41.9797 436.975 48.8822 450.047 61.9534C463.118 75.0246 470.02 94.9671 473.509 126.364C476.994 157.731 477 199.652 477 256Z" fill="#D8F6FF" stroke="#32A8EB" stroke-width="8" stroke-linejoin="round"/>
|
||||||
|
<path d="M347.694 326.566H360V235.186C360 203.566 340.791 185 310.176 185C290.066 185 270.257 193.413 256.15 208.208C248.046 193.123 232.739 185 212.629 185C194.62 185 177.212 191.382 163.405 202.696L161.004 187.031H152V326.566H164.306V212.269C176.912 201.535 193.12 195.153 209.628 195.153C234.84 195.153 249.847 210.528 249.847 236.927V326.566H262.153V235.186C262.153 227.934 261.253 221.262 259.152 215.46C272.058 202.696 289.466 195.153 307.175 195.153C332.687 195.153 347.694 210.528 347.694 236.927V326.566Z" fill="#32A8EB"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
1
static/images/uploads/nesskosicelogo.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><defs><style>.cls-1{fill:#00195f;}</style></defs><path class="cls-1" d="M26.83,27.56c10-8.09,24.42-10.84,32.42-11A31.33,31.33,0,0,0,1.77,40.23L17,22.29h1.12l1.69,12a53.81,53.81,0,0,1,7-6.76ZM58.56,40.09A2,2,0,0,1,58,41.56a2,2,0,0,1-1.48.62h-1a1.84,1.84,0,0,1-2.09-2.09h1.05a1.21,1.21,0,0,0,0,.18.74.74,0,0,0,.33.65,1.26,1.26,0,0,0,.73.22,1.07,1.07,0,0,0,.81-.27,1.18,1.18,0,0,0,.24-.79,1,1,0,0,0-.31-.74L54,36.85a2.18,2.18,0,0,1-.61-1.48v-.52A2,2,0,0,1,54,33.37a2,2,0,0,1,1.48-.62h1c1.31,0,2,.7,2.09,2.1h-1c-.09-.71-.42-1.06-1-1.06a1.18,1.18,0,0,0-.84.27,1,1,0,0,0-.27.79,1.12,1.12,0,0,0,.3.74L58,38.08a2.24,2.24,0,0,1,.61,1.48v.53h0Zm-9.27,0a2.1,2.1,0,0,1-2.09,2.09H46.15a1.84,1.84,0,0,1-2.09-2.09h1a1.21,1.21,0,0,0,0,.18.74.74,0,0,0,.33.65,1.26,1.26,0,0,0,.73.22,1,1,0,0,0,.8-.27,1.18,1.18,0,0,0,.24-.79,1,1,0,0,0-.31-.74l-2.22-2.49a2.18,2.18,0,0,1-.61-1.48v-.52a2.1,2.1,0,0,1,2.09-2.1H47.2c1.31,0,2,.7,2.09,2.1h-1c-.09-.71-.42-1.06-1-1.06a1.18,1.18,0,0,0-.84.27,1,1,0,0,0-.27.79,1.08,1.08,0,0,0,.31.74l2.22,2.49a2.2,2.2,0,0,1,.61,1.48ZM40.08,42H34.94V32.78h5.14v1H37V36.9h2.06v1H37V41h3.08v1ZM63.32,32a31.23,31.23,0,0,0-4-15.26c-7.5,1.71-15.18,4.46-21.14,8.62-6.72,4.69-11.39,10.56-12.86,15.53l-.11.33L25,42H14.59L13,29.62,2.35,42.11A31.32,31.32,0,0,0,63.32,32Z"/></svg>
|
After Width: | Height: | Size: 1.3 KiB |
BIN
static/images/uploads/tuke_znak_b_cmyk.png
(Stored with Git LFS)
Normal file
1
static/svg/input/phone.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z"/></svg>
|
After Width: | Height: | Size: 508 B |
@ -107,7 +107,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com
|
! tailwindcss v3.4.14 | MIT License | https://tailwindcss.com
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -550,7 +550,7 @@ video {
|
|||||||
|
|
||||||
/* Make elements with the HTML hidden attribute stay hidden by default */
|
/* Make elements with the HTML hidden attribute stay hidden by default */
|
||||||
|
|
||||||
[hidden] {
|
[hidden]:where(:not([hidden="until-found"])) {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -624,6 +624,10 @@ video {
|
|||||||
grid-column: span 2 / span 2;
|
grid-column: span 2 / span 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.col-auto {
|
||||||
|
grid-column: auto;
|
||||||
|
}
|
||||||
|
|
||||||
.row-span-3 {
|
.row-span-3 {
|
||||||
grid-row: span 3 / span 3;
|
grid-row: span 3 / span 3;
|
||||||
}
|
}
|
||||||
@ -652,6 +656,10 @@ video {
|
|||||||
margin: 1.5rem;
|
margin: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.m-3 {
|
||||||
|
margin: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
.mx-0\.5 {
|
.mx-0\.5 {
|
||||||
margin-left: 0.125rem;
|
margin-left: 0.125rem;
|
||||||
margin-right: 0.125rem;
|
margin-right: 0.125rem;
|
||||||
@ -707,6 +715,11 @@ video {
|
|||||||
margin-bottom: 1.25rem;
|
margin-bottom: 1.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.my-1 {
|
||||||
|
margin-top: 0.25rem;
|
||||||
|
margin-bottom: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
.mb-1 {
|
.mb-1 {
|
||||||
margin-bottom: 0.25rem;
|
margin-bottom: 0.25rem;
|
||||||
}
|
}
|
||||||
@ -739,6 +752,10 @@ video {
|
|||||||
margin-top: 0.75rem;
|
margin-top: 0.75rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mt-4 {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
.block {
|
.block {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
@ -823,10 +840,38 @@ video {
|
|||||||
max-width: 64rem;
|
max-width: 64rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.max-w-20 {
|
||||||
|
max-width: 5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.max-w-60 {
|
||||||
|
max-width: 15rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.max-w-\[16rem\] {
|
||||||
|
max-width: 16rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.max-w-\[20rem\] {
|
||||||
|
max-width: 20rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.max-w-\[24rem\] {
|
||||||
|
max-width: 24rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.max-w-\[36rem\] {
|
||||||
|
max-width: 36rem;
|
||||||
|
}
|
||||||
|
|
||||||
.flex-1 {
|
.flex-1 {
|
||||||
flex: 1 1 0%;
|
flex: 1 1 0%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.shrink-0 {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.flex-grow {
|
.flex-grow {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
@ -853,6 +898,14 @@ video {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.flex-wrap {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-nowrap {
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
.place-content-center {
|
.place-content-center {
|
||||||
place-content: center;
|
place-content: center;
|
||||||
}
|
}
|
||||||
@ -889,6 +942,10 @@ video {
|
|||||||
gap: 1.5rem;
|
gap: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.gap-4 {
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
.self-start {
|
.self-start {
|
||||||
align-self: flex-start;
|
align-self: flex-start;
|
||||||
}
|
}
|
||||||
@ -936,6 +993,11 @@ video {
|
|||||||
border-color: rgb(203 213 225 / var(--tw-border-opacity));
|
border-color: rgb(203 213 225 / var(--tw-border-opacity));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.border-blue-300 {
|
||||||
|
--tw-border-opacity: 1;
|
||||||
|
border-color: rgb(130 195 247 / var(--tw-border-opacity));
|
||||||
|
}
|
||||||
|
|
||||||
.bg-blue-100 {
|
.bg-blue-100 {
|
||||||
--tw-bg-opacity: 1;
|
--tw-bg-opacity: 1;
|
||||||
background-color: rgb(225 239 253 / var(--tw-bg-opacity));
|
background-color: rgb(225 239 253 / var(--tw-bg-opacity));
|
||||||
@ -976,6 +1038,10 @@ video {
|
|||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.p-2 {
|
||||||
|
padding: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
.px-3 {
|
.px-3 {
|
||||||
padding-left: 0.75rem;
|
padding-left: 0.75rem;
|
||||||
padding-right: 0.75rem;
|
padding-right: 0.75rem;
|
||||||
@ -1007,6 +1073,10 @@ video {
|
|||||||
text-align: justify;
|
text-align: justify;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.font-mono {
|
||||||
|
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||||
|
}
|
||||||
|
|
||||||
.text-2xl {
|
.text-2xl {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
line-height: 2rem;
|
line-height: 2rem;
|
||||||
@ -1080,6 +1150,10 @@ video {
|
|||||||
line-height: 1.25rem;
|
line-height: 1.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.leading-tight {
|
||||||
|
line-height: 1.25;
|
||||||
|
}
|
||||||
|
|
||||||
.text-blue-500 {
|
.text-blue-500 {
|
||||||
--tw-text-opacity: 1;
|
--tw-text-opacity: 1;
|
||||||
color: rgb(23 137 224 / var(--tw-text-opacity));
|
color: rgb(23 137 224 / var(--tw-text-opacity));
|
||||||
@ -1115,6 +1189,16 @@ video {
|
|||||||
color: rgb(30 41 59 / var(--tw-text-opacity));
|
color: rgb(30 41 59 / var(--tw-text-opacity));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.text-blue-800 {
|
||||||
|
--tw-text-opacity: 1;
|
||||||
|
color: rgb(12 73 128 / var(--tw-text-opacity));
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-pink-900 {
|
||||||
|
--tw-text-opacity: 1;
|
||||||
|
color: rgb(119 24 89 / var(--tw-text-opacity));
|
||||||
|
}
|
||||||
|
|
||||||
.no-underline {
|
.no-underline {
|
||||||
text-decoration-line: none;
|
text-decoration-line: none;
|
||||||
}
|
}
|
||||||
@ -2005,6 +2089,16 @@ article a:visited {
|
|||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.md\:mx-0 {
|
||||||
|
margin-left: 0px;
|
||||||
|
margin-right: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md\:mx-6 {
|
||||||
|
margin-left: 1.5rem;
|
||||||
|
margin-right: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
.md\:h-16 {
|
.md\:h-16 {
|
||||||
height: 4rem;
|
height: 4rem;
|
||||||
}
|
}
|
||||||
@ -2068,6 +2162,15 @@ article a:visited {
|
|||||||
font-size: 1.25rem;
|
font-size: 1.25rem;
|
||||||
line-height: 1.75rem;
|
line-height: 1.75rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.md\:text-5xl {
|
||||||
|
font-size: 3rem;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md\:leading-tight {
|
||||||
|
line-height: 1.25;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 1024px) {
|
@media (min-width: 1024px) {
|
||||||
@ -2146,6 +2249,10 @@ article a:visited {
|
|||||||
grid-column: auto;
|
grid-column: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.xl\:col-span-2 {
|
||||||
|
grid-column: span 2 / span 2;
|
||||||
|
}
|
||||||
|
|
||||||
.xl\:row-span-2 {
|
.xl\:row-span-2 {
|
||||||
grid-row: span 2 / span 2;
|
grid-row: span 2 / span 2;
|
||||||
}
|
}
|
||||||
@ -2154,10 +2261,35 @@ article a:visited {
|
|||||||
grid-row-start: auto;
|
grid-row-start: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.xl\:my-4 {
|
||||||
|
margin-top: 1rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xl\:mb-4 {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xl\:mt-6 {
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xl\:mt-10 {
|
||||||
|
margin-top: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
.xl\:block {
|
.xl\:block {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.xl\:grid {
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xl\:grid-flow-row {
|
||||||
|
grid-auto-flow: row;
|
||||||
|
}
|
||||||
|
|
||||||
.xl\:grid-cols-3 {
|
.xl\:grid-cols-3 {
|
||||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||||
}
|
}
|
||||||
@ -2166,13 +2298,45 @@ article a:visited {
|
|||||||
grid-template-columns: 1fr 2fr;
|
grid-template-columns: 1fr 2fr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.xl\:gap-8 {
|
||||||
|
gap: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
.xl\:gap-x-32 {
|
.xl\:gap-x-32 {
|
||||||
-moz-column-gap: 8rem;
|
-moz-column-gap: 8rem;
|
||||||
column-gap: 8rem;
|
column-gap: 8rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.xl\:text-6xl {
|
||||||
|
font-size: 3.75rem;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xl\:text-4xl {
|
||||||
|
font-size: 2.25rem;
|
||||||
|
line-height: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xl\:text-7xl {
|
||||||
|
font-size: 4.5rem;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xl\:text-9xl {
|
||||||
|
font-size: 8rem;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xl\:font-medium {
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media print {
|
@media print {
|
||||||
|
.print\:inline {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
.print\:hidden {
|
.print\:hidden {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
18
templates/components/education_card.html
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<section class="flex border rounded bg-white p-3">
|
||||||
|
<aside class="flex justify-center items-center pr-3 shrink-0">
|
||||||
|
{% match education.thumbnail %}
|
||||||
|
{% when Some with (source) %}
|
||||||
|
{% let picture = crate::picture_generator::picture_markup_generator::generate_picture_markup(source, 64, 64, "education cover", Some("h-12 w-12 md:h-16 md:w-16")).unwrap_or("cover not found".to_string()) %}
|
||||||
|
<figure class="mx-4 my-2">
|
||||||
|
{{picture|safe}}
|
||||||
|
</figure>
|
||||||
|
{% when None %}
|
||||||
|
{% endmatch %}
|
||||||
|
</aside>
|
||||||
|
<section>
|
||||||
|
<header>
|
||||||
|
<h3 class="text-lg font-medium mb-1 md:text-2xl">{{education.name}}</h3>
|
||||||
|
</header>
|
||||||
|
<section class="text-sm leading-tight text-slate-800 md:text-lg md:leading-tight">{{education.description|parse_markdown|safe}}</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
@ -10,7 +10,7 @@
|
|||||||
{{project.metadata.title}}
|
{{project.metadata.title}}
|
||||||
{% endmatch %}
|
{% endmatch %}
|
||||||
</h2>
|
</h2>
|
||||||
<section class="description text-slate-800 my-2 md:text-xl text-justify">
|
<section class="description text-slate-800 my-2 md:text-xl text-justify leading-tight md:leading-tight">
|
||||||
{{project.body|parse_markdown|safe}}
|
{{project.body|parse_markdown|safe}}
|
||||||
</section>
|
</section>
|
||||||
</header>
|
</header>
|
||||||
|
19
templates/components/skill_card.html
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<section class="flex border rounded bg-white p-3">
|
||||||
|
<aside class="flex justify-center items-center pr-3 shrink-0">
|
||||||
|
{% match skill.thumbnail %}
|
||||||
|
{% when Some with (source) %}
|
||||||
|
{% let skill_name = skill.name.clone() %}
|
||||||
|
{% let picture = crate::picture_generator::picture_markup_generator::generate_picture_markup(source, 64, 64, format!("{skill_name} cover"), Some("h-12 w-12 md:h-16 md:w-16")).unwrap_or("cover not found".to_string()) %}
|
||||||
|
<figure class="mx-4 my-2">
|
||||||
|
{{picture|safe}}
|
||||||
|
</figure>
|
||||||
|
{% when None %}
|
||||||
|
{% endmatch %}
|
||||||
|
</aside>
|
||||||
|
<section>
|
||||||
|
<header>
|
||||||
|
<h3 class="text-lg font-medium mb-1 md:text-2xl">{{skill.name}}</h3>
|
||||||
|
</header>
|
||||||
|
<section class="text-sm leading-tight text-slate-800 md:text-lg md:leading-tight">{{skill.description|parse_markdown|safe}}</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
@ -1,6 +1,5 @@
|
|||||||
{% macro talent_card(svg, heading, description) %}
|
{% macro talent_card(svg, heading, description) %}
|
||||||
|
<section class="flex border rounded bg-white p-3">
|
||||||
<section class="flex border rounded bg-white m-4 p-3 max-w-[32rem]">
|
|
||||||
<aside class="flex justify-center items-center pr-3">
|
<aside class="flex justify-center items-center pr-3">
|
||||||
<svg role="img" aria-label="{{svg}} icon" aria-hidden="true" class="fill-blue-950 h-12 w-12 md:h-16 md:w-16">
|
<svg role="img" aria-label="{{svg}} icon" aria-hidden="true" class="fill-blue-950 h-12 w-12 md:h-16 md:w-16">
|
||||||
<use href="#{{svg}}" />
|
<use href="#{{svg}}" />
|
||||||
@ -10,9 +9,8 @@
|
|||||||
<header>
|
<header>
|
||||||
<h3 class="text-lg font-medium mb-1 md:text-2xl">{{heading}}</h3>
|
<h3 class="text-lg font-medium mb-1 md:text-2xl">{{heading}}</h3>
|
||||||
</header>
|
</header>
|
||||||
<p class="text-sm leading-5 text-slate-800 md:text-lg">{{description|safe}}</p>
|
<p class="text-sm leading-tight text-slate-800 md:text-lg md:leading-tight">{{description|safe}}</p>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
|
18
templates/components/workplace_card.html
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<section class="flex border rounded bg-white p-3">
|
||||||
|
<aside class="flex justify-center items-center pr-3 shrink-0">
|
||||||
|
{% match workplace.thumbnail %}
|
||||||
|
{% when Some with (source) %}
|
||||||
|
{% let picture = crate::picture_generator::picture_markup_generator::generate_picture_markup(source, 64, 64, "Workplace cover", Some("h-12 w-12 md:h-16 md:w-16")).unwrap_or("cover not found".to_string()) %}
|
||||||
|
<figure class="mx-4 my-2">
|
||||||
|
{{picture|safe}}
|
||||||
|
</figure>
|
||||||
|
{% when None %}
|
||||||
|
{% endmatch %}
|
||||||
|
</aside>
|
||||||
|
<section>
|
||||||
|
<header>
|
||||||
|
<h3 class="text-lg font-medium mb-1 md:text-2xl">{{workplace.name}}</h3>
|
||||||
|
</header>
|
||||||
|
<section class="text-sm leading-tight text-slate-800 md:text-lg md:leading-tight">{{workplace.description|parse_markdown|safe}}</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
@ -15,7 +15,7 @@
|
|||||||
title="{{link.title}}"
|
title="{{link.title}}"
|
||||||
>
|
>
|
||||||
<svg aria-hidden="true" class="h-6 w-6 mx-2 self-start">
|
<svg aria-hidden="true" class="h-6 w-6 mx-2 self-start">
|
||||||
<use xlink:href="/svg/icons-sprite.svg#{{link.svg}}" />
|
<use xlink:href="#{{link.svg}}" />
|
||||||
</svg>
|
</svg>
|
||||||
<span class="text-lg font-semibold">{{link.label}}</span>
|
<span class="text-lg font-semibold">{{link.label}}</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -14,6 +14,6 @@
|
|||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</symbol><symbol id="linkedin" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/></symbol><symbol id="mail" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4L236.8 313.6c11.4 8.5 27 8.5 38.4 0L492.8 150.4c12.1-9.1 19.2-23.3 19.2-38.4c0-26.5-21.5-48-48-48H48zM0 176V384c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V176L294.4 339.2c-22.8 17.1-54 17.1-76.8 0L0 176z"/></symbol><symbol id="person-chalkboard" viewBox="0 0 640 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M192 96a48 48 0 1 0 0-96 48 48 0 1 0 0 96zm-8 384V352h16V480c0 17.7 14.3 32 32 32s32-14.3 32-32V192h56 64 16c17.7 0 32-14.3 32-32s-14.3-32-32-32H384V64H576V256H384V224H320v48c0 26.5 21.5 48 48 48H592c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48H368c-26.5 0-48 21.5-48 48v80H243.1 177.1c-33.7 0-64.9 17.7-82.3 46.6l-58.3 97c-9.1 15.1-4.2 34.8 10.9 43.9s34.8 4.2 43.9-10.9L120 256.9V480c0 17.7 14.3 32 32 32s32-14.3 32-32z"/></symbol><symbol id="rss" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zM96 136c0-13.3 10.7-24 24-24c137 0 248 111 248 248c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-110.5-89.5-200-200-200c-13.3 0-24-10.7-24-24zm0 96c0-13.3 10.7-24 24-24c83.9 0 152 68.1 152 152c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-57.4-46.6-104-104-104c-13.3 0-24-10.7-24-24zm0 120a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"/></symbol><symbol id="tiktok-2" viewBox="0 0 24 24">
|
</symbol><symbol id="linkedin" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/></symbol><symbol id="mail" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4L236.8 313.6c11.4 8.5 27 8.5 38.4 0L492.8 150.4c12.1-9.1 19.2-23.3 19.2-38.4c0-26.5-21.5-48-48-48H48zM0 176V384c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V176L294.4 339.2c-22.8 17.1-54 17.1-76.8 0L0 176z"/></symbol><symbol id="person-chalkboard" viewBox="0 0 640 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M192 96a48 48 0 1 0 0-96 48 48 0 1 0 0 96zm-8 384V352h16V480c0 17.7 14.3 32 32 32s32-14.3 32-32V192h56 64 16c17.7 0 32-14.3 32-32s-14.3-32-32-32H384V64H576V256H384V224H320v48c0 26.5 21.5 48 48 48H592c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48H368c-26.5 0-48 21.5-48 48v80H243.1 177.1c-33.7 0-64.9 17.7-82.3 46.6l-58.3 97c-9.1 15.1-4.2 34.8 10.9 43.9s34.8 4.2 43.9-10.9L120 256.9V480c0 17.7 14.3 32 32 32s32-14.3 32-32z"/></symbol><symbol id="phone" viewBox="0 0 512 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z"/></symbol><symbol id="rss" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zM96 136c0-13.3 10.7-24 24-24c137 0 248 111 248 248c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-110.5-89.5-200-200-200c-13.3 0-24-10.7-24-24zm0 96c0-13.3 10.7-24 24-24c83.9 0 152 68.1 152 152c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-57.4-46.6-104-104-104c-13.3 0-24-10.7-24-24zm0 120a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"/></symbol><symbol id="tiktok-2" viewBox="0 0 24 24">
|
||||||
<path d="M16.8217 5.1344C16.0886 4.29394 15.6479 3.19805 15.6479 2H14.7293M16.8217 5.1344C17.4898 5.90063 18.3944 6.45788 19.4245 6.67608C19.7446 6.74574 20.0786 6.78293 20.4266 6.78293V10.2191C18.645 10.2191 16.9932 9.64801 15.6477 8.68211V15.6707C15.6477 19.1627 12.8082 22 9.32386 22C7.50043 22 5.85334 21.2198 4.69806 19.98C3.64486 18.847 2.99994 17.3331 2.99994 15.6707C2.99994 12.2298 5.75592 9.42509 9.17073 9.35079M16.8217 5.1344C16.8039 5.12276 16.7861 5.11101 16.7684 5.09914M6.9855 17.3517C6.64217 16.8781 6.43802 16.2977 6.43802 15.6661C6.43802 14.0734 7.73249 12.7778 9.32394 12.7778C9.62087 12.7778 9.9085 12.8288 10.1776 12.9124V9.40192C9.89921 9.36473 9.61622 9.34149 9.32394 9.34149C9.27287 9.34149 8.86177 9.36884 8.81073 9.36884M14.7244 2H12.2097L12.2051 15.7775C12.1494 17.3192 10.8781 18.5591 9.32386 18.5591C8.35878 18.5591 7.50971 18.0808 6.98079 17.3564" stroke="#000000" stroke-linejoin="round"/>
|
<path d="M16.8217 5.1344C16.0886 4.29394 15.6479 3.19805 15.6479 2H14.7293M16.8217 5.1344C17.4898 5.90063 18.3944 6.45788 19.4245 6.67608C19.7446 6.74574 20.0786 6.78293 20.4266 6.78293V10.2191C18.645 10.2191 16.9932 9.64801 15.6477 8.68211V15.6707C15.6477 19.1627 12.8082 22 9.32386 22C7.50043 22 5.85334 21.2198 4.69806 19.98C3.64486 18.847 2.99994 17.3331 2.99994 15.6707C2.99994 12.2298 5.75592 9.42509 9.17073 9.35079M16.8217 5.1344C16.8039 5.12276 16.7861 5.11101 16.7684 5.09914M6.9855 17.3517C6.64217 16.8781 6.43802 16.2977 6.43802 15.6661C6.43802 14.0734 7.73249 12.7778 9.32394 12.7778C9.62087 12.7778 9.9085 12.8288 10.1776 12.9124V9.40192C9.89921 9.36473 9.61622 9.34149 9.32394 9.34149C9.27287 9.34149 8.86177 9.36884 8.81073 9.36884M14.7244 2H12.2097L12.2051 15.7775C12.1494 17.3192 10.8781 18.5591 9.32386 18.5591C8.35878 18.5591 7.50971 18.0808 6.98079 17.3564" stroke="#000000" stroke-linejoin="round"/>
|
||||||
</symbol><symbol id="tiktok" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M448 209.9a210.1 210.1 0 0 1 -122.8-39.3V349.4A162.6 162.6 0 1 1 185 188.3V278.2a74.6 74.6 0 1 0 52.2 71.2V0l88 0a121.2 121.2 0 0 0 1.9 22.2h0A122.2 122.2 0 0 0 381 102.4a121.4 121.4 0 0 0 67 20.1z"/></symbol><symbol id="twitch" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M391.2 103.5H352.5v109.7h38.6zM285 103H246.4V212.8H285zM120.8 0 24.3 91.4V420.6H140.1V512l96.5-91.4h77.3L487.7 256V0zM449.1 237.8l-77.2 73.1H294.6l-67.6 64v-64H140.1V36.6H449.1z"/></symbol><symbol id="twitter" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/></symbol><symbol id="youtube" viewBox="0 0 576 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M549.7 124.1c-6.3-23.7-24.8-42.3-48.3-48.6C458.8 64 288 64 288 64S117.2 64 74.6 75.5c-23.5 6.3-42 24.9-48.3 48.6-11.4 42.9-11.4 132.3-11.4 132.3s0 89.4 11.4 132.3c6.3 23.7 24.8 41.5 48.3 47.8C117.2 448 288 448 288 448s170.8 0 213.4-11.5c23.5-6.3 42-24.2 48.3-47.8 11.4-42.9 11.4-132.3 11.4-132.3s0-89.4-11.4-132.3zm-317.5 213.5V175.2l142.7 81.2-142.7 81.2z"/></symbol></svg>
|
</symbol><symbol id="tiktok" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M448 209.9a210.1 210.1 0 0 1 -122.8-39.3V349.4A162.6 162.6 0 1 1 185 188.3V278.2a74.6 74.6 0 1 0 52.2 71.2V0l88 0a121.2 121.2 0 0 0 1.9 22.2h0A122.2 122.2 0 0 0 381 102.4a121.4 121.4 0 0 0 67 20.1z"/></symbol><symbol id="twitch" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M391.2 103.5H352.5v109.7h38.6zM285 103H246.4V212.8H285zM120.8 0 24.3 91.4V420.6H140.1V512l96.5-91.4h77.3L487.7 256V0zM449.1 237.8l-77.2 73.1H294.6l-67.6 64v-64H140.1V36.6H449.1z"/></symbol><symbol id="twitter" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/></symbol><symbol id="youtube" viewBox="0 0 576 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M549.7 124.1c-6.3-23.7-24.8-42.3-48.3-48.6C458.8 64 288 64 288 64S117.2 64 74.6 75.5c-23.5 6.3-42 24.9-48.3 48.6-11.4 42.9-11.4 132.3-11.4 132.3s0 89.4 11.4 132.3c6.3 23.7 24.8 41.5 48.3 47.8C117.2 448 288 448 288 448s170.8 0 213.4-11.5c23.5-6.3 42-24.2 48.3-47.8 11.4-42.9 11.4-132.3 11.4-132.3s0-89.4-11.4-132.3zm-317.5 213.5V175.2l142.7 81.2-142.7 81.2z"/></symbol></svg>
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
@ -33,9 +33,9 @@
|
|||||||
<em> <a href="https://en.wikipedia.org/wiki/Programmer">programmer</a> </em>
|
<em> <a href="https://en.wikipedia.org/wiki/Programmer">programmer</a> </em>
|
||||||
. I am developing software for more than half of my life and <strong>I love it!</strong> Sometimes I stream working on my side projects and building a <a href="https://discord.gg/2cGg7kwZEh">community of like minded people</a>. Here you can find blogs of my thoughts and journeys, as well as links to my socials where you can see other content.</p>
|
. I am developing software for more than half of my life and <strong>I love it!</strong> Sometimes I stream working on my side projects and building a <a href="https://discord.gg/2cGg7kwZEh">community of like minded people</a>. Here you can find blogs of my thoughts and journeys, as well as links to my socials where you can see other content.</p>
|
||||||
|
|
||||||
<section id="talent-cards" class="flex flex-col items-center">
|
<section id="talent-cards" class="my-4 mx-auto flex flex-col items-center gap-4 max-w-[32rem] px-4">
|
||||||
{% call tc::talent_card("code", "Web development", "Extensive expertise in creating performant, live web applications and websites") %}
|
{% call tc::talent_card("code", "Web development", "Extensive expertise in creating performant, live web applications and websites.") %}
|
||||||
{% call tc::talent_card("gamepad", "Game development", "Extensive expertise in creating performant, live web applications and websites") %}
|
{% call tc::talent_card("gamepad", "Game development", "Creating games with passion. Capable of producing each aspect of a good game with profesional sound and creative mechanics. I consider games as multidisciplinary art.") %}
|
||||||
{% call tc::talent_card("person-chalkboard", "Mentoring & Consulting", "I offer consulting sessions to assist you in developing <strong>higher-quality software</strong> and share insights from crafting robust, professional web applications. <a href=\"https://calendly.com/michalvankosk/30min\">Schedule a session with me</a> and elevate your projects together.") %}
|
{% call tc::talent_card("person-chalkboard", "Mentoring & Consulting", "I offer consulting sessions to assist you in developing <strong>higher-quality software</strong> and share insights from crafting robust, professional web applications. <a href=\"https://calendly.com/michalvankosk/30min\">Schedule a session with me</a> and elevate your projects together.") %}
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
{%- import "components/talent_card.html" as tc -%}
|
||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
|
|
||||||
{% block og_meta %}
|
{% block og_meta %}
|
||||||
@ -9,10 +10,83 @@
|
|||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<section id="portfolio-body">
|
<header class="max-w-read mx-auto">
|
||||||
|
<h1 class="px-4 my-2 text-4xl text-blue-950 font-extrabold md:text-6xl xl:text-7xl xl:mb-4 xl:mt-10">Michal Vanko</h1>
|
||||||
|
<h3 class="px-4 my-1 text-2xl text-blue-900 font-bold italic md:text-3xl xl:text-4xl">Software Architect by passion</h3>
|
||||||
|
<section id="contact" class="mt-4">
|
||||||
|
<ul class="max-w-[24rem] mx-auto md:mx-6">
|
||||||
|
{% for link in contact_links %}
|
||||||
|
<li class="my-2">
|
||||||
|
<a
|
||||||
|
class="flex border-2 place-content-center items-center rounded-full text-blue-900 border-blue-500 py-2 hover:bg-pink-200 fill-blue-900 hover:fill-blue-400 transition-colors no-underline"
|
||||||
|
href="{{link.href}}"
|
||||||
|
title="{{link.title}}"
|
||||||
|
>
|
||||||
|
<svg aria-hidden="true" class="h-6 w-6 mx-2 self-start">
|
||||||
|
<use xlink:href="#{{link.svg}}" />
|
||||||
|
</svg>
|
||||||
|
<span class="text-lg font-semibold print:hidden">{{link.label}}</span>
|
||||||
|
<span class="hidden print:inline text-sm">{{link.href}}</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</header>
|
||||||
|
|
||||||
{{ body }}
|
<section id="portfolio-body" class="article-body">
|
||||||
|
{{ body|parse_markdown|safe }}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="skillsets" class="max-w-maxindex mx-auto xl:grid xl:gap-8 xl:grid-cols-3">
|
||||||
|
<section id="work-history" class="max-w-read mx-auto xl:row-span-2">
|
||||||
|
<h2 class="m-5 text-3xl text-blue-950 font-extrabold md:text-4xl xl:font-medium">Work experience</h2>
|
||||||
|
<ul class="m-6 grid grid-flow-row gap-6">
|
||||||
|
{% for skill in workplace_list %}
|
||||||
|
<li>
|
||||||
|
{% include "components/skill_card.html" %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="education" class="max-w-read mx-auto">
|
||||||
|
<h2 class="m-5 text-3xl text-blue-950 font-extrabold md:text-4xl xl:font-medium">Education</h2>
|
||||||
|
<ul class="m-6 grid grid-flow-row gap-6">
|
||||||
|
{% for skill in education_list %}
|
||||||
|
<li>
|
||||||
|
{% include "components/skill_card.html" %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="skills" class="max-w-read mx-auto">
|
||||||
|
<h2 class="m-5 text-3xl text-blue-950 font-extrabold md:text-4xl xl:font-medium">Skills</h2>
|
||||||
|
<ul class="m-6 grid grid-flow-row gap-6">
|
||||||
|
<li>
|
||||||
|
{% call tc::talent_card("code", "Web development", "Extensive expertise in creating performant, live web applications and websites.",) %}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
{% call tc::talent_card("gamepad", "Game development", "Creating games with passion. Capable of producing each aspect of a good game with profesional sound and creative mechanics. I consider games as multidisciplinary art.") %}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
{% call tc::talent_card("person-chalkboard", "Mentoring & Consulting", "I offer consulting sessions to assist you in developing <strong>higher-quality software</strong> and share insights from crafting robust, professional web applications. <a href=\"https://calendly.com/michalvankosk/30min\">Schedule a session with me</a> and elevate your projects together.") %}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="technologies" class="max-w-read mx-auto xl:col-span-2">
|
||||||
|
<h2 class="m-5 text-3xl text-blue-950 font-extrabold md:text-4xl xl:font-medium">Technologies</h2>
|
||||||
|
|
||||||
|
<ul class="m-6 flex gap-2 flex-wrap justify-center">
|
||||||
|
{% for technology in technology_list %}
|
||||||
|
<li class="p-2 text-pink-900 bg-blue-100 text-sm border rounded border-blue-300 font-mono">
|
||||||
|
{{technology}}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="project-list-container" class="max-w-maxindex mx-auto">
|
<section id="project-list-container" class="max-w-maxindex mx-auto">
|
||||||
@ -20,7 +94,7 @@
|
|||||||
{% if project_list.len() == 0 %}
|
{% if project_list.len() == 0 %}
|
||||||
<p class="no-posts">You've found void in the space.</p>
|
<p class="no-posts">You've found void in the space.</p>
|
||||||
{% else %}
|
{% else %}
|
||||||
<h1 class="m-5 text-4xl text-blue-950 font-extrabold md:text-6xl">
|
<h2 class="m-5 text-3xl text-blue-950 font-extrabold md:text-5xl">
|
||||||
Showcase
|
Showcase
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
|
@ -29,4 +29,9 @@
|
|||||||
</section> <!-- /#project-list -->
|
</section> <!-- /#project-list -->
|
||||||
|
|
||||||
</section> <!-- /#project-list-container -->
|
</section> <!-- /#project-list-container -->
|
||||||
|
|
||||||
|
<section class="text-center my-3 md:text-lg">
|
||||||
|
<a href="/portfolio">see complete portfolio</a>
|
||||||
|
</section>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
21
test-animate.svg
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg width="100%" height="100%"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<!-- Your original SVG code here -->
|
||||||
|
<path id="path1" d="M10 50 L20 50"></path>
|
||||||
|
<path id="path2" d="M30 50 C40 70, 60 90, 80 110"></path>
|
||||||
|
|
||||||
|
<!-- The animation elements -->
|
||||||
|
<animateMotion
|
||||||
|
path="M10 50 S20 50 20 50"
|
||||||
|
dur="2000ms"
|
||||||
|
repeatCount="indefinite">
|
||||||
|
</animateMotion>
|
||||||
|
<animateMotion
|
||||||
|
path="M30 50 S40 70, 60 90, 80 110"
|
||||||
|
begin="2s"
|
||||||
|
dur="2000ms"
|
||||||
|
repeatCount="indefinite">
|
||||||
|
</animateMotion>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 569 B |