feat: add Velxio 2.0 release landing page with new features, boards showcase, and community CTAs

pull/58/head
David Montero Crespo 2026-03-23 18:47:12 -03:00
parent fb8d437d58
commit 61b08e7cf2
4 changed files with 789 additions and 0 deletions

View File

@ -187,6 +187,14 @@
<priority>0.85</priority> <priority>0.85</priority>
</url> </url>
<!-- ── Release pages ────────────────────────────────── -->
<url>
<loc>https://velxio.dev/v2</loc>
<lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<!-- Auth/admin/project pages intentionally excluded (noindex) --> <!-- Auth/admin/project pages intentionally excluded (noindex) -->
</urlset> </urlset>

View File

@ -19,6 +19,7 @@ import { Esp32S3SimulatorPage } from './pages/Esp32S3SimulatorPage';
import { Esp32C3SimulatorPage } from './pages/Esp32C3SimulatorPage'; import { Esp32C3SimulatorPage } from './pages/Esp32C3SimulatorPage';
import { RaspberryPiPicoSimulatorPage } from './pages/RaspberryPiPicoSimulatorPage'; import { RaspberryPiPicoSimulatorPage } from './pages/RaspberryPiPicoSimulatorPage';
import { RaspberryPiSimulatorPage } from './pages/RaspberryPiSimulatorPage'; import { RaspberryPiSimulatorPage } from './pages/RaspberryPiSimulatorPage';
import { Velxio2Page } from './pages/Velxio2Page';
import { useAuthStore } from './store/useAuthStore'; import { useAuthStore } from './store/useAuthStore';
import './App.css'; import './App.css';
@ -50,6 +51,7 @@ function App() {
<Route path="/esp32-c3-simulator" element={<Esp32C3SimulatorPage />} /> <Route path="/esp32-c3-simulator" element={<Esp32C3SimulatorPage />} />
<Route path="/raspberry-pi-pico-simulator" element={<RaspberryPiPicoSimulatorPage />} /> <Route path="/raspberry-pi-pico-simulator" element={<RaspberryPiPicoSimulatorPage />} />
<Route path="/raspberry-pi-simulator" element={<RaspberryPiSimulatorPage />} /> <Route path="/raspberry-pi-simulator" element={<RaspberryPiSimulatorPage />} />
<Route path="/v2" element={<Velxio2Page />} />
{/* Canonical project URL by ID */} {/* Canonical project URL by ID */}
<Route path="/project/:id" element={<ProjectByIdPage />} /> <Route path="/project/:id" element={<ProjectByIdPage />} />
{/* Legacy slug route — redirects to /project/:id */} {/* Legacy slug route — redirects to /project/:id */}

View File

@ -0,0 +1,267 @@
/* ── Velxio2Page.css — Styles for the v2 release page ── */
/* ── Hero override ───────────────────────────────────── */
.v2-hero {
max-width: 820px;
margin: 0 auto;
padding: 72px 2rem 56px;
text-align: center;
}
.v2-hero h1 {
font-size: clamp(2rem, 5vw, 3rem);
font-weight: 700;
line-height: 1.12;
color: #ffffff;
margin: 0 0 1rem;
letter-spacing: -0.5px;
}
.v2-hero h1 .accent {
color: #007acc;
}
.v2-hero .subtitle {
font-size: 1.1rem;
color: #8b949e;
max-width: 640px;
margin: 0 auto 2rem;
line-height: 1.65;
}
/* ── Version badge ───────────────────────────────────── */
.v2-version-badge {
display: inline-flex;
align-items: center;
gap: 8px;
background: rgba(0, 122, 204, 0.12);
color: #3b9ae8;
font-size: 0.82rem;
font-weight: 600;
padding: 6px 16px;
border-radius: 9999px;
border: 1px solid rgba(0, 122, 204, 0.25);
margin-bottom: 1.5rem;
letter-spacing: 0.02em;
}
.v2-version-badge svg {
width: 16px;
height: 16px;
}
/* ── Community buttons ───────────────────────────────── */
.v2-community-row {
display: flex;
gap: 12px;
justify-content: center;
flex-wrap: wrap;
margin-top: 1.5rem;
}
.v2-community-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 9px 20px;
font-size: 0.85rem;
font-weight: 500;
border-radius: 9999px;
text-decoration: none;
transition: background 0.2s, transform 0.15s, border-color 0.2s;
cursor: pointer;
border: 1px solid transparent;
}
.v2-star-btn {
background: #1c1c1e;
color: #f0c14b;
border-color: #333;
}
.v2-star-btn:hover {
background: #2a2a2c;
border-color: #f0c14b;
transform: scale(1.03);
}
.v2-star-btn svg {
fill: #f0c14b;
stroke: #f0c14b;
}
.v2-discord-btn {
background: #1c1c1e;
color: #7289da;
border-color: #333;
}
.v2-discord-btn:hover {
background: #2a2a2c;
border-color: #7289da;
transform: scale(1.03);
}
.v2-discord-btn svg {
fill: #7289da;
}
/* ── Architecture groups ─────────────────────────────── */
.v2-arch-group {
margin-bottom: 2rem;
}
.v2-arch-label {
display: flex;
align-items: center;
gap: 10px;
font-size: 0.85rem;
font-weight: 600;
color: #e6edf3;
padding-bottom: 8px;
margin-bottom: 12px;
border-bottom: 2px solid;
letter-spacing: -0.1px;
}
.v2-arch-engine {
display: inline-block;
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
background: rgba(255, 255, 255, 0.06);
color: #8b949e;
padding: 2px 8px;
border-radius: 4px;
}
/* ── Board cards ─────────────────────────────────────── */
.v2-boards-row {
display: flex;
gap: 12px;
flex-wrap: wrap;
}
.v2-board-card {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
background: #121214;
border: 1px solid #1c1c1e;
border-radius: 10px;
padding: 16px 20px;
min-width: 110px;
transition: border-color 0.2s, transform 0.15s;
}
.v2-board-card:hover {
border-color: #333;
transform: translateY(-2px);
}
.v2-board-card img {
height: 64px;
width: auto;
object-fit: contain;
}
.v2-board-card span {
font-size: 0.78rem;
font-weight: 500;
color: #8b949e;
text-align: center;
white-space: nowrap;
}
/* ── Changelog ───────────────────────────────────────── */
.v2-changelog {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 16px;
}
.v2-change-block {
background: #121214;
border: 1px solid #1c1c1e;
border-radius: 10px;
padding: 1.25rem 1.35rem;
}
.v2-change-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 0.75rem;
}
.v2-change-header h3 {
font-size: 0.92rem;
font-weight: 600;
margin: 0;
color: inherit;
}
.v2-change-header svg {
flex-shrink: 0;
}
.v2-change-list {
list-style: none;
margin: 0;
padding: 0;
}
.v2-change-list li {
position: relative;
font-size: 0.82rem;
color: #8b949e;
line-height: 1.6;
padding-left: 14px;
margin-bottom: 4px;
}
.v2-change-list li::before {
content: '';
position: absolute;
left: 0;
top: 8px;
width: 4px;
height: 4px;
border-radius: 50%;
background: #484848;
}
/* ── Bottom community ────────────────────────────────── */
.v2-bottom-community {
display: flex;
gap: 12px;
justify-content: center;
flex-wrap: wrap;
margin-top: 1.5rem;
}
/* ── Responsive ──────────────────────────────────────── */
@media (max-width: 600px) {
.v2-hero {
padding: 48px 1.25rem 40px;
}
.v2-changelog {
grid-template-columns: 1fr;
}
.v2-boards-row {
justify-content: center;
}
.v2-board-card {
min-width: 90px;
padding: 12px 14px;
}
.v2-board-card img {
height: 48px;
}
}

