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]
name = "athome"
version = "0.4.1"
version = "0.2.0"
authors = ["Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>"]
edition = "2021"
@@ -8,28 +8,17 @@ edition = "2021"
[dependencies]
serde = { version = "1", features = ["derive"] }
dioxus = { version = "0.6", features = ["fullstack", "router"] }
dioxus = { version = "0.7.0", features = ["fullstack", "router"] }
# Debug
tracing = "0.1.40"
dioxus-logger = "0.6.0"
dioxus-i18n = "0.4.0"
dioxus-logger = "0.7.0"
dioxus-i18n = { git = "https://github.com/Kannen/dioxus-i18n/", branch = "main"}
tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] }
[features]
default = []
default = ["web"]
web = ["dioxus/web"]
desktop = ["dioxus/desktop"]
mobile = ["dioxus/mobile"]
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;
}
.flex-auto {
flex: 1 1 auto;
}
.flex-grow {
flex-grow: 1;
}
.grow {
flex-grow: 1;
}
.cursor-pointer {
cursor: pointer;
}
@@ -747,14 +739,6 @@ video {
flex-wrap: wrap;
}
.content-center {
align-content: center;
}
.items-start {
align-items: flex-start;
}
.items-center {
align-items: center;
}
@@ -771,10 +755,6 @@ video {
justify-content: space-between;
}
.justify-stretch {
justify-content: stretch;
}
.gap-2 {
gap: 0.5rem;
}
@@ -801,10 +781,6 @@ video {
margin-bottom: calc(2rem * var(--tw-space-y-reverse));
}
.self-stretch {
align-self: stretch;
}
.rounded {
border-radius: 0.25rem;
}
@@ -1071,10 +1047,6 @@ video {
text-transform: uppercase;
}
.italic {
font-style: italic;
}
.leading-none {
line-height: 1;
}

View File

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

View File

@@ -13,6 +13,7 @@ home_card_text =
home_card_contact_button = Get in touch.
cv_introduction_title = DevOps Engineer | Homelab Enthusiast
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
networking technologies and software development. Specialized in Kubernetes,
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.
cv_workexperience_dd_devops_title = DevOps Engineer @ DextraData
cv_workexperience_dd_devops_time = 2025 - now
cv_workexperience_dd_devops_description = As a DevOps Engineer at DextraData,
I'm responsible for the cloud-based infrastructure behind the company's many
SaaS products. I work closely with software developers, Customer Success
Managers, and Customer Success Engineers to ensure operational excellence
and seamless service delivery for our customers, always keeping their
specific needs in mind. My duties include managing Kubernetes cluster
deployments, continuously monitoring deployment health metrics, and
implementing Infrastructure-as-Code solutions.
cv_workexperience_dd_devops_description = As a DevOps Engineer, I was
responsible for designing, implementing, and maintaining scalable
infrastructure solutions across multiple SaaS product environments. This
involved standardizing and optimizing CI/CD pipelines and establishing
robust monitoring frameworks to ensure high availability and performance.
My work focused on a "shift-left" approach, empowering development teams
with self-service capabilities and streamlined operational workflows as
well as enhancement of system reliability and security.
cv_socials_title = Socials
cv_education_title = Education
cv_education_bachelor_title = BSc Systems Engineering
@@ -139,7 +140,7 @@ publications_projects_projects_athome_description = This website is a
impressum_on = Impressum
component_under_construction = This page is currently under construction
footer_year = © 2025
footer_name = Tuan-Dat Tran
footer_name = Tuan-Dat Tran
footer_rights = . All Rights Reserved.
footer_contact = Contact
link_opens_new_tab = (opens in a new tab)

24
package-lock.json generated
View File

@@ -4,6 +4,9 @@
"requires": true,
"packages": {
"": {
"dependencies": {
"caniuse-lite": "^1.0.30001753"
},
"devDependencies": {
"tailwindcss": "^3.4.3"
}
@@ -227,6 +230,26 @@
"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": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -782,6 +805,7 @@
"url": "https://github.com/sponsors/ai"
}
],
"peer": true,
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.0.0",

View File

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

View File

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

View File

