Version 0.0

This commit is contained in:
Aaron Co 2026-07-20 23:16:37 -05:00
commit 23c95ca5ec
5 changed files with 1499 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
node_modules/

192
index.html Normal file
View file

@ -0,0 +1,192 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Portafolio — Mockup</title>
<link rel="stylesheet" href="styles.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700;800&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
</head>
<body>
<div class="grid-bg"></div>
<svg class="trace-svg" viewBox="0 0 40 1400" preserveAspectRatio="none">
<path class="trace-path" d="M20,0 L20,180 L8,200 L8,420 L20,440 L20,700 L32,720 L32,980 L20,1000 L20,1400" />
<circle class="trace-node" cx="20" cy="180" r="3.5"/>
<circle class="trace-node" cx="8" cy="420" r="3.5"/>
<circle class="trace-node" cx="32" cy="720" r="3.5"/>
<circle class="trace-node" cx="20" cy="1000" r="3.5"/>
</svg>
<div class="wrap">
<header class="top">
<div class="logo">N.<span>_dev</span></div>
<nav>
<!--<a href="#proyectos">Proyectos</a>-->
<a href="#stack">Stack</a>
<a href="#contacto">Contacto</a>
</nav>
</header>
<section class="hero" style="border-top:none;">
<div class="status-line">
<span class="dot"></span> VPS online
</div>
<h1>Integro sistemas que conectan <span class="accent">software, hardware</span> e ingeniería</h1>
<p class="hero-sub">Ingeniero Mecatrónico con 3 años de experiencia diagnosticando y optimizando sistemas eléctricos, electrónicos y mecánicos en la industria automotriz e industrial — hoy aplicados a sistemas embebidos, IoT y análisis de datos.</p>
<!--<div class="hero-cta">
<a href="#proyectos" class="btn btn-primary">Ver proyectos</a>
<a href="#cv" class="btn btn-ghost">Descargar CV</a>
</div>-->
</section>
<section class="about">
<div class="sec-label">// sobre mí</div>
<p>Vengo del diseño y mantenimiento de sistemas eléctricos y electrónicos en vehículos comerciales e industria — de ahí entendí cómo piensan las máquinas antes de aprender a programarlas. He liderado equipos multidisciplinarios en la resolución de fallas críticas y hoy aplico esa base a <strong>sistemas embebidos, IoT y modelos de datos</strong>, con foco en resolver problemas reales de operación, no en coleccionar tecnologías.</p>
</section>
<section class="timeline">
<div class="sec-label">// trayectoria</div>
<div class="tl-item">
<div class="tl-head">
<span class="tl-role">Desarrollo Mecatrónico</span>
<span class="tl-date">[Ene 26] Presente</span>
</div>
<p class="tl-desc">Consultoría independiente en diseño de producto, IoT industrial y análisis de datos operativos para clientes del sector automotriz e industrial.</p>
</div>
<div class="tl-item">
<div class="tl-head">
<span class="tl-role">Ingeniero Eléctrico Neumático</span>
<span class="tl-date">[Jul 23] [Jul 25]</span>
</div>
<p class="tl-desc">Diseño e implementación de arquitecturas eléctricas/electrónicas y sistemas multiplex (CAN) para chasis de Mercedes-Benz, Volvo, Scania y Volkswagen.</p>
</div>
<div class="tl-item">
<div class="tl-head">
<span class="tl-role">Practicante Infraestructura y Mantenimiento</span>
<span class="tl-date">[Jun 22] [Mar 23]</span>
</div>
<p class="tl-desc">Gestión de mantenimiento, operatividad e indicadores, diseñando reportes para toma de decisiones y mejora continua.</p>
</div>
<div class="tl-item">
<div class="tl-head">
<span class="tl-role">Técnico de Ingeniería</span>
<span class="tl-date">[May 21] [Dic 21]</span>
</div>
<p class="tl-desc">Modelado 3D, diagnóstico de sistemas de control y montaje de sistemas de telemetría y sensores.</p>
</div>
<a href="#contacto" class="card-link" style="margin-top:6px; display:inline-block;">→ trayectoria completa en el CV</a>
</section>
<!--
<section id="proyectos">
<div class="sec-label">// proyectos destacados</div>
<div class="proj-grid">
<div class="card">
<div class="card-top">
<h3>Mantenimiento predictivo de maquinaria</h3>
<span class="card-result">94% precisión</span>
</div>
<p class="desc">Modelo que predice fallas de un equipo industrial antes de que ocurran, a partir de datos históricos de sensores (vibración, temperatura). Incluye análisis de por qué se eligió cada variable y modelo.</p>
<div class="tags"><span class="tag">Python</span><span class="tag">scikit-learn</span><span class="tag">pandas</span></div>
<a href="#" class="card-link">→ ver caso de estudio</a>
</div>
<div class="card">
<div class="card-top">
<h3>Diagnóstico de fallas sobre datos CAN</h3>
<span class="card-result">bus vehicular</span>
</div>
<p class="desc">Lectura y clasificación de tramas de bus CAN para identificar patrones anómalos asociados a fallas, aplicando conocimiento directo de arquitecturas eléctricas vehiculares.</p>
<div class="tags"><span class="tag">Python</span><span class="tag">CAN bus</span><span class="tag">clasificación</span></div>
<a href="#" class="card-link">→ ver repositorio</a>
</div>
<div class="card">
<div class="card-top">
<h3>Sistema IoT de monitoreo en tiempo real</h3>
<span class="card-result">end-to-end</span>
</div>
<p class="desc">Microcontrolador con sensores → envío por MQTT → backend que almacena y expone los datos → dashboard en vivo. Desplegado íntegramente en esta misma VPS.</p>
<div class="tags"><span class="tag">ESP32</span><span class="tag">MQTT</span><span class="tag">Docker</span><span class="tag">Node.js</span></div>
<a href="#" class="card-link">→ ver demo en vivo</a>
</div>
</div>
<div class="proj-subhead">diseño técnico / CAD</div>
<div class="cad-grid">
<div class="cad-card">
<div class="cad-thumb">[modelo 3D]</div>
<div class="cad-label">Estructura de soporte para sensores IoT</div>
</div>
<div class="cad-card">
<div class="cad-thumb">[plano]</div>
<div class="cad-label">Arnés eléctrico — sistema GNV</div>
</div>
<div class="cad-card">
<div class="cad-thumb">[modelo 3D]</div>
<div class="cad-label">Chasis de prueba — prototipo</div>
</div>
</div>
</section>
-->
<section id="stack">
<div class="sec-label">// stack técnico</div>
<div class="layer">
<div class="layer-title">Núcleo</div>
<div class="chip-row">
<span class="chip core">Sistemas embebidos</span>
<span class="chip core">IoT</span>
<span class="chip core">Visión artificial</span>
<span class="chip core">Análisis de datos</span>
<span class="chip core">SQL</span>
<span class="chip core">Python</span>
</div>
</div>
<div class="layer">
<div class="layer-title">Diseño CAD - EDA</div>
<div class="chip-row">
<span class="chip support">SolidWorks</span>
<span class="chip support">Fusion 360</span>
<span class="chip support">AutoCAD</span>
<span class="chip support">ANSYS</span>
<span class="chip support">Altium</span>
<span class="chip support">KiCad</span>
<span class="chip support">Proteus</span>
<span class="chip support">TIA Portal</span>
</div>
</div>
<div class="layer">
<div class="layer-title">Soporte</div>
<div class="chip-row">
<span class="chip support">Linux</span>
<span class="chip support">Docker</span>
<span class="chip support">Cloud</span>
<span class="chip support">MATLAB</span>
<span class="chip support">Power BI</span>
<span class="chip support">C / Bash</span>
</div>
</div>
</section>
<footer id="contacto">
<div>
<a href="mailto:tu-email@ejemplo.com">Email</a> ·
<a href="https://www.linkedin.com/in/aaroncolonia/" target="_blank" rel="noopener noreferrer">LinkedIn</a> ·
<a href="https://github.com/aoncoz" target="_blank" rel="noopener noreferrer">GitHub</a> ·
<!--<a href="tu-cv.pdf" style="color:var(--amber);" target="_blank">CV</a>-->
</div>
<div class="infra-note">VPS propia, autogestionado</div>
</footer>
</div>
</body>
</html>

