2 Commits

Author SHA1 Message Date
Tuan-Dat Tran
fef5d771ba feat(dioxus): bump
Signed-off-by: Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>
2025-11-04 01:00:50 +01:00
Tuan-Dat Tran
1284dd9dd6 chore: recompile
Signed-off-by: Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>
2025-11-03 23:09:31 +01:00
15 changed files with 1872 additions and 1574 deletions

3240
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "athome" name = "athome"
version = "0.4.1" version = "0.2.0"
authors = ["Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>"] authors = ["Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>"]
edition = "2021" edition = "2021"
@@ -8,28 +8,17 @@ edition = "2021"
[dependencies] [dependencies]
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
dioxus = { version = "0.6", features = ["fullstack", "router"] } dioxus = { version = "0.7.0", features = ["fullstack", "router"] }
# Debug # Debug
tracing = "0.1.40" tracing = "0.1.40"
dioxus-logger = "0.6.0" dioxus-logger = "0.7.0"
dioxus-i18n = "0.4.0" dioxus-i18n = { git = "https://github.com/Kannen/dioxus-i18n/", branch = "main"}
tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] } tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] }
[features] [features]
default = [] default = ["web"]
web = ["dioxus/web"] web = ["dioxus/web"]
desktop = ["dioxus/desktop"] desktop = ["dioxus/desktop"]
mobile = ["dioxus/mobile"]
server = ["dioxus/server"] server = ["dioxus/server"]
[profile]
[profile.wasm-dev]
inherits = "dev"
opt-level = 1
[profile.server-dev]
inherits = "dev"
[profile.android-dev]
inherits = "dev"

View File

@@ -723,18 +723,10 @@ video {
max-width: 36rem; max-width: 36rem;
} }
.flex-auto {
flex: 1 1 auto;
}
.flex-grow { .flex-grow {
flex-grow: 1; flex-grow: 1;
} }
.grow {
flex-grow: 1;
}
.cursor-pointer { .cursor-pointer {
cursor: pointer; cursor: pointer;
} }
@@ -747,14 +739,6 @@ video {
flex-wrap: wrap; flex-wrap: wrap;
} }
.content-center {
align-content: center;
}
.items-start {
align-items: flex-start;
}
.items-center { .items-center {
align-items: center; align-items: center;
} }
@@ -771,10 +755,6 @@ video {
justify-content: space-between; justify-content: space-between;
} }
.justify-stretch {
justify-content: stretch;
}
.gap-2 { .gap-2 {
gap: 0.5rem; gap: 0.5rem;
} }
@@ -801,10 +781,6 @@ video {
margin-bottom: calc(2rem * var(--tw-space-y-reverse)); margin-bottom: calc(2rem * var(--tw-space-y-reverse));
} }
.self-stretch {
align-self: stretch;
}
.rounded { .rounded {
border-radius: 0.25rem; border-radius: 0.25rem;
} }
@@ -1071,10 +1047,6 @@ video {
text-transform: uppercase; text-transform: uppercase;
} }
.italic {
font-style: italic;
}
.leading-none { .leading-none {
line-height: 1; line-height: 1;
} }

View File

