Compare commits
1 Commits
0.1.13
...
538c99166f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
538c99166f |
@@ -1,18 +0,0 @@
|
|||||||
name: Build Docker Image
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- dev
|
|
||||||
- cicd
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: Build
|
|
||||||
runs-on: [ubuntu-latest, aya01]
|
|
||||||
steps:
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
- uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
tags: tudattr/athome:latest
|
|
||||||
1155
Cargo.lock
generated
1155
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -14,6 +14,7 @@ dioxus = { version = "0.6", features = ["fullstack", "router"] }
|
|||||||
tracing = "0.1.40"
|
tracing = "0.1.40"
|
||||||
dioxus-logger = "0.6.0"
|
dioxus-logger = "0.6.0"
|
||||||
dioxus-i18n = "0.4.0"
|
dioxus-i18n = "0.4.0"
|
||||||
|
tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
|
|||||||
@@ -19,7 +19,10 @@ ENV PATH="/.cargo/bin:$PATH"
|
|||||||
# Create the final bundle folder. Bundle always executes in release mode with optimizations enabled
|
# Create the final bundle folder. Bundle always executes in release mode with optimizations enabled
|
||||||
RUN dx bundle --platform web
|
RUN dx bundle --platform web
|
||||||
|
|
||||||
FROM chef AS runtime
|
FROM debian:bookworm-slim AS runtime
|
||||||
|
# Install ca-certificates for HTTPS requests if the server makes any outgoing calls
|
||||||
|
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
COPY --from=builder /app/target/dx/athome/release/web/ /usr/local/app
|
COPY --from=builder /app/target/dx/athome/release/web/ /usr/local/app
|
||||||
|
|
||||||
# set our port and make sure to listen for all connections
|
# set our port and make sure to listen for all connections
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
headers_home = Home
|
headers_home = Home
|
||||||
headers_cv = Lebenslauf
|
headers_cv = Lebenslauf
|
||||||
headers_publications_projects = Artikel/Projekte
|
headers_publications_projects = Artikel/Projekte
|
||||||
headers_consulting = Consulting
|
|
||||||
headers_about = Impressum
|
headers_about = Impressum
|
||||||
headers_language_buttons_english = 🇬🇧 Englisch
|
headers_language_buttons_english = 🇬🇧 Englisch
|
||||||
headers_language_buttons_german = 🇩🇪 Deutsch
|
headers_language_buttons_german = 🇩🇪 Deutsch
|
||||||
@@ -16,7 +15,7 @@ cv_introduction_title = DevOps Engineer | Homelab Enthusiast
|
|||||||
cv_introduction_0 =
|
cv_introduction_0 =
|
||||||
DevOps Engineer und Softwareentwickler mit starkem akademischen Hintergrund
|
DevOps Engineer und Softwareentwickler mit starkem akademischen Hintergrund
|
||||||
in Netzwerktechnologien und Softwareentwicklung. Spezialisiert auf Kubernetes,
|
in Netzwerktechnologien und Softwareentwicklung. Spezialisiert auf Kubernetes,
|
||||||
Ansible, Azure und moderne Cloud-Technologien. Praxisnahe
|
Ansible, Azure und modernen Cloud-Technologien. Praxisnahe
|
||||||
Forschungserfahrung in Software-Defined Networking, 5G und Maschinellem Lernen.
|
Forschungserfahrung in Software-Defined Networking, 5G und Maschinellem Lernen.
|
||||||
Leidenschaft für effiziente IT-Infrastrukturen, Automatisierung und
|
Leidenschaft für effiziente IT-Infrastrukturen, Automatisierung und
|
||||||
innovative Softwarelösungen.
|
innovative Softwarelösungen.
|
||||||
@@ -75,7 +74,6 @@ 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
|
||||||
cv_education_bachelor_time = 2015 - jetzt
|
cv_education_bachelor_time = 2015 - jetzt
|
||||||
cv_education_bachelor_description = ""
|
|
||||||
cv_skills_title = Fähigkeiten
|
cv_skills_title = Fähigkeiten
|
||||||
cv_skills_devops_title = DevOps
|
cv_skills_devops_title = DevOps
|
||||||
cv_skills_devops_ansible = Ansible
|
cv_skills_devops_ansible = Ansible
|
||||||
@@ -111,7 +109,6 @@ publications_projects_publications_rpm_description = In diesem Artikel stellen
|
|||||||
publications_projects_publications_iot_fuzzers_title = Overview of IoT Fuzzing Techniques
|
publications_projects_publications_iot_fuzzers_title = Overview of IoT Fuzzing Techniques
|
||||||
publications_projects_publications_iot_fuzzers_authors = Tuan-Dat Tran
|
publications_projects_publications_iot_fuzzers_authors = Tuan-Dat Tran
|
||||||
publications_projects_publications_iot_fuzzers_conference = Seminar
|
publications_projects_publications_iot_fuzzers_conference = Seminar
|
||||||
publications_projects_publications_iot_fuzzers_url = https://git.tudattr.dev/AISE/seminar/src/branch/main/paper.pdf
|
|
||||||
publications_projects_publications_iot_fuzzers_description = In dieser Arbeit
|
publications_projects_publications_iot_fuzzers_description = In dieser Arbeit
|
||||||
vergleichen wir Methoden, die speziell von IoT Fuzzern genutzt werden um die
|
vergleichen wir Methoden, die speziell von IoT Fuzzern genutzt werden um die
|
||||||
von IoT Geräten stammenden Herausforderungen und Einschränkungen zu umgehen.
|
von IoT Geräten stammenden Herausforderungen und Einschränkungen zu umgehen.
|
||||||
@@ -119,13 +116,11 @@ publications_projects_projects_title = Projekte
|
|||||||
publications_projects_projects_bpba_title = Unbenannter Ethereum Smart Contract Fuzzer
|
publications_projects_projects_bpba_title = Unbenannter Ethereum Smart Contract Fuzzer
|
||||||
publications_projects_projects_bpba_authors = Tuan-Dat Tran
|
publications_projects_projects_bpba_authors = Tuan-Dat Tran
|
||||||
publications_projects_projects_bpba_kind = Bachelorprojekt/Bachelorarbeit
|
publications_projects_projects_bpba_kind = Bachelorprojekt/Bachelorarbeit
|
||||||
publications_projects_projects_bpba_url = https://git.ude-syssec.de/uni-due-syssec/students/2022_tuan-dat_tran_libAFLEVMFuzzer/ethfuzz/
|
|
||||||
publications_projects_projects_bpba_description = In diesem aktuell laufendem
|
publications_projects_projects_bpba_description = In diesem aktuell laufendem
|
||||||
Projekt entwickle ich einen Ethereum Smart Contract Fuzzer. Mehr Infos folgen...
|
Projekt entwickle ich einen Ethereum Smart Contract Fuzzer. Mehr Infos folgen...
|
||||||
publications_projects_projects_dotfiles_title = .dotfiles
|
publications_projects_projects_dotfiles_title = .dotfiles
|
||||||
publications_projects_projects_dotfiles_authors = Tuan-Dat Tran
|
publications_projects_projects_dotfiles_authors = Tuan-Dat Tran
|
||||||
publications_projects_projects_dotfiles_kind = Personal
|
publications_projects_projects_dotfiles_kind = Personal
|
||||||
publications_projects_projects_dotfiles_url = https://git.tudattr.dev/tudattr/dotfiles
|
|
||||||
publications_projects_projects_dotfiles_description = dotfiles ist ein
|
publications_projects_projects_dotfiles_description = dotfiles ist ein
|
||||||
umgangssprachlicher Begriff, der normalerweise für Konfigurationsdateien in
|
umgangssprachlicher Begriff, der normalerweise für Konfigurationsdateien in
|
||||||
Linux-basierten Systemen verwendet wird. Meine Dotfiles enthalten
|
Linux-basierten Systemen verwendet wird. Meine Dotfiles enthalten
|
||||||
@@ -137,7 +132,6 @@ publications_projects_projects_dotfiles_description = dotfiles ist ein
|
|||||||
publications_projects_projects_homelab_title = Homelab
|
publications_projects_projects_homelab_title = Homelab
|
||||||
publications_projects_projects_homelab_authors = Tuan-Dat Tran
|
publications_projects_projects_homelab_authors = Tuan-Dat Tran
|
||||||
publications_projects_projects_homelab_kind = Personal
|
publications_projects_projects_homelab_kind = Personal
|
||||||
publications_projects_projects_homelab_url = https://git.tudattr.dev/tudattr/ansible
|
|
||||||
publications_projects_projects_homelab_description = Ansible ist ein
|
publications_projects_projects_homelab_description = Ansible ist ein
|
||||||
Automatisierungs-Werkzeug, die eine automatische Maschinenbereitstellung,
|
Automatisierungs-Werkzeug, die eine automatische Maschinenbereitstellung,
|
||||||
Konfigurationsverwaltung und Anwendungsbereitstellung ermöglicht. Ich
|
Konfigurationsverwaltung und Anwendungsbereitstellung ermöglicht. Ich
|
||||||
@@ -146,15 +140,14 @@ publications_projects_projects_homelab_description = Ansible ist ein
|
|||||||
publications_projects_projects_athome_title = Diese Website
|
publications_projects_projects_athome_title = Diese Website
|
||||||
publications_projects_projects_athome_authors = Tuan-Dat Tran
|
publications_projects_projects_athome_authors = Tuan-Dat Tran
|
||||||
publications_projects_projects_athome_kind = Personal
|
publications_projects_projects_athome_kind = Personal
|
||||||
publications_projects_projects_athome_url = /#
|
|
||||||
publications_projects_projects_athome_description = Diese Website ist eine mit
|
publications_projects_projects_athome_description = Diese Website ist eine mit
|
||||||
dem auf Rust basiertem Dioxus Framwork und TailwindCSS gebaute Full Stack
|
dem auf Rust basiertem Dioxus Framwork und TailwindCSS gebaute Full Stack
|
||||||
WASM Website, die sowohl zum Auffrischen von Web Themen, sowie als Rust
|
WASM Website, die sowohl zum Auffrischen von Web Themen, sowie als Rust
|
||||||
Hobbyprojekt dient.
|
Hobbyprojekt dient.
|
||||||
impressum_off = Impressum anzeigen
|
|
||||||
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)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
headers_home = Home
|
headers_home = Home
|
||||||
headers_cv = Résumé
|
headers_cv = Résumé
|
||||||
headers_publications_projects = Publications/Projects
|
headers_publications_projects = Publications/Projects
|
||||||
headers_consulting = Consulting
|
|
||||||
headers_about = About
|
headers_about = About
|
||||||
headers_language_buttons_english = 🇬🇧 English
|
headers_language_buttons_english = 🇬🇧 English
|
||||||
headers_language_buttons_german = 🇩🇪 German
|
headers_language_buttons_german = 🇩🇪 German
|
||||||
@@ -58,19 +57,18 @@ 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 = At DextraData as a DevOps Engineer,
|
cv_workexperience_dd_devops_description = As a DevOps Engineer at DextraData,
|
||||||
I am responsible for the cloud-based infrastructure hosting our companies
|
I'm responsible for the cloud-based infrastructure behind the company's many
|
||||||
diverse portfolio of SaaS products, collaborating with Software Developers,
|
SaaS products. I work closely with software developers, Customer Success
|
||||||
Customer Success Managers, and Customer Success Engineers to ensure
|
Managers, and Customer Success Engineers to ensure operational excellence
|
||||||
operational excellence and uninterrupted service delivery for our customers
|
and seamless service delivery for our customers, always keeping their
|
||||||
with their specific requirements at the forefront. I manage
|
specific needs in mind. My duties include managing Kubernetes cluster
|
||||||
Kubernetes cluster deployments, continuously monitor deployment health metrics,
|
deployments, continuously monitoring deployment health metrics, and
|
||||||
and implement Infrastructure as Code solutions.
|
implementing Infrastructure-as-Code solutions.
|
||||||
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
|
||||||
cv_education_bachelor_time = 2015 - now
|
cv_education_bachelor_time = 2015 - now
|
||||||
cv_education_bachelor_description = ""
|
|
||||||
cv_skills_title = Skills
|
cv_skills_title = Skills
|
||||||
cv_skills_devops_title = DevOps
|
cv_skills_devops_title = DevOps
|
||||||
cv_skills_devops_ansible = Ansible
|
cv_skills_devops_ansible = Ansible
|
||||||
@@ -106,7 +104,6 @@ publications_projects_publications_rpm_description = In this paper, we present
|
|||||||
publications_projects_publications_iot_fuzzers_title = Overview of IoT Fuzzing Techniques
|
publications_projects_publications_iot_fuzzers_title = Overview of IoT Fuzzing Techniques
|
||||||
publications_projects_publications_iot_fuzzers_authors = Tuan-Dat Tran
|
publications_projects_publications_iot_fuzzers_authors = Tuan-Dat Tran
|
||||||
publications_projects_publications_iot_fuzzers_conference = Seminar
|
publications_projects_publications_iot_fuzzers_conference = Seminar
|
||||||
publications_projects_publications_iot_fuzzers_url = https://git.tudattr.dev/AISE/seminar/src/branch/main/paper.pdf
|
|
||||||
publications_projects_publications_iot_fuzzers_description = In this paper, we
|
publications_projects_publications_iot_fuzzers_description = In this paper, we
|
||||||
are comparing techniques used by IoT fuzzers to circumvent the challenges
|
are comparing techniques used by IoT fuzzers to circumvent the challenges
|
||||||
presented by IoT devices and the constraints of the solutions proposed by the
|
presented by IoT devices and the constraints of the solutions proposed by the
|
||||||
@@ -115,12 +112,10 @@ publications_projects_projects_title = Projects
|
|||||||
publications_projects_projects_bpba_title = Undisclosed Ethereum Smart Contract Fuzzer
|
publications_projects_projects_bpba_title = Undisclosed Ethereum Smart Contract Fuzzer
|
||||||
publications_projects_projects_bpba_authors = Tuan-Dat Tran
|
publications_projects_projects_bpba_authors = Tuan-Dat Tran
|
||||||
publications_projects_projects_bpba_kind = Bachelor Project/Bachelor Thesis
|
publications_projects_projects_bpba_kind = Bachelor Project/Bachelor Thesis
|
||||||
publications_projects_projects_bpba_url = https://git.ude-syssec.de/uni-due-syssec/students/2022_tuan-dat_tran_libAFLEVMFuzzer/ethfuzz/
|
|
||||||
publications_projects_projects_bpba_description = In this ongoing project I am building an Ethereum Smart Contract Fuzzer. More info will follow.
|
publications_projects_projects_bpba_description = In this ongoing project I am building an Ethereum Smart Contract Fuzzer. More info will follow.
|
||||||
publications_projects_projects_dotfiles_title = .dotfiles
|
publications_projects_projects_dotfiles_title = .dotfiles
|
||||||
publications_projects_projects_dotfiles_authors = Tuan-Dat Tran
|
publications_projects_projects_dotfiles_authors = Tuan-Dat Tran
|
||||||
publications_projects_projects_dotfiles_kind = Personal
|
publications_projects_projects_dotfiles_kind = Personal
|
||||||
publications_projects_projects_dotfiles_url = https://git.tudattr.dev/tudattr/dotfiles
|
|
||||||
publications_projects_projects_dotfiles_description = dotfiles is a slang term
|
publications_projects_projects_dotfiles_description = dotfiles is a slang term
|
||||||
usually used for configuration files in Linux based systems. My dotfiles
|
usually used for configuration files in Linux based systems. My dotfiles
|
||||||
contain configurations for tools I frequently use as well as a documentation
|
contain configurations for tools I frequently use as well as a documentation
|
||||||
@@ -130,7 +125,6 @@ publications_projects_projects_dotfiles_description = dotfiles is a slang term
|
|||||||
publications_projects_projects_homelab_title = Homelab
|
publications_projects_projects_homelab_title = Homelab
|
||||||
publications_projects_projects_homelab_authors = Tuan-Dat Tran
|
publications_projects_projects_homelab_authors = Tuan-Dat Tran
|
||||||
publications_projects_projects_homelab_kind = Personal
|
publications_projects_projects_homelab_kind = Personal
|
||||||
publications_projects_projects_homelab_url = https://git.tudattr.dev/tudattr/ansible
|
|
||||||
publications_projects_projects_homelab_description = Ansible is a automation
|
publications_projects_projects_homelab_description = Ansible is a automation
|
||||||
tool which allows for automatic provisioning, configuration management and
|
tool which allows for automatic provisioning, configuration management and
|
||||||
application deployment. I use ansible to set up my homelab, which serves as a
|
application deployment. I use ansible to set up my homelab, which serves as a
|
||||||
@@ -138,15 +132,14 @@ publications_projects_projects_homelab_description = Ansible is a automation
|
|||||||
publications_projects_projects_athome_title = This Website
|
publications_projects_projects_athome_title = This Website
|
||||||
publications_projects_projects_athome_authors = Tuan-Dat Tran
|
publications_projects_projects_athome_authors = Tuan-Dat Tran
|
||||||
publications_projects_projects_athome_kind = Personal
|
publications_projects_projects_athome_kind = Personal
|
||||||
publications_projects_projects_athome_url = /#
|
|
||||||
publications_projects_projects_athome_description = This website is a
|
publications_projects_projects_athome_description = This website is a
|
||||||
full-stack WASM site built using the Rust-based Dioxus framework and
|
full-stack WASM site built using the Rust-based Dioxus framework and
|
||||||
TailwindCSS. It serves both as a way to refresh web development topics and as
|
TailwindCSS. It serves both as a way to refresh web development topics and as
|
||||||
a Rust hobby project.
|
a Rust hobby project.
|
||||||
impressum_off = Show Impressum
|
|
||||||
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)
|
||||||
|
|||||||
61
scripts/check_i18n.py
Normal file
61
scripts/check_i18n.py
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def check_i18n_keys(project_root):
|
||||||
|
src_dir = os.path.join(project_root, "src")
|
||||||
|
languages_dir = os.path.join(project_root, "languages")
|
||||||
|
|
||||||
|
rust_key_regex = re.compile(r't!\("([a-zA-Z0-9_.]+)"\)')
|
||||||
|
ftl_key_regex = re.compile(r"^([a-zA-Z0-9_.-]+)\s*=")
|
||||||
|
|
||||||
|
used_keys = set()
|
||||||
|
defined_keys = set()
|
||||||
|
|
||||||
|
# Extract keys from Rust files
|
||||||
|
for root, _, files in os.walk(src_dir):
|
||||||
|
for file in files:
|
||||||
|
if file.endswith(".rs"):
|
||||||
|
file_path = os.path.join(root, file)
|
||||||
|
with open(file_path, "r", encoding="utf-8") as f:
|
||||||
|
content = f.read()
|
||||||
|
for match in rust_key_regex.finditer(content):
|
||||||
|
used_keys.add(match.group(1))
|
||||||
|
|
||||||
|
# Extract keys from FTL files
|
||||||
|
for root, _, files in os.walk(languages_dir):
|
||||||
|
for file in files:
|
||||||
|
if file.endswith(".ftl"):
|
||||||
|
file_path = os.path.join(root, file)
|
||||||
|
with open(file_path, "r", encoding="utf-8") as f:
|
||||||
|
for line in f:
|
||||||
|
match = ftl_key_regex.match(line)
|
||||||
|
if match:
|
||||||
|
defined_keys.add(match.group(1))
|
||||||
|
|
||||||
|
print("--- i18n Key Check Report ---")
|
||||||
|
|
||||||
|
missing_keys = used_keys - defined_keys
|
||||||
|
if not missing_keys:
|
||||||
|
print("✅ No missing translation keys found in FTL files.")
|
||||||
|
else:
|
||||||
|
print(
|
||||||
|
"❌ Missing translation keys (used in code but not defined in FTL files):"
|
||||||
|
)
|
||||||
|
for key in sorted(list(missing_keys)):
|
||||||
|
print(f" - {key}")
|
||||||
|
|
||||||
|
unused_keys = defined_keys - used_keys
|
||||||
|
if not unused_keys:
|
||||||
|
print("✅ No unused translation keys found in FTL files.")
|
||||||
|
else:
|
||||||
|
print("⚠️ Unused translation keys (defined in FTL files but not used in code):")
|
||||||
|
for key in sorted(list(unused_keys)):
|
||||||
|
print(f" - {key}")
|
||||||
|
|
||||||
|
print("-----------------------------")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
||||||
|
check_i18n_keys(project_root)
|
||||||
@@ -280,3 +280,35 @@ fn random_badge_color(seed: usize) -> String {
|
|||||||
|
|
||||||
colors[seed % colors.len()].to_string()
|
colors[seed % colors.len()].to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Props, Clone)]
|
||||||
|
pub struct AccessibleLinkProps {
|
||||||
|
to: String,
|
||||||
|
#[props(default = "".to_string())]
|
||||||
|
class: String,
|
||||||
|
#[props(default = false)]
|
||||||
|
new_tab: bool,
|
||||||
|
children: Element,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[component]
|
||||||
|
pub fn AccessibleLink(props: AccessibleLinkProps) -> Element {
|
||||||
|
let mut aria_label = String::new();
|
||||||
|
let mut rel = String::new();
|
||||||
|
|
||||||
|
if props.new_tab {
|
||||||
|
aria_label = t!("link_opens_new_tab").to_string();
|
||||||
|
rel = "noopener noreferrer".to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
rsx! {
|
||||||
|
Link {
|
||||||
|
to: "{props.to}",
|
||||||
|
class: "{props.class}",
|
||||||
|
new_tab: props.new_tab,
|
||||||
|
rel: "{rel}",
|
||||||
|
aria_label: "{aria_label}",
|
||||||
|
{props.children}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -39,11 +39,11 @@ fn Introduction() -> Element {
|
|||||||
P {
|
P {
|
||||||
{ t!("cv_introduction_tools") },
|
{ t!("cv_introduction_tools") },
|
||||||
" ",
|
" ",
|
||||||
Link { new_tab: true, to: "https://www.lazyvim.org/", "NeoVim (LazyVim)" },
|
AccessibleLink { new_tab: true, to: "https://www.lazyvim.org/", "NeoVim (LazyVim)" },
|
||||||
", ",
|
", ",
|
||||||
Link { new_tab: true, to: "https://zellij.dev/", "Zellij" },
|
AccessibleLink { new_tab: true, to: "https://zellij.dev/", "Zellij" },
|
||||||
", ",
|
", ",
|
||||||
Link { new_tab: true, to: "https://k9scli.io/", "k9s" }
|
AccessibleLink { new_tab: true, to: "https://k9scli.io/", "k9s" }
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -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 { Link { 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" } }},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use crate::components::{Card, P};
|
use crate::components::{AccessibleLink, Card, P};
|
||||||
use dioxus::prelude::*;
|
use dioxus::prelude::*;
|
||||||
use dioxus_i18n::t;
|
use dioxus_i18n::t;
|
||||||
|
|
||||||
@@ -20,9 +20,10 @@ pub fn Home() -> Element {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Link {
|
AccessibleLink {
|
||||||
to: "mailto:tuan-dat.tran@tudattr.dev",
|
to: "mailto:tuan-dat.tran@tudattr.dev",
|
||||||
class: "text-gray-900 bg-gradient-to-br from-green-400 to-blue-600 group-hover:from-green-400 group-hover:to-blue-600 hover:text-white rounded-full shadow-lg py-4 px-4",
|
class: "text-gray-900 bg-gradient-to-br from-green-400 to-blue-600 group-hover:from-green-400 group-hover:to-blue-600 hover:text-white rounded-full shadow-lg py-4 px-4",
|
||||||
|
new_tab: true,
|
||||||
{ t!("home_card_contact_button") }
|
{ t!("home_card_contact_button") }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
20
src/main.rs
20
src/main.rs
@@ -9,7 +9,8 @@ use dioxus_i18n::prelude::Locale;
|
|||||||
use dioxus_i18n::unic_langid::langid;
|
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;
|
use tracing::{Level, info};
|
||||||
|
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
|
||||||
|
|
||||||
pub mod components;
|
pub mod components;
|
||||||
mod cv;
|
mod cv;
|
||||||
@@ -35,14 +36,27 @@ pub enum Route {
|
|||||||
PublicationsProjects {},
|
PublicationsProjects {},
|
||||||
#[route("/resume")]
|
#[route("/resume")]
|
||||||
CV {},
|
CV {},
|
||||||
|
#[route("/health")]
|
||||||
|
Health {},
|
||||||
#[end_layout]
|
#[end_layout]
|
||||||
#[route("/:..route")]
|
#[route("/:..route")]
|
||||||
PageNotFound { route: Vec<String> },
|
PageNotFound { route: Vec<String> },
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
dioxus_logger::init(Level::DEBUG).expect("failed to init logger");
|
// Configure tracing to output JSON logs
|
||||||
LaunchBuilder::new().launch(App)
|
tracing_subscriber::registry()
|
||||||
|
.with(EnvFilter::from_default_env().add_directive(Level::INFO.into()))
|
||||||
|
.with(fmt::layer().json())
|
||||||
|
.init();
|
||||||
|
|
||||||
|
info!("Starting Dioxus application...");
|
||||||
|
LaunchBuilder::new().launch(App);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[component]
|
||||||
|
fn Health() -> Element {
|
||||||
|
rsx! { "OK" }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn App() -> Element {
|
fn App() -> Element {
|
||||||
|
|||||||
Reference in New Issue
Block a user