mirror of
https://github.com/AlessandroAcuna/Home.git
synced 2026-03-21 22:50:00 +00:00
1559 lines
86 KiB
HTML
1559 lines
86 KiB
HTML
<!doctype html>
|
||
<html lang="it" data-theme="dark">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
<title>Alessandro Acuna - Mechanical Design Engineer</title>
|
||
<meta name="description" content="Portfolio & CV of Alessandro Acuna, Mechanical Design Engineer specialized in structural design, CAD, and FEM analysis." />
|
||
|
||
<!-- Canonical + Social -->
|
||
<link rel="canonical" href="https://yourdomain.tld/">
|
||
<meta property="og:title" content="Alessandro Acuna - Mechanical Design Engineer" />
|
||
<meta property="og:description" content="Portfolio & CV of Alessandro Acuna, Mechanical Design Engineer specialized in structural design, CAD, and FEM analysis." />
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:image" content="https://yourdomain.tld/res/og-cover.jpg" />
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
|
||
<meta name="theme-color" content="#0b0c10" />
|
||
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='0.9em' font-size='90'>A</text></svg>">
|
||
<link rel="preload" as="fetch" href="res/Alessandro_Acuna_CV.pdf" type="application/pdf" crossorigin>
|
||
|
||
<style>
|
||
:root{
|
||
--bg:#0b0c10; --surface:#0f1116; --text:#e5e7eb; --muted:#94a3b8; --primary:#0ea5e9; --ring:#22d3ee; --card:#111318; --border:#1f2937; --chip:#111827; --chip-text:#cbd5e1;
|
||
}
|
||
[data-theme="dark"]{
|
||
--bg:#0b0c10; --surface:#0f1116; --text:#e5e7eb; --muted:#94a3b8; --primary:#0ea5e9; --ring:#22d3ee; --card:#111318; --border:#1f2937; --chip:#111827; --chip-text:#cbd5e1;
|
||
}
|
||
[data-theme="light"]{
|
||
--bg:#f8fafc; --surface:#ffffff; --text:#0f172a; --muted:#475569; --primary:#0284c7; --ring:#22d3ee; --card:#ffffff; --border:#e2e8f0; --chip:#f1f5f9; --chip-text:#0f172a;
|
||
}
|
||
|
||
*{box-sizing:border-box}
|
||
html{scroll-behavior:smooth}
|
||
body{
|
||
margin:0;
|
||
font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,"Helvetica Neue",Arial,"Apple Color Emoji","Segoe UI Emoji";
|
||
background:var(--bg);
|
||
color:var(--text);
|
||
}
|
||
a{color:var(--primary);text-decoration:none}
|
||
a:hover{text-decoration:underline}
|
||
.container{max-width:1000px;margin:0 auto;padding:24px}
|
||
|
||
header{
|
||
position:sticky;top:0;z-index:50;
|
||
background:color-mix(in oklab, var(--surface) 80%, transparent);
|
||
backdrop-filter:blur(8px);
|
||
border-bottom:1px solid var(--border)
|
||
}
|
||
nav{display:flex;align-items:center;gap:16px;justify-content:space-between}
|
||
nav .links{display:flex;gap:12px;flex-wrap:wrap}
|
||
nav a{padding:10px 12px;border-radius:10px}
|
||
nav a:hover{background:var(--chip)}
|
||
|
||
.btn{
|
||
display:inline-flex;align-items:center;gap:8px;border:1px solid var(--border);
|
||
padding:10px 14px;border-radius:12px;
|
||
background:linear-gradient(180deg,var(--surface),var(--card));
|
||
color:var(--text);
|
||
box-shadow:0 1px 0 rgba(255,255,255,0.04) inset, 0 8px 24px rgba(2,8,23,0.25);
|
||
cursor:pointer;
|
||
}
|
||
.btn:hover{transform:translateY(-1px)}
|
||
.btn.primary{
|
||
border-color:transparent;
|
||
background:linear-gradient(180deg,rgba(14,165,233,0.15),rgba(14,165,233,0.05));
|
||
}
|
||
|
||
.grid{display:grid;gap:16px}
|
||
.hero{display:grid;grid-template-columns:1.4fr 1fr;gap:24px;align-items:center;padding:40px 0}
|
||
.section{padding:16px 0 32px}
|
||
|
||
.card{
|
||
border:1px solid var(--border);
|
||
background:var(--card);
|
||
border-radius:16px;
|
||
padding:20px;
|
||
box-shadow:0 1px 0 rgba(255,255,255,0.03) inset, 0 10px 24px rgba(2,8,23,0.15)
|
||
}
|
||
.timeline{display:grid;gap:14px}
|
||
.item{display:grid;grid-template-columns:180px 1fr;gap:14px}
|
||
.item + .item{border-top:1px solid var(--border); padding-top:14px; margin-top:6px}
|
||
|
||
h1{font-size:clamp(28px,4vw,44px);line-height:1.1;margin:0 0 8px 0}
|
||
h2{font-size:clamp(22px,3vw,30px);margin:24px 0 12px}
|
||
h3{font-size:18px;margin:0 0 6px}
|
||
p{color:var(--muted);margin:8px 0}
|
||
|
||
.chips{display:flex;flex-wrap:wrap;gap:8px}
|
||
.chip{
|
||
background:var(--chip);
|
||
color:var(--chip-text);
|
||
padding:6px 10px;
|
||
border-radius:999px;
|
||
font-size:12px;
|
||
border:1px solid var(--border)
|
||
}
|
||
|
||
.project{border-left:3px solid var(--primary);padding-left:12px}
|
||
.kbd{
|
||
font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;
|
||
background:var(--chip);
|
||
border:1px solid var(--border);
|
||
padding:2px 6px;
|
||
border-radius:6px;
|
||
font-size:12px
|
||
}
|
||
.sr-only{
|
||
position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
|
||
clip:rect(0,0,0,0);white-space:nowrap;border:0
|
||
}
|
||
|
||
.brand{
|
||
display:flex;
|
||
flex-direction:column;
|
||
align-items:flex-start;
|
||
gap:2px;
|
||
line-height:1.25;
|
||
}
|
||
.brand .where{ font-weight:500; opacity:.85; }
|
||
|
||
.when{
|
||
display:flex;flex-direction:column;gap:8px;align-items:center;justify-content:center;
|
||
text-align:center;min-height:60px
|
||
}
|
||
.logo-box{
|
||
width:160px;height:60px;display:grid;place-items:center;background:transparent;
|
||
border:1px solid transparent;border-radius:10px; aspect-ratio:160/60;
|
||
}
|
||
.logo{
|
||
display:block;height:auto;max-height:48px;max-width:100%;object-fit:contain;
|
||
image-rendering:auto;opacity:.98
|
||
}
|
||
.logo--wide{max-height:44px}
|
||
.logo--square{max-height:52px}
|
||
|
||
.timeline .item ul{ margin:8px 0 0 0; padding-left:18px; list-style-position:outside; }
|
||
.timeline .item li{ margin:4px 0; }
|
||
|
||
@media(max-width:860px){
|
||
.hero{grid-template-columns:1fr}
|
||
.item{grid-template-columns:1fr}
|
||
}
|
||
|
||
.footer{padding:24px 0;color:var(--muted);font-size:14px;border-top:1px solid var(--border)}
|
||
|
||
dialog.project-modal {
|
||
width:min(900px, 92vw);
|
||
border:1px solid var(--border);
|
||
border-radius:16px;
|
||
padding:0;
|
||
background:var(--surface);
|
||
color:var(--text);
|
||
box-shadow:0 25px 60px rgba(0,0,0,.45);
|
||
}
|
||
dialog.project-modal::backdrop{
|
||
background:rgba(2,8,23,.55);
|
||
backdrop-filter:blur(3px);
|
||
}
|
||
.modal-header{
|
||
display:flex;justify-content:space-between;align-items:center;
|
||
padding:16px 18px;border-bottom:1px solid var(--border);background:var(--card);
|
||
}
|
||
.modal-title{font-size:18px;margin:0}
|
||
.modal-body{padding:18px;display:grid;gap:14px;max-height:70vh;overflow:auto}
|
||
.modal-actions{
|
||
display:flex;justify-content:flex-end;gap:8px;padding:12px 18px;
|
||
border-top:1px solid var(--border);background:var(--card)
|
||
}
|
||
.modal-close{cursor:pointer}
|
||
.modal-close:hover{opacity:.85}
|
||
|
||
.modal-gallery{
|
||
display:grid;gap:10px;
|
||
grid-template-columns:repeat(auto-fill,minmax(220px,1fr));
|
||
}
|
||
.modal-gallery img{
|
||
width:100%;height:180px;object-fit:cover;border-radius:10px;border:1px solid var(--border);cursor:zoom-in;
|
||
}
|
||
|
||
.project[data-modal]{cursor:pointer;transition:transform .12s ease;}
|
||
.project[data-modal]:hover{ transform:translateY(-2px); }
|
||
|
||
.lang-switcher{ position:relative; display:inline-flex; }
|
||
.lang-btn{
|
||
display:inline-flex; align-items:center; gap:8px;
|
||
padding:8px 10px; border:1px solid var(--border); border-radius:12px;
|
||
background:var(--card); cursor:pointer; user-select:none;
|
||
}
|
||
.lang-flag{ font-size:18px; line-height:1; }
|
||
.lang-code{ font-weight:600; letter-spacing:.4px; }
|
||
.lang-caret{ font-size:14px; opacity:.8; }
|
||
|
||
.lang-menu{
|
||
position:absolute; top:calc(100% + 8px); right:0; z-index:100;
|
||
min-width:180px; background:var(--surface); border:1px solid var(--border); border-radius:12px;
|
||
box-shadow:0 12px 32px rgba(0,0,0,.3); padding:6px; display:none;
|
||
}
|
||
.lang-menu.open{ display:block; }
|
||
.lang-option{
|
||
display:flex; align-items:center; gap:10px; padding:10px; border-radius:10px; cursor:pointer;
|
||
}
|
||
.lang-option:hover, .lang-option[aria-selected="true"]{ background:var(--chip); }
|
||
.lang-name{ flex:1; }
|
||
.lang-short{ opacity:.65; font-size:12px; }
|
||
.lang-check{ opacity:0; }
|
||
.lang-option[aria-selected="true"] .lang-check{ opacity:1; }
|
||
|
||
dialog#lightbox{
|
||
padding:0; border:none; background:transparent; max-width:96vw;
|
||
}
|
||
dialog#lightbox::backdrop{
|
||
background:rgba(0,0,0,.85);
|
||
backdrop-filter: blur(2px);
|
||
}
|
||
.lightbox-wrap{
|
||
position:relative; display:flex; align-items:center; justify-content:center; padding:12px;
|
||
}
|
||
.lightbox-figure{
|
||
margin:0; background:var(--surface); border:1px solid var(--border); border-radius:12px;
|
||
max-width:96vw; max-height:90vh; display:flex; flex-direction:column; overflow:hidden;
|
||
box-shadow:0 30px 80px rgba(0,0,0,.6);
|
||
}
|
||
.lightbox-img{
|
||
max-width:96vw; max-height:80vh; width:auto; height:auto; display:block; object-fit:contain;
|
||
background:#000;
|
||
}
|
||
.lightbox-caption{
|
||
padding:10px 12px; font-size:14px; color:var(--muted); background:var(--card); border-top:1px solid var(--border);
|
||
}
|
||
.lightbox-close{
|
||
position:absolute; top:8px; right:8px; z-index:2;
|
||
}
|
||
|
||
:focus-visible{ outline:2px solid var(--ring); outline-offset:2px; border-radius:8px; }
|
||
:target{ scroll-margin-top: 90px; }
|
||
@media (prefers-reduced-motion: reduce){
|
||
*{transition-duration:0.001ms !important; animation-duration:0.001ms !important; animation-iteration-count:1 !important;}
|
||
}
|
||
</style>
|
||
|
||
<script>
|
||
(function(){
|
||
const KEY='aa-theme';
|
||
const metaTheme = document.querySelector('meta[name="theme-color"]');
|
||
const apply = (t)=>{
|
||
const theme = (t==='light') ? 'light' : 'dark';
|
||
document.documentElement.setAttribute('data-theme', theme);
|
||
if(metaTheme) metaTheme.setAttribute('content', theme==='light' ? '#ffffff' : '#0b0c10');
|
||
const btn = document.getElementById('themeToggle');
|
||
if(btn){
|
||
const isDark = theme==='dark';
|
||
btn.textContent = isDark ? '☀️' : '🌙';
|
||
btn.title = isDark ? 'Passa a tema chiaro' : 'Passa a tema scuro';
|
||
btn.setAttribute('aria-pressed', isDark ? 'false' : 'true');
|
||
}
|
||
};
|
||
const saved = localStorage.getItem(KEY);
|
||
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
||
apply(saved || (prefersDark ? 'dark' : 'dark'));
|
||
|
||
window.addEventListener('DOMContentLoaded', ()=>{
|
||
const btn = document.getElementById('themeToggle');
|
||
const setIcon = ()=>{
|
||
const cur = document.documentElement.getAttribute('data-theme') || 'dark';
|
||
btn.textContent = (cur==='dark') ? '☀️' : '🌙';
|
||
btn.title = (cur==='dark') ? 'Passa a tema chiaro' : 'Passa a tema scuro';
|
||
btn.setAttribute('aria-pressed', cur==='dark' ? 'false' : 'true');
|
||
};
|
||
setIcon();
|
||
btn.addEventListener('click', ()=>{
|
||
const cur = document.documentElement.getAttribute('data-theme') || 'dark';
|
||
const next = (cur==='dark') ? 'light' : 'dark';
|
||
apply(next);
|
||
localStorage.setItem(KEY, next);
|
||
setIcon();
|
||
});
|
||
});
|
||
})();
|
||
</script>
|
||
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "https://schema.org",
|
||
"@type": "Person",
|
||
"name": "Alessandro Acuna",
|
||
"jobTitle": "Mechanical Design Engineer",
|
||
"email": "mailto:alessan.acunaguardia@gmail.com",
|
||
"telephone": "+393277671048",
|
||
"url": "https://yourdomain.tld/",
|
||
"image": "https://yourdomain.tld/res/og-cover.jpg",
|
||
"sameAs": ["https://www.linkedin.com/in/aleacuna"],
|
||
"knowsAbout": ["Structural Design","Composite Materials","FEA","CAD","Aerospace","Python"],
|
||
"address": {
|
||
"@type": "PostalAddress",
|
||
"addressLocality": "Ancona",
|
||
"addressCountry": "IT"
|
||
}
|
||
}
|
||
</script>
|
||
</head>
|
||
<body>
|
||
<header>
|
||
<div class="container">
|
||
<nav>
|
||
<div class="links" aria-label="Navigation">
|
||
<a href="#about" data-i18n="nav.about">About</a>
|
||
<a href="#experience" data-i18n="nav.experience">Experience</a>
|
||
<a href="#projects" data-i18n="nav.projects">Projects</a>
|
||
<a href="#education" data-i18n="nav.education">Education</a>
|
||
<a href="#skills" data-i18n="nav.skills">Skills</a>
|
||
<a href="#contact" data-i18n="nav.contact">Contact</a>
|
||
</div>
|
||
|
||
<div class="links">
|
||
<div class="lang-switcher" id="langSwitcher">
|
||
<button class="lang-btn" id="langBtn" aria-haspopup="listbox" aria-expanded="false" aria-controls="langMenu" title="Language">
|
||
<span class="lang-flag" id="langFlag">🇮🇹</span>
|
||
<span class="lang-code" id="langCode">IT</span>
|
||
<span class="lang-caret">▾</span>
|
||
</button>
|
||
<div class="lang-menu" id="langMenu" role="listbox" tabindex="-1">
|
||
<div class="lang-option" role="option" data-lang="it" aria-selected="true" tabindex="0">
|
||
<span class="lang-flag">🇮🇹</span><span class="lang-name">Italiano</span><span class="lang-short">IT</span><span class="lang-check">✓</span>
|
||
</div>
|
||
<div class="lang-option" role="option" data-lang="en" aria-selected="false" tabindex="0">
|
||
<span class="lang-flag">🇬🇧</span><span class="lang-name">English</span><span class="lang-short">EN</span><span class="lang-check">✓</span>
|
||
</div>
|
||
<div class="lang-option" role="option" data-lang="de" aria-selected="false" tabindex="0">
|
||
<span class="lang-flag">🇩🇪</span><span class="lang-name">Deutsch</span><span class="lang-short">DE</span><span class="lang-check">✓</span>
|
||
</div>
|
||
<div class="lang-option" role="option" data-lang="es" aria-selected="false" tabindex="0">
|
||
<span class="lang-flag">🇪🇸</span><span class="lang-name">Español</span><span class="lang-short">ES</span><span class="lang-check">✓</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<button id="themeToggle" class="btn" aria-label="Toggle theme" aria-pressed="false" title="Light/Dark">🌓</button>
|
||
<a class="btn primary" href="res/Alessandro_Acuna_CV.pdf" download data-i18n="cta.downloadCv" data-i18n-attr="title" title="Scarica il CV">⬇️ Scarica CV</a>
|
||
</div>
|
||
</nav>
|
||
</div>
|
||
</header>
|
||
|
||
<main class="container">
|
||
<!-- HERO -->
|
||
<section class="hero" id="about">
|
||
<div class="card">
|
||
<h1>Alessandro Acuna</h1>
|
||
<h2 style="margin:0 0 10px 0" data-i18n="hero.role">Mechanical Design Engineer</h2>
|
||
<p data-i18n="hero.blurb">
|
||
Mechanical design engineer with experience in the design and FEM analysis of structural components for the aerospace and industrial sectors. Specialised in optimising designs for manufacturing, reducing costs and improving performance.
|
||
</p>
|
||
<div class="chips" aria-label="Highlights">
|
||
<span class="chip">Structural Design</span>
|
||
<span class="chip">Composite Materials</span>
|
||
<span class="chip">FEA (Abaqus, Ansys, Nastran, LS-DYNA, HyperWorks)</span>
|
||
<span class="chip">CAD (CATIA V5, NX, Creo)</span>
|
||
<span class="chip">Python & SAP</span>
|
||
</div>
|
||
<div style="margin-top:16px; display:flex; gap:10px; flex-wrap:wrap">
|
||
<a class="btn" href="mailto:alessan.acunaguardia@gmail.com">📧 Email</a>
|
||
<a class="btn" href="tel:+393277671048">📱 +393277671048</a>
|
||
<a class="btn" href="https://www.linkedin.com/in/aleacuna" target="_blank" rel="noopener noreferrer">💼 LinkedIn</a>
|
||
</div>
|
||
</div>
|
||
<div class="grid">
|
||
<div class="card">
|
||
<h3 data-i18n="availability.title">Availability</h3>
|
||
<p data-i18n="availability.text">Available immediately.</p>
|
||
<p class="kbd" data-i18n="availability.location">Europe · DE IT ES UK</p>
|
||
</div>
|
||
<div class="card">
|
||
<h3 data-i18n="keycompetencies.title">Key competencies</h3>
|
||
<div class="chips">
|
||
<span class="chip" data-i18n="keycompetencies.damageTolerance">Damage Tolerance</span>
|
||
<span class="chip" data-i18n="keycompetencies.buckling">Buckling & Pre-sizing</span>
|
||
<span class="chip" data-i18n="keycompetencies.impact">Impact & Energy Absorption</span>
|
||
<span class="chip" data-i18n="keycompetencies.drawing">Drawings & GD&T</span>
|
||
<span class="chip" data-i18n="keycompetencies.data">Data Analysis</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- EXPERIENCE -->
|
||
<section id="experience" class="section">
|
||
<h2 data-i18n="sections.experience">Experience</h2>
|
||
|
||
<div class="timeline">
|
||
<!-- AIRBUS -->
|
||
<div class="card item">
|
||
<div class="when">Jan 2025 – Dec 2025
|
||
<div class="logo-box"><img class="logo logo--wide" alt="Airbus logo" src="res/logos/airbus.svg" /></div>
|
||
</div>
|
||
<div>
|
||
<h3 class="brand">
|
||
<a class="brand-link" href="https://www.airbus.com" target="_blank" rel="noopener noreferrer" data-i18n="exp.airbus.title">AIRBUS - Structural Design & Analysis Engineer</a>
|
||
<span class="where" data-i18n="exp.airbus.where">Madrid, Spain</span>
|
||
</h3>
|
||
<ul>
|
||
<li data-i18n="exp.airbus.p1">Management of non-conformities and customer concessions, in order to define repairs to ensure airworthiness.</li>
|
||
<li data-i18n="exp.airbus.p2">Designing structural repairs by checking geometries, tolerances and interferences while considering hydraulic and mechanical systems and applying design and fatigue principles in CATIA V5.</li>
|
||
<li data-i18n="exp.airbus.p3">Creation of 3D models and 2D drawings of structural components in CATIA V5.</li>
|
||
<li data-i18n="exp.airbus.p4">Structural verification of repairs using FEM analysis, development of FEM models on HyperWorks for pre and post processing with Nastran as the solver.</li>
|
||
<li data-i18n="exp.airbus.p5">Development of FEM models on Abaqus to study the propagation of delamination in detail in structures affected by different types of defects.</li>
|
||
<li data-i18n="exp.airbus.p6">Collaboration with the Quality and Production departments to ensure optimal repairs without compromising the production line.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- DLR -->
|
||
<div class="card item">
|
||
<div class="when">Mar 2024 – Dec 2024
|
||
<div class="logo-box"><img class="logo logo--square" alt="DLR logo" src="res/logos/dlr.svg" /></div>
|
||
</div>
|
||
<div>
|
||
<h3 class="brand">
|
||
<a class="brand-link" href="https://www.dlr.de" target="_blank" rel="noopener noreferrer" data-i18n="exp.dlr.title">DLR – German Aerospace Center - R&D Engineer – Master Thesis</a>
|
||
<span class="where" data-i18n="exp.dlr.where">Stuttgart, Germany</span>
|
||
</h3>
|
||
<ul>
|
||
<li data-i18n="exp.dlr.p1">Compression (out of plane) testing at different speeds on cores used in sandwich structures, quasi-static and dynamic (impact) rates, to characterize the mechanical properties of the cores and verify strain-rate dependency.</li>
|
||
<li data-i18n="exp.dlr.p2">Development of FEM models on LS-Dyna to replicate the experimental results obtained. Calibration of parameters in material cards that govern the plasticity law of different materials.</li>
|
||
<li data-i18n="exp.dlr.p3">Assessment of core performance, considering not only mechanical properties but also CO2 emissions in the production of this material. Calculation of life cycle assessment using OpenLCA.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- UNIBO MOTORSPORT -->
|
||
<div class="card item">
|
||
<div class="when">Oct 2021 – Sep 2023
|
||
<div class="logo-box"><img class="logo logo--square" alt="UniBo Motorsport logo" src="res/logos/unibo-motorsport.png" /></div>
|
||
</div>
|
||
<div>
|
||
<h3 class="brand">
|
||
<a class="brand-link" href="https://motorsport.unibo.it/" target="_blank" rel="noopener noreferrer" data-i18n="exp.unibo.title">UniBo Motorsport – Formula Student - Stress & Design Engineer</a>
|
||
<span class="where" data-i18n="exp.unibo.where">Bologna, Italy</span>
|
||
</h3>
|
||
<ul>
|
||
<li data-i18n="exp.unibo.p1">Design of CFRP chassis, moulds and other structural components of the vehicle using Siemens NX, including system integration within the chassis.</li>
|
||
<li data-i18n="exp.unibo.p2">FEM analysis on Ansys to verify the structure’s strength to loads.</li>
|
||
<li data-i18n="exp.unibo.p3">Production and lamination of the chassis and designed components.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- DVP -->
|
||
<div class="card item">
|
||
<div class="when">Jul 2022 – Sep 2022
|
||
<div class="logo-box"><img class="logo" alt="DVP Vacuum Technology logo" src="res/logos/dvp-vacuum.png" /></div>
|
||
</div>
|
||
<div>
|
||
<h3 class="brand">
|
||
<a class="brand-link" href="https://www.dvp.it" target="_blank" rel="noopener noreferrer" data-i18n="exp.dvp.title">D.V.P. Vacuum Technology - Bachelor Thesis · R&D Engineer</a>
|
||
<span class="where" data-i18n="exp.dvp.where">Bologna, Italy</span>
|
||
</h3>
|
||
<ul>
|
||
<li data-i18n="exp.dvp.p1">Experimental campaigns on flow rates and pressure losses in turbines and control valves.</li>
|
||
<li data-i18n="exp.dvp.p2">Built performance maps in GT-Suite and validated the model.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- CPC -->
|
||
<div class="card item">
|
||
<div class="when">Feb 2022 – Apr 2022
|
||
<div class="logo-box"><img class="logo" alt="CPC Group logo" src="res/logos/cpc.png" /></div>
|
||
</div>
|
||
<div>
|
||
<h3 class="brand">
|
||
<a class="brand-link" href="https://www.cpcgroup.it" target="_blank" rel="noopener noreferrer" data-i18n="exp.cpc.title">CPC Group - Composite Laminator</a>
|
||
<span class="where" data-i18n="exp.cpc.where">Modena, Italy</span>
|
||
</h3>
|
||
<ul>
|
||
<li data-i18n="exp.cpc.p1">Lamination of CFRP moulds and a chassis for Formula SAE team.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- PROJECTS -->
|
||
<section id="projects" class="section">
|
||
<h2 data-i18n="sections.projects">Academic Projects</h2>
|
||
<div class="grid">
|
||
<div class="card project" data-modal="tmpl-stiffened-panels">
|
||
<h3 data-i18n="projects.card.stiff.title">Composite stiffened panels</h3>
|
||
<p data-i18n="projects.card.stiff.teaser">Buckling & damage tolerance checks, layup optimization (skin & stringers), deflection verification. <span class="where">UPM · Feb–May 2025</span></p>
|
||
</div>
|
||
|
||
<div class="card project" data-modal="tmpl-composite-hashin">
|
||
<h3 data-i18n="projects.card.hashin.title">Composite laminate - Hashin (Abaqus)</h3>
|
||
<p data-i18n="projects.card.hashin.teaser">UD laminate under tension vs compression; ply-by-ply failure using Hashin initiation; FEM-driven analysis. <span class="where">UPM · Jan–Mar 2025</span></p>
|
||
</div>
|
||
|
||
<div class="card project" data-modal="tmpl-section19">
|
||
<h3 data-i18n="projects.card.sec19.title">Rear Fuselage - Section 19 (Skin & Stringers)</h3>
|
||
<p data-i18n="projects.card.sec19.teaser">Skin laminate & stringer concept, drop-offs, reinforcements, frame joints (clips, Ø4.8 mm). <span class="where">UPM · Jan–Mar 2024</span></p>
|
||
</div>
|
||
|
||
<div class="card project" data-modal="tmpl-handlebar-bracket">
|
||
<h3 data-i18n="projects.card.handlebar.title">Handlebar Bracket - AW-2024 T3</h3>
|
||
<p data-i18n="projects.card.handlebar.teaser">
|
||
Topology optimization, clamp & VDI 2230 bolted-joint checks, static/fatigue validation (Ansys), weight minimization.
|
||
<span class="where">Unibo · Sep–Dec 2024</span>
|
||
</p>
|
||
</div>
|
||
|
||
<div class="card project" data-modal="tmpl-drone-structure">
|
||
<h3 data-i18n="projects.card.drone.title">Composite drone structure</h3>
|
||
<p data-i18n="projects.card.drone.teaser">Lamination definition, thickness optimization, harmonic & impact FEM analyses. <span class="where">Unibo · Feb–Jun 2023</span></p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TEMPLATES DETTAGLI PROGETTI -->
|
||
<template id="tmpl-stiffened-panels">
|
||
<h4 data-i18n="proj.stiff.h4">Composite stiffened panels</h4>
|
||
<p data-i18n-html="proj.stiff.obj"><strong>Objective -</strong> Design and validate CFRP panels with stringers, minimizing weight while meeting buckling and damage-tolerance requirements under the defined load cases.</p>
|
||
|
||
<div>
|
||
<a class="btn primary" href="res/projects/stiffened-panels/report.pdf" target="_blank" rel="noopener noreferrer" data-i18n="proj.common.download">📄 Download report</a>
|
||
</div>
|
||
|
||
<h5 data-i18n="proj.common.what">What I did</h5>
|
||
<ul>
|
||
<li data-i18n="proj.stiff.li1">Defined <strong>layups</strong> for skin and stringers (symmetry, balance, ply percentages).</li>
|
||
<li data-i18n="proj.stiff.li2"><strong>Pre-sized</strong> reinforcements and verified <strong>local/global buckling</strong> and <strong>stringer crippling</strong>.</li>
|
||
<li data-i18n="proj.stiff.li3">Checked <strong>deflections</strong> and <strong>margins of safety (MS)</strong> vs requirements.</li>
|
||
<li data-i18n="proj.stiff.li5">Used <strong>buckling mode shapes</strong> to guide redesign iterations.</li>
|
||
</ul>
|
||
<h5 data-i18n="proj.common.tools">Tools</h5>
|
||
<p data-i18n="proj.stiff.tools">Hand Calculation; engineering spreadsheets for trade-offs; aerospace laminate rules.</p>
|
||
<h5 data-i18n="proj.common.results">Results</h5>
|
||
<ul>
|
||
<li data-i18n="proj.stiff.r1">Weight reduction: <strong>≈ X–Y%</strong> (replace with your actual value).</li>
|
||
<li data-i18n="proj.stiff.r2"><strong>MS ≥ 0</strong> for buckling and crippling on critical load cases.</li>
|
||
<li data-i18n="proj.stiff.r3"><strong>Deflections ≤</strong> specified limit.</li>
|
||
</ul>
|
||
<hr style="border:none;border-top:1px solid var(--border);margin:8px 0 4px">
|
||
<ul class="chips" aria-label="Highlights">
|
||
<li class="chip" data-i18n="proj.stiff.ch1">Buckling & Crippling</li>
|
||
<li class="chip" data-i18n="proj.stiff.ch2">Optimized Layup</li>
|
||
<li class="chip" data-i18n="proj.stiff.ch3">FEM-Driven</li>
|
||
<li class="chip" data-i18n="proj.stiff.ch4">MS ≥ 0</li>
|
||
</ul>
|
||
</template>
|
||
|
||
<template id="tmpl-composite-hashin">
|
||
<h4 data-i18n="proj.hashin.h4">Composite laminate - Hashin (Abaqus)</h4>
|
||
<p data-i18n-html="proj.hashin.obj"><strong>Objective -</strong> Simulate a UD laminate under tension and compression using <em>Hashin damage initiation</em> to identify ply-by-ply failure and compare tensile vs compressive capacity.</p>
|
||
|
||
<div>
|
||
<a class="btn primary" href="res/projects/hashin/report.pdf" target="_blank" rel="noopener noreferrer" data-i18n="proj.common.download">📄 Download report</a>
|
||
</div>
|
||
|
||
<h5 data-i18n="proj.common.model">Model</h5>
|
||
<ul>
|
||
<li data-i18n="proj.hashin.m1">Coupon: <strong>100 × 20 mm</strong>, <strong>10 plies × 0.25 mm = 2.5 mm</strong>; symmetric layup <strong>[0°, ±45°, 0°, 90°]s</strong>.</li>
|
||
<li data-i18n="proj.hashin.m2">Elements: <strong>S4R</strong> shell mesh (~2 mm); material: UD lamina with elastic + Hashin inputs.</li>
|
||
<li data-i18n="proj.hashin.m3">BC/Load: bottom clamped; top edge coupled to a Reference Point with prescribed Y-displacement.</li>
|
||
<li data-i18n="proj.hashin.m4">Damage model: <strong>Hashin initiation</strong> (no damage evolution). Outputs: HSNFTCRT, HSNFCCRT, HSNMTCRT, HSNMCCRT.</li>
|
||
</ul>
|
||
<h5 data-i18n="proj.common.results">Results</h5>
|
||
<ul>
|
||
<li data-i18n="proj.hashin.r1"><strong>Tension:</strong> 90° matrix-tension → ±45° matrix-shear → 0° fiber-tension; <strong>UTS ≈ 413 MPa</strong>.</li>
|
||
<li data-i18n="proj.hashin.r2"><strong>Compression:</strong> ±45° matrix-compression → 90° matrix-compression → 0° fiber-compression; <strong>UCS ≈ 336 MPa</strong>.</li>
|
||
<li data-i18n="proj.hashin.r3"><strong>Strength ratio:</strong> UTS/UCS ≈ <strong>1.23</strong> (≈23% stronger in tension).</li>
|
||
</ul>
|
||
<div class="modal-gallery">
|
||
<figure>
|
||
<img src="res/projects/hashin/mesh.png" alt="Mesh and layup definition (S4R shell model)" loading="lazy">
|
||
<figcaption data-i18n="proj.hashin.cap1">Mesh & layup (S4R shells)</figcaption>
|
||
</figure>
|
||
<figure>
|
||
<img src="res/projects/hashin/damage_evolution.png" alt="Hashin indices showing first-ply failure" loading="lazy">
|
||
<figcaption data-i18n="proj.hashin.cap2">Hashin maps - first-ply failure</figcaption>
|
||
</figure>
|
||
<figure>
|
||
<img src="res/projects/hashin/tension_stress_strain.png" alt="Tension stress–strain curve with stage markers" loading="lazy">
|
||
<figcaption data-i18n="proj.hashin.cap3">Tension σ–ε (staged stiffness drops)</figcaption>
|
||
</figure>
|
||
<figure>
|
||
<img src="res/projects/hashin/compression_stress_strain.png" alt="Compression stress–strain curve with stage markers" loading="lazy">
|
||
<figcaption data-i18n="proj.hashin.cap4">Compression σ–ε (staged stiffness drops)</figcaption>
|
||
</figure>
|
||
</div>
|
||
<hr style="border:none;border-top:1px solid var(--border);margin:8px 0 4px">
|
||
<ul class="chips" aria-label="Highlights">
|
||
<li class="chip" data-i18n="proj.hashin.ch1">Hashin initiation</li>
|
||
<li class="chip" data-i18n="proj.hashin.ch2">[0/±45/0/90]s</li>
|
||
<li class="chip" data-i18n="proj.hashin.ch3">UTS 413 MPa</li>
|
||
<li class="chip" data-i18n="proj.hashin.ch4">UCS 336 MPa</li>
|
||
<li class="chip" data-i18n="proj.hashin.ch5">Ratio ≈ 1.23</li>
|
||
</ul>
|
||
</template>
|
||
|
||
<template id="tmpl-section19">
|
||
<h4 data-i18n="proj.sec19.h4">Rear Fuselage - Section 19 (Skin & Stringers)</h4>
|
||
<p data-i18n-html="proj.sec19.obj"><strong>Objective -</strong> Define composite skin and stringer concept, reinforcements, drop-offs, and frame joints (clips, Ø4.8 mm) for a fuselage bay between Frames A–B.</p>
|
||
|
||
<div>
|
||
<a class="btn primary" href="res/projects/section19/report.pdf" target="_blank" rel="noopener noreferrer" data-i18n="proj.common.download">📄 Download report</a>
|
||
</div>
|
||
|
||
<h5 data-i18n="proj.sec19.given">Given data</h5>
|
||
<ul>
|
||
<li data-i18n="proj.sec19.g1"><strong>Geometry:</strong> cylinder <strong>R = 4500 mm</strong>; frames <strong>550 mm</strong> apart; stringer pitch <strong>150 mm</strong>.</li>
|
||
<li data-i18n="proj.sec19.g2"><strong>Material:</strong> UD, <strong>CPT 0.184 mm</strong>.</li>
|
||
<li data-i18n="proj.sec19.g3"><strong>Skin:</strong> base <strong>9 plies (2/4/3)</strong>; reinforcement <strong>14 plies (2/8/4)</strong>, <strong>100 × 70 mm</strong> patch.</li>
|
||
<li data-i18n="proj.sec19.g4"><strong>Stringers:</strong> <strong>h < 35 mm</strong>, <strong>R ≥ 3 mm</strong>; web <strong>20 plies</strong> (50% 0° / 40% ±45° / 10% 90°); <strong>web = 2× flange</strong>.</li>
|
||
<li data-i18n="proj.sec19.g5"><strong>Joints:</strong> clips + <strong>Ø 4.8 mm</strong> fasteners.</li>
|
||
</ul>
|
||
<h5 data-i18n="proj.common.what">What I did</h5>
|
||
<ul>
|
||
<li data-i18n="proj.sec19.li1">Built the master geometry (frames & stringers on skin), set pitch and feet widths.</li>
|
||
<li data-i18n="proj.sec19.li2">Mapped skin layups, drop-offs and reinforcement footprint.</li>
|
||
<li data-i18n="proj.sec19.li3">Sized stringer web/flanges and verified repairability (L1 for Ø4.8 mm).</li>
|
||
<li data-i18n="proj.sec19.li4">Defined clip joints and prepared drawings, materials list, and panel weight.</li>
|
||
</ul>
|
||
<div class="modal-gallery">
|
||
<img src="res/projects/section19/assembly.png" alt="Master geometry: frames and stringers on fuselage surface" loading="lazy">
|
||
<img src="res/projects/section19/laminate_map.png" alt="Skin laminate map with drop-offs and reinforcement" loading="lazy">
|
||
<img src="res/projects/section19/drawing_stringer.png" alt="Drawing of the Stringer" loading="lazy">
|
||
<img src="res/projects/section19/drawing_clip.png" alt="Drawing of the Clip" loading="lazy">
|
||
</div>
|
||
<hr style="border:none;border-top:1px solid var(--border);margin:8px 0 4px">
|
||
<ul class="chips" aria-label="Highlights">
|
||
<li class="chip" data-i18n="proj.sec19.ch1">R 4500 mm</li>
|
||
<li class="chip" data-i18n="proj.sec19.ch2">Pitch 150 mm</li>
|
||
<li class="chip" data-i18n="proj.sec19.ch3">UD CPT 0.184 mm</li>
|
||
<li class="chip" data-i18n="proj.sec19.ch4">Clips Ø 4.8 mm</li>
|
||
</ul>
|
||
</template>
|
||
|
||
<template id="tmpl-handlebar-bracket">
|
||
<h4 data-i18n="proj.handle.h4">Handlebar Bracket - AW-2024 T3</h4>
|
||
<p data-i18n-html="proj.handle.obj">
|
||
<strong>Objective -</strong> Design a lightweight handlebar bracket within the design envelope,
|
||
compliant with steering/impact/vibration loads, manufacturable by AW-2024 T3.
|
||
</p>
|
||
|
||
<div>
|
||
<a class="btn primary" href="res/projects/handlebar-bracket/report.pdf" target="_blank" rel="noopener noreferrer" data-i18n="proj.common.download">
|
||
📄 Download report
|
||
</a>
|
||
</div>
|
||
|
||
<h5 data-i18n="proj.common.process">Process</h5>
|
||
<ul>
|
||
<li data-i18n="proj.handle.p2"><strong>Topology:</strong> compliance target with constraints on clamp stiffness and load paths → smoothed CAD rebuild.</li>
|
||
<li data-i18n="proj.handle.p3"><strong>Bolts (VDI 2230):</strong> M6 for clamp; torque, preload & checks from FEA reactions.</li>
|
||
<li data-i18n="proj.handle.p4"><strong>Validation (Ansys):</strong> static + fatigue (Goodman); handlebar–clamp contact and surface pressure checks.</li>
|
||
</ul>
|
||
|
||
<h5 data-i18n="proj.common.model">Model</h5>
|
||
<ul>
|
||
<li><strong>Material (bracket):</strong> EN AW-2024 T3 — ρ=2.77×10<sup>−3</sup> kg/mm³, E=73.1 GPa, ν=0.33, σ<sub>y</sub>=345 MPa, σ<sub>u</sub>=483 MPa.</li>
|
||
<li><strong>Loads:</strong> ultimate Fx=450 N, Fz=100 N; fatigue Fx=±350 N, Fz=50 N; life target 10<sup>5</sup> cycles.</li>
|
||
<li><strong>Contacts:</strong> threaded shaft–bracket bonded; under-head frictional (μ≈0.39); mesh conv. ~2.5 mm (local 2 mm).</li>
|
||
</ul>
|
||
|
||
<h5 data-i18n="proj.common.results">Results</h5>
|
||
<ul>
|
||
<li data-i18n="proj.handle.r1"><strong>Safety factors:</strong> ≥ 2 static, ≥ 1 fatigue.</li>
|
||
<li data-i18n="proj.handle.r2"><strong>Clamp stiffness:</strong> within deflection/rotation limits; max deflection < 1 mm at ultimate load.</li>
|
||
<li><strong>Bolts:</strong> VDI 2230 checks OK (tightening, head pressure, stiffness, thread engagement).</li>
|
||
</ul>
|
||
|
||
<div class="modal-gallery">
|
||
<img src="res/projects/handlebar-bracket/design_space.png" alt="Design space: clamp zone and handlebar constraints" loading="lazy">
|
||
<img src="res/projects/handlebar-bracket/topology_outputs.png" alt="Topology optimization outputs for handlebar bracket" loading="lazy">
|
||
<img src="res/projects/handlebar-bracket/finaldesign.png" alt="Final handlebar bracket design (AW-2024 T3)" loading="lazy">
|
||
<img src="res/projects/handlebar-bracket/femresults.png" alt="FEM results: safety factor and deflection maps" loading="lazy">
|
||
</div>
|
||
|
||
<hr style="border:none;border-top:1px solid var(--border);margin:8px 0 4px">
|
||
<ul class="chips" aria-label="Highlights">
|
||
<li class="chip" data-i18n="proj.handle.ch1">AW-2024 T3</li>
|
||
<li class="chip" data-i18n="proj.handle.ch2">Topology-Optimized</li>
|
||
<li class="chip" data-i18n="proj.handle.ch3">VDI 2230 bolts</li>
|
||
<li class="chip" data-i18n="proj.handle.ch4">Clamp OK</li>
|
||
<li class="chip" data-i18n="proj.handle.ch5">Deflection < 1 mm</li>
|
||
</ul>
|
||
</template>
|
||
|
||
<template id="tmpl-drone-structure">
|
||
<h4 data-i18n="proj.drone.h4">Composite drone structure</h4>
|
||
<p data-i18n-html="proj.drone.obj"><strong>Objective -</strong> Define laminate schedule and thicknesses to minimize weight while maintaining stiffness and strength on a composite drone frame, with harmonic and impact checks on critical members.</p>
|
||
|
||
<div>
|
||
<a class="btn primary" href="res/projects/drone/report.pdf" target="_blank" rel="noopener noreferrer" data-i18n="proj.common.download">📄 Download report</a>
|
||
</div>
|
||
|
||
<h5 data-i18n="proj.common.what">What I did</h5>
|
||
<ul>
|
||
<li data-i18n="proj.drone.li1">Selected laminate families for arms and central plate (ply angles, stacking rules, symmetry/balance).</li>
|
||
<li data-i18n="proj.drone.li2">Ran <strong>thickness optimization</strong> under flight-load envelopes (hover, maneuver, landing).</li>
|
||
<li data-i18n="proj.drone.li3">Built FEM and extracted <strong>harmonic response</strong> to avoid resonance near rotor frequencies.</li>
|
||
<li data-i18n="proj.drone.li4">Performed <strong>impact scenarios</strong> on weak spots (arm-hub joints, landing edges).</li>
|
||
</ul>
|
||
<h5 data-i18n="proj.common.results">Results</h5>
|
||
<ul>
|
||
<li data-i18n="proj.drone.r1">Weight reduction vs baseline while keeping <strong>MS ≥ 0</strong> in static checks.</li>
|
||
<li data-i18n="proj.drone.r2">Minimum separation to rotor-induced frequencies achieved.</li>
|
||
<li data-i18n="proj.drone.r3">Local reinforcements added only where needed after impact assessment.</li>
|
||
</ul>
|
||
<div class="modal-gallery">
|
||
<img src="res/projects/drone/finalthickness.png" alt="Thickness map on drone frame" loading="lazy">
|
||
<img src="res/projects/drone/harmonic_response.png" alt="Harmonic response - mode proximity to rotor frequencies" loading="lazy">
|
||
<img src="res/projects/drone/impact_results.png" alt="Impact FEM results on arm-hub joint" loading="lazy">
|
||
</div>
|
||
<hr style="border:none;border-top:1px solid var(--border);margin:8px 0 4px">
|
||
<ul class="chips" aria-label="Highlights">
|
||
<li class="chip" data-i18n="proj.drone.ch1">Layup Optimization</li>
|
||
<li class="chip" data-i18n="proj.drone.ch2">Harmonic Check</li>
|
||
<li class="chip" data-i18n="proj.drone.ch3">Impact FEM</li>
|
||
<li class="chip" data-i18n="proj.drone.ch4">MS ≥ 0</li>
|
||
</ul>
|
||
</template>
|
||
|
||
<!-- EDUCATION -->
|
||
<section id="education" class="section">
|
||
<h2 data-i18n="sections.education">Education</h2>
|
||
<div class="timeline">
|
||
<div class="card item">
|
||
<div class="when">2024 – 2025
|
||
<div class="logo-box"><img class="logo logo--square" alt="UPM logo" src="res/logos/upm.png" /></div>
|
||
</div>
|
||
<div>
|
||
<h3 class="brand">
|
||
<a class="brand-link" href="https://www.upm.es" target="_blank" rel="noopener noreferrer">Master in Composite Materials</a>
|
||
<span class="where">Airbus Programme, Universidad Politécnica de Madrid</span>
|
||
</h3>
|
||
</div>
|
||
</div>
|
||
<div class="card item">
|
||
<div class="when">2023 – 2024
|
||
<div class="logo-box"><img class="logo logo--square" alt="University of Stuttgart logo" src="res/logos/universitat.svg" /></div>
|
||
</div>
|
||
<div>
|
||
<h3 class="brand">
|
||
<a class="brand-link" href="https://www.uni-stuttgart.de" target="_blank" rel="noopener noreferrer">Erasmus – Aerospace Engineering</a>
|
||
<span class="where">University of Stuttgart</span>
|
||
</h3>
|
||
</div>
|
||
</div>
|
||
<div class="card item">
|
||
<div class="when">2019 – 2025
|
||
<div class="logo-box"><img class="logo logo--square" alt="University of Bologna logo" src="res/logos/unibo.svg" /></div>
|
||
</div>
|
||
<div>
|
||
<h3 class="brand">
|
||
<a class="brand-link" href="https://www.unibo.it" target="_blank" rel="noopener noreferrer">BSc and MSc in Mechanical Engineering</a>
|
||
<span class="where">University of Bologna</span>
|
||
</h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- SKILLS -->
|
||
<section id="skills" class="section">
|
||
<h2 data-i18n="sections.skills">Skills</h2>
|
||
<div class="card">
|
||
<h3 data-i18n="skills.software">Software</h3>
|
||
<div class="skills-grid">
|
||
<div>CAD: CATIA V5, Siemens NX, PTC Creo</div>
|
||
<div>FEA: Abaqus, ANSYS Mechanical, HyperWorks, Nastran, LS-DYNA</div>
|
||
<div>Programming / Tools: Python, basic Linux, SAP</div>
|
||
<div data-i18n="skills.data">Data Analysis: Excel, Python</div>
|
||
</div>
|
||
</div>
|
||
<div class="card" style="margin-top:12px">
|
||
<h3 data-i18n="skills.soft">Soft Skills</h3>
|
||
<div class="chips">
|
||
<span class="chip" data-i18n="skills.teamwork">Teamwork</span>
|
||
<span class="chip" data-i18n="skills.adapt">Adaptability</span>
|
||
<span class="chip" data-i18n="skills.creative">Creative Problem Solving</span>
|
||
</div>
|
||
</div>
|
||
<div class="card" style="margin-top:12px">
|
||
<h3 data-i18n="skills.langs">Languages</h3>
|
||
<div class="lang-grid">
|
||
<div data-i18n="lang.it">Italian - Native</div>
|
||
<div data-i18n="lang.es">Spanish - Fluent</div>
|
||
<div data-i18n="lang.en">English - Fluent</div>
|
||
<div data-i18n="lang.de">German - Basic</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- CONTACT -->
|
||
<section id="contact" class="section">
|
||
<h2 data-i18n="sections.contact">Contact</h2>
|
||
<div class="card">
|
||
<p data-i18n="contact.cta">Interested in collaborating or need the CV in a different format? Get in touch.</p>
|
||
<div style="margin-bottom:18px">
|
||
<strong data-i18n="contact.locationTitle">Current location:</strong> Ancona, Italy
|
||
<div style="margin:10px 0;">
|
||
<iframe
|
||
src="https://www.openstreetmap.org/export/embed.html?bbox=13.4700,43.5900,13.5600,43.6400&layer=mapnik&marker=43.6158,13.5189"
|
||
style="width:100%;height:220px;border-radius:12px;border:1px solid var(--border);"
|
||
allowfullscreen
|
||
loading="lazy"
|
||
referrerpolicy="no-referrer-when-downgrade">
|
||
</iframe>
|
||
<div style="font-size:13px;color:var(--muted);margin-top:4px;text-align:right">
|
||
<a
|
||
href="https://www.openstreetmap.org/?mlat=43.6158&mlon=13.5189#map=13/43.6158/13.5189"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
style="color:var(--primary)"
|
||
data-i18n="contact.viewmap">View larger map</a>
|
||
</div>
|
||
</div>
|
||
<div style="margin:10px 0 18px 0">
|
||
<strong data-i18n="contact.hoursTitle">Contact hours (Ancona time):</strong>
|
||
<ul style="margin:6px 0 0 0;padding-left:18px;font-size:15px;color:var(--muted)">
|
||
<li data-i18n="contact.hours.weekdays">Monday - Friday: 09:00 - 19:00</li>
|
||
<li data-i18n="contact.hours.saturday">Saturday: 09:00 - 19:00</li>
|
||
<li data-i18n="contact.hours.sunday">Sunday: 09:00 - 12:00</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div style="display:flex; gap:10px; flex-wrap:wrap">
|
||
<a class="btn" href="mailto:alessan.acunaguardia@gmail.com">📧 alessan.acunaguardia@gmail.com</a>
|
||
<a class="btn" href="tel:+393277671048">📱 +39 327 767 1048</a>
|
||
<a class="btn" href="https://www.linkedin.com/in/aleacuna" target="_blank" rel="noopener noreferrer">💼 linkedin.com/in/aleacuna</a>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="footer">
|
||
<div>© <span id="year"></span> Alessandro Acuna · <span data-i18n="footer.updated">Last updated:</span> <span id="updated"></span></div>
|
||
</section>
|
||
</main>
|
||
|
||
<dialog class="project-modal" id="projectModal" aria-modal="true" role="dialog" aria-labelledby="modalTitle">
|
||
<div class="modal-header">
|
||
<h3 class="modal-title" id="modalTitle" data-i18n="modal.title">Project details</h3>
|
||
<button class="btn modal-close" type="button" aria-label="Chiudi">✖</button>
|
||
</div>
|
||
<div class="modal-body" id="projectModalBody"></div>
|
||
<div class="modal-actions">
|
||
<button class="btn modal-close" type="button" data-i18n="modal.close">Close</button>
|
||
</div>
|
||
</dialog>
|
||
|
||
<dialog id="lightbox" aria-labelledby="lightboxCaption">
|
||
<div class="lightbox-wrap">
|
||
<button class="btn lightbox-close" type="button" aria-label="Close">✖</button>
|
||
<figure class="lightbox-figure">
|
||
<img id="lightboxImg" class="lightbox-img" src="" alt="">
|
||
<figcaption id="lightboxCaption" class="lightbox-caption"></figcaption>
|
||
</figure>
|
||
</div>
|
||
</dialog>
|
||
|
||
<script>
|
||
(function(){
|
||
const modal = document.getElementById('projectModal');
|
||
const body = document.getElementById('projectModalBody');
|
||
const titleEl = modal.querySelector('.modal-title');
|
||
let lastTrigger = null;
|
||
|
||
const getFocusables = () =>
|
||
modal.querySelectorAll('button,[href],input,select,textarea,[tabindex]:not([tabindex="-1"])');
|
||
|
||
document.addEventListener('click', (e)=>{
|
||
const card = e.target.closest('.project[data-modal]');
|
||
if(!card) return;
|
||
lastTrigger = card;
|
||
|
||
const tmplId = card.getAttribute('data-modal');
|
||
const tmpl = document.getElementById(tmplId);
|
||
if(!tmpl){ console.warn('Template non trovato:', tmplId); return; }
|
||
|
||
const cardTitle = card.querySelector('h3')?.textContent?.trim() || 'Dettagli progetto';
|
||
titleEl.textContent = cardTitle;
|
||
|
||
body.innerHTML = '';
|
||
body.appendChild(tmpl.content.cloneNode(true));
|
||
|
||
if(window.__i18n && typeof window.__i18n.apply === 'function'){
|
||
window.__i18n.apply();
|
||
}
|
||
|
||
if(typeof modal.showModal === 'function'){ modal.showModal(); }
|
||
else { modal.setAttribute('open',''); }
|
||
|
||
setTimeout(()=>{ getFocusables()[0]?.focus(); }, 0);
|
||
document.body.style.overflow = 'hidden';
|
||
});
|
||
|
||
modal.addEventListener('click', (e)=>{
|
||
if(e.target.closest('.modal-close')) modal.close();
|
||
});
|
||
|
||
modal.addEventListener('click', (e)=>{
|
||
const r = modal.getBoundingClientRect();
|
||
const inside = (e.clientX >= r.left && e.clientX <= r.right && e.clientY >= r.top && e.clientY <= r.bottom);
|
||
if(!inside) modal.close();
|
||
});
|
||
|
||
modal.addEventListener('cancel', (e)=>{ e.preventDefault(); modal.close(); });
|
||
|
||
modal.addEventListener('close', ()=>{
|
||
document.body.style.overflow = '';
|
||
lastTrigger?.focus();
|
||
});
|
||
|
||
modal.addEventListener('keydown',(e)=>{
|
||
if(e.key !== 'Tab') return;
|
||
const f = [...getFocusables()];
|
||
if(!f.length) return;
|
||
const i = f.indexOf(document.activeElement);
|
||
if(e.shiftKey && (i === 0 || i === -1)){ e.preventDefault(); f[f.length-1].focus(); }
|
||
else if(!e.shiftKey && (i === f.length-1)){ e.preventDefault(); f[0].focus(); }
|
||
});
|
||
})();
|
||
</script>
|
||
|
||
<script>
|
||
(function(){
|
||
const lb = document.getElementById('lightbox');
|
||
const img = document.getElementById('lightboxImg');
|
||
const cap = document.getElementById('lightboxCaption');
|
||
|
||
document.addEventListener('click', (e)=>{
|
||
const targetImg = e.target.closest('.modal-gallery img');
|
||
if(!targetImg) return;
|
||
|
||
img.src = targetImg.src;
|
||
img.alt = targetImg.alt || '';
|
||
cap.textContent = targetImg.closest('figure')?.querySelector('figcaption')?.textContent || targetImg.alt || '';
|
||
|
||
if(typeof lb.showModal === 'function'){ lb.showModal(); }
|
||
else { lb.setAttribute('open',''); }
|
||
});
|
||
|
||
lb.addEventListener('click', (e)=>{
|
||
if(e.target.closest('.lightbox-close')) lb.close();
|
||
});
|
||
|
||
lb.addEventListener('click', (e)=>{
|
||
const r = lb.getBoundingClientRect();
|
||
const inside = (e.clientX >= r.left && e.clientX <= r.right && e.clientY >= r.top && e.clientY <= r.bottom);
|
||
if(!inside) lb.close();
|
||
});
|
||
|
||
lb.addEventListener('cancel', (e)=>{ e.preventDefault(); lb.close(); });
|
||
})();
|
||
</script>
|
||
|
||
<script>
|
||
(function(){
|
||
const DEFAULT_LANG = 'it';
|
||
const STORAGE_KEY = 'site-lang';
|
||
|
||
const t = {
|
||
it: {
|
||
'cta.downloadCv': '⬇️ Scarica CV',
|
||
'cta.downloadCv@title': 'Scarica il CV',
|
||
'nav.about':'About',
|
||
'nav.experience':'Esperienza',
|
||
'nav.projects':'Progetti',
|
||
'nav.education':'Formazione',
|
||
'nav.skills':'Competenze',
|
||
'nav.contact':'Contatti',
|
||
|
||
'hero.role':'Mechanical Design Engineer',
|
||
'hero.blurb':'Mechanical design engineer con esperienza nella progettazione e nell’analisi FEM di componenti strutturali per i settori aerospace e industriale. Specializzato nell’ottimizzazione del design per la produzione, riduzione dei costi e miglioramento delle performance.',
|
||
|
||
'availability.title':'Disponibilità',
|
||
'availability.text':'Disponibile immediatamente.',
|
||
'availability.location':'Europe · DE IT ES UK',
|
||
|
||
'keycompetencies.title':'Competenze chiave',
|
||
'keycompetencies.damageTolerance':'Damage Tolerance',
|
||
'keycompetencies.buckling':'Buckling & Pre-sizing',
|
||
'keycompetencies.impact':'Impact & Energy Absorption',
|
||
'keycompetencies.drawing':'Drawings & GD&T',
|
||
'keycompetencies.data':'Data Analysis',
|
||
|
||
'sections.experience':'Esperienza',
|
||
'sections.projects':'Progetti Accademici',
|
||
'sections.education':'Formazione',
|
||
'sections.skills':'Competenze',
|
||
'sections.contact':'Contatti',
|
||
|
||
'projects.card.stiff.title':'Pannelli compositi irrigiditi',
|
||
'projects.card.stiff.teaser':'Verifiche di buckling e damage tolerance, ottimizzazione layup (skin & stringers), verifica deflessioni. <span class="where">UPM · Feb–Mag 2025</span>',
|
||
'projects.card.hashin.title':'Laminato composito - Hashin (Abaqus)',
|
||
'projects.card.hashin.teaser':'Provino UD a trazione vs. compressione; failure ply-by-ply con Hashin; analisi FEM. <span class="where">UPM · Gen–Mar 2025</span>',
|
||
'projects.card.sec19.title':'Sezione 19 - fusoliera posteriore (Skin & Stringers)',
|
||
'projects.card.sec19.teaser':'Skin laminate & concept stringers, drop-off, rinforzi, giunti a frame (clip, Ø4.8 mm). <span class="where">UPM · Gen–Mar 2024</span>',
|
||
'projects.card.handlebar.title':'Staffa manubrio - AW-2024 T3',
|
||
'projects.card.handlebar.teaser':'Ottimizzazione topologica, verifica morsetto e bulloneria VDI 2230, validazione statico/fatica (Ansys), minimizzazione del peso. <span class="where">Unibo · Set–Dic 2024</span>',
|
||
'projects.card.drone.title':'Struttura drone in composito',
|
||
'projects.card.drone.teaser':'Definizione lamina, ottimizzazione spessori, analisi armoniche & impatto. <span class="where">Unibo · Feb–Giu 2023</span>',
|
||
|
||
'skills.software':'Software',
|
||
'skills.data':'Data Analysis: Excel, Python',
|
||
'skills.soft':'Soft Skills',
|
||
'skills.teamwork':'Teamwork',
|
||
'skills.adapt':'Adaptability',
|
||
'skills.creative':'Creative Problem Solving',
|
||
'skills.langs':'Lingue',
|
||
'lang.it':'Italiano - Madrelingua',
|
||
'lang.es':'Spagnolo - Fluente',
|
||
'lang.en':'Inglese - Fluente',
|
||
'lang.de':'Tedesco - Base',
|
||
|
||
'contact.cta':'Interessa collaborare o vuoi il CV in un formato diverso? Scrivimi.',
|
||
'contact.locationTitle':'Località attuale:',
|
||
'contact.viewmap':'Apri mappa',
|
||
'contact.hoursTitle':'Orari di contatto (ora di Ancona):',
|
||
'contact.hours.weekdays':'Lunedì - Venerdì: 09:00 - 19:00',
|
||
'contact.hours.saturday':'Sabato: 09:00 - 19:00',
|
||
'contact.hours.sunday':'Domenica: 09:00 - 12:00',
|
||
|
||
'footer.updated':'Ultimo aggiornamento:',
|
||
'modal.title':'Dettagli progetto',
|
||
'modal.close':'Chiudi',
|
||
|
||
'exp.airbus.title':'AIRBUS - Structural Design & Analysis Engineer',
|
||
'exp.airbus.where':'Madrid, Spain',
|
||
'exp.airbus.p1':'Gestione di non-conformità e customer concessions per definire riparazioni che garantiscano l’airworthiness.',
|
||
'exp.airbus.p2':'Progettazione di riparazioni strutturali verificando geometrie, tolleranze e interferenze, considerando sistemi idraulici e meccanici e applicando principi di design e fatica in CATIA V5.',
|
||
'exp.airbus.p3':'Creazione di modelli 3D e tavole 2D di componenti strutturali in CATIA V5.',
|
||
'exp.airbus.p4':'Verifica strutturale delle riparazioni tramite analisi FEM, sviluppo di modelli FEM in HyperWorks per pre e post processing con Nastran come solver.',
|
||
'exp.airbus.p5':'Sviluppo di modelli FEM in Abaqus per studiare in dettaglio la propagazione della delaminazione in strutture affette da diversi tipi di difetti.',
|
||
'exp.airbus.p6':'Collaborazione con i reparti Quality e Production per garantire riparazioni ottimali senza compromettere la linea produttiva.',
|
||
|
||
'exp.dlr.title':'DLR – German Aerospace Center - R&D Engineer – Master Thesis',
|
||
'exp.dlr.where':'Stuttgart, Germany',
|
||
'exp.dlr.p1':'Test di compressione fuori piano a diverse velocità su core di sandwich structures, a rate quasi-statici e dinamici (impatto), per caratterizzarne le proprietà meccaniche e verificare la strain-rate dependency.',
|
||
'exp.dlr.p2':'Sviluppo di modelli FEM in LS-Dyna per replicare i risultati sperimentali. Calibrazione dei parametri delle material cards che governano la legge plastica di diversi materiali.',
|
||
'exp.dlr.p3':'Valutazione delle performance dei core considerando non solo le proprietà meccaniche ma anche le emissioni di CO2 nella produzione del materiale. Calcolo LCA con OpenLCA.',
|
||
|
||
'exp.unibo.title':'UniBo Motorsport – Formula Student - Stress & Design Engineer',
|
||
'exp.unibo.where':'Bologna, Italy',
|
||
'exp.unibo.p1':'Progettazione di chassis CFRP, stampi e altri componenti strutturali del veicolo con Siemens NX, inclusa l’integrazione di sistema all’interno del telaio.',
|
||
'exp.unibo.p2':'Analisi FEM in Ansys per verificare la resistenza della struttura ai carichi.',
|
||
'exp.unibo.p3':'Produzione e laminazione del telaio e dei componenti progettati.',
|
||
|
||
'exp.dvp.title':'D.V.P. Vacuum Technology - Tesi Triennale · R&D Engineer',
|
||
'exp.dvp.where':'Bologna, Italy',
|
||
'exp.dvp.p1':'Campagne sperimentali su portate e perdite di carico in turbine e valvole di controllo.',
|
||
'exp.dvp.p2':'Sviluppo di performance maps in GT-Suite e validazione del modello.',
|
||
|
||
'exp.cpc.title':'CPC Group - Composite Laminator',
|
||
'exp.cpc.where':'Modena, Italy',
|
||
'exp.cpc.p1':'Laminazione di stampi in CFRP e di un telaio per il team Formula SAE.',
|
||
|
||
'proj.common.what':'Cosa ho fatto',
|
||
'proj.common.model':'Modello',
|
||
'proj.common.tools':'Strumenti',
|
||
'proj.common.results':'Risultati',
|
||
'proj.common.process':'Processo',
|
||
'proj.common.download':'📄 Scarica report',
|
||
|
||
'proj.stiff.h4':'Pannelli compositi irrigiditi',
|
||
'proj.stiff.obj':'<strong>Obiettivo -</strong> Progettare e validare pannelli CFRP irrigiditi minimizzando il peso e rispettando i requisiti di buckling e damage tolerance.',
|
||
'proj.stiff.li1':'Definizione dei <strong>layup</strong> per skin e stringers (simmetria, bilanciamento, percentuali).',
|
||
'proj.stiff.li2':'<strong>Predimensionamento</strong> dei rinforzi e verifica di <strong>buckling</strong> locale/globale e <strong>crippling</strong> stringer.',
|
||
'proj.stiff.li3':'Verifica <strong>deflessioni</strong> e <strong>MS</strong> vs requisiti.',
|
||
'proj.stiff.li5':'Uso delle <strong>forme modali</strong> di buckling per guidare il redesign.',
|
||
'proj.stiff.tools':'Calcoli a mano; fogli ingegneristici; regole aerospaziali di laminazione.',
|
||
'proj.stiff.r1':'Riduzione di peso: <strong>≈ X–Y%</strong>.',
|
||
'proj.stiff.r2':'<strong>MS ≥ 0</strong> per buckling/crippling nei casi critici.',
|
||
'proj.stiff.r3':'<strong>Deflessioni ≤</strong> limite.',
|
||
'proj.stiff.ch1':'Buckling & Crippling',
|
||
'proj.stiff.ch2':'Layup ottimizzato',
|
||
'proj.stiff.ch3':'FEM-Driven',
|
||
'proj.stiff.ch4':'MS ≥ 0',
|
||
|
||
'proj.hashin.h4':'Laminato composito - Hashin (Abaqus)',
|
||
'proj.hashin.obj':'<strong>Obiettivo -</strong> Simulare un laminato UD a trazione e compressione con <em>inizio danno Hashin</em> per identificare il first-ply failure e confrontare la capacità a trazione/compressione.',
|
||
'proj.hashin.m1':'Provino: <strong>100 × 20 mm</strong>, <strong>10 lamine × 0.25 mm = 2.5 mm</strong>; layup simmetrico <strong>[0°, ±45°, 0°, 90°]s</strong>.',
|
||
'proj.hashin.m2':'Elementi: <strong>S4R</strong> (≈2 mm); materiale: lamina UD con elastico + Hashin.',
|
||
'proj.hashin.m3':'Vincoli/Carico: bordo inferiore vincolato; bordo superiore accoppiato a RP con spostamento prescritto in Y.',
|
||
'proj.hashin.m4':'Danno: <strong>Hashin initiation</strong> (no evoluzione). Output: HSNFTCRT, HSNFCCRT, HSNMTCRT, HSNMCCRT.',
|
||
'proj.hashin.r1':'<strong>Trazione:</strong> 90° matrix-tension → ±45° matrix-shear → 0° fiber-tension; <strong>UTS ≈ 413 MPa</strong>.',
|
||
'proj.hashin.r2':'<strong>Compressione:</strong> ±45° matrix-compression → 90° matrix-compression → 0° fiber-compression; <strong>UCS ≈ 336 MPa</strong>.',
|
||
'proj.hashin.r3':'<strong>Rapporto:</strong> UTS/UCS ≈ <strong>1.23</strong>.',
|
||
'proj.hashin.cap1':'Mesh & layup (S4R)',
|
||
'proj.hashin.cap2':'Mappe Hashin - first-ply',
|
||
'proj.hashin.cap3':'σ–ε trazione (drop di rigidezza)',
|
||
'proj.hashin.cap4':'σ–ε compressione (drop di rigidezza)',
|
||
'proj.hashin.ch1':'Hashin initiation',
|
||
'proj.hashin.ch2':'[0/±45/0/90]s',
|
||
'proj.hashin.ch3':'UTS 413 MPa',
|
||
'proj.hashin.ch4':'UCS 336 MPa',
|
||
'proj.hashin.ch5':'Rapporto ≈ 1.23',
|
||
|
||
'proj.sec19.h4':'Sezione 19 - fusoliera (Skin & Stringers)',
|
||
'proj.sec19.obj':'<strong>Obiettivo -</strong> Definire skin e stringers in composito, rinforzi, drop-off e giunti ai frame (clip, Ø4.8 mm) per un pannello tra i frame A–B.',
|
||
'proj.sec19.given':'Dati di base',
|
||
'proj.sec19.g1':'<strong>Geometria:</strong> cilindro <strong>R = 4500 mm</strong>; frame distanti <strong>550 mm</strong>; pitch stringer <strong>150 mm</strong>.',
|
||
'proj.sec19.g2':'<strong>Materiale:</strong> UD, <strong>CPT 0.184 mm</strong>.',
|
||
'proj.sec19.g3':'<strong>Skin:</strong> base <strong>9 lamine (2/4/3)</strong>; rinforzo <strong>14 lamine (2/8/4)</strong>, patch <strong>100 × 70 mm</strong>.',
|
||
'proj.sec19.g4':'<strong>Stringers:</strong> <strong>h < 35 mm</strong>, <strong>R ≥ 3 mm</strong>; anima <strong>20 lamine</strong> (50% 0° / 40% ±45° / 10% 90°); <strong>anima = 2× flange</strong>.',
|
||
'proj.sec19.g5':'<strong>Giunzioni:</strong> clip + <strong>Ø 4.8 mm</strong> fasteners.',
|
||
'proj.sec19.li1':'Geometria master (frame & stringer sulla skin), pitch e piedi.',
|
||
'proj.sec19.li2':'Mappatura layup skin, drop-off e footprint di rinforzo.',
|
||
'proj.sec19.li3':'Sizing web/flange e verifiche riparabilità (L1 con Ø4.8).',
|
||
'proj.sec19.li4':'Definizione clip e preparazione tavole/materiali/peso.',
|
||
'proj.sec19.ch1':'R 4500 mm',
|
||
'proj.sec19.ch2':'Pitch 150 mm',
|
||
'proj.sec19.ch3':'UD CPT 0.184 mm',
|
||
'proj.sec19.ch4':'Clip Ø 4.8 mm',
|
||
|
||
'proj.handle.h4':'Staffa manubrio - AW-2024 T3',
|
||
'proj.handle.obj':'<strong>Obiettivo -</strong> Progettare una staffa manubrio leggera entro gli ingombri, conforme ai carichi di sterzo/urto/vibrazioni, producibile in AW-2024 T3.',
|
||
'proj.handle.p2':'<strong>Topologia:</strong> obiettivo di compliance con vincoli su rigidezza del morsetto e percorsi di carico → rebuild CAD levigato.',
|
||
'proj.handle.p3':'<strong>Bulloni (VDI 2230):</strong> M6 per morsetto; coppia, preload e verifiche da reazioni FEM.',
|
||
'proj.handle.p4':'<strong>Validazione (Ansys):</strong> statico + fatica (Goodman); contatto manubrio–morsetto e pressioni superficiali.',
|
||
'proj.handle.r1':'<strong>Fattori di sicurezza:</strong> ≥ 2 statico, ≥ 1 a fatica.',
|
||
'proj.handle.r2':'<strong>Rigidezza morsetto:</strong> entro i limiti di flessione/rotazione; freccia max < 1 mm.',
|
||
'proj.handle.ch1':'AW-2024 T3',
|
||
'proj.handle.ch2':'Topology-Optimized',
|
||
'proj.handle.ch3':'VDI 2230',
|
||
'proj.handle.ch4':'Morsetto OK',
|
||
'proj.handle.ch5':'Deflessione < 1 mm',
|
||
|
||
'proj.drone.h4':'Struttura drone in composito',
|
||
'proj.drone.obj':'<strong>Obiettivo -</strong> Definire layup e spessori per minimizzare il peso mantenendo rigidezza/resistenza; verifiche armoniche e impatto.',
|
||
'proj.drone.li1':'Selezione famiglie di laminati per bracci e piastra.',
|
||
'proj.drone.li2':'<strong>Ottimizzazione spessori</strong> su inviluppo carichi di volo.',
|
||
'proj.drone.li3':'FEM con <strong>risposta armonica</strong> lontano da frequenze rotori.',
|
||
'proj.drone.li4':'Scenari di <strong>impatto</strong> su giunti braccio-mozzo e bordi d’atterraggio.',
|
||
'proj.drone.r1':'Riduzione peso con <strong>MS ≥ 0</strong>.',
|
||
'proj.drone.r2':'Separazione minima da frequenze indotte dai rotori.',
|
||
'proj.drone.r3':'Rinforzi locali solo dove necessari.',
|
||
'proj.drone.ch1':'Layup Optimization',
|
||
'proj.drone.ch2':'Harmonic Check',
|
||
'proj.drone.ch3':'Impact FEM',
|
||
'proj.drone.ch4':'MS ≥ 0'
|
||
},
|
||
|
||
en: {
|
||
'cta.downloadCv': '⬇️ Download CV',
|
||
'cta.downloadCv@title': 'Download CV',
|
||
'nav.about':'About',
|
||
'nav.experience':'Experience',
|
||
'nav.projects':'Projects',
|
||
'nav.education':'Education',
|
||
'nav.skills':'Skills',
|
||
'nav.contact':'Contact',
|
||
|
||
'hero.role':'Mechanical Design Engineer',
|
||
'hero.blurb':'Mechanical design engineer with experience in the design and FEM analysis of structural components for the aerospace and industrial sectors. Specialised in optimising designs for manufacturing, reducing costs and improving performance.',
|
||
|
||
'availability.title':'Availability',
|
||
'availability.text':'Available immediately.',
|
||
'availability.location':'Europe · DE IT ES UK',
|
||
|
||
'keycompetencies.title':'Key competencies',
|
||
'keycompetencies.damageTolerance':'Damage Tolerance',
|
||
'keycompetencies.buckling':'Buckling & Pre-sizing',
|
||
'keycompetencies.impact':'Impact & Energy Absorption',
|
||
'keycompetencies.drawing':'Drawings & GD&T',
|
||
'keycompetencies.data':'Data Analysis',
|
||
|
||
'sections.experience':'Experience',
|
||
'sections.projects':'Academic Projects',
|
||
'sections.education':'Education',
|
||
'sections.skills':'Skills',
|
||
'sections.contact':'Contact',
|
||
|
||
'projects.card.stiff.title':'Composite stiffened panels',
|
||
'projects.card.stiff.teaser':'Buckling & damage tolerance checks, layup optimization (skin & stringers), deflection verification. <span class="where">UPM · Feb–May 2025</span>',
|
||
'projects.card.hashin.title':'Composite laminate - Hashin (Abaqus)',
|
||
'projects.card.hashin.teaser':'UD laminate under tension vs compression; ply-by-ply failure using Hashin initiation; FEM-driven analysis. <span class="where">UPM · Jan–Mar 2025</span>',
|
||
'projects.card.sec19.title':'Rear Fuselage - Section 19 (Skin & Stringers)',
|
||
'projects.card.sec19.teaser':'Skin laminate & stringer concept, drop-offs, reinforcements, frame joints (clips, Ø4.8 mm). <span class="where">UPM · Jan–Mar 2024</span>',
|
||
'projects.card.handlebar.title':'Handlebar Bracket - AW-2024 T3',
|
||
'projects.card.handlebar.teaser':'Topology optimization, clamp & VDI 2230 bolted-joint checks, static/fatigue validation (Ansys), weight minimization. <span class="where">Unibo · Sep–Dec 2024</span>',
|
||
'projects.card.drone.title':'Composite drone structure',
|
||
'projects.card.drone.teaser':'Lamination definition, thickness optimization, harmonic & impact FEM analyses. <span class="where">Unibo · Feb–Jun 2023</span>',
|
||
|
||
'skills.software':'Software',
|
||
'skills.data':'Data Analysis: Excel, Python',
|
||
'skills.soft':'Soft Skills',
|
||
'skills.teamwork':'Teamwork',
|
||
'skills.adapt':'Adaptability',
|
||
'skills.creative':'Creative Problem Solving',
|
||
'skills.langs':'Languages',
|
||
'lang.it':'Italian - Native',
|
||
'lang.es':'Spanish - Fluent',
|
||
'lang.en':'English - Fluent',
|
||
'lang.de':'German - Basic',
|
||
|
||
'contact.cta':'Interested in collaborating or need the CV in a different format? Get in touch.',
|
||
'contact.locationTitle':'Current location:',
|
||
'contact.viewmap':'View larger map',
|
||
'contact.hoursTitle':'Contact hours (Ancona time):',
|
||
'contact.hours.weekdays':'Monday - Friday: 09:00 - 19:00',
|
||
'contact.hours.saturday':'Saturday: 09:00 - 19:00',
|
||
'contact.hours.sunday':'Sunday: 09:00 - 12:00',
|
||
|
||
'footer.updated':'Last updated:',
|
||
'modal.title':'Project details',
|
||
'modal.close':'Close',
|
||
|
||
'exp.airbus.title':'AIRBUS - Structural Design & Analysis Engineer',
|
||
'exp.airbus.where':'Madrid, Spain',
|
||
'exp.airbus.p1':'Management of non-conformities and customer concessions, in order to define repairs to ensure airworthiness.',
|
||
'exp.airbus.p2':'Designing structural repairs by checking geometries, tolerances and interferences while considering hydraulic and mechanical systems and applying design and fatigue principles in CATIA V5.',
|
||
'exp.airbus.p3':'Creation of 3D models and 2D drawings of structural components in CATIA V5.',
|
||
'exp.airbus.p4':'Structural verification of repairs using FEM analysis, development of FEM models on HyperWorks for pre and post processing with Nastran as the solver.',
|
||
'exp.airbus.p5':'Development of FEM models on Abaqus to study the propagation of delamination in detail in structures affected by different types of defects.',
|
||
'exp.airbus.p6':'Collaboration with the Quality and Production departments to ensure optimal repairs without compromising the production line.',
|
||
|
||
'exp.dlr.title':'DLR – German Aerospace Center - R&D Engineer – Master Thesis',
|
||
'exp.dlr.where':'Stuttgart, Germany',
|
||
'exp.dlr.p1':'Compression (out of plane) testing at different speeds on cores used in sandwich structures, quasi-static and dynamic (impact) rates, to characterize the mechanical properties of the cores and verify strain-rate dependency.',
|
||
'exp.dlr.p2':'Development of FEM models on LS-Dyna to replicate the experimental results obtained. Calibration of parameters in material cards that govern the plasticity law of different materials.',
|
||
'exp.dlr.p3':'Assessment of core performance, considering not only mechanical properties but also CO2 emissions in the production of this material. Calculation of life cycle assessment using OpenLCA.',
|
||
|
||
'exp.unibo.title':'UniBo Motorsport – Formula Student - Stress & Design Engineer',
|
||
'exp.unibo.where':'Bologna, Italy',
|
||
'exp.unibo.p1':'Design of CFRP chassis, moulds and other structural components of the vehicle using Siemens NX, including system integration within the chassis.',
|
||
'exp.unibo.p2':'FEM analysis on Ansys to verify the structure’s strength to loads.',
|
||
'exp.unibo.p3':'Production and lamination of the chassis and designed components.',
|
||
|
||
'exp.dvp.title':'D.V.P. Vacuum Technology - Bachelor Thesis · R&D Engineer',
|
||
'exp.dvp.where':'Bologna, Italy',
|
||
'exp.dvp.p1':'Experimental campaigns on flow rates and pressure losses in turbines and control valves.',
|
||
'exp.dvp.p2':'Built performance maps in GT-Suite and validated the model.',
|
||
|
||
'exp.cpc.title':'CPC Group - Composite Laminator',
|
||
'exp.cpc.where':'Modena, Italy',
|
||
'exp.cpc.p1':'Lamination of CFRP moulds and a chassis for Formula SAE team.',
|
||
|
||
'proj.common.what':'What I did',
|
||
'proj.common.model':'Model',
|
||
'proj.common.tools':'Tools',
|
||
'proj.common.results':'Results',
|
||
'proj.common.process':'Process',
|
||
'proj.common.download':'📄 Download report',
|
||
|
||
'proj.stiff.h4':'Composite stiffened panels',
|
||
'proj.stiff.obj':'<strong>Objective -</strong> Design and validate CFRP panels with stringers, minimizing weight while meeting buckling and damage-tolerance requirements under the defined load cases.',
|
||
'proj.stiff.li1':'Defined <strong>layups</strong> for skin and stringers (symmetry, balance, ply percentages).',
|
||
'proj.stiff.li2':'<strong>Pre-sized</strong> reinforcements and verified <strong>local/global buckling</strong> and <strong>stringer crippling</strong>.',
|
||
'proj.stiff.li3':'Checked <strong>deflections</strong> and <strong>margins of safety (MS)</strong> vs requirements.',
|
||
'proj.stiff.li5':'Used <strong>buckling mode shapes</strong> to guide redesign iterations.',
|
||
'proj.stiff.tools':'Hand Calculation; engineering spreadsheets for trade-offs; aerospace laminate rules.',
|
||
'proj.stiff.r1':'Weight reduction: <strong>≈ X–Y%</strong> (replace with your actual value).',
|
||
'proj.stiff.r2':'<strong>MS ≥ 0</strong> for buckling and crippling on critical load cases.',
|
||
'proj.stiff.r3':'<strong>Deflections ≤</strong> specified limit.',
|
||
'proj.stiff.ch1':'Buckling & Crippling',
|
||
'proj.stiff.ch2':'Optimized Layup',
|
||
'proj.stiff.ch3':'FEM-Driven',
|
||
'proj.stiff.ch4':'MS ≥ 0',
|
||
|
||
'proj.hashin.h4':'Composite laminate - Hashin (Abaqus)',
|
||
'proj.hashin.obj':'<strong>Objective -</strong> Simulate a UD laminate under tension and compression using <em>Hashin damage initiation</em> to identify ply-by-ply failure and compare tensile vs compressive capacity.',
|
||
'proj.hashin.m1':'Coupon: <strong>100 × 20 mm</strong>, <strong>10 plies × 0.25 mm = 2.5 mm</strong>; symmetric layup <strong>[0°, ±45°, 0°, 90°]s</strong>.',
|
||
'proj.hashin.m2':'Elements: <strong>S4R</strong> shell mesh (~2 mm); material: UD lamina with elastic + Hashin inputs.',
|
||
'proj.hashin.m3':'BC/Load: bottom clamped; top edge coupled to a Reference Point with prescribed Y-displacement.',
|
||
'proj.hashin.m4':'Damage model: <strong>Hashin initiation</strong> (no damage evolution). Outputs: HSNFTCRT, HSNFCCRT, HSNMTCRT, HSNMCCRT.',
|
||
'proj.hashin.r1':'<strong>Tension:</strong> 90° matrix-tension → ±45° matrix-shear → 0° fiber-tension; <strong>UTS ≈ 413 MPa</strong>.',
|
||
'proj.hashin.r2':'<strong>Compression:</strong> ±45° matrix-compression → 90° matrix-compression → 0° fiber-compression; <strong>UCS ≈ 336 MPa</strong>.',
|
||
'proj.hashin.r3':'<strong>Strength ratio:</strong> UTS/UCS ≈ <strong>1.23</strong> (≈23% stronger in tension).',
|
||
'proj.hashin.cap1':'Mesh & layup (S4R shells)',
|
||
'proj.hashin.cap2':'Hashin maps - first-ply failure',
|
||
'proj.hashin.cap3':'Tension σ–ε (staged stiffness drops)',
|
||
'proj.hashin.cap4':'Compression σ–ε (staged stiffness drops)',
|
||
'proj.hashin.ch1':'Hashin initiation',
|
||
'proj.hashin.ch2':'[0/±45/0/90]s',
|
||
'proj.hashin.ch3':'UTS 413 MPa',
|
||
'proj.hashin.ch4':'UCS 336 MPa',
|
||
'proj.hashin.ch5':'Ratio ≈ 1.23',
|
||
|
||
'proj.sec19.h4':'Rear Fuselage - Section 19 (Skin & Stringers)',
|
||
'proj.sec19.obj':'<strong>Objective -</strong> Define composite skin and stringer concept, reinforcements, drop-offs, and frame joints (clips, Ø4.8 mm) for a fuselage bay between Frames A–B.',
|
||
'proj.sec19.given':'Given data',
|
||
'proj.sec19.g1':'<strong>Geometry:</strong> cylinder <strong>R = 4500 mm</strong>; frames <strong>550 mm</strong> apart; stringer pitch <strong>150 mm</strong>.',
|
||
'proj.sec19.g2':'<strong>Material:</strong> UD, <strong>CPT 0.184 mm</strong>.',
|
||
'proj.sec19.g3':'<strong>Skin:</strong> base <strong>9 plies (2/4/3)</strong>; reinforcement <strong>14 plies (2/8/4)</strong>, <strong>100 × 70 mm</strong> patch.',
|
||
'proj.sec19.g4':'<strong>Stringers:</strong> <strong>h < 35 mm</strong>, <strong>R ≥ 3 mm</strong>; web <strong>20 plies</strong> (50% 0° / 40% ±45° / 10% 90°); <strong>web = 2× flange</strong>.',
|
||
'proj.sec19.g5':'<strong>Joints:</strong> clips + <strong>Ø 4.8 mm</strong> fasteners.',
|
||
'proj.sec19.li1':'Built the master geometry (frames & stringers on skin), set pitch and feet widths.',
|
||
'proj.sec19.li2':'Mapped skin layups, drop-offs and reinforcement footprint.',
|
||
'proj.sec19.li3':'Sized stringer web/flanges and verified repairability (L1 for Ø4.8 mm).',
|
||
'proj.sec19.li4':'Defined clip joints and prepared drawings, materials list, and panel weight.',
|
||
'proj.sec19.ch1':'R 4500 mm',
|
||
'proj.sec19.ch2':'Pitch 150 mm',
|
||
'proj.sec19.ch3':'UD CPT 0.184 mm',
|
||
'proj.sec19.ch4':'Clips Ø 4.8 mm',
|
||
|
||
'proj.handle.h4':'Handlebar Bracket - AW-2024 T3',
|
||
'proj.handle.obj':'<strong>Objective -</strong> Design a lightweight handlebar bracket within the envelope, compliant with steering/impact/vibration loads, manufacturable by AW-2024 T3.',
|
||
'proj.handle.p2':'<strong>Topology:</strong> compliance target with constraints on clamp stiffness and load paths → smoothed CAD rebuild.',
|
||
'proj.handle.p3':'<strong>Bolts (VDI 2230):</strong> M6 for clamp; torque, preload & checks from FEA reactions.',
|
||
'proj.handle.p4':'<strong>Validation (Ansys):</strong> static + fatigue (Goodman); handlebar–clamp contact and surface pressure checks.',
|
||
'proj.handle.r1':'<strong>Safety factors:</strong> ≥ 2 static, ≥ 1 fatigue.',
|
||
'proj.handle.r2':'<strong>Clamp stiffness:</strong> within deflection/rotation limits; max deflection < 1 mm.',
|
||
'proj.handle.ch1':'AW-2024 T3',
|
||
'proj.handle.ch2':'Topology-Optimized',
|
||
'proj.handle.ch3':'VDI 2230 bolts',
|
||
'proj.handle.ch4':'Clamp OK',
|
||
'proj.handle.ch5':'Deflection < 1 mm',
|
||
|
||
'proj.drone.h4':'Composite drone structure',
|
||
'proj.drone.obj':'<strong>Objective -</strong> Define laminate schedule and thicknesses to minimize weight while maintaining stiffness and strength on a composite drone frame, with harmonic and impact checks on critical members.',
|
||
'proj.drone.li1':'Selected laminate families for arms and central plate (ply angles, stacking rules, symmetry/balance).',
|
||
'proj.drone.li2':'Ran <strong>thickness optimization</strong> under flight-load envelopes (hover, maneuver, landing).',
|
||
'proj.drone.li3':'Built FEM and extracted <strong>harmonic response</strong> to avoid resonance near rotor frequencies.',
|
||
'proj.drone.li4':'Performed <strong>impact scenarios</strong> on weak spots (arm-hub joints, landing edges).',
|
||
'proj.drone.r1':'Weight reduction vs baseline while keeping <strong>MS ≥ 0</strong> in static checks.',
|
||
'proj.drone.r2':'Minimum separation to rotor-induced frequencies achieved.',
|
||
'proj.drone.r3':'Local reinforcements added only where needed after impact assessment.',
|
||
'proj.drone.ch1':'Layup Optimization',
|
||
'proj.drone.ch2':'Harmonic Check',
|
||
'proj.drone.ch3':'Impact FEM',
|
||
'proj.drone.ch4':'MS ≥ 0'
|
||
},
|
||
|
||
de: {
|
||
'cta.downloadCv': '⬇️ Lebenslauf herunterladen',
|
||
'cta.downloadCv@title': 'Lebenslauf herunterladen',
|
||
'nav.about':'Über mich',
|
||
'nav.experience':'Erfahrung',
|
||
'nav.projects':'Projekte',
|
||
'nav.education':'Ausbildung',
|
||
'nav.skills':'Fähigkeiten',
|
||
'nav.contact':'Kontakt',
|
||
'hero.role':'Mechanical Design Engineer',
|
||
'hero.blurb':'Mechanical Design Engineer mit Erfahrung in Konstruktion und FEM-Analyse struktureller Komponenten für Luft- und Raumfahrt sowie Industrie.',
|
||
'availability.title':'Verfügbarkeit',
|
||
'availability.text':'Sofort verfügbar.',
|
||
'availability.location':'Europe · DE IT ES UK',
|
||
'keycompetencies.title':'Kernkompetenzen',
|
||
'keycompetencies.damageTolerance':'Schadenstoleranz',
|
||
'keycompetencies.buckling':'Beulen & Vordimensionierung',
|
||
'keycompetencies.impact':'Aufprall & Energieaufnahme',
|
||
'keycompetencies.drawing':'Zeichnungen & GD&T',
|
||
'keycompetencies.data':'Datenanalyse',
|
||
'sections.experience':'Erfahrung',
|
||
'sections.projects':'Akademische Projekte',
|
||
'sections.education':'Ausbildung',
|
||
'sections.skills':'Fähigkeiten',
|
||
'sections.contact':'Kontakt',
|
||
'projects.card.stiff.title':'Versteifte Verbundpaneele',
|
||
'projects.card.stiff.teaser':'Beul- & Schadensprüfungen, Layup-Optimierung, Durchbiegungsprüfung. <span class="where">UPM · Feb–Mai 2025</span>',
|
||
'projects.card.hashin.title':'Verbundlaminat - Hashin (Abaqus)',
|
||
'projects.card.hashin.teaser':'UD-Laminat Zug vs. Druck; ply-by-ply Versagen mit Hashin. <span class="where">UPM · Jan–Mär 2025</span>',
|
||
'projects.card.sec19.title':'Heckrumpf - Sektion 19 (Skin & Stringers)',
|
||
'projects.card.sec19.teaser':'Skin-Laminat, Stringer-Konzept, Drop-offs, Verstärkungen. <span class="where">UPM · Jan–Mär 2024</span>',
|
||
'projects.card.handlebar.title':'Lenkerhalterung - AW-2024 T3',
|
||
'projects.card.handlebar.teaser':'Topologieoptimierung, Klemmen- und Schraubennachweise. <span class="where">Unibo · Sep–Dez 2024</span>',
|
||
'projects.card.drone.title':'Verbund-Drone-Struktur',
|
||
'projects.card.drone.teaser':'Laminatdefinition, Dickenoptimierung, harmonische & Schlag-FEM. <span class="where">Unibo · Feb–Jun 2023</span>',
|
||
'skills.software':'Software',
|
||
'skills.data':'Datenanalyse: Excel, Python',
|
||
'skills.soft':'Soft Skills',
|
||
'skills.teamwork':'Teamarbeit',
|
||
'skills.adapt':'Anpassungsfähigkeit',
|
||
'skills.creative':'Kreatives Problemlösen',
|
||
'skills.langs':'Sprachen',
|
||
'lang.it':'Italienisch - Muttersprache',
|
||
'lang.es':'Spanisch - Fließend',
|
||
'lang.en':'Englisch - Fließend',
|
||
'lang.de':'Deutsch - Grundkenntnisse',
|
||
'contact.cta':'Interesse an einer Zusammenarbeit oder CV in anderem Format? Kontaktieren Sie mich.',
|
||
'contact.locationTitle':'Aktueller Standort:',
|
||
'contact.viewmap':'Größere Karte anzeigen',
|
||
'contact.hoursTitle':'Kontaktzeiten (Ancona):',
|
||
'contact.hours.weekdays':'Montag – Freitag: 09:00 – 19:00',
|
||
'contact.hours.saturday':'Samstag: 09:00 – 19:00',
|
||
'contact.hours.sunday':'Sonntag: 09:00 – 12:00',
|
||
'footer.updated':'Letzte Aktualisierung:',
|
||
'modal.title':'Projektdetails',
|
||
'modal.close':'Schließen'
|
||
},
|
||
|
||
es: {
|
||
'cta.downloadCv': '⬇️ Descargar CV',
|
||
'cta.downloadCv@title': 'Descargar CV',
|
||
'nav.about':'Sobre mí',
|
||
'nav.experience':'Experiencia',
|
||
'nav.projects':'Proyectos',
|
||
'nav.education':'Educación',
|
||
'nav.skills':'Habilidades',
|
||
'nav.contact':'Contacto',
|
||
'hero.role':'Mechanical Design Engineer',
|
||
'hero.blurb':'Mechanical Design Engineer con experiencia en diseño y análisis FEM de componentes estructurales para los sectores aeroespacial e industrial.',
|
||
'availability.title':'Disponibilidad',
|
||
'availability.text':'Disponible inmediatamente.',
|
||
'availability.location':'Europa · DE IT ES UK',
|
||
'keycompetencies.title':'Competencias clave',
|
||
'keycompetencies.damageTolerance':'Tolerancia al daño',
|
||
'keycompetencies.buckling':'Pandeo & pre-dimensionado',
|
||
'keycompetencies.impact':'Impacto & absorción de energía',
|
||
'keycompetencies.drawing':'Planos & GD&T',
|
||
'keycompetencies.data':'Análisis de datos',
|
||
'sections.experience':'Experiencia',
|
||
'sections.projects':'Proyectos Académicos',
|
||
'sections.education':'Educación',
|
||
'sections.skills':'Habilidades',
|
||
'sections.contact':'Contacto',
|
||
'projects.card.stiff.title':'Paneles compuestos rigidizados',
|
||
'projects.card.stiff.teaser':'Verificaciones de pandeo y tolerancia al daño. <span class="where">UPM · Feb–May 2025</span>',
|
||
'projects.card.hashin.title':'Laminado compuesto - Hashin (Abaqus)',
|
||
'projects.card.hashin.teaser':'Laminado UD a tracción vs compresión. <span class="where">UPM · Ene–Mar 2025</span>',
|
||
'projects.card.sec19.title':'Sección 19 del fuselaje trasero',
|
||
'projects.card.sec19.teaser':'Skin laminate y concepto de stringers. <span class="where">UPM · Ene–Mar 2024</span>',
|
||
'projects.card.handlebar.title':'Soporte de manillar - AW-2024 T3',
|
||
'projects.card.handlebar.teaser':'Optimización topológica y validación estática/fatiga. <span class="where">Unibo · Sep–Dic 2024</span>',
|
||
'projects.card.drone.title':'Estructura de dron compuesta',
|
||
'projects.card.drone.teaser':'Definición de laminado y optimización de espesores. <span class="where">Unibo · Feb–Jun 2023</span>',
|
||
'skills.software':'Software',
|
||
'skills.data':'Análisis de datos: Excel, Python',
|
||
'skills.soft':'Soft Skills',
|
||
'skills.teamwork':'Trabajo en equipo',
|
||
'skills.adapt':'Adaptabilidad',
|
||
'skills.creative':'Resolución creativa de problemas',
|
||
'skills.langs':'Idiomas',
|
||
'lang.it':'Italiano - Nativo',
|
||
'lang.es':'Español - Fluido',
|
||
'lang.en':'Inglés - Fluido',
|
||
'lang.de':'Alemán - Básico',
|
||
'contact.cta':'¿Colaboramos o necesitas el CV en otro formato? Escríbeme.',
|
||
'contact.locationTitle':'Ubicación actual:',
|
||
'contact.viewmap':'Ver mapa ampliado',
|
||
'contact.hoursTitle':'Horario de contacto (Ancona):',
|
||
'contact.hours.weekdays':'Lunes - Viernes: 09:00 - 19:00',
|
||
'contact.hours.saturday':'Sábado: 09:00 - 19:00',
|
||
'contact.hours.sunday':'Domingo: 09:00 - 12:00',
|
||
'footer.updated':'Última actualización:',
|
||
'modal.title':'Detalles del proyecto',
|
||
'modal.close':'Cerrar'
|
||
}
|
||
};
|
||
|
||
let currentLang = DEFAULT_LANG;
|
||
|
||
function resolveKey(key, lang){
|
||
const order = [lang, 'en', DEFAULT_LANG];
|
||
for(const L of order){
|
||
if(t[L] && typeof t[L][key] === 'string') return t[L][key];
|
||
}
|
||
return null;
|
||
}
|
||
|
||
function applyNodeTranslation(node, value){
|
||
if(node.hasAttribute('data-i18n-html')) node.innerHTML = value;
|
||
else node.innerHTML = value;
|
||
}
|
||
|
||
function translateAttributes(node, key, lang){
|
||
const attr = node.getAttribute('data-i18n-attr');
|
||
if(!attr) return;
|
||
const k = key + '@' + attr;
|
||
const v = resolveKey(k, lang);
|
||
if(v) node.setAttribute(attr, v);
|
||
}
|
||
|
||
function translatePage(lang){
|
||
currentLang = lang;
|
||
document.documentElement.setAttribute('lang', lang);
|
||
|
||
document.querySelectorAll('[data-i18n],[data-i18n-html]').forEach(el=>{
|
||
const key = el.getAttribute('data-i18n') || el.getAttribute('data-i18n-html');
|
||
const val = resolveKey(key, lang);
|
||
if(typeof val === 'string'){
|
||
applyNodeTranslation(el, val);
|
||
}
|
||
translateAttributes(el, key, lang);
|
||
});
|
||
}
|
||
|
||
window.__i18n = {
|
||
getLang: ()=>currentLang,
|
||
apply: ()=>translatePage(currentLang),
|
||
set: (lang)=>{ localStorage.setItem(STORAGE_KEY, lang); translatePage(lang); updateLangUI(lang); }
|
||
};
|
||
|
||
const langBtn = document.getElementById('langBtn');
|
||
const langMenu = document.getElementById('langMenu');
|
||
const langSwitcher = document.getElementById('langSwitcher');
|
||
const flagEl = document.getElementById('langFlag');
|
||
const codeEl = document.getElementById('langCode');
|
||
|
||
const flags = { it:'🇮🇹', en:'🇬🇧', de:'🇩🇪', es:'🇪🇸' };
|
||
|
||
function updateLangUI(lang){
|
||
flagEl.textContent = flags[lang] || '🌐';
|
||
codeEl.textContent = (lang || 'it').toUpperCase();
|
||
langMenu.querySelectorAll('.lang-option').forEach(o=>{
|
||
o.setAttribute('aria-selected', o.dataset.lang === lang ? 'true' : 'false');
|
||
});
|
||
}
|
||
|
||
function openMenu(){
|
||
langMenu.classList.add('open');
|
||
langBtn.setAttribute('aria-expanded','true');
|
||
langMenu.focus();
|
||
}
|
||
function closeMenu(){
|
||
langMenu.classList.remove('open');
|
||
langBtn.setAttribute('aria-expanded','false');
|
||
}
|
||
|
||
langBtn.addEventListener('click', ()=>{
|
||
const open = langMenu.classList.contains('open');
|
||
if(open) closeMenu(); else openMenu();
|
||
});
|
||
|
||
langMenu.addEventListener('click', (e)=>{
|
||
const opt = e.target.closest('.lang-option');
|
||
if(!opt) return;
|
||
const lang = opt.dataset.lang;
|
||
window.__i18n.set(lang);
|
||
closeMenu();
|
||
langBtn.focus();
|
||
});
|
||
|
||
langMenu.addEventListener('keydown', (e)=>{
|
||
const opts = Array.from(langMenu.querySelectorAll('.lang-option'));
|
||
const cur = opts.findIndex(o => o.getAttribute('aria-selected')==='true');
|
||
if(e.key==='Escape'){ e.preventDefault(); closeMenu(); langBtn.focus(); }
|
||
if(['ArrowDown','ArrowUp'].includes(e.key)){
|
||
e.preventDefault();
|
||
let i = cur;
|
||
if(e.key==='ArrowDown') i = (cur+1) % opts.length;
|
||
if(e.key==='ArrowUp') i = (cur-1+opts.length) % opts.length;
|
||
opts[i].focus?.();
|
||
}
|
||
if(e.key==='Enter' || e.key===' '){
|
||
e.preventDefault();
|
||
document.activeElement?.click();
|
||
}
|
||
});
|
||
|
||
document.addEventListener('click', (e)=>{
|
||
if(!langSwitcher.contains(e.target)) closeMenu();
|
||
});
|
||
|
||
const saved = localStorage.getItem(STORAGE_KEY);
|
||
const browser = (navigator.language || '').slice(0,2).toLowerCase();
|
||
const initial = saved || (['it','en','de','es'].includes(browser) ? browser : DEFAULT_LANG);
|
||
updateLangUI(initial);
|
||
translatePage(initial);
|
||
})();
|
||
</script>
|
||
|
||
<script>
|
||
document.getElementById('year').textContent = new Date().getFullYear();
|
||
document.getElementById('updated').textContent = new Date().toLocaleDateString();
|
||
</script>
|
||
</body>
|
||
</html> |