View File

@ -0,0 +1,512 @@
/**
* /v2 Velxio 2.0 Release Landing Page
* Showcases all new features, supported boards, and community CTAs
*/
import React from 'react';
import { Link } from 'react-router-dom';
import { AppHeader } from '../components/layout/AppHeader';
import { useSEO } from '../utils/useSEO';
import raspberryPi3Svg from '../assets/Raspberry_Pi_3_illustration.svg';
import './SEOPage.css';
import './Velxio2Page.css';
const GITHUB_URL = 'https://github.com/davidmonterocrespo24/velxio';
const DISCORD_URL = 'https://discord.gg/rCScB9cG';
/* ── SVG Icons (no emojis) ─────────────────────────────── */
const IcoRocket = () => (
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z" />
<path d="M12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z" />
<path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" />
<path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" />
</svg>
);
const IcoChip = () => (
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<rect x="5" y="5" width="14" height="14" rx="2" />
<rect x="9" y="9" width="6" height="6" />
<path d="M9 1v4M15 1v4M9 19v4M15 19v4M1 9h4M1 15h4M19 9h4M19 15h4" />
</svg>
);
const IcoCpu = () => (
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<rect x="4" y="4" width="16" height="16" rx="2" />
<rect x="8" y="8" width="8" height="8" />
<path d="M10 2v2M14 2v2M10 20v2M14 20v2M2 10h2M2 14h2M20 10h2M20 14h2" />
</svg>
);
const IcoSensor = () => (
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7z" />
<circle cx="12" cy="12" r="3" />
</svg>
);
const IcoTerminal = () => (
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<polyline points="4 17 10 11 4 5" />
<line x1="12" y1="19" x2="20" y2="19" />
</svg>
);
const IcoTestTube = () => (
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="M14.5 2v17.5c0 1.4-1.1 2.5-2.5 2.5s-2.5-1.1-2.5-2.5V2" />
<path d="M8.5 2h7" />
<path d="M14.5 16h-5" />
</svg>
);
const IcoPaintbrush = () => (
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="M18.37 2.63L14 7l-1.59-1.59a2 2 0 0 0-2.82 0L8 7l9 9 1.59-1.59a2 2 0 0 0 0-2.82L17 10l4.37-4.37a2.12 2.12 0 1 0-3-3z" />
<path d="M9 8c-2 3-4 3.5-7 4l8 10c2-1 6-5 6-7" />
</svg>
);
const IcoBook = () => (
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z" />
<path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z" />
</svg>
);
const IcoWrench = () => (
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z" />
</svg>
);
const IcoGitHub = () => (
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0C5.37 0 0 5.37 0 12c0 5.3 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61-.546-1.385-1.335-1.755-1.335-1.755-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 21.795 24 17.295 24 12c0-6.63-5.37-12-12-12z" />
</svg>
);
const IcoDiscord = () => (
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z" />
</svg>
);
const IcoStar = () => (
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" />
</svg>
);
const IcoRefresh = () => (
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="M21.5 2v6h-6" />
<path d="M2.5 22v-6h6" />
<path d="M2 11.5a10 10 0 0 1 18.8-4.3" />
<path d="M22 12.5a10 10 0 0 1-18.8 4.2" />
</svg>
);
const JSON_LD: object[] = [
{
'@context': 'https://schema.org',
'@type': 'SoftwareApplication',
name: 'Velxio 2.0 — Multi-Board Embedded Systems Simulator',
applicationCategory: 'DeveloperApplication',
operatingSystem: 'Any (browser-based)',
softwareVersion: '2.0.0',
description:
'Velxio 2.0 — a free, open-source multi-board embedded systems simulator. 19 boards, 5 CPU architectures, QEMU-based ESP32 emulation, sensor simulation, 68+ examples. Runs in your browser.',
url: 'https://velxio.dev/v2',
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
author: { '@type': 'Person', name: 'David Montero Crespo' },
license: 'https://www.gnu.org/licenses/agpl-3.0.html',
},
{
'@context': 'https://schema.org',
'@type': 'BreadcrumbList',
itemListElement: [
{ '@type': 'ListItem', position: 1, name: 'Velxio', item: 'https://velxio.dev/' },
{ '@type': 'ListItem', position: 2, name: 'Velxio 2.0', item: 'https://velxio.dev/v2' },
],
},
];
const CHANGE_SECTIONS = [
{
icon: <IcoChip />,
title: 'Multi-Board Support',
color: '#007acc',
items: [
'Raspberry Pi 3B — full Linux (ARM Cortex-A53 via QEMU raspi3b)',
'ESP32 / ESP32-S3 / ESP32-CAM — Xtensa LX6/LX7 via QEMU',
'ESP32-C3 / CH32V003 — RISC-V RV32IMC, browser-native',
'RP2040 — Raspberry Pi Pico / Pico W (ARM Cortex-M0+)',
'ATtiny85, ATmega2560, Leonardo, Pro Mini — AVR8 via avr8js',
'Multi-board canvas — mix architectures on the same simulation',
],
},
{
icon: <IcoCpu />,
title: 'Advanced Emulation',
color: '#c8701a',
items: [
'ESP32 emulation via QEMU (Xtensa) with GPIO, ADC, timers',
'SYSTIMER, timer group, and SPI flash/EXTMEM stubs',
'ROM function emulation for ESP32 boot sequence',
'Enhanced RP2040 dual-core ARM simulation',
'Virtual File System for Raspberry Pi 3 (full Linux OS)',
'Real arduino-cli compilation producing .hex / .bin / .uf2 files',
],
},
{
icon: <IcoSensor />,
title: 'Sensor Simulation',
color: '#4a9e6b',
items: [
'DHT22 — accurate timing and synchronous protocol handling',
'HC-SR04 — ultrasonic distance measurement with trigger/echo',
'Servo motor — configurable sweep with PWM emulation',
'Potentiometer and analog sensor improvements',
'Generic sensor registration system for extensibility',
'Improved timing accuracy and component interactions',
],
},
{
icon: <IcoTestTube />,
title: 'Testing',
color: '#a8304d',
items: [
'ESP32 test modules and integration test suites',
'Multi-board integration tests across architectures',
'Arduino serial communication integration testing',
],
},
{
icon: <IcoPaintbrush />,
title: 'UI/UX Improvements',
color: '#8957e5',
items: [
'Enhanced simulator canvas — wire handling and segment dragging',
'Improved z-index layering and component rendering',
'Oscilloscope and multi-board picker enhancements',
'Sensor Control Panel for interactive sensor adjustment',
'New visual components for all supported board families',
'Mobile-first responsive design with code/circuit tab switcher',
],
},
{
icon: <IcoBook />,
title: 'Documentation',
color: '#1a7f37',
items: [
'Full documentation site with 10+ pages',
'Board gallery with all 19 supported boards',
'ESP32 emulation guide (Xtensa + RISC-V)',
'RP2040 and Raspberry Pi 3 documentation',
'CodeBlock component with syntax highlighting',
],
},
{
icon: <IcoRefresh />,
title: 'Refactoring & Cleanup',
color: '#6e7681',
items: [
'Codebase refactors for readability and maintainability',
'Removed deprecated scripts and unused code',
'Simplified logging and internal data structures',
],
},
{
icon: <IcoWrench />,
title: 'Tooling & Integrations',
color: '#b08800',
items: [
'Discord notification workflow for issues',
'Wokwi elements integrated into Landing Page visuals',
'Scripts for automated example generation',
'Docker standalone image published to GHCR + Docker Hub',
],
},
];
export const Velxio2Page: React.FC = () => {
useSEO({
title: 'Velxio 2.0 — Multi-Board Embedded Simulator | ESP32, Raspberry Pi, Arduino, RISC-V',
description:
'Velxio 2.0 is here. 19 boards, 5 CPU architectures, QEMU-based ESP32 emulation, realistic sensor simulation, 68+ examples. A free, open-source multi-platform embedded systems simulator.',
url: 'https://velxio.dev/v2',
jsonLd: JSON_LD,
});
return (
<div className="seo-page">
<AppHeader />
<main>
{/* ── Hero ── */}
<section className="v2-hero">
<div className="v2-version-badge">
<IcoRocket /> Version 2.0
</div>
<h1>
Velxio 2.0<br />
<span className="accent">Multi-Platform Embedded Simulator</span>
</h1>
<p className="subtitle">
19 boards across 5 CPU architectures AVR8, RP2040, RISC-V, Xtensa, and ARM Linux.
QEMU-based ESP32 emulation, realistic sensor simulation, 68+ ready-to-run examples.
Free, open-source, runs in your browser.
</p>
<div className="seo-cta-group">
<Link to="/editor" className="seo-btn-primary">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2" /></svg>
Try Velxio 2.0
</Link>
<a href={GITHUB_URL} target="_blank" rel="noopener noreferrer" className="seo-btn-secondary">
<IcoGitHub /> View on GitHub
</a>
</div>
{/* Community CTAs */}
<div className="v2-community-row">
<a href={GITHUB_URL} target="_blank" rel="noopener noreferrer" className="v2-community-btn v2-star-btn">
<IcoStar />
<span>Star on GitHub</span>
</a>
<a href={DISCORD_URL} target="_blank" rel="noopener noreferrer" className="v2-community-btn v2-discord-btn">
<IcoDiscord />
<span>Join Discord</span>
</a>
</div>
</section>
{/* ── Boards showcase ── */}
<section className="seo-section">
<h2>19 boards. 5 architectures. One tool.</h2>
<p className="lead">
From 8-bit AVR to quad-core ARM Linux Velxio 2.0 emulates every major embedded platform in a single browser tab.
</p>
{/* AVR8 */}
<div className="v2-arch-group">
<div className="v2-arch-label" style={{ borderColor: '#0071e3' }}>
<span className="v2-arch-engine">avr8js</span>
AVR8 -- ATmega -- 16 MHz
</div>
<div className="v2-boards-row">
<div className="v2-board-card">
<img src="/boards/arduino-uno.svg" alt="Arduino Uno" />
<span>Arduino Uno</span>
</div>
<div className="v2-board-card">
<img src="/boards/arduino-nano.svg" alt="Arduino Nano" />
<span>Arduino Nano</span>
</div>
<div className="v2-board-card">
<img src="/boards/arduino-mega.svg" alt="Arduino Mega 2560" />
<span>Mega 2560</span>
</div>
</div>
</div>
{/* RP2040 */}
<div className="v2-arch-group">
<div className="v2-arch-label" style={{ borderColor: '#a8192a' }}>
<span className="v2-arch-engine">rp2040js</span>
RP2040 -- ARM Cortex-M0+ -- 133 MHz
</div>
<div className="v2-boards-row">
<div className="v2-board-card">
<img src="/boards/pi-pico.svg" alt="Raspberry Pi Pico" />
<span>Pi Pico</span>
</div>
<div className="v2-board-card">
<img src="/boards/pi-pico-w.svg" alt="Raspberry Pi Pico W" />
<span>Pi Pico W</span>
</div>
</div>
</div>
{/* RISC-V */}
<div className="v2-arch-group">
<div className="v2-arch-label" style={{ borderColor: '#4a9e6b' }}>
<span className="v2-arch-engine">Browser-native</span>
RISC-V -- RV32IMC -- 160 MHz
</div>
<div className="v2-boards-row">
<div className="v2-board-card">
<img src="/boards/esp32-c3.svg" alt="ESP32-C3" />
<span>ESP32-C3</span>
</div>
<div className="v2-board-card">
<img src="/boards/xiao-esp32-c3.svg" alt="XIAO ESP32-C3" />
<span>XIAO C3</span>
</div>
<div className="v2-board-card">
<img src="/boards/esp32c3-supermini.svg" alt="ESP32-C3 SuperMini" />
<span>C3 SuperMini</span>
</div>
</div>
</div>
{/* Xtensa QEMU */}
<div className="v2-arch-group">
<div className="v2-arch-label" style={{ borderColor: '#c8701a' }}>
<span className="v2-arch-engine">QEMU Xtensa</span>
Xtensa LX6/LX7 -- 240 MHz
</div>
<div className="v2-boards-row">
<div className="v2-board-card">
<img src="/boards/esp32-devkit-c-v4.svg" alt="ESP32 DevKit" />
<span>ESP32 DevKit</span>
</div>
<div className="v2-board-card">
<img src="/boards/esp32-s3.svg" alt="ESP32-S3" />
<span>ESP32-S3</span>
</div>
<div className="v2-board-card">
<img src="/boards/esp32-cam.svg" alt="ESP32-CAM" />
<span>ESP32-CAM</span>
</div>
<div className="v2-board-card">
<img src="/boards/xiao-esp32-s3.svg" alt="XIAO ESP32-S3" />
<span>XIAO S3</span>
</div>
<div className="v2-board-card">
<img src="/boards/arduino-nano-esp32.svg" alt="Nano ESP32" />
<span>Nano ESP32</span>
</div>
</div>
</div>
{/* ARM Linux */}
<div className="v2-arch-group">
<div className="v2-arch-label" style={{ borderColor: '#a8304d' }}>
<span className="v2-arch-engine">QEMU ARM</span>
ARM Cortex-A53 -- Linux -- 1.2 GHz
</div>
<div className="v2-boards-row">
<div className="v2-board-card">
<img src={raspberryPi3Svg} alt="Raspberry Pi 3B" />
<span>Raspberry Pi 3B</span>
</div>
</div>
</div>
</section>
{/* ── Changelog ── */}
<section className="seo-section">
<h2>What's new in 2.0</h2>
<p className="lead">
A complete transformation into a multi-platform embedded systems simulator more boards, more accurate emulation, better developer experience.
</p>
<div className="v2-changelog">
{CHANGE_SECTIONS.map((section) => (
<div key={section.title} className="v2-change-block">
<div className="v2-change-header" style={{ color: section.color }}>
{section.icon}
<h3>{section.title}</h3>
</div>
<ul className="v2-change-list">
{section.items.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
</div>
))}
</div>
</section>
{/* ── Examples ── */}
<section className="seo-section">
<h2>68+ ready-to-run examples</h2>
<p className="lead">
From basic LED blink to multi-board communication examples for every platform and skill level.
</p>
<div className="seo-grid">
<div className="seo-card">
<h3>Arduino (17 examples)</h3>
<p>Blink, traffic light, button, fade, RGB LED, Simon Says game, TFT display, LCD, I2C scanner, SPI loopback, and more.</p>
</div>
<div className="seo-card">
<h3>Raspberry Pi Pico (18 examples)</h3>
<p>Blink, serial, I2C (scanner, RTC, EEPROM), SPI, ADC read, DHT22, HC-SR04, servo, joystick, NTC sensor.</p>
</div>
<div className="seo-card">
<h3>ESP32 (9 examples)</h3>
<p>Blink, serial echo, 7-segment, DHT22, HC-SR04, MPU6050 IMU, PIR motion, servo, joystick.</p>
</div>
<div className="seo-card">
<h3>ESP32-C3 RISC-V (9 examples)</h3>
<p>Blink, serial, RGB LED, button + LED, serial echo, DHT22, HC-SR04, PIR, servo.</p>
</div>
<div className="seo-card">
<h3>Arduino Mega (5 examples)</h3>
<p>Blink, LED chase, serial echo, serial control, 7-segment display.</p>
</div>
<div className="seo-card">
<h3>Arduino Nano (4 examples)</h3>
<p>Blink, button LED, fade, serial echo. Plus multi-board Pi-to-Arduino control.</p>
</div>
</div>
<div style={{ textAlign: 'center', marginTop: 24 }}>
<Link to="/examples" className="seo-btn-secondary">Browse All Examples</Link>
</div>
</section>
{/* ── Outcome ── */}
<section className="seo-section">
<h2>The outcome</h2>
<p className="lead">
Velxio 2.0 transforms the project into a complete, scalable multi-platform embedded systems simulator.
</p>
<div className="seo-grid">
<div className="seo-card">
<h3>More realistic emulation</h3>
<p>QEMU-based Xtensa and ARM emulation. Browser-native RISC-V. Cycle-accurate AVR8 via avr8js. Real firmware execution, not approximations.</p>
</div>
<div className="seo-card">
<h3>Broader hardware support</h3>
<p>19 boards across 5 CPU architectures. From 8-bit ATtiny85 to quad-core Raspberry Pi 3B running full Linux.</p>
</div>
<div className="seo-card">
<h3>Better developer experience</h3>
<p>Monaco editor, multi-file workspace, library manager, oscilloscope, sensor control panel, mobile-responsive design.</p>
</div>
</div>
</section>
{/* ── Bottom CTA ── */}
<div className="seo-bottom">
<h2>Try Velxio 2.0 now</h2>
<p>Open the editor and start simulating 19 boards, 68+ examples, zero setup.</p>
<Link to="/editor" className="seo-btn-primary">Launch Simulator</Link>
<div className="v2-bottom-community">
<a href={GITHUB_URL} target="_blank" rel="noopener noreferrer" className="v2-community-btn v2-star-btn">
<IcoStar />
<span>Star on GitHub</span>
</a>
<a href={DISCORD_URL} target="_blank" rel="noopener noreferrer" className="v2-community-btn v2-discord-btn">
<IcoDiscord />
<span>Join Discord</span>
</a>
</div>
<div className="seo-internal-links">
<Link to="/">Home</Link>
<Link to="/examples">Examples</Link>
<Link to="/docs/intro">Documentation</Link>
<Link to="/arduino-simulator">Arduino Simulator</Link>
<Link to="/esp32-simulator">ESP32 Simulator</Link>
<Link to="/raspberry-pi-pico-simulator">RP2040 Simulator</Link>
<Link to="/raspberry-pi-simulator">Pi 3 Simulator</Link>
</div>
</div>
</main>
</div>
);
};