@@ -13,7 +13,7 @@ pub fn CV() -> Element {
img {
class: "rounded-full w-24 h-24",
alt: "headshot",
src: asset!("./assets/pictures/headshot.webp")
src: asset!("/assets/pictures/headshot.webp")
}
Introduction {},
Socials {}
@@ -39,7 +39,7 @@ fn Introduction() -> Element {
P {
{ 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" },
", ",
@@ -57,7 +57,7 @@ fn WorkExperience() -> Element {
ol {
class:"relative border-s border-gray-700",
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")
},
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") } },
div {
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 {
name: t!("home_card_name"),
gender: t!("home_card_gender"),
picture: asset!("./assets/pictures/headshot.webp"),
picture: asset!("/assets/pictures/headshot.webp"),
div {
class: "py-4",
div {

View File

@@ -1,59 +1,30 @@
use dioxus::prelude::*;
use dioxus_i18n::t;
use crate::components::{H1, HR, P};
#[component]
pub fn Impressum() -> Element {
let mut impressum = use_signal(Vec::<String>::new);
let mut contact = use_signal(Vec::<String>::new);
rsx! {
div {
div {
class: "flex flex-col items-center",
button {
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") } },
},
H1 { "Impressum" },
},
HR{},
div {
class: "flex flex-col items-center",
for line in impressum() {
P { {line} }
}
P { {"Tuan-Dat Tran"} },
P { {"c/o AutorenServices.de"} },
P { {"Birkenallee 24"} },
P { {"36037 Fulda"} },
}
if !impressum.read().is_empty() { HR{} },
HR{},
div {
class: "flex flex-col items-center",
for line in contact() {
P { {line} }
}
P { {"tuan-dat.tran(at)tudattr(dot)dev"} },
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 {
class:"text-sm sm:text-center text-gray-400",
{ t!("footer_year") },
" ",
a { href: "#", class: "hover:underline", { t!("footer_name") }},
" ",
{ t!("footer_rights") }
}
ul {

View File

@@ -1,5 +1,5 @@
use dioxus::prelude::*;
use dioxus_i18n::{prelude::i18n, t, unic_langid::langid};
use dioxus_i18n::{prelude::*, t, unic_langid::langid};
use crate::Route;
@@ -15,7 +15,7 @@ pub fn Header() -> Element {
Link {
to: Route::Home {},
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")} },

View File

@@ -3,10 +3,7 @@
use components::H1;
use dioxus::prelude::*;
use dioxus_i18n::prelude::use_init_i18n;
use dioxus_i18n::prelude::I18nConfig;
use dioxus_i18n::prelude::Locale;
use dioxus_i18n::unic_langid::langid;
use dioxus_i18n::{prelude::*, unic_langid::langid};
use layout::footer::Footer;
use layout::header::Header;
use tracing::{Level, info};
@@ -62,19 +59,16 @@ fn Health() -> Element {
fn App() -> Element {
use_init_i18n(|| {
I18nConfig::new(langid!("en-GB"))
.with_locale((langid!("de-DE"), include_str!("../languages/de-DE.ftl")))
.with_locale(Locale::new_static(
langid!("en-GB"),
include_str!("../languages/en-GB.ftl"),
))
.with_locale(Locale::new_static(
langid!("de-DE"),
include_str!("../languages/de-DE.ftl"),
))
});
rsx! {
document::Link { rel: "stylesheet", href: asset!("./assets/tailwind.css") }
document::Link { rel: "icon", href: asset!("./assets/favicon.ico") }
document::Link { rel: "stylesheet", href: asset!("/assets/tailwind.css") }
document::Link { rel: "icon", href: asset!("/assets/favicon.ico") }
meta {
name: "description",
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"),
technologies: vec![],
kind: t!("publications_projects_publications_iot_fuzzers_conference"),
url: "/#",
url: "/publications/#",
description: t!("publications_projects_publications_iot_fuzzers_description")
},
}
@@ -97,7 +97,7 @@ fn Projects() -> Element {
authors: t!("publications_projects_projects_bpba_authors"),
technologies: vec![],
kind: t!("publications_projects_projects_bpba_kind"),
url: "/#",
url: "/publications/#",
description: t!("publications_projects_projects_bpba_description")
},
Project {
@@ -105,7 +105,7 @@ fn Projects() -> Element {
authors: t!("publications_projects_projects_dotfiles_authors"),
technologies: vec![],
kind: t!("publications_projects_projects_dotfiles_kind"),
url: "/#",
url: "/publications/#",
description: t!("publications_projects_projects_dotfiles_description")
},
Project {
@@ -113,7 +113,7 @@ fn Projects() -> Element {
authors: t!("publications_projects_projects_homelab_authors"),
technologies: vec![],
kind: t!("publications_projects_projects_homelab_kind"),
url: "/#",
url: "/publications/#",
description: t!("publications_projects_projects_homelab_description")
}
Project {
@@ -121,7 +121,7 @@ fn Projects() -> Element {
authors: t!("publications_projects_projects_athome_authors"),
technologies: vec![],
kind: t!("publications_projects_projects_athome_kind"),
url: "/#",
url: "/publications/#",
description: t!("publications_projects_projects_athome_description")
}
}