903
package-lock.json generated Normal file
View file

@ -0,0 +1,903 @@
{
"name": "aonv1",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "aonv1",
"version": "1.0.0",
"license": "ISC",
"devDependencies": {
"vite": "^8.1.5"
}
},
"node_modules/@emnapi/core": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz",
"integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/wasi-threads": "1.2.2",
"tslib": "^2.4.0"
}
},
"node_modules/@emnapi/runtime": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
"integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@emnapi/wasi-threads": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
"integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@napi-rs/wasm-runtime": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz",
"integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@tybys/wasm-util": "^0.10.3"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/Brooooooklyn"
},
"peerDependencies": {
"@emnapi/core": "^1.7.1",
"@emnapi/runtime": "^1.7.1"
}
},
"node_modules/@oxc-project/types": {
"version": "0.139.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz",
"integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/Boshen"
}
},
"node_modules/@rolldown/binding-android-arm64": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz",
"integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz",
"integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-darwin-x64": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz",
"integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz",
"integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz",
"integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz",
"integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz",
"integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz",
"integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==",
"cpu": [
"ppc64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-linux-s390x-gnu": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz",
"integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==",
"cpu": [
"s390x"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz",
"integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz",
"integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz",
"integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openharmony"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-wasm32-wasi": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz",
"integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==",
"cpu": [
"wasm32"
],
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/core": "1.11.1",
"@emnapi/runtime": "1.11.1",
"@napi-rs/wasm-runtime": "^1.1.6"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz",
"integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz",
"integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/pluginutils": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
"integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
"dev": true,
"license": "MIT"
},
"node_modules/@tybys/wasm-util": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
"integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=8"
}
},
"node_modules/fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"picomatch": "^3 || ^4"
},
"peerDependenciesMeta": {
"picomatch": {
"optional": true
}
}
},
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/lightningcss": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
"integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
"dev": true,
"license": "MPL-2.0",
"dependencies": {
"detect-libc": "^2.0.3"
},
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
},
"optionalDependencies": {
"lightningcss-android-arm64": "1.33.0",
"lightningcss-darwin-arm64": "1.33.0",
"lightningcss-darwin-x64": "1.33.0",
"lightningcss-freebsd-x64": "1.33.0",
"lightningcss-linux-arm-gnueabihf": "1.33.0",
"lightningcss-linux-arm64-gnu": "1.33.0",
"lightningcss-linux-arm64-musl": "1.33.0",
"lightningcss-linux-x64-gnu": "1.33.0",
"lightningcss-linux-x64-musl": "1.33.0",
"lightningcss-win32-arm64-msvc": "1.33.0",
"lightningcss-win32-x64-msvc": "1.33.0"
}
},
"node_modules/lightningcss-android-arm64": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
"integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-darwin-arm64": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
"integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-darwin-x64": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
"integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-freebsd-x64": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
"integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-linux-arm-gnueabihf": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
"integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
"cpu": [
"arm"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-linux-arm64-gnu": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
"integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-linux-arm64-musl": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
"integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-linux-x64-gnu": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
"integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-linux-x64-musl": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
"integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-win32-arm64-msvc": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
"integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-win32-x64-msvc": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
"integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/nanoid": {
"version": "3.3.16",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
"integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"dev": true,
"license": "ISC"
},
"node_modules/picomatch": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/postcss": {
"version": "8.5.20",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.20.tgz",
"integrity": "sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.16",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/rolldown": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz",
"integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@oxc-project/types": "=0.139.0",
"@rolldown/pluginutils": "^1.0.0"
},
"bin": {
"rolldown": "bin/cli.mjs"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
"@rolldown/binding-android-arm64": "1.1.5",
"@rolldown/binding-darwin-arm64": "1.1.5",
"@rolldown/binding-darwin-x64": "1.1.5",
"@rolldown/binding-freebsd-x64": "1.1.5",
"@rolldown/binding-linux-arm-gnueabihf": "1.1.5",
"@rolldown/binding-linux-arm64-gnu": "1.1.5",
"@rolldown/binding-linux-arm64-musl": "1.1.5",
"@rolldown/binding-linux-ppc64-gnu": "1.1.5",
"@rolldown/binding-linux-s390x-gnu": "1.1.5",
"@rolldown/binding-linux-x64-gnu": "1.1.5",
"@rolldown/binding-linux-x64-musl": "1.1.5",
"@rolldown/binding-openharmony-arm64": "1.1.5",
"@rolldown/binding-wasm32-wasi": "1.1.5",
"@rolldown/binding-win32-arm64-msvc": "1.1.5",
"@rolldown/binding-win32-x64-msvc": "1.1.5"
}
},
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/tinyglobby": {
"version": "0.2.17",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
"integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
"dev": true,
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
"picomatch": "^4.0.4"
},
"engines": {
"node": ">=12.0.0"
},
"funding": {
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"dev": true,
"license": "0BSD",
"optional": true
},
"node_modules/vite": {
"version": "8.1.5",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz",
"integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==",
"dev": true,
"license": "MIT",
"dependencies": {
"lightningcss": "^1.32.0",
"picomatch": "^4.0.5",
"postcss": "^8.5.17",
"rolldown": "~1.1.5",
"tinyglobby": "^0.2.17"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
},
"optionalDependencies": {
"fsevents": "~2.3.3"
},
"peerDependencies": {
"@types/node": "^20.19.0 || >=22.12.0",
"@vitejs/devtools": "^0.3.0",
"esbuild": "^0.27.0 || ^0.28.0",
"jiti": ">=1.21.0",
"less": "^4.0.0",
"sass": "^1.70.0",
"sass-embedded": "^1.70.0",
"stylus": ">=0.54.8",
"sugarss": "^5.0.0",
"terser": "^5.16.0",
"tsx": "^4.8.1",
"yaml": "^2.4.2"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
},
"@vitejs/devtools": {
"optional": true
},
"esbuild": {
"optional": true
},
"jiti": {
"optional": true
},
"less": {
"optional": true
},
"sass": {
"optional": true
},
"sass-embedded": {
"optional": true
},
"stylus": {
"optional": true
},
"sugarss": {
"optional": true
},
"terser": {
"optional": true
},
"tsx": {
"optional": true
},
"yaml": {
"optional": true
}
}
}
}
}

