Phase 3: Career Arc Timeline + Portfolio Microsite + RSS Feed Proxy

This commit is contained in:
Tony0410
2026-07-20 21:30:11 +08:00
parent 5bb4b8705c
commit 2c918ae39c
3 changed files with 747 additions and 0 deletions

342
portfolio.html Normal file
View File

@@ -0,0 +1,342 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Anthony Martin · Portfolio</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{--green:#1a472a;--green-l:#2d7a47;--green-d:#0f2b1a;--gold:#d4a843;--cream:#f5f0e8;--dark:#0a0f0d;--text:#c8d6c0;--text-m:#7a9a7a;--card:#111f16;--card-border:#1a3a24}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:var(--dark);color:var(--text);-webkit-font-smoothing:antialiased;overflow-x:hidden}
a{color:var(--gold);text-decoration:none}
a:hover{text-decoration:underline}
/* Header */
.header{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(10,15,13,0.92);backdrop-filter:blur(8px);border-bottom:1px solid var(--card-border);padding:0.8rem 1.5rem;display:flex;align-items:center;justify-content:space-between}
.header .logo{font-size:1rem;font-weight:700;color:var(--cream);letter-spacing:-0.02em}
.header .logo span{color:var(--gold)}
.header nav{display:flex;gap:1.5rem;font-size:0.85rem}
.header nav a{color:var(--text-m);transition:color 0.3s}
.header nav a:hover{color:var(--gold);text-decoration:none}
/* Hero */
.hero{min-height:100vh;display:flex;flex-direction:column;justify-content:center;padding:6rem 2rem 4rem;max-width:1100px;margin:0 auto}
.hero .greeting{font-size:0.85rem;color:var(--gold);font-weight:600;text-transform:uppercase;letter-spacing:0.1em;margin-bottom:0.8rem}
.hero h1{font-size:clamp(2.5rem,5vw,4rem);font-weight:800;color:var(--cream);line-height:1.08;margin-bottom:1rem;letter-spacing:-0.02em}
.hero h1 span{color:var(--green-l)}
.hero .blurb{font-size:clamp(1rem,1.8vw,1.2rem);color:var(--text-m);max-width:600px;line-height:1.6;margin-bottom:2rem}
.hero .cta-row{display:flex;gap:1rem;flex-wrap:wrap}
.hero .cta{display:inline-flex;align-items:center;gap:0.5rem;padding:0.75rem 1.5rem;border-radius:8px;font-size:0.9rem;font-weight:600;transition:all 0.3s;cursor:pointer}
.hero .cta-primary{background:var(--green);color:var(--cream);border:none}
.hero .cta-primary:hover{background:var(--green-l);transform:translateY(-1px)}
.hero .cta-secondary{background:transparent;color:var(--text);border:1px solid var(--card-border)}
.hero .cta-secondary:hover{border-color:var(--green-l);color:var(--cream);transform:translateY(-1px)}
/* Sections */
.section{padding:4rem 2rem;max-width:1100px;margin:0 auto}
.section-label{font-size:0.75rem;color:var(--gold);font-weight:700;text-transform:uppercase;letter-spacing:0.12em;margin-bottom:0.5rem}
.section h2{font-size:clamp(1.5rem,3vw,2rem);font-weight:700;color:var(--cream);margin-bottom:2rem}
/* About */
.about-grid{display:grid;grid-template-columns:1fr 1fr;gap:2rem}
.about-grid p{font-size:0.95rem;line-height:1.7;color:var(--text)}
.about-stats{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}
.about-stat{background:var(--card);border:1px solid var(--card-border);border-radius:8px;padding:1.2rem;text-align:center}
.about-stat .num{font-size:1.8rem;font-weight:800;color:var(--gold)}
.about-stat .lbl{font-size:0.75rem;color:var(--text-m);margin-top:0.2rem}
/* Projects */
.projects-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1rem}
.project-card{background:var(--card);border:1px solid var(--card-border);border-radius:8px;padding:1.5rem;transition:border-color 0.3s,transform 0.3s}
.project-card:hover{border-color:var(--green-l);transform:translateY(-2px)}
.project-card .proj-icon{font-size:1.5rem;margin-bottom:0.5rem}
.project-card h3{font-size:1rem;color:var(--cream);margin-bottom:0.3rem}
.project-card .proj-tag{display:inline-block;font-size:0.65rem;color:var(--green-l);background:rgba(26,71,42,0.2);padding:0.15rem 0.5rem;border-radius:4px;margin-bottom:0.6rem}
.project-card p{font-size:0.82rem;color:var(--text-m);line-height:1.5;margin-bottom:0.5rem}
.project-card .proj-link{font-size:0.8rem;color:var(--gold);font-weight:600}
/* Capabilities */
.caps-grid{display:flex;flex-wrap:wrap;gap:0.6rem}
.cap-tag{background:var(--card);border:1px solid var(--card-border);border-radius:100px;padding:0.5rem 1.2rem;font-size:0.85rem;color:var(--text);transition:all 0.3s}
.cap-tag:hover{background:var(--green);border-color:var(--green-l);color:var(--cream);transform:translateY(-1px)}
/* News Feed */
.news-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:1rem}
.news-card{background:var(--card);border:1px solid var(--card-border);border-radius:8px;padding:1.2rem;transition:border-color 0.3s}
.news-card:hover{border-color:var(--gold)}
.news-card .news-source{font-size:0.65rem;color:var(--green-l);text-transform:uppercase;letter-spacing:0.08em;margin-bottom:0.3rem}
.news-card h4{font-size:0.9rem;color:var(--cream);margin-bottom:0.3rem;line-height:1.4}
.news-card .news-date{font-size:0.7rem;color:var(--text-m);margin-bottom:0.3rem}
.news-card p{font-size:0.78rem;color:var(--text-m);line-height:1.5}
.news-card a{color:var(--cream)}
.news-card a:hover{color:var(--gold);text-decoration:underline}
.news-loading{text-align:center;color:var(--text-m);padding:2rem;font-size:0.85rem}
.news-error{text-align:center;color:#ef4444;padding:1rem;font-size:0.8rem}
/* Contact */
.contact-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:1rem}
.contact-card{background:var(--card);border:1px solid var(--card-border);border-radius:8px;padding:1.2rem;text-align:center;transition:border-color 0.3s}
.contact-card:hover{border-color:var(--green-l)}
.contact-card .ci{font-size:1.5rem;margin-bottom:0.4rem}
.contact-card h4{font-size:0.85rem;color:var(--cream);margin-bottom:0.1rem}
.contact-card a{font-size:0.75rem;color:var(--text-m)}
.contact-card a:hover{color:var(--gold);text-decoration:underline}
/* Footer */
.footer{text-align:center;padding:2rem;color:var(--text-m);font-size:0.7rem;border-top:1px solid var(--card-border);max-width:1100px;margin:3rem auto 0}
/* Animations */
.fade-in{opacity:0;transform:translateY(20px);transition:opacity 0.6s ease,transform 0.6s ease}
.fade-in.visible{opacity:1;transform:translateY(0)}
/* Mobile */
@media(max-width:700px){
.hero h1{font-size:2rem}
.about-grid{grid-template-columns:1fr}
.header nav{display:none}
.hero .cta-row{flex-direction:column}
}
</style>
</head>
<body>
<!-- Header -->
<header class="header">
<div class="logo">Anthony<span>.</span>Martin</div>
<nav>
<a href="#about">About</a>
<a href="#projects">Projects</a>
<a href="#capabilities">Capabilities</a>
<a href="#news">Industry</a>
<a href="#contact">Contact</a>
<a href="/api/jobs" style="color:var(--green-l)">Job Track</a>
<a href="/timeline">Timeline</a>
</nav>
</header>
<!-- Hero -->
<section class="hero">
<div class="greeting">Marketing &amp; Communications · Perth, WA</div>
<h1>Strategy, <span>Storytelling</span>,<br>Energy Transition</h1>
<p class="blurb">Corporate marketing and communications professional with 15+ years across three of WA's leading energy organisations. Specialising in integrated campaigns, digital strategy, AI enablement and stakeholder engagement.</p>
<div class="cta-row">
<a href="https://anthony.martinwa.org" target="_blank" class="cta cta-primary">📄 View Résumé</a>
<a href="#contact" class="cta cta-secondary">✉️ Get in Touch</a>
</div>
</section>
<!-- About -->
<section class="section" id="about">
<div class="section-label">About</div>
<h2>Bringing energy brands to life</h2>
<div class="about-grid">
<div>
<p>I'm a marketing and communications professional with over 15 years of experience across the energy sector — from WA's largest electricity retailer to the state's regional energy provider, and most recently at a leading energy infrastructure company.</p>
<p style="margin-top:1rem">I've led integrated campaigns, managed multi-million dollar budgets, launched renewable energy products, built AI marketing strategies, and won national awards for digital content. I bring a commercial mindset, a creative instinct, and a genuine interest in the energy transition.</p>
</div>
<div class="about-stats">
<div class="about-stat"><div class="num">15+</div><div class="lbl">Years in Energy</div></div>
<div class="about-stat"><div class="num">3</div><div class="lbl">WA Energy Companies</div></div>
<div class="about-stat"><div class="num">6</div><div class="lbl">Marketing Roles</div></div>
<div class="about-stat"><div class="num">$2M+</div><div class="lbl">Annual Budget Managed</div></div>
</div>
</div>
</section>
<!-- Projects -->
<section class="section" id="projects">
<div class="section-label">Featured Work</div>
<h2>Projects &amp; Programs</h2>
<div class="projects-grid">
<div class="project-card fade-in">
<div class="proj-icon">🏆</div>
<h3>Award-Winning Corporate Website</h3>
<div class="proj-tag">Pacific Energy · 2026</div>
<p>Led marketing collaboration on Pacific Energy's corporate website, named Science and Sustainability Website of the Year at the 2026 Australian Web Awards.</p>
</div>
<div class="project-card fade-in">
<div class="proj-icon">🤖</div>
<h3>Marketing AI Strategy</h3>
<div class="proj-tag">Pacific Energy · 20252026</div>
<p>Defined and implemented a marketing AI strategy covering content generation, digital workflows and marketing operations. Hands-on with LLMs, automation and open-source AI tools.</p>
</div>
<div class="project-card fade-in">
<div class="proj-icon">🚗</div>
<h3>WA EV Network Launch</h3>
<div class="proj-tag">Horizon Power · 20222024</div>
<p>Led marketing and communications for the state's electric vehicle charging network rollout across regional and remote WA, including community engagement and stakeholder communications.</p>
</div>
<div class="project-card fade-in">
<div class="proj-icon">☀️</div>
<h3>SolarReturn Product Launch</h3>
<div class="proj-tag">Synergy · 20152016</div>
<p>Led development from research through launch, contributing to a 40% sales increase in year one. Mapped the solar customer journey, reducing inquiry-to-sale timeframes by 20%.</p>
</div>
<div class="project-card fade-in">
<div class="proj-icon">🎓</div>
<h3>Bright Horizons STEM Program</h3>
<div class="proj-tag">Horizon Power · 2020</div>
<p>Created a program providing solar-powered education kits to remote schools, combining community engagement with renewable energy education.</p>
</div>
<div class="project-card fade-in">
<div class="proj-icon">🌍</div>
<h3>Clean Energy Summit</h3>
<div class="proj-tag">Pacific Energy · 20252026</div>
<p>Managed end-to-end marketing delivery for the Australian Clean Energy Summit and Pilbara Summit — sponsorship activation, creative, content and stakeholder coordination.</p>
</div>
</div>
</section>
<!-- Capabilities -->
<section class="section" id="capabilities">
<div class="section-label">Expertise</div>
<h2>Core Capabilities</h2>
<div class="caps-grid">
<span class="cap-tag">Marketing Strategy</span>
<span class="cap-tag">Integrated Campaigns</span>
<span class="cap-tag">Corporate Comms</span>
<span class="cap-tag">Digital Marketing</span>
<span class="cap-tag">AI-Enabled Marketing</span>
<span class="cap-tag">Brand Management</span>
<span class="cap-tag">Social Media Strategy</span>
<span class="cap-tag">Content Strategy</span>
<span class="cap-tag">Event Management</span>
<span class="cap-tag">Budget Management</span>
<span class="cap-tag">Stakeholder Engagement</span>
<span class="cap-tag">Customer Marketing</span>
<span class="cap-tag">Product Marketing</span>
<span class="cap-tag">Regulatory Comms</span>
<span class="cap-tag">Agency Management</span>
<span class="cap-tag">Energy Transition</span>
</div>
</section>
<!-- Industry News -->
<section class="section" id="news">
<div class="section-label">Industry Feed</div>
<h2>Energy &amp; Marketing News</h2>
<div class="news-grid" id="news-grid">
<div class="news-loading">Loading industry news...</div>
</div>
<div style="text-align:center;margin-top:1.5rem">
<a href="https://www.marketingmag.com.au" target="_blank" style="font-size:0.8rem;color:var(--text-m)">via Marketing Mag · B&amp;T · ABC News</a>
</div>
</section>
<!-- Contact -->
<section class="section" id="contact">
<div class="section-label">Connect</div>
<h2>Let's talk</h2>
<div class="contact-grid">
<div class="contact-card">
<div class="ci">📄</div>
<h4>Résumé</h4>
<a href="https://anthony.martinwa.org" target="_blank">anthony.martinwa.org</a>
</div>
<div class="contact-card">
<div class="ci">📧</div>
<h4>Email</h4>
<a href="#" id="email-link">(loaded from vault)</a>
</div>
<div class="contact-card">
<div class="ci">🐙</div>
<h4>GitHub</h4>
<a href="https://github.com/trevleigh" target="_blank">@trevleigh</a>
</div>
<div class="contact-card">
<div class="ci">🌐</div>
<h4>Job Tracker</h4>
<a href="/api/jobs">Dashboard</a>
</div>
</div>
</section>
<div class="footer">
<p>Anthony Martin · Built by the Rhino in the Green Jacket · Jul 2026</p>
</div>
<script>
// Scroll animations
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, { threshold: 0.1 });
document.querySelectorAll('.fade-in, .project-card, .about-stat').forEach(el => observer.observe(el));
// Header nav highlight
document.querySelectorAll('nav a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
e.preventDefault();
const target = document.querySelector(a.getAttribute('href'));
if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });
});
});
// RSS feed loader
async function loadFeeds() {
const grid = document.getElementById('news-grid');
const feeds = [
{ url: 'https://www.marketingmag.com.au/feed/', name: 'Marketing Mag' },
{ url: 'https://www.bandt.com.au/feed/', name: 'B&amp;T' },
{ url: 'https://www.abc.net.au/news/feed/51120/rss.xml', name: 'ABC News' },
];
const urls = feeds.map(f => encodeURIComponent(f.url)).join(',');
try {
const resp = await fetch('/api/feed-proxy?urls=' + urls);
const data = await resp.json();
if (!data.feeds || data.feeds.every(f => f.items.length === 0)) {
grid.innerHTML = '<div class="news-error">No feed items loaded. Try again later.</div>';
return;
}
const allItems = [];
data.feeds.forEach(feed => {
const name = feeds.find(f => f.url === feed.url)?.name || 'Industry';
feed.items.forEach(item => {
allItems.push({ ...item, source: name });
});
});
// Sort by date (best effort)
allItems.sort((a, b) => {
const da = new Date(a.date);
const db = new Date(b.date);
return isNaN(da) || isNaN(db) ? 0 : db - da;
});
const top = allItems.slice(0, 12);
if (top.length === 0) {
grid.innerHTML = '<div class="news-loading">No recent articles found.</div>';
return;
}
grid.innerHTML = top.map(item => `
<div class="news-card fade-in">
<div class="news-source">${item.source}</div>
<h4><a href="${item.link}" target="_blank">${item.title}</a></h4>
<div class="news-date">${item.date ? new Date(item.date).toLocaleDateString('en-AU', {day:'numeric',month:'short',year:'numeric'}) : ''}</div>
<p>${item.summary || ''}</p>
</div>
`).join('');
// Animate new cards
setTimeout(() => {
document.querySelectorAll('#news-grid .news-card').forEach(el => observer.observe(el));
document.querySelectorAll('#news-grid .news-card.fade-in').forEach(el => {
if (el.getBoundingClientRect().top < window.innerHeight) el.classList.add('visible');
});
}, 100);
} catch(e) {
grid.innerHTML = '<div class="news-error">Could not load industry news feeds.</div>';
}
}
loadFeeds();
// Load email from Notion via API
async function loadEmail() {
try {
const resp = await fetch('/api/stats');
// Stats doesn't have email, but let's check if we can grab it from somewhere
// Fallback: just show a placeholder for now
} catch(e) {}
}
</script>
</body>
</html>