@@ -61,15 +61,15 @@ cv_workexperience_ra_ude_description = Während meiner Tätigkeit bei der
aufgebaut und verwaltet. aufgebaut und verwaltet.
cv_workexperience_dd_devops_title = DevOps Engineer @ DextraData cv_workexperience_dd_devops_title = DevOps Engineer @ DextraData
cv_workexperience_dd_devops_time = 2025 - Jetzt cv_workexperience_dd_devops_time = 2025 - Jetzt
cv_workexperience_dd_devops_description = Als DevOps Engineer bei DextraData cv_workexperience_dd_devops_description = Als DevOps Engineer war ich
bin ich für die Cloud-basierte Infrastruktur hinter den vielfältigen verantwortlich für das Design, die Implementierung und die Wartung
SaaS-Produkten des Unternehmens verantwortlich. Ich arbeite eng mit skalierbarer Infrastrukturlösungen in verschiedenen SaaS-Produktumgebungen.
Software-Entwicklern, Customer Success Managern und Customer Success Engineers Dies umfasste die Standardisierung und Optimierung von CI/CD-Pipelines sowie
zusammen, um betriebliche Exzellenz und unterbrechungsfreie Servicebereitstellung den Aufbau robuster Monitoring-Frameworks zur Gewährleistung hoher
für unsere Kunden zu gewährleisten, wobei ihre spezifischen Anforderungen im Verfügbarkeit und Performance. Meine Arbeit konzentrierte sich auf einen
Vordergrund stehen. Ich verwalte Kubernetes-Cluster-Deployments, überwache "Shift-Left"-Ansatz, der Entwicklungsteams durch Self-Service-Funktionen und
kontinuierlich Deployment-Gesundheitsmetriken und implementiere optimierte operative Workflows befähigte, sowie auf die Verbesserung der
Infrastructure-as-Code-Lösungen. Systemzuverlässigkeit und -sicherheit.
cv_socials_title = Profile cv_socials_title = Profile
cv_education_title = Bildungsweg cv_education_title = Bildungsweg
cv_education_bachelor_title = BSc Angewandte Informatik - Systems Engineering cv_education_bachelor_title = BSc Angewandte Informatik - Systems Engineering
@@ -147,7 +147,7 @@ publications_projects_projects_athome_description = Diese Website ist eine mit
impressum_on = Impressum impressum_on = Impressum
component_under_construction = Diese Seite befindet sich gerade im Aufbau component_under_construction = Diese Seite befindet sich gerade im Aufbau
footer_year = © 2025 footer_year = © 2025
footer_name = Tuan-Dat Tran footer_name = Tuan-Dat Tran
footer_rights = . All Rights Reserved. footer_rights = . All Rights Reserved.
footer_contact = Kontakt footer_contact = Kontakt
link_opens_new_tab = (öffnet in neuem Tab) link_opens_new_tab = (öffnet in neuem Tab)

View File