16
package.json Normal file
View file

@ -0,0 +1,16 @@
{
"name": "aonv1",
"version": "1.0.0",
"description": "",
"license": "ISC",
"author": "",
"type": "commonjs",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "vite"
},
"devDependencies": {
"vite": "^8.1.5"
}
}

387
styles.css Normal file
View file

@ -0,0 +1,387 @@
:root{
--bg: #0D1210;
--bg-alt: #10160F;
--panel: #171F1B;
--panel-line: #2A342E;
--amber: #FFB020;
--amber-dim: #8a6a2c;
--green: #5B8C6E;
--text: #E8E6DD;
--text-dim: #8B948B;
--mono: 'JetBrains Mono', monospace;
--sans: 'Inter', sans-serif;
}
*{ box-sizing: border-box; margin:0; padding:0; }
body{
background: var(--bg);
color: var(--text);
font-family: var(--sans);
line-height: 1.6;
overflow-x: hidden;
}
a{ color: inherit; }
::selection{ background: var(--amber); color: #0D1210; }
:focus-visible{
outline: 2px solid var(--amber);
outline-offset: 3px;
}
/* background grid texture */
.grid-bg{
position: fixed;
inset: 0;
z-index: 0;
background-image:
linear-gradient(rgba(91,140,110,0.06) 1px, transparent 1px),
linear-gradient(90deg, rgba(91,140,110,0.06) 1px, transparent 1px);
background-size: 42px 42px;
pointer-events: none;
}
/* signature trace line */
.trace-svg{
position: fixed;
top: 0;
left: 24px;
height: 100vh;
width: 40px;
z-index: 1;
pointer-events: none;
}
.trace-path{
fill: none;
stroke: var(--green);
stroke-width: 1.5;
opacity: 0.35;
stroke-dasharray: 6 6;
}
.trace-node{
fill: var(--amber);
opacity: 0.8;
}
@media (max-width: 900px){
.trace-svg{ display: none; }
}
.wrap{
position: relative;
z-index: 2;
max-width: 980px;
margin: 0 auto;
padding: 0 32px;
}
header.top{
padding: 28px 0;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid var(--panel-line);
}
.logo{
font-family: var(--mono);
font-weight: 700;
letter-spacing: 0.5px;
font-size: 15px;
color: var(--amber);
}
.logo span{ color: var(--text-dim); }
nav a{
font-family: var(--mono);
font-size: 13px;
color: var(--text-dim);
text-decoration: none;
margin-left: 28px;
}
nav a:hover{ color: var(--amber); }
/* HERO */
.hero{
padding: 100px 0 90px;
}
.status-line{
display: inline-flex;
align-items: center;
gap: 8px;
font-family: var(--mono);
font-size: 12px;
color: var(--green);
border: 1px solid var(--panel-line);
background: var(--panel);
padding: 6px 12px;
border-radius: 3px;
margin-bottom: 32px;
}
.dot{
width: 7px; height: 7px;
border-radius: 50%;
background: var(--green);
box-shadow: 0 0 8px var(--green);
animation: blink 2.4s infinite;
}
@keyframes blink{
0%, 100%{ opacity: 1; }
50%{ opacity: 0.3; }
}
@media (prefers-reduced-motion: reduce){
.dot{ animation: none; }
}
h1{
font-family: var(--mono);
font-weight: 800;
font-size: clamp(32px, 5vw, 52px);
line-height: 1.15;
letter-spacing: -0.5px;
max-width: 760px;
}
h1 .accent{ color: var(--amber); }
.hero-sub{
margin-top: 24px;
max-width: 560px;
color: var(--text-dim);
font-size: 17px;
}
.hero-cta{
margin-top: 40px;
display: flex;
gap: 14px;
flex-wrap: wrap;
}
.btn{
font-family: var(--mono);
font-size: 13px;
padding: 12px 20px;
border-radius: 3px;
text-decoration: none;
display: inline-block;
border: 1px solid var(--panel-line);
transition: border-color 0.15s ease, background 0.15s ease;
}
.btn-primary{
background: var(--amber);
color: #10160F;
border-color: var(--amber);
font-weight: 700;
}
.btn-primary:hover{ background: #ffc451; }
.btn-ghost{ color: var(--text); }
.btn-ghost:hover{ border-color: var(--amber); color: var(--amber); }
/* SECTION LABEL */
.sec-label{
font-family: var(--mono);
font-size: 12px;
color: var(--amber-dim);
letter-spacing: 2px;
text-transform: uppercase;
margin-bottom: 14px;
}
section{ padding: 70px 0; border-top: 1px solid var(--panel-line); }
.about p{
max-width: 640px;
font-size: 16px;
color: var(--text-dim);
}
.about strong{ color: var(--text); font-weight: 600; }
/* TIMELINE */
.tl-item{
padding: 18px 0;
border-bottom: 1px solid var(--panel-line);
}
.tl-item:last-of-type{ border-bottom: none; }
.tl-head{
display: flex;
justify-content: space-between;
align-items: baseline;
flex-wrap: wrap;
gap: 8px;
}
.tl-role{
font-family: var(--mono);
font-weight: 700;
font-size: 15px;
}
.tl-date{
font-family: var(--mono);
font-size: 12px;
color: var(--amber-dim);
}
.tl-desc{
margin-top: 6px;
color: var(--text-dim);
font-size: 14px;
max-width: 620px;
}
/* PROJECT SUBGROUPS */
.proj-subhead{
font-family: var(--mono);
font-size: 13px;
color: var(--text-dim);
margin: 36px 0 14px;
display: flex;
align-items: center;
gap: 10px;
}
.proj-subhead::after{
content: '';
flex: 1;
height: 1px;
background: var(--panel-line);
}
.cad-grid{
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 14px;
}
.cad-card{
background: var(--panel);
border: 1px solid var(--panel-line);
border-radius: 4px;
overflow: hidden;
}
.cad-thumb{
aspect-ratio: 4/3;
background:
repeating-linear-gradient(45deg, var(--panel-line) 0, var(--panel-line) 1px, transparent 1px, transparent 12px),
var(--bg-alt);
display: flex;
align-items: center;
justify-content: center;
font-family: var(--mono);
font-size: 11px;
color: var(--text-dim);
}
.cad-label{
padding: 12px 14px;
font-family: var(--mono);
font-size: 13px;
}
/* PROJECTS */
.proj-grid{
display: grid;
grid-template-columns: 1fr;
gap: 18px;
margin-top: 24px;
}
.card{
background: var(--panel);
border: 1px solid var(--panel-line);
border-radius: 4px;
padding: 26px;
transition: border-color 0.2s ease;
}
.card:hover{ border-color: var(--green); }
.card-top{
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 16px;
flex-wrap: wrap;
}
.card h3{
font-family: var(--mono);
font-size: 19px;
font-weight: 700;
}
.card-result{
font-family: var(--mono);
font-size: 12px;
color: var(--green);
white-space: nowrap;
}
.card p.desc{
margin-top: 10px;
color: var(--text-dim);
font-size: 14.5px;
max-width: 620px;
}
.tags{
margin-top: 16px;
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.tag{
font-family: var(--mono);
font-size: 11px;
color: var(--text-dim);
border: 1px solid var(--panel-line);
padding: 3px 8px;
border-radius: 2px;
}
.card-link{
margin-top: 18px;
display: inline-block;
font-family: var(--mono);
font-size: 12.5px;
color: var(--amber);
text-decoration: none;
}
.card-link:hover{ text-decoration: underline; }
/* STACK LAYERS */
.layer{
margin-bottom: 28px;
}
.layer-title{
font-family: var(--mono);
font-size: 13px;
color: var(--text);
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 10px;
}
.layer-title::after{
content: '';
flex: 1;
height: 1px;
background: var(--panel-line);
}
.chip-row{ display: flex; flex-wrap: wrap; gap: 10px; }
.chip{
font-family: var(--mono);
font-size: 13px;
padding: 7px 14px;
border-radius: 3px;
border: 1px solid var(--panel-line);
}
.chip.core{ color: var(--amber); border-color: var(--amber-dim); background: rgba(255,176,32,0.06); }
.chip.support{ color: var(--text-dim); }
/* CV */
.cv-row{
display: flex;
gap: 14px;
flex-wrap: wrap;
margin-top: 20px;
}
footer{
padding: 50px 0 70px;
border-top: 1px solid var(--panel-line);
color: var(--text-dim);
font-size: 13px;
font-family: var(--mono);
}
footer .infra-note{
margin-top: 10px;
color: var(--green);
}
@media (min-width: 640px){
.proj-grid{ grid-template-columns: 1fr; }
}