Files
job-dashboard/portfolio.html

343 lines
16 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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>