@@ -13,6 +13,7 @@ home_card_text =
home_card_contact_button = Get in touch. home_card_contact_button = Get in touch.
cv_introduction_title = DevOps Engineer | Homelab Enthusiast cv_introduction_title = DevOps Engineer | Homelab Enthusiast
cv_introduction_0 = cv_introduction_0 =
A results-driven DevOps Engineer with a career in technology spanning over 8 years. My journey began with foundational part-time roles in software development (C#, Python) and academic research during my university studies. Now, I apply this deep technical understanding to my full-time DevOps role, where I specialize in building and maintaining scalable, high-availability SaaS infrastructure using Kubernetes, Azure, ArgoCD, and Ansible.
DevOps Engineer and Software Developer with a strong academic background in DevOps Engineer and Software Developer with a strong academic background in
networking technologies and software development. Specialized in Kubernetes, networking technologies and software development. Specialized in Kubernetes,
Ansible, Azure, and modern cloud technologies. Hands-on research experience Ansible, Azure, and modern cloud technologies. Hands-on research experience
@@ -57,14 +58,14 @@ cv_workexperience_ra_ude_description = While working at the Network
infractructure, inventory system and online presence. infractructure, inventory system and online presence.
cv_workexperience_dd_devops_title = DevOps Engineer @ DextraData cv_workexperience_dd_devops_title = DevOps Engineer @ DextraData
cv_workexperience_dd_devops_time = 2025 - now cv_workexperience_dd_devops_time = 2025 - now
cv_workexperience_dd_devops_description = As a DevOps Engineer at DextraData, cv_workexperience_dd_devops_description = As a DevOps Engineer, I was
I'm responsible for the cloud-based infrastructure behind the company's many responsible for designing, implementing, and maintaining scalable
SaaS products. I work closely with software developers, Customer Success infrastructure solutions across multiple SaaS product environments. This
Managers, and Customer Success Engineers to ensure operational excellence involved standardizing and optimizing CI/CD pipelines and establishing
and seamless service delivery for our customers, always keeping their robust monitoring frameworks to ensure high availability and performance.
specific needs in mind. My duties include managing Kubernetes cluster My work focused on a "shift-left" approach, empowering development teams
deployments, continuously monitoring deployment health metrics, and with self-service capabilities and streamlined operational workflows as
implementing Infrastructure-as-Code solutions. well as enhancement of system reliability and security.
cv_socials_title = Socials cv_socials_title = Socials
cv_education_title = Education cv_education_title = Education
cv_education_bachelor_title = BSc Systems Engineering cv_education_bachelor_title = BSc Systems Engineering
@@ -139,7 +140,7 @@ publications_projects_projects_athome_description = This website is a
impressum_on = Impressum impressum_on = Impressum
component_under_construction = This page is currently under construction component_under_construction = This page is currently under construction
footer_year = © 2025 footer_year = © 2025
footer_name = Tuan-Dat Tran footer_name = Tuan-Dat Tran
footer_rights = . All Rights Reserved. footer_rights = . All Rights Reserved.
footer_contact = Contact footer_contact = Contact
link_opens_new_tab = (opens in a new tab) link_opens_new_tab = (opens in a new tab)

24
package-lock.json generated
View File

@@ -4,6 +4,9 @@
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"dependencies": {
"caniuse-lite": "^1.0.30001753"
},
"devDependencies": { "devDependencies": {
"tailwindcss": "^3.4.3" "tailwindcss": "^3.4.3"
} }
@@ -227,6 +230,26 @@
"node": ">= 6" "node": ">= 6"
} }
}, },
"node_modules/caniuse-lite": {
"version": "1.0.30001753",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz",
"integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "CC-BY-4.0"
},
"node_modules/chokidar": { "node_modules/chokidar": {
"version": "3.6.0", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -782,6 +805,7 @@
"url": "https://github.com/sponsors/ai" "url": "https://github.com/sponsors/ai"
} }
], ],
"peer": true,
"dependencies": { "dependencies": {
"nanoid": "^3.3.7", "nanoid": "^3.3.7",
"picocolors": "^1.0.0", "picocolors": "^1.0.0",

View File

@@ -1,5 +1,8 @@
{ {
"devDependencies": { "devDependencies": {
"tailwindcss": "^3.4.3" "tailwindcss": "^3.4.3"
},
"dependencies": {
"caniuse-lite": "^1.0.30001753"
} }
} }

View File

@@ -1,3 +1,3 @@
[toolchain] [toolchain]
channel = "1.86.0" channel = "1.91.0"
components = ["rustfmt", "clippy", "rust-analyzer"] components = ["rustfmt", "clippy", "rust-analyzer"]

View File

@@ -13,7 +13,7 @@ pub fn CV() -> Element {
img { img {
class: "rounded-full w-24 h-24", class: "rounded-full w-24 h-24",
alt: "headshot", alt: "headshot",
src: asset!("./assets/pictures/headshot.webp") src: asset!("/assets/pictures/headshot.webp")
} }
Introduction {}, Introduction {},
Socials {} Socials {}
@@ -39,7 +39,7 @@ fn Introduction() -> Element {
P { P {
{ t!("cv_introduction_tools") }, { t!("cv_introduction_tools") },
" ", " ",
AccessibleLink { new_tab: true, to: "https://www.lazyvim.org/", "NeoVim (LazyVim)" }, AccessibleLink { new_tab: true, to: "https://www.lazyvim.org/", "NeoVim" },
", ", ", ",
AccessibleLink { new_tab: true, to: "https://zellij.dev/", "Zellij" }, AccessibleLink { new_tab: true, to: "https://zellij.dev/", "Zellij" },
", ", ", ",
@@ -57,7 +57,7 @@ fn WorkExperience() -> Element {
ol { ol {
class:"relative border-s border-gray-700", class:"relative border-s border-gray-700",
CVEntry {time: t!("cv_workexperience_dd_devops_time"), title: t!("cv_workexperience_dd_devops_title"), CVEntry {time: t!("cv_workexperience_dd_devops_time"), title: t!("cv_workexperience_dd_devops_title"),
technologies: vec!["Kubernetes".to_string(), "ArgoCD".to_string(), "Ansible".to_string(), "Azure".to_string(), "ELK".to_string(), "Helm".to_string()], technologies: vec!["Kubernetes".to_string(), "ArgoCD".to_string(), "Ansible".to_string(), "Azure".to_string(), "Elastic Stack".to_string(), "Helm".to_string()],
description: t!("cv_workexperience_dd_devops_description") description: t!("cv_workexperience_dd_devops_description")
}, },
CVEntry {time: t!("cv_workexperience_ra_ude_time"), title: t!("cv_workexperience_ra_ude_title"), CVEntry {time: t!("cv_workexperience_ra_ude_time"), title: t!("cv_workexperience_ra_ude_title"),
@@ -210,7 +210,7 @@ fn Socials() -> Element {
H4 { { t!("cv_socials_title") } }, H4 { { t!("cv_socials_title") } },
div { div {
class: "flex justify-center items-center space-x-4", class: "flex justify-center items-center space-x-4",
P { AccessibleLink { to:"https://www.linkedin.com/in/tudattr/", class:"hover:underline", new_tab: true, img { class: "h-8", src:asset!("./assets/pictures/LI-Bug.svg.original.svg"), alt:"LinkedIn Logo" } }}, P { AccessibleLink { to:"https://www.linkedin.com/in/tudattr/", class:"hover:underline", new_tab: true, img { class: "h-8", src:asset!("/assets/pictures/LI-Bug.svg.original.svg"), alt:"LinkedIn Logo" } }},
} }
} }
} }

View File

@@ -10,7 +10,7 @@ pub fn Home() -> Element {
Card { Card {
name: t!("home_card_name"), name: t!("home_card_name"),
gender: t!("home_card_gender"), gender: t!("home_card_gender"),
picture: asset!("./assets/pictures/headshot.webp"), picture: asset!("/assets/pictures/headshot.webp"),
div { div {
class: "py-4", class: "py-4",
div { div {

View File

@@ -1,59 +1,30 @@
use dioxus::prelude::*; use dioxus::prelude::*;
use dioxus_i18n::t;
use crate::components::{H1, HR, P}; use crate::components::{H1, HR, P};
#[component] #[component]
pub fn Impressum() -> Element { pub fn Impressum() -> Element {
let mut impressum = use_signal(Vec::<String>::new);
let mut contact = use_signal(Vec::<String>::new);
rsx! { rsx! {
div { div {
div { div {
class: "flex flex-col items-center", class: "flex flex-col items-center",
button { H1 { "Impressum" },
onclick: move |_| async move {
if let Ok(data) = get_impressum().await {
impressum.set(data.clone());
}
if let Ok(data) = get_contact().await {
contact.set(data.clone());
}
},
H1 { { t!("impressum_on") } },
},
}, },
HR{},
div { div {
class: "flex flex-col items-center", class: "flex flex-col items-center",
for line in impressum() { P { {"Tuan-Dat Tran"} },
P { {line} } P { {"c/o AutorenServices.de"} },
} P { {"Birkenallee 24"} },
P { {"36037 Fulda"} },
} }
if !impressum.read().is_empty() { HR{} }, HR{},
div { div {
class: "flex flex-col items-center", class: "flex flex-col items-center",
for line in contact() { P { {"tuan-dat.tran(at)tudattr(dot)dev"} },
P { {line} } P { {"+49 17(six) 83(four)683(eight)8"} },
}
} }
} }
} }
} }
#[server(GetServerData)]
async fn get_impressum() -> Result<Vec<String>, ServerFnError> {
Ok(vec![
"Tuan-Dat Tran".to_string(),
"c/o AutorenServices.de".to_string(),
"Birkenallee 24".to_string(),
"36037 Fulda".to_string(),
])
}
async fn get_contact() -> Result<Vec<String>, ServerFnError> {
Ok(vec![
"tuan-dat.tran(at)tudattr(dot)dev".to_string(),
"+49 17(six) 83(four)683(eight)8".to_string(),
])
}

View File

@@ -12,7 +12,9 @@ pub fn Footer() -> Element {
span { span {
class:"text-sm sm:text-center text-gray-400", class:"text-sm sm:text-center text-gray-400",
{ t!("footer_year") }, { t!("footer_year") },
" ",
a { href: "#", class: "hover:underline", { t!("footer_name") }}, a { href: "#", class: "hover:underline", { t!("footer_name") }},
" ",
{ t!("footer_rights") } { t!("footer_rights") }
} }
ul { ul {

View File

@@ -1,5 +1,5 @@
use dioxus::prelude::*; use dioxus::prelude::*;
use dioxus_i18n::{prelude::i18n, t, unic_langid::langid}; use dioxus_i18n::{prelude::*, t, unic_langid::langid};
use crate::Route; use crate::Route;
@@ -15,7 +15,7 @@ pub fn Header() -> Element {
Link { Link {
to: Route::Home {}, to: Route::Home {},
class: "rounded-md shadow-sm", class: "rounded-md shadow-sm",
img { src:asset!("./assets/pictures/ClackCat_t.webp"), class:"rounded-full h-8", alt:"TuDatTr Logo" }, img { src:asset!("/assets/pictures/ClackCat_t.webp"), class:"rounded-full h-8", alt:"TuDatTr Logo" },
}, },
}, },
li { HeaderLink { url: Route::Home {}, text: t!("headers_home")} }, li { HeaderLink { url: Route::Home {}, text: t!("headers_home")} },

View File

@@ -3,10 +3,7 @@
use components::H1; use components::H1;
use dioxus::prelude::*; use dioxus::prelude::*;
use dioxus_i18n::prelude::use_init_i18n; use dioxus_i18n::{prelude::*, unic_langid::langid};
use dioxus_i18n::prelude::I18nConfig;
use dioxus_i18n::prelude::Locale;
use dioxus_i18n::unic_langid::langid;
use layout::footer::Footer; use layout::footer::Footer;
use layout::header::Header; use layout::header::Header;
use tracing::{Level, info}; use tracing::{Level, info};
@@ -62,19 +59,16 @@ fn Health() -> Element {
fn App() -> Element { fn App() -> Element {
use_init_i18n(|| { use_init_i18n(|| {
I18nConfig::new(langid!("en-GB")) I18nConfig::new(langid!("en-GB"))
.with_locale((langid!("de-DE"), include_str!("../languages/de-DE.ftl")))
.with_locale(Locale::new_static( .with_locale(Locale::new_static(
langid!("en-GB"), langid!("en-GB"),
include_str!("../languages/en-GB.ftl"), include_str!("../languages/en-GB.ftl"),
)) ))
.with_locale(Locale::new_static(
langid!("de-DE"),
include_str!("../languages/de-DE.ftl"),
))
}); });
rsx! { rsx! {
document::Link { rel: "stylesheet", href: asset!("./assets/tailwind.css") } document::Link { rel: "stylesheet", href: asset!("/assets/tailwind.css") }
document::Link { rel: "icon", href: asset!("./assets/favicon.ico") } document::Link { rel: "icon", href: asset!("/assets/favicon.ico") }
meta { meta {
name: "description", name: "description",
content: "Visit Tuan-Dat Tran's website for his CV, publications, projects, and consulting services. Connect for collaboration.", content: "Visit Tuan-Dat Tran's website for his CV, publications, projects, and consulting services. Connect for collaboration.",

View File

@@ -81,7 +81,7 @@ fn Publications() -> Element {
authors: t!("publications_projects_publications_iot_fuzzers_authors"), authors: t!("publications_projects_publications_iot_fuzzers_authors"),
technologies: vec![], technologies: vec![],
kind: t!("publications_projects_publications_iot_fuzzers_conference"), kind: t!("publications_projects_publications_iot_fuzzers_conference"),
url: "/#", url: "/publications/#",
description: t!("publications_projects_publications_iot_fuzzers_description") description: t!("publications_projects_publications_iot_fuzzers_description")
}, },
} }
@@ -97,7 +97,7 @@ fn Projects() -> Element {
authors: t!("publications_projects_projects_bpba_authors"), authors: t!("publications_projects_projects_bpba_authors"),
technologies: vec![], technologies: vec![],
kind: t!("publications_projects_projects_bpba_kind"), kind: t!("publications_projects_projects_bpba_kind"),
url: "/#", url: "/publications/#",
description: t!("publications_projects_projects_bpba_description") description: t!("publications_projects_projects_bpba_description")
}, },
Project { Project {
@@ -105,7 +105,7 @@ fn Projects() -> Element {
authors: t!("publications_projects_projects_dotfiles_authors"), authors: t!("publications_projects_projects_dotfiles_authors"),
technologies: vec![], technologies: vec![],
kind: t!("publications_projects_projects_dotfiles_kind"), kind: t!("publications_projects_projects_dotfiles_kind"),
url: "/#", url: "/publications/#",
description: t!("publications_projects_projects_dotfiles_description") description: t!("publications_projects_projects_dotfiles_description")
}, },
Project { Project {
@@ -113,7 +113,7 @@ fn Projects() -> Element {
authors: t!("publications_projects_projects_homelab_authors"), authors: t!("publications_projects_projects_homelab_authors"),
technologies: vec![], technologies: vec![],
kind: t!("publications_projects_projects_homelab_kind"), kind: t!("publications_projects_projects_homelab_kind"),
url: "/#", url: "/publications/#",
description: t!("publications_projects_projects_homelab_description") description: t!("publications_projects_projects_homelab_description")
} }
Project { Project {
@@ -121,7 +121,7 @@ fn Projects() -> Element {
authors: t!("publications_projects_projects_athome_authors"), authors: t!("publications_projects_projects_athome_authors"),
technologies: vec![], technologies: vec![],
kind: t!("publications_projects_projects_athome_kind"), kind: t!("publications_projects_projects_athome_kind"),
url: "/#", url: "/publications/#",
description: t!("publications_projects_projects_athome_description") description: t!("publications_projects_projects_athome_description")
} }
} }