Phase 3: Career Arc Timeline + Portfolio Microsite + RSS Feed Proxy
This commit is contained in:
342
portfolio.html
Normal file
342
portfolio.html
Normal 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 & 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 & 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 · 2025–2026</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 · 2022–2024</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 · 2015–2016</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 · 2025–2026</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 & 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&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&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>
|
||||
Reference in New Issue
Block a user