Projects moved and finished to showcase on index
This commit is contained in:
parent
8b6dbc83c7
commit
6dc6a581e3
16
_projects/2020-04-04-panoramic.md
Normal file
16
_projects/2020-04-04-panoramic.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
title: Panoramic
|
||||||
|
displayed: true
|
||||||
|
description: "*Panoramic* was 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."
|
||||||
|
classification: webapp
|
||||||
|
tags:
|
||||||
|
- Webapp
|
||||||
|
- Node.js
|
||||||
|
- TypeScript
|
||||||
|
- React
|
||||||
|
- GraphQL
|
||||||
|
- Data analytics
|
||||||
|
featured: false
|
||||||
|
---
|
19
_projects/2022-05-05-the-expert.md
Normal file
19
_projects/2022-05-05-the-expert.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
title: The Expert
|
||||||
|
displayed: true
|
||||||
|
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.
|
||||||
|
link: https://www.theexpert.com/
|
||||||
|
cover_image: /images/uploads/the-expert-logo.svg
|
||||||
|
classification: webapp
|
||||||
|
tags:
|
||||||
|
- Node.js
|
||||||
|
- PostgreSQL
|
||||||
|
- TypeScript
|
||||||
|
- React
|
||||||
|
- GraphQL
|
||||||
|
featured: true
|
||||||
|
---
|
12
_projects/2024-08-06-beinsports.md
Normal file
12
_projects/2024-08-06-beinsports.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: beinSports
|
||||||
|
displayed: true
|
||||||
|
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*"
|
||||||
|
cover_image: /images/uploads/bein_logo.af017869.webp
|
||||||
|
classification: website
|
||||||
|
tags:
|
||||||
|
- Freemarker
|
||||||
|
featured: false
|
||||||
|
---
|
11
_projects/2024-08-06-ckvive.md
Normal file
11
_projects/2024-08-06-ckvive.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
title: CK Vive
|
||||||
|
displayed: true
|
||||||
|
description: Websitefor *CK Vive* travel agency with a **custom CMS system** for
|
||||||
|
managing travel destinations.
|
||||||
|
cover_image: /images/uploads/ck_vive_logo.svg
|
||||||
|
classification: website
|
||||||
|
tags:
|
||||||
|
- PHP
|
||||||
|
featured: false
|
||||||
|
---
|
9
_projects/2024-08-06-dev-project-test.md
Normal file
9
_projects/2024-08-06-dev-project-test.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
title: dev project test
|
||||||
|
displayed: true
|
||||||
|
description: Testing project
|
||||||
|
classification: webapp
|
||||||
|
tags:
|
||||||
|
- Webapp
|
||||||
|
featured: false
|
||||||
|
---
|
12
_projects/2024-08-06-docker-presentation.md
Normal file
12
_projects/2024-08-06-docker-presentation.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: Docker
|
||||||
|
displayed: false
|
||||||
|
description: An introduction to Docker containerization technology and how it
|
||||||
|
differs from virtualization.
|
||||||
|
cover_image: /images/uploads/docker-use-cases.png
|
||||||
|
classification: presentation
|
||||||
|
tags:
|
||||||
|
- Presentation
|
||||||
|
- Docker
|
||||||
|
featured: false
|
||||||
|
---
|
14
_projects/2024-08-06-fx-sales.md
Normal file
14
_projects/2024-08-06-fx-sales.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
title: FX Sales
|
||||||
|
displayed: true
|
||||||
|
description: "*Caplin FX Sales* allows sales people to **trade on behalf of
|
||||||
|
their clients**. This needs to be an efficient workflow providing all the
|
||||||
|
relevant information to the sales user"
|
||||||
|
cover_image: /images/uploads/fx_sales_screen2x.png
|
||||||
|
classification: webapp
|
||||||
|
tags:
|
||||||
|
- Webapp
|
||||||
|
- React
|
||||||
|
- Knockout
|
||||||
|
featured: false
|
||||||
|
---
|
16
_projects/2024-08-06-heylady.md
Normal file
16
_projects/2024-08-06-heylady.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
title: HeyLady!
|
||||||
|
displayed: true
|
||||||
|
description: A thriving online community supporting women to learn and practise
|
||||||
|
speaking English.
|
||||||
|
cover_image: /images/uploads/heyladylogo.svg
|
||||||
|
classification: webapp
|
||||||
|
tags:
|
||||||
|
- Webapp
|
||||||
|
- React
|
||||||
|
- GraphQL
|
||||||
|
- TypeScript
|
||||||
|
- NodeJS
|
||||||
|
- PostgreSQL
|
||||||
|
featured: false
|
||||||
|
---
|
13
_projects/2024-08-06-košice-peace-marathon.md
Normal file
13
_projects/2024-08-06-košice-peace-marathon.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
title: Košice Peace Marathon
|
||||||
|
displayed: true
|
||||||
|
description: "*Košice Peace Marathon* is the oldest marathon in Europe and the
|
||||||
|
third-oldest in the world."
|
||||||
|
link: https://www.kosicemarathon.com/
|
||||||
|
cover_image: /images/uploads/screenshot-from-2024-08-06-18-22-52.png
|
||||||
|
classification: website
|
||||||
|
tags:
|
||||||
|
- PHP
|
||||||
|
- MySQL
|
||||||
|
featured: false
|
||||||
|
---
|
10
_projects/2024-08-06-livesport-tv.md
Normal file
10
_projects/2024-08-06-livesport-tv.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: Livesport.tv
|
||||||
|
displayed: false
|
||||||
|
description: "*Livesport.tv* is a network of premium online sports channels,
|
||||||
|
featuring all the top sports competitions from around the world."
|
||||||
|
classification: website
|
||||||
|
tags:
|
||||||
|
- Freemarker
|
||||||
|
featured: false
|
||||||
|
---
|
14
_projects/2024-08-06-manualogic.md
Normal file
14
_projects/2024-08-06-manualogic.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
title: Manualogic
|
||||||
|
displayed: false
|
||||||
|
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."
|
||||||
|
classification: webapp
|
||||||
|
tags:
|
||||||
|
- Webapp
|
||||||
|
- Angular
|
||||||
|
- RxJS
|
||||||
|
featured: false
|
||||||
|
---
|
14
_projects/2024-08-06-renaissance-of-hypermedia-systems-1.md
Normal file
14
_projects/2024-08-06-renaissance-of-hypermedia-systems-1.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
title: Renaissance of hypermedia systems
|
||||||
|
displayed: true
|
||||||
|
description: A presentation about hypermedia systems, HTMX, HyperView, and the
|
||||||
|
HATEOAS principles. 2024
|
||||||
|
link: https://michalvankodev.github.io/presentation-renaissance-of-hypermedia-systems/#/intro
|
||||||
|
cover_image: /images/uploads/screenshot-from-2024-08-06-19-01-03.png
|
||||||
|
classification: presentation
|
||||||
|
tags:
|
||||||
|
- Webdev
|
||||||
|
- Mobile
|
||||||
|
- HTMX
|
||||||
|
featured: true
|
||||||
|
---
|
14
_projects/2024-08-06-responzio.md
Normal file
14
_projects/2024-08-06-responzio.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
title: responzIO
|
||||||
|
displayed: true
|
||||||
|
description: "***responzIO*** is a smart, easy-to-use monitoring and automation
|
||||||
|
system. The ultimate tool for various applications such as hydroponics,
|
||||||
|
aquariums, and gardens."
|
||||||
|
cover_image: /images/uploads/responzio.png
|
||||||
|
classification: embedded
|
||||||
|
tags:
|
||||||
|
- Webapp
|
||||||
|
- Embedded
|
||||||
|
- NodeJS
|
||||||
|
featured: false
|
||||||
|
---
|
11
_projects/2024-08-06-ship-structured-heard-input-process.md
Normal file
11
_projects/2024-08-06-ship-structured-heard-input-process.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
title: SHIP (Structured heard input process)
|
||||||
|
displayed: true
|
||||||
|
description: "*SHIP* is a web application for **editors** who actively **track
|
||||||
|
trades offers and bids** on the commodity market."
|
||||||
|
classification: webapp
|
||||||
|
tags:
|
||||||
|
- Webapp
|
||||||
|
- Angular
|
||||||
|
featured: false
|
||||||
|
---
|
13
_projects/2024-08-06-signal-hub-manager.md
Normal file
13
_projects/2024-08-06-signal-hub-manager.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
title: Signal Hub Manager
|
||||||
|
displayed: true
|
||||||
|
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."
|
||||||
|
classification: webapp
|
||||||
|
tags:
|
||||||
|
- Webapp
|
||||||
|
- React
|
||||||
|
featured: false
|
||||||
|
---
|
10
_projects/2024-08-06-skosy.md
Normal file
10
_projects/2024-08-06-skosy.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: Skosy
|
||||||
|
displayed: false
|
||||||
|
description: "*Skosy* is a web application whose purpose is to **automate the
|
||||||
|
writing of integration tests** for websites."
|
||||||
|
classification: webapp
|
||||||
|
tags:
|
||||||
|
- Webapp
|
||||||
|
featured: false
|
||||||
|
---
|
13
_projects/2024-08-06-spreading-the-web.md
Normal file
13
_projects/2024-08-06-spreading-the-web.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
title: Spreading the Web
|
||||||
|
displayed: true
|
||||||
|
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. 2015
|
||||||
|
cover_image: /images/uploads/screenshot-from-2024-08-06-18-48-02.png
|
||||||
|
classification: presentation
|
||||||
|
tags:
|
||||||
|
- Presentation
|
||||||
|
- NodeJS
|
||||||
|
featured: false
|
||||||
|
---
|
14
_projects/2024-08-06-the-grand-escape.md
Normal file
14
_projects/2024-08-06-the-grand-escape.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
title: The Grand Escape
|
||||||
|
displayed: true
|
||||||
|
description: A videogame where you need to steer your boat to avoid obstacles
|
||||||
|
and enemy bullets. The difficulty will be increased after a certain time and
|
||||||
|
new enemies will be spawned to make your escape harder.
|
||||||
|
link: https://michalvankodev.itch.io/the-grand-escape
|
||||||
|
cover_image: /images/uploads/logo.png
|
||||||
|
classification: videogame
|
||||||
|
tags:
|
||||||
|
- Rust
|
||||||
|
- Bevy
|
||||||
|
featured: true
|
||||||
|
---
|
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: Unstoppable growth of front-end frameworks
|
||||||
|
displayed: true
|
||||||
|
description: A simple summary of the web front-end evolution. Describes how and
|
||||||
|
why new tools in the NodeJS ecosystem improve & why there is still something
|
||||||
|
to explore.
|
||||||
|
classification: presentation
|
||||||
|
tags:
|
||||||
|
- Presentation
|
||||||
|
- NodeJS
|
||||||
|
featured: false
|
||||||
|
---
|
12
_projects/2024-08-06-webassembly-presentation.md
Normal file
12
_projects/2024-08-06-webassembly-presentation.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: WebAssembly presentation
|
||||||
|
displayed: true
|
||||||
|
description: A presentation about what WebAssembly is about and how it might
|
||||||
|
affect the future of the world.
|
||||||
|
cover_image: /images/uploads/screenshot-from-2024-08-06-18-52-41.png
|
||||||
|
classification: presentation
|
||||||
|
tags:
|
||||||
|
- Presentation
|
||||||
|
- WebAssembly
|
||||||
|
featured: false
|
||||||
|
---
|
@ -1,4 +1,8 @@
|
|||||||
use crate::{pages::project::ProjectMetadata, post_list::get_post_list, post_parser::ParseResult};
|
use crate::{
|
||||||
|
pages::project::ProjectMetadata,
|
||||||
|
post_list::get_post_list,
|
||||||
|
post_parser::{parse_html, ParseResult},
|
||||||
|
};
|
||||||
use axum::http::StatusCode;
|
use axum::http::StatusCode;
|
||||||
|
|
||||||
pub async fn get_featured_projects() -> Result<Vec<ParseResult<ProjectMetadata>>, StatusCode> {
|
pub async fn get_featured_projects() -> Result<Vec<ParseResult<ProjectMetadata>>, StatusCode> {
|
||||||
@ -7,6 +11,10 @@ pub async fn get_featured_projects() -> Result<Vec<ParseResult<ProjectMetadata>>
|
|||||||
let featured_projects = project_list
|
let featured_projects = project_list
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter(|post| post.metadata.featured)
|
.filter(|post| post.metadata.featured)
|
||||||
|
.map(|mut post| {
|
||||||
|
post.metadata.description = parse_html(&post.metadata.description);
|
||||||
|
post
|
||||||
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
Ok(featured_projects)
|
Ok(featured_projects)
|
||||||
|
@ -9,4 +9,15 @@ pub struct ProjectMetadata {
|
|||||||
pub cover_image: Option<String>,
|
pub cover_image: Option<String>,
|
||||||
pub tags: Vec<String>,
|
pub tags: Vec<String>,
|
||||||
pub featured: bool,
|
pub featured: bool,
|
||||||
|
pub link: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn translate_classification(classification: &str) -> &str {
|
||||||
|
match classification {
|
||||||
|
"webapp" => "Web application",
|
||||||
|
"website" => "Web site",
|
||||||
|
"presentation" => "Presentation",
|
||||||
|
"videogame" => "Video game",
|
||||||
|
any => any,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ pub async fn parse_post<'de, Metadata: DeserializeOwned>(
|
|||||||
.parse_with_struct::<Metadata>(&file_contents)
|
.parse_with_struct::<Metadata>(&file_contents)
|
||||||
.ok_or_else(|| {
|
.ok_or_else(|| {
|
||||||
tracing::error!("Failed to parse metadata");
|
tracing::error!("Failed to parse metadata");
|
||||||
return StatusCode::INTERNAL_SERVER_ERROR;
|
StatusCode::INTERNAL_SERVER_ERROR
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let body = parse_html(&metadata.content);
|
let body = parse_html(&metadata.content);
|
||||||
@ -52,14 +52,14 @@ pub async fn parse_post<'de, Metadata: DeserializeOwned>(
|
|||||||
.ok_or(StatusCode::INTERNAL_SERVER_ERROR)?
|
.ok_or(StatusCode::INTERNAL_SERVER_ERROR)?
|
||||||
.to_owned();
|
.to_owned();
|
||||||
|
|
||||||
return Ok(ParseResult {
|
Ok(ParseResult {
|
||||||
body,
|
body,
|
||||||
metadata: metadata.data,
|
metadata: metadata.data,
|
||||||
slug: filename,
|
slug: filename,
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_html(markdown: &str) -> String {
|
pub fn parse_html(markdown: &str) -> String {
|
||||||
let mut options = Options::empty();
|
let mut options = Options::empty();
|
||||||
options.insert(Options::ENABLE_TABLES);
|
options.insert(Options::ENABLE_TABLES);
|
||||||
options.insert(Options::ENABLE_FOOTNOTES);
|
options.insert(Options::ENABLE_FOOTNOTES);
|
||||||
@ -68,17 +68,18 @@ fn parse_html(markdown: &str) -> String {
|
|||||||
options.insert(Options::ENABLE_SMART_PUNCTUATION);
|
options.insert(Options::ENABLE_SMART_PUNCTUATION);
|
||||||
options.insert(Options::ENABLE_HEADING_ATTRIBUTES);
|
options.insert(Options::ENABLE_HEADING_ATTRIBUTES);
|
||||||
|
|
||||||
let parser = Parser::new_ext(&markdown, options).map(|event| match event {
|
let parser = Parser::new_ext(markdown, options).map(|event| match event {
|
||||||
Event::Start(ref tag) => match tag {
|
/*
|
||||||
// Parsing images considers `alt` attribute as inner `Text` event
|
Parsing images considers `alt` attribute as inner `Text` event
|
||||||
// Therefore the `[alt]` is rendered in html as subtitle
|
Therefore the `[alt]` is rendered in html as subtitle
|
||||||
// and the `[](url "title")` `title` is rendered as `alt` attribute
|
and the `[](url "title")` `title` is rendered as `alt` attribute
|
||||||
Tag::Image {
|
*/
|
||||||
|
Event::Start(Tag::Image {
|
||||||
link_type,
|
link_type,
|
||||||
dest_url,
|
dest_url,
|
||||||
title,
|
title,
|
||||||
id,
|
id,
|
||||||
} => {
|
}) => {
|
||||||
println!(
|
println!(
|
||||||
"Image link_type: {:?} url: {} title: {} id: {}",
|
"Image link_type: {:?} url: {} title: {} id: {}",
|
||||||
link_type, dest_url, title, id
|
link_type, dest_url, title, id
|
||||||
@ -99,14 +100,13 @@ fn parse_html(markdown: &str) -> String {
|
|||||||
.into(),
|
.into(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
_ => event,
|
Event::Start(_) => event,
|
||||||
},
|
|
||||||
Event::End(TagEnd::Image) => Event::Html("</figcaption></figure>".into()),
|
Event::End(TagEnd::Image) => Event::Html("</figcaption></figure>".into()),
|
||||||
_ => event,
|
_ => event,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Write to String buffer.
|
// Write to String buffer
|
||||||
let mut html = String::new();
|
let mut html = String::new();
|
||||||
pulldown_cmark::html::push_html(&mut html, parser);
|
pulldown_cmark::html::push_html(&mut html, parser);
|
||||||
return html;
|
html
|
||||||
}
|
}
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
use std::path::Path;
|
|
||||||
|
|
||||||
use axum::http::StatusCode;
|
|
||||||
use serde::de::DeserializeOwned;
|
|
||||||
use tokio::fs::read_dir;
|
|
||||||
use tracing::info;
|
|
||||||
|
|
||||||
use crate::post_parser::{parse_post, ParseResult};
|
|
||||||
|
|
||||||
pub async fn get_post_list<'de, Metadata: DeserializeOwned>(
|
|
||||||
path: &Path,
|
|
||||||
) -> Result<Vec<ParseResult<Metadata>>, StatusCode> {
|
|
||||||
// let path = "../_posts/blog/";
|
|
||||||
let mut dir = read_dir(path)
|
|
||||||
.await
|
|
||||||
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
|
|
||||||
let mut posts: Vec<ParseResult<Metadata>> = Vec::new();
|
|
||||||
|
|
||||||
while let Some(file) = dir
|
|
||||||
.next_entry()
|
|
||||||
.await
|
|
||||||
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?
|
|
||||||
{
|
|
||||||
let file_path = file.path();
|
|
||||||
let file_path_str = file_path.to_str().unwrap();
|
|
||||||
info!(":{}", file_path_str);
|
|
||||||
let post = parse_post::<Metadata>(file_path_str).await?;
|
|
||||||
posts.push(post);
|
|
||||||
}
|
|
||||||
|
|
||||||
if std::env::var("TARGET")
|
|
||||||
.unwrap_or_else(|_| "DEV".to_owned())
|
|
||||||
.eq("PROD")
|
|
||||||
{
|
|
||||||
posts = posts
|
|
||||||
.into_iter()
|
|
||||||
.filter(|post| !post.slug.starts_with("dev"))
|
|
||||||
.collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
return Ok(posts);
|
|
||||||
}
|
|
@ -624,6 +624,16 @@ video {
|
|||||||
margin-bottom: 1.5rem;
|
margin-bottom: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mx-1 {
|
||||||
|
margin-left: 0.25rem;
|
||||||
|
margin-right: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.my-1 {
|
||||||
|
margin-top: 0.25rem;
|
||||||
|
margin-bottom: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
.mb-1 {
|
.mb-1 {
|
||||||
margin-bottom: 0.25rem;
|
margin-bottom: 0.25rem;
|
||||||
}
|
}
|
||||||
@ -644,6 +654,10 @@ video {
|
|||||||
margin-top: 0.75rem;
|
margin-top: 0.75rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mt-1 {
|
||||||
|
margin-top: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
.block {
|
.block {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
@ -892,6 +906,11 @@ video {
|
|||||||
line-height: 1.25rem;
|
line-height: 1.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.text-xl {
|
||||||
|
font-size: 1.25rem;
|
||||||
|
line-height: 1.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
.font-bold {
|
.font-bold {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
@ -1,34 +1,45 @@
|
|||||||
<article>
|
<article class="border rounded-md bg-white m-4 p-4">
|
||||||
<header class="px-4 mb-3">
|
<header class="px-4 mb-3">
|
||||||
<h2 class="text-3xl font-semibold text-blue-900">
|
<h2 class="text-xl font-semibold text-blue-900">
|
||||||
|
{% match project.metadata.link %}
|
||||||
|
{% when Some with (href) %}
|
||||||
|
<a href="{{href}}" class="text-blue-900 no-underline">
|
||||||
{{project.metadata.title}}
|
{{project.metadata.title}}
|
||||||
|
</a>
|
||||||
|
{% when None %}
|
||||||
|
{{project.metadata.title}}
|
||||||
|
{% endmatch %}
|
||||||
</h2>
|
</h2>
|
||||||
<p class="px-5 text-gray-800">
|
<p class="text-gray-800 text-lg my-2">
|
||||||
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make</p>
|
{{project.metadata.description|safe}}
|
||||||
|
</p>
|
||||||
</header>
|
</header>
|
||||||
<!-- <hr class="border-blue-950 my-5"> -->
|
<!-- <hr class="border-blue-950 my-5"> -->
|
||||||
|
|
||||||
{% match project.metadata.cover_image %}
|
{% match project.metadata.cover_image %}
|
||||||
{% when Some with (source) %}
|
{% when Some with (source) %}
|
||||||
<figure>
|
<figure class="my-2">
|
||||||
<!-- <img src="{{source}}" /> -->
|
{% match project.metadata.link %}
|
||||||
|
{% when Some with (href) %}
|
||||||
|
<a href="{{href}}">
|
||||||
|
<img src="{{source}}" />
|
||||||
|
</a>
|
||||||
|
{% when None %}
|
||||||
|
<img src="{{source}}" />
|
||||||
|
{% endmatch %}
|
||||||
<!-- TODO <figure> -->
|
<!-- TODO <figure> -->
|
||||||
<svg aria-hidden="true" class="h-12 w-12 fill-blue-950">
|
|
||||||
<use xlink:href="/svg/icons-sprite.svg#mail" />
|
|
||||||
</svg>
|
|
||||||
|
|
||||||
</figure>
|
</figure>
|
||||||
{% when None %}
|
{% when None %}
|
||||||
{% endmatch %}
|
{% endmatch %}
|
||||||
|
|
||||||
|
|
||||||
<footer class="text-sm">
|
<footer class="text-sm px-4">
|
||||||
<h3 class="text-3xl font-semibold text-blue-900">
|
<h3 class="text-xl font-semibold text-blue-900 my-2">
|
||||||
TODO classification
|
{{crate::pages::project::translate_classification(project.metadata.classification)}}
|
||||||
</h3>
|
</h3>
|
||||||
<ul class="inline-block">
|
<ul class="inline-block">
|
||||||
{% for tag in project.metadata.tags %}
|
{% for tag in project.metadata.tags %}
|
||||||
<li class="inline-block">
|
<li class="inline-block text-blue-700 italic">
|
||||||
{{tag}}
|
{{tag}}
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
BIN
static/images/uploads/bein_logo.af017869.webp
Normal file
BIN
static/images/uploads/bein_logo.af017869.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
86
static/images/uploads/ck_vive_logo.svg
Normal file
86
static/images/uploads/ck_vive_logo.svg
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 172 75" style="enable-background:new 0 0 172 75;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{clip-path:url(#SVGID_2_);fill:url(#SVGID_3_);}
|
||||||
|
.st1{clip-path:url(#SVGID_5_);fill:url(#SVGID_6_);}
|
||||||
|
.st2{fill:#A72C32;}
|
||||||
|
.st3{fill:#ED1C24;}
|
||||||
|
</style>
|
||||||
|
<g>
|
||||||
|
<defs>
|
||||||
|
<path id="SVGID_1_" d="M122.7,21.2C122.7,21.2,122.7,21.2,122.7,21.2c-6.7-7.5-15-14.7-24.9-17.4l0,0c15.2-4.4,29-1.4,41,15.8l0,0
|
||||||
|
l-3,2.5C132,25.5,126.1,25.1,122.7,21.2L122.7,21.2z"/>
|
||||||
|
</defs>
|
||||||
|
<clipPath id="SVGID_2_">
|
||||||
|
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
|
||||||
|
</clipPath>
|
||||||
|
|
||||||
|
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="10.3229" y1="463.0904" x2="10.6827" y2="463.0904" gradientTransform="matrix(56.4463 43.9349 -41.9345 53.8764 18943.2227 -25399.9766)">
|
||||||
|
<stop offset="0" style="stop-color:#7C1C1E"/>
|
||||||
|
<stop offset="1" style="stop-color:#C9234A"/>
|
||||||
|
</linearGradient>
|
||||||
|
<polygon class="st0" points="85.2,15.7 123.4,45.4 151.5,9.2 113.3,-20.5 "/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<defs>
|
||||||
|
<path id="SVGID_4_" d="M114.3,2.3c-5.5-1-23.6-1.5-28.9-0.6c-8.2,1.8-24,15.5-51.9,40.7C58.3,24.9,82.1,4.8,114.3,2.3"/>
|
||||||
|
</defs>
|
||||||
|
<clipPath id="SVGID_5_">
|
||||||
|
<use xlink:href="#SVGID_4_" style="overflow:visible;"/>
|
||||||
|
</clipPath>
|
||||||
|
|
||||||
|
<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="12.5912" y1="456.284" x2="13.1524" y2="456.284" gradientTransform="matrix(-120.901 74.4084 -61.6717 -100.2061 29764.8125 44789.3945)">
|
||||||
|
<stop offset="0" style="stop-color:#ED1B2F"/>
|
||||||
|
<stop offset="1" style="stop-color:#9E0B0F"/>
|
||||||
|
</linearGradient>
|
||||||
|
<polygon class="st1" points="92.1,-35.3 14.9,12.2 55.7,78.4 132.8,31 "/>
|
||||||
|
</g>
|
||||||
|
<path class="st2" d="M109.5,49.3l-8.2-18.1c-1.3,0-2.6,0-3.9,0l10.3,22L109.5,49.3z"/>
|
||||||
|
<polygon class="st3" points="25.1,31.2 21.3,31.2 13.1,49.3 4.9,31.2 1,31.2 13,57.1 13.1,57.1 "/>
|
||||||
|
<rect x="59.5" y="31.2" class="st3" width="3.5" height="25.5"/>
|
||||||
|
<path class="st3" d="M121.5,31.2c-3.2,0-4.1,0.7-5.4,3.7l-8.4,18.3l1.8,3.9C113.5,48.5,117.5,39.8,121.5,31.2"/>
|
||||||
|
<path class="st3" d="M171.1,31.2h-15.8v25.5h16.1v-3.3H168h-9.2v-8.1h10.8v-3.2h-10.8c0-2.6,0-5.2,0-7.7c4.1,0,8.2,0,12.3,0
|
||||||
|
C171.1,33.4,171.1,32.3,171.1,31.2"/>
|
||||||
|
<path class="st2" d="M136.8,71.5l0.5,1.3h-1.1L136.8,71.5z M136.8,69.8L136.8,69.8l-2.1,4.3h1l0.3-0.7h1.6l0.3,0.7h1L136.8,69.8z
|
||||||
|
M132.3,69.9h-0.9v4.3h0.9V69.9z M127.2,70.6c0.1,0,0.3,0,0.4,0.1c0.1,0,0.2,0.1,0.2,0.2c0.1,0.1,0.1,0.2,0.1,0.3
|
||||||
|
c0,0.1,0,0.2-0.1,0.3c-0.1,0.1-0.1,0.2-0.2,0.2c-0.1,0-0.2,0.1-0.4,0.1h-0.7v-1.2H127.2z M127.3,69.9h-1.7v4.3h0.9v-1.5h0.6l0.9,1.5
|
||||||
|
h1l-1-1.6c0.2-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.2-0.3,0.3-0.4c0.1-0.2,0.1-0.3,0.1-0.5c0-0.2,0-0.4-0.1-0.6c-0.1-0.2-0.2-0.3-0.3-0.4
|
||||||
|
c-0.1-0.1-0.3-0.2-0.5-0.3C127.7,69.9,127.5,69.9,127.3,69.9z M122.4,68.9h-1l-0.7,0.7h0.8L122.4,68.9z M121.1,71.5l0.5,1.3h-1.1
|
||||||
|
L121.1,71.5z M121.1,69.8L121.1,69.8l-2.1,4.3h1l0.3-0.7h1.6l0.3,0.7h1L121.1,69.8z M115.2,69.9h-0.9v4.3h2.7v-0.8h-1.8V69.9z
|
||||||
|
M111.7,69.9h-2.7v4.3h2.8v-0.8h-1.9v-1h1.6v-0.7h-1.6v-0.9h1.9V69.9z M104.9,69.8c-0.3,0-0.5,0-0.7,0.1c-0.2,0.1-0.4,0.2-0.6,0.3
|
||||||
|
c-0.2,0.1-0.3,0.3-0.5,0.5c-0.1,0.2-0.2,0.4-0.3,0.6c-0.1,0.2-0.1,0.5-0.1,0.7c0,0.3,0,0.5,0.1,0.7c0.1,0.2,0.2,0.4,0.3,0.6
|
||||||
|
c0.1,0.2,0.3,0.3,0.5,0.5c0.2,0.1,0.4,0.2,0.6,0.3c0.2,0.1,0.5,0.1,0.7,0.1c0.2,0,0.4,0,0.6-0.1c0.2,0,0.4-0.1,0.5-0.2
|
||||||
|
c0.2-0.1,0.3-0.2,0.5-0.4l-0.5-0.6c-0.1,0.1-0.2,0.2-0.3,0.2c-0.1,0.1-0.2,0.1-0.3,0.2c-0.1,0-0.3,0.1-0.4,0.1c-0.2,0-0.4,0-0.5-0.1
|
||||||
|
c-0.2-0.1-0.3-0.2-0.4-0.3c-0.1-0.1-0.2-0.3-0.3-0.4c-0.1-0.2-0.1-0.4-0.1-0.6c0-0.2,0-0.4,0.1-0.6c0.1-0.2,0.1-0.3,0.3-0.4
|
||||||
|
c0.1-0.1,0.2-0.2,0.4-0.3c0.2-0.1,0.3-0.1,0.5-0.1c0.1,0,0.3,0,0.4,0.1c0.1,0,0.2,0.1,0.3,0.2c0.1,0.1,0.2,0.2,0.3,0.2l0.6-0.6
|
||||||
|
c-0.1-0.1-0.3-0.3-0.4-0.4c-0.2-0.1-0.3-0.2-0.5-0.2C105.3,69.8,105.1,69.8,104.9,69.8z M100.2,69.9h-0.9v2.4l-2.5-2.4h0v4.3h0.9
|
||||||
|
v-2.4l2.5,2.4h0V69.9z M92.3,71.5l0.5,1.3h-1.1L92.3,71.5z M92.3,69.8L92.3,69.8l-2.1,4.3h1l0.3-0.7h1.6l0.3,0.7h1L92.3,69.8z
|
||||||
|
M88,69.9h-1l-1.4,2.5v-2.5h-0.9v4.3h0.7l0.9-1.4l1,1.4h1.1l-1.5-2.2L88,69.9z M78.1,68.9h-1l-0.7,0.7h0.8L78.1,68.9z M76.9,71.5
|
||||||
|
l0.5,1.3h-1.1L76.9,71.5z M76.9,69.8L76.9,69.8l-2.1,4.3h1l0.3-0.7h1.6l0.3,0.7h1L76.9,69.8z M72.4,69.9h-0.9v2.4L69,69.8h0v4.3h0.9
|
||||||
|
v-2.4l2.5,2.4h0V69.9z M66.5,69.9h-1l-1.1,2.5l-1.1-2.5h-1l2,4.3h0L66.5,69.9z M58.3,70.6c0.2,0,0.4,0,0.5,0.1
|
||||||
|
c0.2,0.1,0.3,0.2,0.4,0.3c0.1,0.1,0.2,0.3,0.3,0.4c0.1,0.2,0.1,0.4,0.1,0.6c0,0.2,0,0.4-0.1,0.6c-0.1,0.2-0.2,0.3-0.3,0.4
|
||||||
|
c-0.1,0.1-0.3,0.2-0.4,0.3c-0.2,0.1-0.3,0.1-0.5,0.1c-0.2,0-0.4,0-0.5-0.1c-0.2-0.1-0.3-0.2-0.4-0.3c-0.1-0.1-0.2-0.3-0.3-0.4
|
||||||
|
C57,72.4,57,72.2,57,72c0-0.2,0-0.4,0.1-0.6c0.1-0.2,0.2-0.3,0.3-0.4c0.1-0.1,0.3-0.2,0.4-0.3C57.9,70.6,58.1,70.6,58.3,70.6z
|
||||||
|
M58.3,69.8c-0.3,0-0.6,0.1-0.9,0.2c-0.3,0.1-0.5,0.3-0.7,0.5c-0.2,0.2-0.3,0.4-0.5,0.7c-0.1,0.3-0.2,0.6-0.2,0.9
|
||||||
|
c0,0.3,0.1,0.6,0.2,0.9c0.1,0.3,0.3,0.5,0.5,0.7c0.2,0.2,0.4,0.3,0.7,0.5c0.3,0.1,0.6,0.2,0.9,0.2c0.3,0,0.5,0,0.7-0.1
|
||||||
|
c0.2-0.1,0.4-0.2,0.6-0.3c0.2-0.1,0.3-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.6c0.1-0.2,0.1-0.5,0.1-0.7c0-0.3,0-0.5-0.1-0.7
|
||||||
|
c-0.1-0.2-0.2-0.4-0.3-0.6c-0.1-0.2-0.3-0.3-0.5-0.5c-0.2-0.1-0.4-0.2-0.6-0.3C58.7,69.8,58.5,69.8,58.3,69.8z M53.8,69.9h-3.6v0.8
|
||||||
|
h1.4v3.5h0.9v-3.5h1.4V69.9z M46.4,69.8c-0.2,0-0.4,0-0.6,0.1c-0.2,0.1-0.3,0.2-0.5,0.3c-0.1,0.1-0.2,0.3-0.3,0.4
|
||||||
|
c-0.1,0.2-0.1,0.3-0.1,0.5c0,0.2,0,0.3,0.1,0.4c0,0.1,0.1,0.3,0.2,0.4c0.1,0.1,0.3,0.2,0.4,0.3c0.2,0.1,0.4,0.2,0.7,0.2
|
||||||
|
c0.2,0,0.4,0.1,0.5,0.1c0.1,0,0.2,0.1,0.3,0.2c0.1,0.1,0.1,0.1,0.1,0.2c0,0.2-0.1,0.3-0.2,0.4c-0.1,0.1-0.3,0.1-0.5,0.1
|
||||||
|
c-0.1,0-0.3,0-0.4-0.1c-0.1,0-0.3-0.1-0.4-0.2c-0.1-0.1-0.2-0.2-0.3-0.3l-0.5,0.7c0.1,0.1,0.3,0.2,0.5,0.3c0.2,0.1,0.4,0.1,0.6,0.2
|
||||||
|
c0.2,0,0.4,0.1,0.6,0.1c0.3,0,0.5,0,0.7-0.1c0.2-0.1,0.4-0.2,0.5-0.3c0.1-0.1,0.2-0.3,0.3-0.4C48,73.2,48,73,48,72.8
|
||||||
|
c0-0.2,0-0.3-0.1-0.4c0-0.1-0.1-0.3-0.2-0.4c-0.1-0.1-0.3-0.2-0.4-0.3c-0.2-0.1-0.4-0.1-0.7-0.2c-0.2,0-0.3-0.1-0.4-0.1
|
||||||
|
c-0.1,0-0.2-0.1-0.2-0.1c-0.1,0-0.1-0.1-0.1-0.1c0,0,0-0.1,0-0.2c0-0.1,0-0.2,0.1-0.3c0-0.1,0.1-0.1,0.2-0.2c0.1,0,0.2,0,0.3,0
|
||||||
|
c0.2,0,0.3,0,0.4,0c0.1,0,0.2,0.1,0.3,0.1c0.1,0.1,0.2,0.1,0.3,0.2l0.5-0.7c-0.1-0.1-0.3-0.2-0.4-0.2c-0.2-0.1-0.3-0.1-0.5-0.2
|
||||||
|
C46.8,69.8,46.6,69.8,46.4,69.8z M42.4,69.9h-2.7v4.3h2.8v-0.8h-1.9v-1h1.6v-0.7h-1.6v-0.9h1.9V69.9z M35.7,69.8
|
||||||
|
c-0.3,0-0.5,0-0.7,0.1c-0.2,0.1-0.4,0.2-0.6,0.3c-0.2,0.1-0.3,0.3-0.5,0.5c-0.1,0.2-0.2,0.4-0.3,0.6c-0.1,0.2-0.1,0.5-0.1,0.7
|
||||||
|
c0,0.3,0,0.5,0.1,0.7c0.1,0.2,0.2,0.4,0.3,0.6c0.1,0.2,0.3,0.3,0.5,0.5c0.2,0.1,0.4,0.2,0.6,0.3c0.2,0.1,0.5,0.1,0.7,0.1
|
||||||
|
c0.2,0,0.4,0,0.6-0.1c0.2,0,0.4-0.1,0.5-0.2c0.2-0.1,0.3-0.2,0.5-0.4l-0.5-0.6c-0.1,0.1-0.2,0.2-0.3,0.2c-0.1,0.1-0.2,0.1-0.3,0.2
|
||||||
|
c-0.1,0-0.3,0.1-0.4,0.1c-0.2,0-0.4,0-0.5-0.1c-0.2-0.1-0.3-0.2-0.4-0.3c-0.1-0.1-0.2-0.3-0.3-0.4c-0.1-0.2-0.1-0.4-0.1-0.6
|
||||||
|
c0-0.2,0-0.4,0.1-0.6c0.1-0.2,0.1-0.3,0.3-0.4c0.1-0.1,0.2-0.2,0.4-0.3c0.2-0.1,0.3-0.1,0.5-0.1c0.1,0,0.3,0,0.4,0.1
|
||||||
|
c0.1,0,0.2,0.1,0.3,0.2c0.1,0.1,0.2,0.2,0.3,0.2l0.6-0.6c-0.1-0.1-0.3-0.3-0.4-0.4c-0.2-0.1-0.3-0.2-0.5-0.2
|
||||||
|
C36.1,69.8,35.9,69.8,35.7,69.8z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 7.0 KiB |
BIN
static/images/uploads/docker-use-cases.png
(Stored with Git LFS)
Normal file
BIN
static/images/uploads/docker-use-cases.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
static/images/uploads/fx_sales_screen2x.png
(Stored with Git LFS)
Normal file
BIN
static/images/uploads/fx_sales_screen2x.png
(Stored with Git LFS)
Normal file
Binary file not shown.
13
static/images/uploads/heyladylogo.svg
Normal file
13
static/images/uploads/heyladylogo.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 83 KiB |
BIN
static/images/uploads/logo.png
(Stored with Git LFS)
Normal file
BIN
static/images/uploads/logo.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
static/images/uploads/screenshot-from-2024-08-06-18-22-52.png
(Stored with Git LFS)
Normal file
BIN
static/images/uploads/screenshot-from-2024-08-06-18-22-52.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
static/images/uploads/screenshot-from-2024-08-06-18-48-02.png
(Stored with Git LFS)
Normal file
BIN
static/images/uploads/screenshot-from-2024-08-06-18-48-02.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
static/images/uploads/screenshot-from-2024-08-06-18-52-41.png
(Stored with Git LFS)
Normal file
BIN
static/images/uploads/screenshot-from-2024-08-06-18-52-41.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
static/images/uploads/screenshot-from-2024-08-06-19-01-03.png
(Stored with Git LFS)
Normal file
BIN
static/images/uploads/screenshot-from-2024-08-06-19-01-03.png
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -143,6 +143,12 @@ collections:
|
|||||||
default: true,
|
default: true,
|
||||||
}
|
}
|
||||||
- { label: Description, name: description, widget: markdown }
|
- { label: Description, name: description, widget: markdown }
|
||||||
|
- {
|
||||||
|
label: Link,
|
||||||
|
name: link,
|
||||||
|
widget: string,
|
||||||
|
required: false,
|
||||||
|
}
|
||||||
- {
|
- {
|
||||||
label: Cover image,
|
label: Cover image,
|
||||||
name: cover_image,
|
name: cover_image,
|
||||||
|
Loading…
Reference in New Issue
Block a user