Copy cat > /tmp/portfolio.html << 'EOF'
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Jane Smith — Frontend Developer portfolio">
<title>Jane Smith — Frontend Developer</title>
<style>
/* === RESET === */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { line-height: 1.5; -webkit-font-smoothing: antialiased; }
img, picture { display: block; max-width: 100%; }
input, button, textarea, select { font: inherit; }
/* === TOKENS === */
:root {
--primary: #667eea; --secondary: #764ba2; --accent: #f5576c;
--bg: #0d1117; --surface: #161b22; --border: #30363d;
--text: #f0f6fc; --muted: #8b949e;
--grad: linear-gradient(135deg, var(--primary), var(--secondary));
--pad: clamp(16px, 4vw, 60px);
--section-pad: clamp(60px, 10vw, 100px);
--radius: 12px; --radius-full: 9999px;
--shadow: 0 4px 20px rgba(0,0,0,0.4);
--t: 0.25s ease;
}
/* === BASE === */
body { font-family: system-ui, sans-serif; background: var(--bg); color: var(--text); }
a { color: var(--primary); }
:focus-visible { outline: 3px solid var(--primary); outline-offset: 2px; border-radius: 4px; }
/* === SKIP LINK === */
.skip-link { position: absolute; top: -100%; left: 8px; background: var(--primary); color: white; padding: 10px 20px; border-radius: 0 0 8px 8px; font-weight: 600; text-decoration: none; z-index: 9999; }
.skip-link:focus { top: 0; }
/* === LAYOUT === */
.container { max-width: 1200px; margin: 0 auto; padding: 0 var(--pad); }
/* === HEADER === */
.site-header { position: sticky; top: 0; background: rgba(13,17,23,0.9); backdrop-filter: blur(12px); border-bottom: 1px solid var(--border); z-index: 100; }
.site-header__inner { display: flex; justify-content: space-between; align-items: center; height: 64px; }
.logo { font-weight: 900; font-size: 1.3rem; color: var(--primary); text-decoration: none; width: 42px; height: 42px; background: var(--grad); border-radius: var(--radius); display: flex; align-items: center; justify-content: center; color: white; }
.nav__list { display: none; list-style: none; gap: 32px; }
@media (min-width: 768px) { .nav__list { display: flex; } }
.nav__link { color: var(--muted); text-decoration: none; font-size: 0.9rem; font-weight: 600; transition: color var(--t); }
.nav__link:hover { color: var(--text); }
.nav-toggle { display: flex; flex-direction: column; gap: 5px; cursor: pointer; background: none; border: none; padding: 4px; }
.nav-toggle span { display: block; width: 22px; height: 2px; background: var(--text); border-radius: 2px; transition: var(--t); }
@media (min-width: 768px) { .nav-toggle { display: none; } }
/* === HERO === */
@keyframes slideUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }
@keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-15px); } }
@keyframes pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(102,126,234,0.4); } 50% { box-shadow: 0 0 0 20px rgba(102,126,234,0); } }
.hero { min-height: calc(100vh - 64px); display: grid; grid-template-columns: 1fr; place-items: center; padding: var(--section-pad) var(--pad); gap: 40px; }
@media (min-width: 900px) { .hero { grid-template-columns: 1fr 1fr; text-align: left; } }
.hero__tag { display: inline-block; background: rgba(102,126,234,0.15); color: var(--primary); border: 1px solid rgba(102,126,234,0.3); padding: 6px 16px; border-radius: var(--radius-full); font-size: 0.85rem; font-weight: 600; margin-bottom: 20px; animation: slideUp 0.5s ease 0.1s both; }
.hero__name { font-size: clamp(2.5rem, 7vw, 5rem); font-weight: 900; line-height: 1.05; margin-bottom: 12px; background: var(--grad); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; animation: slideUp 0.5s ease 0.2s both; }
.hero__role { font-size: clamp(1.1rem, 2.5vw, 1.5rem); color: var(--muted); margin-bottom: 20px; animation: slideUp 0.5s ease 0.3s both; }
.hero__desc { color: var(--muted); max-width: 480px; line-height: 1.7; margin-bottom: 32px; animation: slideUp 0.5s ease 0.4s both; }
.hero__actions { display: flex; gap: 16px; flex-wrap: wrap; animation: slideUp 0.5s ease 0.5s both; }
@media (max-width: 899px) { .hero__actions { justify-content: center; } }
.hero__visual { display: flex; flex-direction: column; align-items: center; gap: 24px; animation: slideUp 0.5s ease 0.3s both; }
.hero__avatar { font-size: 6rem; animation: float 4s ease-in-out infinite; width: 140px; height: 140px; background: var(--surface); border-radius: 50%; display: flex; align-items: center; justify-content: center; border: 3px solid var(--border); animation: float 4s ease-in-out infinite, pulse 3s ease-in-out infinite; }
.code-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 20px; font-family: monospace; font-size: 0.85rem; line-height: 1.8; min-width: 220px; }
/* === BUTTONS === */
.btn { display: inline-flex; align-items: center; gap: 8px; padding: 12px 28px; border-radius: var(--radius-full); font-weight: 700; font-size: 0.95rem; cursor: pointer; border: none; text-decoration: none; transition: var(--t); }
.btn--primary { background: var(--grad); color: white; }
.btn--primary:hover { opacity: 0.9; transform: translateY(-2px); box-shadow: 0 8px 25px rgba(102,126,234,0.4); }
.btn--outline { background: transparent; border: 2px solid var(--primary); color: var(--primary); }
.btn--outline:hover { background: rgba(102,126,234,0.1); transform: translateY(-2px); }
.btn--ghost { background: transparent; color: var(--muted); }
.btn--ghost:hover { color: var(--text); background: var(--border); }
.btn--sm { padding: 8px 18px; font-size: 0.85rem; }
/* === SECTIONS === */
section { padding: var(--section-pad) 0; }
section:nth-child(even) { background: rgba(22,27,34,0.5); }
.section-header { text-align: center; margin-bottom: 48px; }
.section-title { font-size: clamp(1.5rem, 4vw, 2.5rem); font-weight: 900; margin-bottom: 12px; }
.section-subtitle { color: var(--muted); max-width: 500px; margin: 0 auto; }
/* === ABOUT === */
.about__grid { display: grid; grid-template-columns: 1fr; gap: 40px; }
@media (min-width: 768px) { .about__grid { grid-template-columns: 1.5fr 1fr; align-items: center; } }
.about__text p { color: var(--muted); line-height: 1.8; margin-bottom: 16px; }
.about__stats { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
.stat { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 20px; text-align: center; }
.stat__num { font-size: 2rem; font-weight: 900; background: var(--grad); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
.stat__label { color: var(--muted); font-size: 0.85rem; margin-top: 4px; }
/* === SKILLS === */
.skills__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 20px; }
.skill { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 24px 20px; text-align: center; transition: var(--t); }
.skill:hover { border-color: var(--primary); transform: translateY(-4px); box-shadow: 0 8px 25px rgba(102,126,234,0.2); }
.skill__icon { font-size: 2.5rem; margin-bottom: 12px; }
.skill__name { font-weight: 700; margin-bottom: 6px; }
.skill__desc { color: var(--muted); font-size: 0.8rem; line-height: 1.4; }
/* === PROJECTS === */
.projects__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 24px; }
.project { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; transition: var(--t); }
.project:hover { border-color: var(--primary); box-shadow: var(--shadow); transform: translateY(-4px); }
.project__img { height: 180px; display: flex; align-items: center; justify-content: center; font-size: 5rem; }
.project__body { padding: 20px; }
.project__tags { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
.tag { background: rgba(102,126,234,0.12); color: var(--primary); padding: 2px 10px; border-radius: var(--radius-full); font-size: 0.75rem; font-weight: 700; }
.project__title { font-size: 1.1rem; font-weight: 700; margin-bottom: 8px; }
.project__desc { color: var(--muted); font-size: 0.9rem; line-height: 1.5; margin-bottom: 16px; }
.project__links { display: flex; gap: 10px; }
/* === CONTACT === */
.contact__inner { display: grid; grid-template-columns: 1fr; gap: 48px; }
@media (min-width: 768px) { .contact__inner { grid-template-columns: 1fr 1.5fr; } }
.contact__info p { color: var(--muted); line-height: 1.7; margin-bottom: 24px; }
.contact__links { display: flex; flex-direction: column; gap: 12px; }
.contact__link { color: var(--muted); text-decoration: none; display: flex; align-items: center; gap: 10px; font-size: 0.95rem; transition: color var(--t); }
.contact__link:hover { color: var(--text); }
.form__field { margin-bottom: 20px; }
.form__label { display: block; margin-bottom: 6px; font-weight: 600; font-size: 0.85rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; }
.form__input { width: 100%; padding: 12px 16px; background: var(--surface); border: 2px solid var(--border); border-radius: var(--radius); color: var(--text); font-size: 1rem; transition: border-color var(--t); }
.form__input:focus { outline: none; border-color: var(--primary); }
.form__input:valid:not(:placeholder-shown) { border-color: rgba(0,184,148,0.6); }
.form__input::placeholder { color: var(--muted); }
.btn--full { width: 100%; justify-content: center; border-radius: var(--radius); }
/* === FOOTER === */
.site-footer { background: var(--surface); border-top: 1px solid var(--border); padding: 32px var(--pad); text-align: center; }
.site-footer p { color: var(--muted); font-size: 0.9rem; margin-bottom: 8px; }
.site-footer a { color: var(--primary); }
/* === PRINT === */
@media print {
*, *::before, *::after { background: transparent !important; color: black !important; box-shadow: none !important; }
.site-header, .nav-toggle, .btn { display: none !important; }
.hero__visual { display: none; }
section { padding: 20pt 0; break-inside: avoid; }
@page { margin: 1in; }
}
</style>
</head>
<body>
<a href="#main" class="skip-link">Skip to main content</a>
<header class="site-header" role="banner">
<div class="container">
<div class="site-header__inner">
<a href="#" class="logo" aria-label="Jane Smith">JS</a>
<nav aria-label="Main navigation">
<ul class="nav__list">
<li><a href="#about" class="nav__link">About</a></li>
<li><a href="#skills" class="nav__link">Skills</a></li>
<li><a href="#projects" class="nav__link">Projects</a></li>
<li><a href="#contact" class="nav__link">Contact</a></li>
</ul>
</nav>
<button class="nav-toggle" aria-label="Toggle navigation" aria-expanded="false" id="nav-toggle">
<span></span><span></span><span></span>
</button>
</div>
</div>
</header>
<main id="main">
<!-- HERO -->
<section class="hero" aria-labelledby="hero-name" style="padding-inline:var(--pad)">
<div class="hero__text">
<div class="hero__tag">👋 Available for hire</div>
<h1 id="hero-name" class="hero__name">Jane Smith</h1>
<p class="hero__role">Frontend Developer</p>
<p class="hero__desc">I craft beautiful, accessible, and performant web experiences using modern HTML, CSS, and JavaScript.</p>
<div class="hero__actions">
<a href="#projects" class="btn btn--primary">View My Work</a>
<a href="#contact" class="btn btn--outline">Hire Me</a>
</div>
</div>
<div class="hero__visual" aria-hidden="true">
<div class="hero__avatar">👩💻</div>
<div class="code-card">
<div><span style="color:#e74c3c">const</span> <span style="color:#667eea">dev</span> = {</div>
<div> <span style="color:#48bb78">name</span>: <span style="color:#f6ad55">"Jane"</span>,</div>
<div> <span style="color:#48bb78">loves</span>: <span style="color:#f6ad55">"CSS"</span>,</div>
<div> <span style="color:#48bb78">coffee</span>: <span style="color:#667eea">true</span></div>
<div>};</div>
</div>
</div>
</section>
<!-- ABOUT -->
<section id="about" aria-labelledby="about-h">
<div class="container">
<div class="section-header"><h2 id="about-h" class="section-title">About Me</h2></div>
<div class="about__grid">
<div class="about__text">
<p>I'm a frontend developer with 3 years of experience building responsive, accessible web applications. I specialize in creating delightful user interfaces that perform well on every device.</p>
<p>Passionate about web standards, CSS architecture, and making the web accessible to everyone. Currently exploring CSS container queries and the View Transitions API.</p>
</div>
<div class="about__stats">
<div class="stat"><div class="stat__num">50+</div><div class="stat__label">Projects</div></div>
<div class="stat"><div class="stat__num">3</div><div class="stat__label">Years Exp</div></div>
<div class="stat"><div class="stat__num">12</div><div class="stat__label">Clients</div></div>
<div class="stat"><div class="stat__num">∞</div><div class="stat__label">Coffees ☕</div></div>
</div>
</div>
</div>
</section>
<!-- SKILLS -->
<section id="skills" aria-labelledby="skills-h">
<div class="container">
<div class="section-header"><h2 id="skills-h" class="section-title">Skills</h2><p class="section-subtitle">Technologies and practices I use every day</p></div>
<div class="skills__grid">
<div class="skill"><div class="skill__icon">🌐</div><h3 class="skill__name">HTML5</h3><p class="skill__desc">Semantic markup, accessibility, ARIA, structured data</p></div>
<div class="skill"><div class="skill__icon">🎨</div><h3 class="skill__name">CSS3</h3><p class="skill__desc">Grid, Flexbox, animations, custom properties, BEM</p></div>
<div class="skill"><div class="skill__icon">⚡</div><h3 class="skill__name">JavaScript</h3><p class="skill__desc">ES6+, DOM APIs, async/await, Web APIs</p></div>
<div class="skill"><div class="skill__icon">⚛️</div><h3 class="skill__name">React</h3><p class="skill__desc">Hooks, context, component architecture</p></div>
<div class="skill"><div class="skill__icon">📱</div><h3 class="skill__name">Responsive</h3><p class="skill__desc">Mobile-first, fluid typography, container queries</p></div>
<div class="skill"><div class="skill__icon">♿</div><h3 class="skill__name">Accessibility</h3><p class="skill__desc">WCAG 2.1 AA, ARIA, screen reader testing</p></div>
</div>
</div>
</section>
<!-- PROJECTS -->
<section id="projects" aria-labelledby="proj-h">
<div class="container">
<div class="section-header"><h2 id="proj-h" class="section-title">Projects</h2><p class="section-subtitle">Things I've built and shipped</p></div>
<div class="projects__grid">
<article class="project" aria-label="E-commerce Platform project">
<div class="project__img" style="background:linear-gradient(135deg,#667eea,#764ba2)">🛒</div>
<div class="project__body">
<div class="project__tags"><span class="tag">React</span><span class="tag">CSS Grid</span><span class="tag">Node.js</span></div>
<h3 class="project__title">E-commerce Platform</h3>
<p class="project__desc">Full-featured online store with cart, checkout, and Stripe payment integration.</p>
<div class="project__links"><a href="#" class="btn btn--primary btn--sm">Live Demo</a><a href="#" class="btn btn--ghost btn--sm">GitHub ↗</a></div>
</div>
</article>
<article class="project" aria-label="Design System project">
<div class="project__img" style="background:linear-gradient(135deg,#f5576c,#f093fb)">🎨</div>
<div class="project__body">
<div class="project__tags"><span class="tag">CSS</span><span class="tag">Storybook</span><span class="tag">TypeScript</span></div>
<h3 class="project__title">Design System</h3>
<p class="project__desc">Component library with 50+ accessible, themeable UI components and documentation.</p>
<div class="project__links"><a href="#" class="btn btn--primary btn--sm">Live Demo</a><a href="#" class="btn btn--ghost btn--sm">GitHub ↗</a></div>
</div>
</article>
<article class="project" aria-label="Analytics Dashboard project">
<div class="project__img" style="background:linear-gradient(135deg,#43e97b,#38f9d7)">📊</div>
<div class="project__body">
<div class="project__tags"><span class="tag">D3.js</span><span class="tag">CSS Grid</span><span class="tag">REST API</span></div>
<h3 class="project__title">Analytics Dashboard</h3>
<p class="project__desc">Real-time data visualization with interactive charts and filterable views.</p>
<div class="project__links"><a href="#" class="btn btn--primary btn--sm">Live Demo</a><a href="#" class="btn btn--ghost btn--sm">GitHub ↗</a></div>
</div>
</article>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact" aria-labelledby="contact-h">
<div class="container">
<div class="section-header"><h2 id="contact-h" class="section-title">Get In Touch</h2><p class="section-subtitle">I'm currently available for new opportunities</p></div>
<div class="contact__inner">
<div class="contact__info">
<p>Whether you have a project in mind, need a frontend developer for your team, or just want to say hi — I'd love to hear from you!</p>
<div class="contact__links">
<a href="mailto:[email protected] " class="contact__link" aria-label="Send email to Jane">✉️ [email protected] </a>
<a href="https://github.com" class="contact__link" aria-label="Jane's GitHub">⬛ github.com/janesmith</a>
<a href="https://linkedin.com" class="contact__link" aria-label="Jane's LinkedIn">🔵 linkedin.com/in/janesmith</a>
<a href="https://twitter.com" class="contact__link" aria-label="Jane's Twitter">🐦 @janesmith_dev</a>
</div>
</div>
<form class="contact-form" aria-label="Send Jane a message" novalidate>
<div class="form__field">
<label class="form__label" for="name">Name <span aria-hidden="true">*</span></label>
<input class="form__input" type="text" id="name" name="name" required aria-required="true" autocomplete="name" placeholder="Your full name">
</div>
<div class="form__field">
<label class="form__label" for="email">Email <span aria-hidden="true">*</span></label>
<input class="form__input" type="email" id="email" name="email" required aria-required="true" autocomplete="email" placeholder="[email protected] ">
</div>
<div class="form__field">
<label class="form__label" for="subject">Subject</label>
<input class="form__input" type="text" id="subject" name="subject" placeholder="What's this about?">
</div>
<div class="form__field">
<label class="form__label" for="message">Message <span aria-hidden="true">*</span></label>
<textarea class="form__input" id="message" name="message" required aria-required="true" rows="5" placeholder="Tell me about your project..."></textarea>
</div>
<button type="submit" class="btn btn--primary btn--full">Send Message ✉️</button>
</form>
</div>
</div>
</section>
</main>
<footer class="site-footer" role="contentinfo">
<div class="container">
<p>© 2024 Jane Smith. Crafted with HTML, CSS & ❤️</p>
<p><a href="#">Back to top ↑</a></p>
</div>
</footer>
<script>
// Mobile nav toggle
const toggle = document.getElementById('nav-toggle');
const navList = document.querySelector('.nav__list');
toggle.addEventListener('click', () => {
const expanded = toggle.getAttribute('aria-expanded') === 'true';
toggle.setAttribute('aria-expanded', !expanded);
navList.style.display = expanded ? 'none' : 'flex';
navList.style.flexDirection = 'column';
navList.style.position = 'absolute';
navList.style.top = '64px';
navList.style.right = '0';
navList.style.background = '#0d1117';
navList.style.padding = '20px';
navList.style.border = '1px solid #30363d';
});
// Active nav link on scroll
const sections = document.querySelectorAll('section[id]');
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
document.querySelectorAll('.nav__link').forEach(l => l.removeAttribute('aria-current'));
const link = document.querySelector('.nav__link[href="#' + entry.target.id + '"]');
if (link) link.setAttribute('aria-current', 'page');
}
});
}, { threshold: 0.5 });
sections.forEach(s => observer.observe(s));
</script>
</body>
</html>
EOF