Files
acuna_homepage/index.html
alessanacunaguardia ecbc135ea2
All checks were successful
Build and Deploy / build (push) Successful in 23s
Build and Deploy / Deploy to target (push) Successful in 3s
Patch
2025-10-16 22:52:59 +02:00

1792 lines
104 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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 - Structural Engineer</title>
<meta name="description" content="Portfolio & CV of Alessandro Acuna, Structural Engineer specialized in composites, CAD, and FEA." />
<!-- Canonical + Social -->
<link rel="canonical" href="https://yourdomain.tld/">
<meta property="og:title" content="Alessandro Acuna - Structural Engineer" />
<meta property="og:description" content="Portfolio & CV of Alessandro Acuna, Structural Engineer specialized in composites, CAD, and FEA." />
<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>">
<!-- Preload CV (opzionale) -->
<link rel="preload" as="fetch" href="res/Alessandro_Acuna_CV.pdf" type="application/pdf" crossorigin>
<style>
/* --- THEME TOKENS --- */
: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;
}
/* --- BASE --- */
*{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}
/* --- LAYOUT / CARDS / DIVIDERS --- */
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}
/* --- TITOLI (titolo sopra, where sotto) --- */
.brand{
display:flex;
flex-direction:column;
align-items:flex-start;
gap:2px;
line-height:1.25;
}
.brand .where{ font-weight:500; opacity:.85; }
/* --- LOGHI --- */
.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}
/* --- LISTE --- */
.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)}
/* =======================
MODAL (dialog)
======================= */
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;
}
/* Progetti cliccabili */
.project[data-modal]{cursor:pointer;transition:transform .12s ease;}
.project[data-modal]:hover{ transform:translateY(-2px); }
/* ===== CUSTOM LANGUAGE DROPDOWN ===== */
.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; }
/* ===== LIGHTBOX ===== */
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;
}
/* A11y */
: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>
<!-- Tema: toggle visibile, persistenza -->
<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');
// Aggiorna lo stato ARIA del toggle
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>
<!-- JSON-LD base (sostituisci yourdomain.tld e l'immagine OG) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Alessandro Acuna",
"jobTitle": "Structural 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": ["Composite Materials","FEA","CAD","Aerospace","Python"],
"address": {
"@type": "PostalAddress",
"addressLocality": "Madrid",
"addressCountry": "ES"
}
}
</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>
<!-- Language dropdown + Theme + CV -->
<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">Structural Engineer</h2>
<p data-i18n="hero.blurb">
Mechanical Engineer passionate about aerospace and advanced manufacturing, specialized in developing structural components from concept to advanced FEM validation. Focus on composite materials, CAD, FEA, and explicit simulations.
</p>
<div class="chips" aria-label="Highlights">
<span class="chip">Composite Materials</span>
<span class="chip">FEA (Abaqus, Ansys, Nastran, Hypermesh)</span>
<span class="chip">CAD (CATIA V5, NX, Creo)</span>
<span class="chip">PASS and SAP</span>
<span class="chip">Python (Numpy, Pandas, Matplotlib)</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">Currently at Airbus (contract until Dec 2025). Open to a new Structural Engineer role from January 2026.</p>
<p class="kbd" data-i18n="availability.location">Madrid, Spain · 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 &amp; Pre-sizing</span>
<span class="chip" data-i18n="keycompetencies.impact">Impact &amp; Energy Absorption</span>
<span class="chip" data-i18n="keycompetencies.drawing">Drawings &amp; GD&amp;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 Present
<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 &amp; Analysis Engineer</a>
<span class="where" data-i18n="exp.airbus.where">Madrid, ES</span>
</h3>
<ul>
<li data-i18n="exp.airbus.p1">Development and assessment of <strong>repair solutions</strong> for composite and metallic components.</li>
<li data-i18n="exp.airbus.p2">Part design for <strong>A350 HTP</strong> and <strong>Section 19</strong> (rear fuselage) in <strong>CATIA V5</strong>.</li>
<li data-i18n="exp.airbus.p3">Design Office interface in production, ensuring structural integrity and compliance.</li>
<li data-i18n="exp.airbus.p4">Development of <strong>numerical models</strong> and explicit simulations for composite damage mechanisms.</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 - Master Thesis · R&amp;D Engineer</a>
<span class="where" data-i18n="exp.dlr.where">Stuttgart, DE</span>
</h3>
<ul>
<li data-i18n="exp.dlr.p1">Thesis for the EU project <strong>r-LightBioCom</strong> on sustainable high-performance composites for automotive/aerospace.</li>
<li data-i18n="exp.dlr.p2">Computed environmental footprint for 1 kg of materials in <strong>openLCA</strong>.</li>
<li data-i18n="exp.dlr.p3"><strong>Quasi-static &amp; dynamic</strong> compression tests on cores (honeycomb/foam) and <strong>KPIs</strong> combining <em>LCA</em> and mechanical performance.</li>
<li data-i18n="exp.dlr.p4">Implementation and calibration of <strong>LS-DYNA MAT cards</strong> from test data.</li>
<li data-i18n="exp.dlr.p5"><strong>FEM</strong> static/dynamic analyses to validate experiments.</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 - Stress &amp; Design Engineer</a>
<span class="where" data-i18n="exp.unibo.where">Bologna, IT</span>
</h3>
<ul>
<li data-i18n="exp.unibo.p1"><strong>Design</strong> and <strong>Stress Analysis</strong> of automotive parts (monocoque moulds, dashboard support, driver harness).</li>
<li data-i18n="exp.unibo.p2"><strong>FEM</strong> on CFRP chassis under multiple loads; investigation of delamination causes.</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&amp;D Engineer</a>
<span class="where" data-i18n="exp.dvp.where">Bologna, IT</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 <strong>performance maps</strong> in <strong>GT-Suite</strong> 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, IT</span>
</h3>
<ul>
<li data-i18n="exp.cpc.p1">Lamination of <strong>CFRP</strong> 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 · FebMay 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 · JanMar 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 · JanMar 2024</span></p>
</div>
<!-- Handlebar Bracket (NUOVO) -->
<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 &amp; VDI 2230 bolted-joint checks, static/fatigue validation (Ansys), weight minimization.
<span class="where">Unibo · SepDec 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 · FebJun 2023</span></p>
</div>
</div>
</section>
<!-- TEMPLATES DETTAGLI PROGETTI (i18n) -->
<!-- Stiffened Panels -->
<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>≈ XY%</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 &amp; 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>
<!-- Hashin (Abaqus) -->
<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 &amp; 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 stressstrain 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 stressstrain 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>
<!-- Section 19 -->
<template id="tmpl-section19">
<h4 data-i18n="proj.sec19.h4">Rear Fuselage - Section 19 (Skin &amp; 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 AB.</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 &lt; 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 &amp; 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>
<!-- Handlebar Bracket -->
<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 &amp; checks from FEA reactions.</li>
<li data-i18n="proj.handle.p4"><strong>Validation (Ansys):</strong> static + fatigue (Goodman); handlebarclamp 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 shaftbracket 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 &lt; 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 &lt; 1 mm</li>
</ul>
</template>
<!-- Drone Structure -->
<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">Oct 2024 Jun 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>
<p>Courses: Design of Advanced Composite Structures · Analysis of Composite Strucures · Abaqus Lab · Space Structures.</p>
</div>
</div>
<div class="card item">
<div class="when">Oct 2022 Dec 2025 / Mar 2026
<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">MSc in Mechanical Engineering (Minor: Mechanical Design & Modelling)</a>
<span class="where">University of Bologna</span>
</h3>
<p>Courses: Chassis & Body Design Manufacturing · CAD of Surfaces Lab · CAD of Mechanical Structures · Processes and Manufacturing Methods for Product Development.</p>
</div>
</div>
<div class="card item">
<div class="when">Sep 2023 Feb 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>
<p>Computational Dynamics (Robotics) · Computational Mechanics of Structures · Advanced FEA Technology.</p>
</div>
</div>
<div class="card item">
<div class="when">Sep 2019 Oct 2022
<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 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: Siemens NX, CATIA V5, PTC Creo</div>
<div>FEA: Ansys, Abaqus, Hypermesh/Nastran, GT-Suite</div>
<div>Programming: Python (pandas, matplotlib, pycatia)</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 (C2)</div>
<div data-i18n="lang.en">English - Fluent (C1)</div>
<div data-i18n="lang.de">German - Basic (A1)</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> Madrid, Spain
<div style="margin:10px 0;">
<iframe src="https://www.openstreetmap.org/export/embed.html?bbox=-3.745%2C40.312%2C-3.543%2C40.563&amp;layer=mapnik&amp;marker=40.4168%2C-3.7038" 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=40.4168&amp;mlon=-3.7038#map=12/40.4168/-3.7038" 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 (Madrid 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 PROGETTO -->
<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 LIGHTBOX -->
<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>
<!-- MODALI -->
<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));
// Re-applica traduzioni ai contenuti appena iniettati
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>
<!-- LIGHTBOX -->
<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>
<!-- i18n + CUSTOM LANGUAGE UI -->
<script>
(function(){
const DEFAULT_LANG = 'it';
const STORAGE_KEY = 'site-lang';
const t = {
/* =========================
ITALIANO
========================= */
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':'Structural Engineer',
'hero.blurb':'Ingegnere Meccanico appassionato di aerospazio e advanced manufacturing, specializzato nello sviluppo di componenti strutturali dal concept alla validazione FEM avanzata. Focus su materiali compositi, CAD, FEA e simulazioni esplicite.',
'availability.title':'Disponibilità',
'availability.text':'Attualmente in Airbus (contratto fino a Dic 2025). Disponibile per un nuovo ruolo da Gennaio 2026.',
'availability.location':'Madrid, Spain · 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 · FebMag 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 · GenMar 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 · GenMar 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 · SetDic 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 · FebGiu 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 (C2)',
'lang.en':'Inglese - Fluente (C1)',
'lang.de':'Tedesco - Base (A1)',
'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 Madrid):',
'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',
/* EXPERIENCE (IT) */
'exp.airbus.title':'AIRBUS - Structural Design & Analysis Engineer',
'exp.airbus.where':'Madrid, ES',
'exp.airbus.p1':'Sviluppo e valutazione di <strong>riparazioni</strong> per componenti in composito e metallo.',
'exp.airbus.p2':'Progettazione parti per <strong>A350 HTP</strong> e <strong>Sezione 19</strong> (fusoliera posteriore) con <strong>CATIA V5</strong>.',
'exp.airbus.p3':'Interfaccia Design Office in produzione, garantendo integrità strutturale e compliance.',
'exp.airbus.p4':'Sviluppo di <strong>modelli numerici</strong> e simulazioni esplicite su meccanismi di danno nei compositi con Abaqus.',
'exp.dlr.title':'DLR - Tesi di Laurea · R&D Engineer',
'exp.dlr.where':'Stoccarda, DE',
'exp.dlr.p1':'Tesi per il progetto UE <strong>r-LightBioCom</strong> su compositi sostenibili ad alte prestazioni per automotive/aerospazio.',
'exp.dlr.p2':'Calcolo dellimpronta ambientale per 1 kg di materiali con <strong>openLCA</strong>.',
'exp.dlr.p3':'Test di compressione <strong>quasi-statici e dinamici</strong> su cores (honeycomb/foam) e definizione di <strong>KPI</strong> integrando <em>LCA</em> e prestazioni meccaniche.',
'exp.dlr.p4':'Implementazione e calibrazione <strong>MAT cards</strong> in <strong>LS-DYNA</strong> dai dati sperimentali.',
'exp.dlr.p5':'<strong>Analisi FEM</strong> statiche/dinamiche per validare i risultati sperimentali.',
'exp.unibo.title':'UniBo Motorsport - Stress & Design Engineer',
'exp.unibo.where':'Bologna, IT',
'exp.unibo.p1':'<strong>Design</strong> e <strong>Stress Analysis</strong> di parti automotive (stampi monoscocca, supporto cruscotto, imbragatura pilota).',
'exp.unibo.p2':'<strong>FEM</strong> su telaio CFRP con carichi multipli; indagine sulle cause di delaminazione.',
'exp.dvp.title':'D.V.P. Vacuum Technology - Tesi Triennale · R&D Engineer',
'exp.dvp.where':'Bologna, IT',
'exp.dvp.p1':'Campagne sperimentali su portate e perdite di carico in turbine e valvole.',
'exp.dvp.p2':'Sviluppo di <strong>mappe prestazionali</strong> in <strong>GT-Suite</strong> e validazione modello.',
'exp.cpc.title':'CPC Group - Composite Laminator',
'exp.cpc.where':'Modena, IT',
'exp.cpc.p1':'Laminazione di stampi <strong>CFRP</strong> e di un telaio per il team Formula SAE.',
/* PROGETTI - common */
'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',
/* === PROGETTI - dettagli (IT) === */
'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.li4':'<strong>Ottimizzazione spessori</strong> con feedback FEM.',
'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>≈ XY%</strong>.',
'proj.stiff.r2':'<strong>MS ≥ 0</strong> per buckling/crippling nei casi critici.',
'proj.stiff.r3':'<strong>Deflessioni ≤</strong> limite.',
'proj.stiff.cap1':'Vista pannello & stringers',
'proj.stiff.cap2':'Modi di buckling 13 (FEM)',
'proj.stiff.cap3':'Tabella layup & spessori',
'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/pressione.',
'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 prescr. 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 AB.',
'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 &lt; 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 manubriomorsetto 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 &lt; 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 &lt; 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 datterraggio.',
'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'
},
/* =========================
ENGLISH
========================= */
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':'Structural Engineer',
'hero.blurb':'Mechanical Engineer passionate about aerospace and advanced manufacturing, specialized in developing structural components from concept to advanced FEM validation. Focus on composite materials, CAD, FEA, and explicit simulations.',
'availability.title':'Availability',
'availability.text':'Currently at Airbus (contract until Dec 2025). Open to a new Structural Engineer role from January 2026.',
'availability.location':'Madrid, Spain · 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 · FebMay 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 · JanMar 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 · JanMar 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 · SepDec 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 · FebJun 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 (C2)',
'lang.en':'English - Fluent (C1)',
'lang.de':'German - Basic (A1)',
'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 (Madrid 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',
/* EXPERIENCE */
'exp.airbus.title':'AIRBUS - Structural Design & Analysis Engineer',
'exp.airbus.where':'Madrid, ES',
'exp.airbus.p1':'Development and assessment of <strong>repair solutions</strong> for composite and metallic components.',
'exp.airbus.p2':'Part design for <strong>A350 HTP</strong> and <strong>Section 19</strong> (rear fuselage) in <strong>CATIA V5</strong>.',
'exp.airbus.p3':'Design Office interface in production, ensuring structural integrity and compliance.',
'exp.airbus.p4':'Development of <strong>numerical models</strong> and explicit simulations for composite damage mechanisms in Abaqus.',
'exp.dlr.title':'DLR - Master Thesis · R&amp;D Engineer',
'exp.dlr.where':'Stuttgart, DE',
'exp.dlr.p1':'Thesis for the EU project <strong>r-LightBioCom</strong> on sustainable high-performance composites for automotive/aerospace.',
'exp.dlr.p2':'Computed environmental footprint for 1 kg of materials in <strong>openLCA</strong>.',
'exp.dlr.p3':'<strong>Quasi-static &amp; dynamic</strong> compression tests on cores (honeycomb/foam) and <strong>KPIs</strong> combining <em>LCA</em> and mechanical performance.',
'exp.dlr.p4':'Implementation and calibration of <strong>LS-DYNA MAT cards</strong> from test data.',
'exp.dlr.p5':'<strong>FEM</strong> static/dynamic analyses to validate experiments.',
'exp.unibo.title':'UniBo Motorsport - Stress & Design Engineer',
'exp.unibo.where':'Bologna, IT',
'exp.unibo.p1':'<strong>Design</strong> and <strong>Stress Analysis</strong> of automotive parts (monocoque moulds, dashboard support, driver harness).',
'exp.unibo.p2':'<strong>FEM</strong> on CFRP chassis under multiple loads; investigation of delamination causes.',
'exp.dvp.title':'D.V.P. Vacuum Technology - Bachelor Thesis · R&amp;D Engineer',
'exp.dvp.where':'Bologna, IT',
'exp.dvp.p1':'Experimental campaigns on flow rates and pressure losses in turbines and control valves.',
'exp.dvp.p2':'Built <strong>performance maps</strong> in <strong>GT-Suite</strong> and validated the model.',
'exp.cpc.title':'CPC Group - Composite Laminator',
'exp.cpc.where':'Modena, IT',
'exp.cpc.p1':'Lamination of <strong>CFRP</strong> moulds and a chassis for Formula SAE team.',
/* === PROJECT DETAILS (EN) === */
'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.li4':'Performed <strong>thickness optimization</strong> (weight vs stiffness/stability) with FEM feedback.',
'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>≈ XY%</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.cap1':'Panel & stringers overview',
'proj.stiff.cap2':'Buckling modes 13 (FEM)',
'proj.stiff.cap3':'Layup & thickness table',
'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 AB.',
'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 &lt; 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 driven by FEA reactions.',
'proj.handle.p4':'<strong>Validation (Ansys):</strong> static + fatigue (Goodman); handlebarclamp 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 &lt; 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 &lt; 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'
},
/* =========================
DEUTSCH
========================= */
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':'Strukturingenieur',
'hero.blurb':'Maschinenbauingenieur mit Leidenschaft für Luft- und Raumfahrt sowie Advanced Manufacturing; Entwicklung von Strukturbauteilen vom Konzept bis zur FEM-Validierung. Fokus auf Verbundwerkstoffe, CAD, FEA und explizite Simulationen.',
'availability.title':'Verfügbarkeit',
'availability.text':'Derzeit bei Airbus (Vertrag bis Dez 2025). Ab Januar 2026 verfügbar.',
'availability.location':'Madrid, Spanien · DE IT ES UK',
'keycompetencies.title':'Kernkompetenzen',
'keycompetencies.damageTolerance':'Schadens­toleranz',
'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- & Schadens­toleranzprüfungen, Layup-Optimierung (Skin & Stringer), Durchbiegungsprüfung. <span class="where">UPM · FebMai 2025</span>',
'projects.card.hashin.title':'Verbundlaminat - Hashin (Abaqus)',
'projects.card.hashin.teaser':'UD-Laminat Zug vs. Druck; ply-by-ply Versagen mit Hashin; FEM-gestützte Analyse. <span class="where">UPM · JanMär 2025</span>',
'projects.card.sec19.title':'Heckrumpf - Sektion 19 (Skin & Stringers)',
'projects.card.sec19.teaser':'Skin-Laminat & Stringer-Konzept, Drop-offs, Verstärkungen, Rahmenverbindungen (Clips, Ø4,8 mm). <span class="where">UPM · JanMär 2024</span>',
'projects.card.handlebar.title':'Lenkerhalterung - AW-2024 T3',
'projects.card.handlebar.teaser':'Topologie­optimierung, Klemmen- & VDI-2230-Schraubennachweise, statische/Ermüdungs-Validierung (Ansys), Gewichts­minimierung. <span class="where">Unibo · SepDez 2024</span>',
'projects.card.drone.title':'Verbund-Drone-Struktur',
'projects.card.drone.teaser':'Laminatdefinition, Dickenoptimierung, harmonische & Schlag-FEM. <span class="where">Unibo · FebJun 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 (C2)',
'lang.en':'Englisch - Fließend (C1)',
'lang.de':'Deutsch - Grundkenntnisse (A1)',
'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 (Madrid):',
'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',
'exp.airbus.title':'AIRBUS - Structural Design & Analysis Engineer',
'exp.airbus.where':'Madrid, ES',
'exp.airbus.p1':'Entwicklung und Bewertung von <strong>Reparatur­lösungen</strong> für Verbund- und Metallbauteile.',
'exp.airbus.p2':'Teilekonstruktion für <strong>A350 HTP</strong> und <strong>Sektion 19</strong> (Heckrumpf) in <strong>CATIA V5</strong>.',
'exp.airbus.p3':'Schnittstelle Design Office in der Produktion; Sicherstellung von Strukturintegrität und Compliance.',
'exp.airbus.p4':'Entwicklung von <strong>numerischen Modellen</strong> und expliziten Simulationen zu Schadensmechanismen in Verbundwerkstoffen in Abaqus.',
'exp.dlr.title':'DLR - Masterarbeit · R&amp;D Engineer',
'exp.dlr.where':'Stuttgart, DE',
'exp.dlr.p1':'Arbeit für das EU-Projekt <strong>r-LightBioCom</strong> zu nachhaltigen Hochleistungsverbunden für Automotive/Aerospace.',
'exp.dlr.p2':'Berechnung des Umweltfußabdrucks je 1 kg Material in <strong>openLCA</strong>.',
'exp.dlr.p3':'<strong>Quasi-statische &amp; dynamische</strong> Druckversuche an Kernen (Wabe/Schaum) und <strong>KPI</strong> aus <em>LCA</em> und Mechanik.',
'exp.dlr.p4':'Implementierung und Kalibrierung von <strong>LS-DYNA MAT-Karten</strong> aus Testdaten.',
'exp.dlr.p5':'<strong>FEM</strong> statisch/dynamisch zur Validierung der Versuche.',
'exp.unibo.title':'UniBo Motorsport - Stress & Design Engineer',
'exp.unibo.where':'Bologna, IT',
'exp.unibo.p1':'<strong>Konstruktion</strong> und <strong>Spannungsanalyse</strong> (Monocoqueformen, Armaturenbrettträger, Fahrer­gurt).',
'exp.unibo.p2':'<strong>FEM</strong> am CFRP-Chassis unter Mehrfachlasten; Untersuchung von Delaminationen.',
'exp.dvp.title':'D.V.P. Vacuum Technology - Bachelorarbeit · R&amp;D Engineer',
'exp.dvp.where':'Bologna, IT',
'exp.dvp.p1':'Versuchsreihen zu Durchsätzen und Druckverlusten in Turbinen und Ventilen.',
'exp.dvp.p2':'Erstellung von <strong>Leistungs­kennfeldern</strong> in <strong>GT-Suite</strong> und Modellvalidierung.',
'exp.cpc.title':'CPC Group - Composite Laminator',
'exp.cpc.where':'Modena, IT',
'exp.cpc.p1':'Laminieren von <strong>CFRP</strong>-Formen und eines Chassis für das Formula-SAE-Team.',
'proj.common.what':'Was ich gemacht habe',
'proj.common.model':'Modell',
'proj.common.tools':'Werkzeuge',
'proj.common.results':'Ergebnisse',
'proj.common.process':'Prozess',
'proj.common.download':'📄 Bericht herunterladen',
'proj.stiff.h4':'Versteifte Verbundpaneele',
'proj.stiff.obj':'<strong>Ziel -</strong> CFRP-Paneele mit Stringern auslegen und validieren, Gewicht minimieren und Beul-/Schadens­toleranz-Anforderungen erfüllen.',
'proj.stiff.li1':'<strong>Layups</strong> für Skin und Stringer definiert (Symmetrie, Balance, Lagenanteile).',
'proj.stiff.li2':'Verstärkungen <strong>vordimensioniert</strong> und <strong>lokales/globales Beulen</strong> sowie <strong>Stringer-Crippling</strong> geprüft.',
'proj.stiff.li3':'<strong>Durchbiegungen</strong> und <strong>Safety Margins (MS)</strong> gegen Anforderungen überprüft.',
'proj.stiff.li4':'<strong>Dickenoptimierung</strong> (Gewicht vs. Steifigkeit/Stabilität) mit FEM-Feedback.',
'proj.stiff.li5':'<strong>Beulmoden</strong> genutzt, um Redesign-Iterationen zu steuern.',
'proj.stiff.tools':'Berechnungen von Hand; Ingenieur-Spreadsheets; Luftfahrt-Laminatregeln.',
'proj.stiff.r1':'Gewichtsreduktion: <strong>≈ XY %</strong>.',
'proj.stiff.r2':'<strong>MS ≥ 0</strong> für Beulen und Crippling in kritischen Lastfällen.',
'proj.stiff.r3':'<strong>Durchbiegungen ≤</strong> Grenzwert.',
'proj.stiff.cap1':'Übersicht Paneel & Stringer',
'proj.stiff.cap2':'Beulmoden 13 (FEM)',
'proj.stiff.cap3':'Layup- & Dicken­tabelle',
'proj.stiff.ch1':'Beulen & Crippling',
'proj.stiff.ch2':'Optimiertes Layup',
'proj.stiff.ch3':'FEM-getrieben',
'proj.stiff.ch4':'MS ≥ 0',
'proj.hashin.h4':'Verbundlaminat - Hashin (Abaqus)',
'proj.hashin.obj':'<strong>Ziel -</strong> UD-Laminat unter Zug und Druck mit <em>Hashin-Schadenseinleitung</em> simulieren, ply-by-ply-Versagen identifizieren und Zug- vs. Drucktragfähigkeit vergleichen.',
'proj.hashin.m1':'Probekörper: <strong>100 × 20 mm</strong>, <strong>10 Lagen × 0,25 mm = 2,5 mm</strong>; symmetrisches Layup <strong>[0°, ±45°, 0°, 90°]s</strong>.',
'proj.hashin.m2':'Elemente: <strong>S4R</strong> Schalenelemente (~2 mm); Material: UD-Lage mit elastischen + Hashin-Parametern.',
'proj.hashin.m3':'Randbedingungen/Last: unten eingespannt; obere Kante an RP gekoppelt mit vorgeschriebener Y-Verschiebung.',
'proj.hashin.m4':'Schadensmodell: <strong>Hashin-Initiation</strong> (keine Evolution). Outputs: HSNFTCRT, HSNFCCRT, HSNMTCRT, HSNMCCRT.',
'proj.hashin.r1':'<strong>Zug:</strong> 90° Matrix-Zug → ±45° Matrix-Schub → 0° Faser-Zug; <strong>UTS ≈ 413 MPa</strong>.',
'proj.hashin.r2':'<strong>Druck:</strong> ±45° Matrix-Druck → 90° Matrix-Druck → 0° Faser-Druck; <strong>UCS ≈ 336 MPa</strong>.',
'proj.hashin.r3':'<strong>Verhältnis:</strong> UTS/UCS ≈ <strong>1,23</strong> (≈23 % stärker in Zug).',
'proj.hashin.cap1':'Mesh & Layup (S4R-Schalen)',
'proj.hashin.cap2':'Hashin-Karten - First-Ply-Failure',
'proj.hashin.cap3':'Zug σ–ε (stufenweise Steifigkeitsabfälle)',
'proj.hashin.cap4':'Druck σ–ε (stufenweise Steifigkeitsabfälle)',
'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':'Verhältnis ≈ 1,23',
'proj.sec19.h4':'Heckrumpf - Sektion 19 (Skin & Stringers)',
'proj.sec19.obj':'<strong>Ziel -</strong> Skin- und Stringer-Konzept in Verbundbauweise festlegen, Verstärkungen, Drop-offs und Rahmenverbindungen (Clips, Ø4,8 mm) für ein Rumpffeld zwischen Rahmen AB.',
'proj.sec19.given':'Gegebene Daten',
'proj.sec19.g1':'<strong>Geometrie:</strong> Zylinder <strong>R = 4500 mm</strong>; Rahmenabstand <strong>550 mm</strong>; 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> Basis <strong>9 Lagen (2/4/3)</strong>; Verstärkung <strong>14 Lagen (2/8/4)</strong>, Patch <strong>100 × 70 mm</strong>.',
'proj.sec19.g4':'<strong>Stringer:</strong> <strong>h &lt; 35 mm</strong>, <strong>R ≥ 3 mm</strong>; Steg <strong>20 Lagen</strong> (50 % 0° / 40 % ±45° / 10 % 90 %); <strong>Steg = 2× Flansch</strong>.',
'proj.sec19.g5':'<strong>Verbindungen:</strong> Clips + <strong>Ø 4,8 mm</strong> Befestiger.',
'proj.sec19.li1':'Mastergeometrie (Rahmen & Stringer auf der Skin), Pitch und Fußbreiten erstellt.',
'proj.sec19.li2':'Skin-Layups, Drop-offs und Verstärkungs-Footprint kartiert.',
'proj.sec19.li3':'Stringer-Steg/Flansche dimensioniert und Reparierbarkeit (L1 für Ø4,8 mm) geprüft.',
'proj.sec19.li4':'Clip-Verbindungen definiert, Zeichnungen, Materialliste und Paneelgewicht vorbereitet.',
'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':'Lenkerhalterung - AW-2024 T3',
'proj.handle.obj':'<strong>Ziel -</strong> Leichte Lenkerhalterung innerhalb der Hüllkurve, konform zu Lenk-/Schlag-/Vibrationslasten, herstellbar per AW-2024 T3.',
'proj.handle.p2':'<strong>Topologie:</strong> Compliance-Ziel mit Randbedingungen zur Klemmensteifigkeit & Lastpfaden → geglätteter CAD-Rebuild.',
'proj.handle.p3':'<strong>Schrauben (VDI 2230):</strong> M6 für Klemme; Drehmoment, Vorspannung & Nachweise aus FEM-Reaktionen.',
'proj.handle.p4':'<strong>Validierung (Ansys):</strong> statisch + Ermüdung (Goodman); Kontakt LenkerKlemme und Flächendrücke.',
'proj.handle.r1':'<strong>Sicherheitsfaktoren:</strong> ≥ 2 statisch, ≥ 1 Ermüdung.',
'proj.handle.r2':'<strong>Klemmensteifigkeit:</strong> innerhalb der Durchbiegungs-/Rotationsgrenzen; maximale Durchbiegung &lt; 1 mm.',
'proj.handle.ch1':'AW-2024 T3',
'proj.handle.ch2':'Topologie-optimiert',
'proj.handle.ch3':'VDI 2230',
'proj.handle.ch4':'Klemme OK',
'proj.handle.ch5':'Durchbiegung &lt; 1 mm',
'proj.drone.h4':'Verbund-Drone-Struktur',
'proj.drone.obj':'<strong>Ziel -</strong> Laminataufbau und Dicken zur Gewichtsminimierung bei ausreichender Steifigkeit/Festigkeit festlegen; harmonische und Schlagprüfungen an kritischen Bauteilen.',
'proj.drone.li1':'Laminatfamilien für Arme und Mittelplatte (Lagenwinkel, Stapelregeln, Symmetrie/Balanz) ausgewählt.',
'proj.drone.li2':'<strong>Dickenoptimierung</strong> über Fluglast-Hüllkurven (Hover, Manöver, Landung).',
'proj.drone.li3':'FEM aufgebaut und <strong>harmonische Antwort</strong> extrahiert, Resonanznähe zu Rotorfrequenzen vermieden.',
'proj.drone.li4':'<strong>Schlagszenarien</strong> an Schwachstellen (Arm-Nabe, Landekanten) bewertet.',
'proj.drone.r1':'Gewichtsreduktion ggü. Basis bei <strong>MS ≥ 0</strong> in statischen Nachweisen.',
'proj.drone.r2':'Mindestabstand zu rotorinduzierten Frequenzen erreicht.',
'proj.drone.r3':'Lokale Verstärkungen nur bei Bedarf nach Schlagbewertung hinzugefügt.',
'proj.drone.ch1':'Layup-Optimierung',
'proj.drone.ch2':'Harmonische Prüfung',
'proj.drone.ch3':'Schlag-FEM',
'proj.drone.ch4':'MS ≥ 0'
},
/* =========================
ESPAÑOL
========================= */
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':'Ingeniero Estructural',
'hero.blurb':'Ingeniero mecánico apasionado por el sector aeroespacial y la fabricación avanzada, especializado en desarrollar componentes estructurales desde el concepto hasta la validación FEM. Enfoque en materiales compuestos, CAD, FEA y simulaciones explícitas.',
'availability.title':'Disponibilidad',
'availability.text':'Actualmente en Airbus (contrato hasta dic 2025). Disponible para un nuevo rol desde enero de 2026.',
'availability.location':'Madrid, España · 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, optimización de layup (skin & stringers), verificación de flechas. <span class="where">UPM · FebMay 2025</span>',
'projects.card.hashin.title':'Laminado compuesto - Hashin (Abaqus)',
'projects.card.hashin.teaser':'Laminado UD a tracción vs compresión; fallo ply-by-ply con Hashin; análisis FEM. <span class="where">UPM · EneMar 2025</span>',
'projects.card.sec19.title':'Sección 19 del fuselaje trasero (Skin & Stringers)',
'projects.card.sec19.teaser':'Skin laminate y concepto de stringers, drop-offs, refuerzos, uniones a marcos (clips, Ø4,8 mm). <span class="where">UPM · EneMar 2024</span>',
'projects.card.handlebar.title':'Soporte de manillar - AW-2024 T3',
'projects.card.handlebar.teaser':'Optimización topológica, verificación de mordaza y tornillería VDI 2230, validación estática/fatiga (Ansys), minimización de peso. <span class="where">Unibo · SepDic 2024</span>',
'projects.card.drone.title':'Estructura de dron compuesta',
'projects.card.drone.teaser':'Definición de laminado, optimización de espesores, análisis armónico y de impacto FEM. <span class="where">Unibo · FebJun 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 (C2)',
'lang.en':'Inglés - Fluido (C1)',
'lang.de':'Alemán - Básico (A1)',
'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 (Madrid):',
'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',
'exp.airbus.title':'AIRBUS - Structural Design & Analysis Engineer',
'exp.airbus.where':'Madrid, ES',
'exp.airbus.p1':'Desarrollo y evaluación de <strong>reparaciones</strong> para componentes compuestos y metálicos.',
'exp.airbus.p2':'Diseño de piezas para <strong>A350 HTP</strong> y <strong>Sección 19</strong> (fuselaje trasero) en <strong>CATIA V5</strong>.',
'exp.airbus.p3':'Interfaz con Design Office en producción, garantizando integridad estructural y cumplimiento.',
'exp.airbus.p4':'Desarrollo de <strong>modelos numéricos</strong> y simulaciones explícitas de daño en compuestos in Abaqus.',
'exp.dlr.title':'DLR - Tesis de Máster · R&amp;D Engineer',
'exp.dlr.where':'Stuttgart, DE',
'exp.dlr.p1':'Tesis para el proyecto UE <strong>r-LightBioCom</strong> sobre compuestos sostenibles de alto rendimiento para automoción/aeroespacio.',
'exp.dlr.p2':'Huella ambiental por 1 kg de material con <strong>openLCA</strong>.',
'exp.dlr.p3':'Ensayos de compresión <strong>quasi-estáticos y dinámicos</strong> en núcleos (panal/espuma) y <strong>KPI</strong> combinando <em>LCA</em> y prestaciones mecánicas.',
'exp.dlr.p4':'Implementación y calibración de <strong>cartas MAT</strong> en <strong>LS-DYNA</strong> a partir de ensayos.',
'exp.dlr.p5':'Análisis <strong>FEM</strong> estáticos/dinámicos para validar los resultados.',
'exp.unibo.title':'UniBo Motorsport - Stress & Design Engineer',
'exp.unibo.where':'Bolonia, IT',
'exp.unibo.p1':'<strong>Diseño</strong> y <strong>análisis de tensiones</strong> (moldes de monocasco, soporte de salpicadero, arnés).',
'exp.unibo.p2':'<strong>FEM</strong> en chasis CFRP con múltiples cargas; investigación de delaminaciones.',
'exp.dvp.title':'D.V.P. Vacuum Technology - Tesis de Grado · R&amp;D Engineer',
'exp.dvp.where':'Bolonia, IT',
'exp.dvp.p1':'Campañas experimentales sobre caudales y pérdidas de carga en turbinas y válvulas.',
'exp.dvp.p2':'Desarrollo de <strong>mapas de rendimiento</strong> en <strong>GT-Suite</strong> y validación del modelo.',
'exp.cpc.title':'CPC Group - Composite Laminator',
'exp.cpc.where':'Módena, IT',
'exp.cpc.p1':'Laminación de moldes <strong>CFRP</strong> y de un chasis para el equipo de Formula SAE.',
'proj.common.what':'Qué hice',
'proj.common.model':'Modelo',
'proj.common.tools':'Herramientas',
'proj.common.results':'Resultados',
'proj.common.process':'Proceso',
'proj.common.download':'📄 Descargar informe',
'proj.stiff.h4':'Paneles compuestos rigidizados',
'proj.stiff.obj':'<strong>Objetivo -</strong> Diseñar y validar paneles CFRP con rigidizadores, minimizando peso y cumpliendo requisitos de pandeo y tolerancia al daño.',
'proj.stiff.li1':'Definí <strong>layups</strong> para piel y stringers (simetría, balance, porcentajes de capas).',
'proj.stiff.li2':'<strong>Pre-dimensioné</strong> refuerzos y verifiqué <strong>pandeo local/global</strong> y <strong>crippling</strong> de stringers.',
'proj.stiff.li3':'Comprobé <strong>flechas</strong> y <strong>márgenes de seguridad (MS)</strong> vs requisitos.',
'proj.stiff.li4':'Realicé <strong>optimización de espesores</strong> (peso vs rigidez/estabilidad) con feedback FEM.',
'proj.stiff.li5':'Usé <strong>modos de pandeo</strong> para guiar iteraciones de rediseño.',
'proj.stiff.tools':'Calculos a mano; hojas de cálculo de ingeniería; reglas aeronáuticas de laminado.',
'proj.stiff.r1':'Reducción de peso: <strong>≈ XY %</strong>.',
'proj.stiff.r2':'<strong>MS ≥ 0</strong> para pandeo y crippling en casos críticos.',
'proj.stiff.r3':'<strong>Flechas ≤</strong> límite especificado.',
'proj.stiff.cap1':'Vista de panel & rigidizadores',
'proj.stiff.cap2':'Modos de pandeo 13 (FEM)',
'proj.stiff.cap3':'Tabla de layup & espesores',
'proj.stiff.ch1':'Pandeo & Crippling',
'proj.stiff.ch2':'Layup optimizado',
'proj.stiff.ch3':'Impulsado por FEM',
'proj.stiff.ch4':'MS ≥ 0',
'proj.hashin.h4':'Laminado compuesto - Hashin (Abaqus)',
'proj.hashin.obj':'<strong>Objetivo -</strong> Simular un laminado UD a tracción y compresión con <em>inicio de daño Hashin</em> para identificar fallo ply-by-ply y comparar capacidad a tracción vs compresión.',
'proj.hashin.m1':'Probeta: <strong>100 × 20 mm</strong>, <strong>10 capas × 0,25 mm = 2,5 mm</strong>; layup simétrico <strong>[0°, ±45°, 0°, 90°]s</strong>.',
'proj.hashin.m2':'Elementos: <strong>S4R</strong> de cascarón (~2 mm); material: lamina UD con elástico + parámetros Hashin.',
'proj.hashin.m3':'BC/Carga: borde inferior empotrado; borde superior acoplado a RP con desplazamiento prescrito en Y.',
'proj.hashin.m4':'Modelo de daño: <strong>Hashin initiation</strong> (sin evolución). Salidas: HSNFTCRT, HSNFCCRT, HSNMTCRT, HSNMCCRT.',
'proj.hashin.r1':'<strong>Tracción:</strong> 90° matriz-tracción → ±45° matriz-corte → 0° fibra-tracción; <strong>UTS ≈ 413 MPa</strong>.',
'proj.hashin.r2':'<strong>Compresión:</strong> ±45° matriz-compresión → 90° matriz-compresión → 0° fibra-compresión; <strong>UCS ≈ 336 MPa</strong>.',
'proj.hashin.r3':'<strong>Relación:</strong> UTS/UCS ≈ <strong>1,23</strong> (≈23 % más fuerte a tracción).',
'proj.hashin.cap1':'Malla & layup (S4R cascarón)',
'proj.hashin.cap2':'Mapas Hashin - first-ply failure',
'proj.hashin.cap3':'σ–ε tracción (caídas escalonadas de rigidez)',
'proj.hashin.cap4':'σ–ε compresión (caídas escalonadas de rigidez)',
'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':'Relación ≈ 1,23',
'proj.sec19.h4':'Sección 19 del fuselaje trasero (Skin & Stringers)',
'proj.sec19.obj':'<strong>Objetivo -</strong> Definir skin y stringers en compuesto, refuerzos, drop-offs y uniones a marcos (clips, Ø4,8 mm) para un panel entre marcos AB.',
'proj.sec19.given':'Datos de base',
'proj.sec19.g1':'<strong>Geometría:</strong> cilindro <strong>R = 4500 mm</strong>; marcos a <strong>550 mm</strong>; pitch de stringer <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 capas (2/4/3)</strong>; refuerzo <strong>14 capas (2/8/4)</strong>, parche <strong>100 × 70 mm</strong>.',
'proj.sec19.g4':'<strong>Stringers:</strong> <strong>h &lt; 35 mm</strong>, <strong>R ≥ 3 mm</strong>; alma <strong>20 capas</strong> (50% 0° / 40% ±45° / 10% 90°); <strong>alma = 2× ala</strong>.',
'proj.sec19.g5':'<strong>Uniones:</strong> clips + <strong>Ø 4.8 mm</strong> tornillería.',
'proj.sec19.li1':'Geometría master (marcos & stringers sobre la skin), pitch y pies.',
'proj.sec19.li2':'Mapeado de layups de skin, drop-offs y footprint de refuerzo.',
'proj.sec19.li3':'Dimensionado de alma/alas de stringer y verificación de reparabilidad (L1 con Ø4,8).',
'proj.sec19.li4':'Definición de clips y preparación de planos, lista de materiales y peso del panel.',
'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'
}
};
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);
});
}
// API globale per ri-applicare la traduzione (usata anche dai modali)
window.__i18n = {
getLang: ()=>currentLang,
apply: ()=>translatePage(currentLang),
set: (lang)=>{ localStorage.setItem(STORAGE_KEY, lang); translatePage(lang); updateLangUI(lang); }
};
// ====== UI CUSTOM DROPDOWN ======
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();
});
// Click su opzioni
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();
});
// Tastiera su menu (ESC / frecce / invio)
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();
}
});
// Chiudi con click fuori
document.addEventListener('click', (e)=>{
if(!langSwitcher.contains(e.target)) closeMenu();
});
// Init lingua (saved / browser / default)
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>
// Footer dates
document.getElementById('year').textContent = new Date().getFullYear();
document.getElementById('updated').textContent = new Date().toLocaleDateString();
</script>
</body>
</html>