Projects moved and finished to showcase on index

This commit is contained in:
Michal Vanko 2024-08-06 22:45:30 +02:00
parent 8b6dbc83c7
commit 6dc6a581e3
37 changed files with 482 additions and 90 deletions

View 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
---

View 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
---

View 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
---

View 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
---

View File

@ -0,0 +1,9 @@
---
title: dev project test
displayed: true
description: Testing project
classification: webapp
tags:
- Webapp
featured: false
---

View 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
---

View 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
---

View 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
---

View 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
---

View 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
---

View 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
---

View 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
---

View 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
---

View 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
---

View 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
---

View 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
---

View 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
---

View 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
---

View File

@ -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
---

View 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
---

View File

@ -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;
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
.into_iter()
.filter(|post| post.metadata.featured)
.map(|mut post| {
post.metadata.description = parse_html(&post.metadata.description);
post
})
.collect();
Ok(featured_projects)

View File

@ -9,4 +9,15 @@ pub struct ProjectMetadata {
pub cover_image: Option<String>,
pub tags: Vec<String>,
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,
}
}

View File

@ -40,7 +40,7 @@ pub async fn parse_post<'de, Metadata: DeserializeOwned>(
.parse_with_struct::<Metadata>(&file_contents)
.ok_or_else(|| {
tracing::error!("Failed to parse metadata");
return StatusCode::INTERNAL_SERVER_ERROR;
StatusCode::INTERNAL_SERVER_ERROR
})?;
let body = parse_html(&metadata.content);
@ -52,14 +52,14 @@ pub async fn parse_post<'de, Metadata: DeserializeOwned>(
.ok_or(StatusCode::INTERNAL_SERVER_ERROR)?
.to_owned();
return Ok(ParseResult {
Ok(ParseResult {
body,
metadata: metadata.data,
slug: filename,
});
})
}
fn parse_html(markdown: &str) -> String {
pub fn parse_html(markdown: &str) -> String {
let mut options = Options::empty();
options.insert(Options::ENABLE_TABLES);
options.insert(Options::ENABLE_FOOTNOTES);
@ -68,45 +68,45 @@ fn parse_html(markdown: &str) -> String {
options.insert(Options::ENABLE_SMART_PUNCTUATION);
options.insert(Options::ENABLE_HEADING_ATTRIBUTES);
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
// Therefore the `[alt]` is rendered in html as subtitle
// and the `[](url "title")` `title` is rendered as `alt` attribute
Tag::Image {
link_type,
dest_url,
title,
id,
} => {
println!(
"Image link_type: {:?} url: {} title: {} id: {}",
link_type, dest_url, title, id
);
// TODO src set
Event::Html(
format!(
r#"<figure>
let parser = Parser::new_ext(markdown, options).map(|event| match event {
/*
Parsing images considers `alt` attribute as inner `Text` event
Therefore the `[alt]` is rendered in html as subtitle
and the `[](url "title")` `title` is rendered as `alt` attribute
*/
Event::Start(Tag::Image {
link_type,
dest_url,
title,
id,
}) => {
println!(
"Image link_type: {:?} url: {} title: {} id: {}",
link_type, dest_url, title, id
);
// TODO src set
Event::Html(
format!(
r#"<figure>
<img
alt="{alt}"
src="{src}"
/>
<figcaption>
"#,
alt = title,
src = dest_url,
)
.into(),
alt = title,
src = dest_url,
)
}
_ => event,
},
.into(),
)
}
Event::Start(_) => event,
Event::End(TagEnd::Image) => Event::Html("</figcaption></figure>".into()),
_ => event,
});
// Write to String buffer.
// Write to String buffer
let mut html = String::new();
pulldown_cmark::html::push_html(&mut html, parser);
return html;
html
}

View File

@ -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);
}

View File

@ -624,6 +624,16 @@ video {
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 {
margin-bottom: 0.25rem;
}
@ -644,6 +654,10 @@ video {
margin-top: 0.75rem;
}
.mt-1 {
margin-top: 0.25rem;
}
.block {
display: block;
}
@ -892,6 +906,11 @@ video {
line-height: 1.25rem;
}
.text-xl {
font-size: 1.25rem;
line-height: 1.75rem;
}
.font-bold {
font-weight: 700;
}

View File

@ -1,34 +1,45 @@
<article>
<article class="border rounded-md bg-white m-4 p-4">
<header class="px-4 mb-3">
<h2 class="text-3xl font-semibold text-blue-900">
{{project.metadata.title}}
<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}}
</a>
{% when None %}
{{project.metadata.title}}
{% endmatch %}
</h2>
<p class="px-5 text-gray-800">
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>
<p class="text-gray-800 text-lg my-2">
{{project.metadata.description|safe}}
</p>
</header>
<!-- <hr class="border-blue-950 my-5"> -->
{% match project.metadata.cover_image %}
{% when Some with (source) %}
<figure>
<!-- <img src="{{source}}" /> -->
<figure class="my-2">
{% match project.metadata.link %}
{% when Some with (href) %}
<a href="{{href}}">
<img src="{{source}}" />
</a>
{% when None %}
<img src="{{source}}" />
{% endmatch %}
<!-- TODO <figure> -->
<svg aria-hidden="true" class="h-12 w-12 fill-blue-950">
<use xlink:href="/svg/icons-sprite.svg#mail" />
</svg>
</figure>
{% when None %}
{% endmatch %}
<footer class="text-sm">
<h3 class="text-3xl font-semibold text-blue-900">
TODO classification
<footer class="text-sm px-4">
<h3 class="text-xl font-semibold text-blue-900 my-2">
{{crate::pages::project::translate_classification(project.metadata.classification)}}
</h3>
<ul class="inline-block">
{% for tag in project.metadata.tags %}
<li class="inline-block">
<li class="inline-block text-blue-700 italic">
{{tag}}
</li>
{% endfor %}

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View 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

Binary file not shown.

BIN
static/images/uploads/fx_sales_screen2x.png (Stored with Git LFS) Normal file

Binary file not shown.

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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -143,6 +143,12 @@ collections:
default: true,
}
- { label: Description, name: description, widget: markdown }
- {
label: Link,
name: link,
widget: string,
required: false,
}
- {
label: Cover image,
name: cover_image,