Skip to content

Commit 84dc978

Browse files
authored
Add files via upload
1 parent c9abfb2 commit 84dc978

File tree

9 files changed

+691
-0
lines changed

9 files changed

+691
-0
lines changed

assets/app.js

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// Shared nav + dynamic GitHub repo loader
2+
(function(){
3+
const btn = document.getElementById('menuBtn');
4+
const drawer = document.getElementById('mobileMenu');
5+
btn?.addEventListener('click', () => {
6+
const open = drawer.classList.toggle('open');
7+
btn.setAttribute('aria-expanded', String(open));
8+
});
9+
drawer?.querySelectorAll('a').forEach(a=>a.addEventListener('click',()=>{
10+
drawer.classList.remove('open');
11+
btn.setAttribute('aria-expanded','false');
12+
}));
13+
14+
// Fill current year
15+
const yearEl = document.getElementById('year');
16+
if(yearEl){ yearEl.textContent = new Date().getFullYear(); }
17+
18+
// Auto-sync projects with GitHub (client-side)
19+
// Configure your username via <meta name="gh-username" content="your-github">
20+
const meta = document.querySelector('meta[name="gh-username"]');
21+
const username = meta?.content?.trim();
22+
const grid = document.getElementById('projectGrid');
23+
24+
async function fetchRepos(user){
25+
const resp = await fetch(`https://api.github.com/users/${user}/repos?per_page=100&sort=updated`);
26+
if(!resp.ok) throw new Error('GitHub API error');
27+
return await resp.json();
28+
}
29+
30+
async function fetchPins(){
31+
try{
32+
const r = await fetch('/pins.json', {cache:'no-store'});
33+
if(r.ok){ return await r.json(); }
34+
}catch(e){}
35+
return [];
36+
}
37+
38+
function prioritizeRepos(repos, pins){
39+
const byName = new Map(repos.map(r=>[r.name.toLowerCase(), r]));
40+
const chosen = [];
41+
42+
// 1) add pinned in order if exist
43+
pins.forEach(name => {
44+
const r = byName.get(String(name).toLowerCase());
45+
if(r) chosen.push(r);
46+
});
47+
48+
// 2) add remaining, sorted by stargazers then recent update
49+
const rest = repos
50+
.filter(r => !chosen.includes(r) && !r.fork && !r.archived)
51+
.sort((a,b)=> (b.stargazers_count - a.stargazers_count) || (new Date(b.pushed_at) - new Date(a.pushed_at)));
52+
53+
return chosen.concat(rest);
54+
}
55+
56+
function createCard(repo){
57+
const card = document.createElement('article');
58+
card.className = 'card project';
59+
60+
const title = document.createElement('h3');
61+
title.textContent = repo.name;
62+
63+
const desc = document.createElement('p');
64+
desc.className = 'muted';
65+
desc.textContent = repo.description || 'No description provided.';
66+
67+
const chips = document.createElement('div');
68+
chips.className = 'chips';
69+
// Try to surface top languages and stars
70+
if(repo.language){
71+
const c = document.createElement('span'); c.className='chip'; c.textContent = repo.language; chips.appendChild(c);
72+
}
73+
const s = document.createElement('span'); s.className='chip'; s.textContent = `★ ${repo.stargazers_count}`; chips.appendChild(s);
74+
const u = document.createElement('span'); u.className='chip'; u.textContent = new Date(repo.pushed_at).toISOString().slice(0,10); chips.appendChild(u);
75+
76+
const links = document.createElement('div');
77+
links.className = 'links';
78+
const repoA = document.createElement('a'); repoA.href = repo.html_url; repoA.target = '_blank'; repoA.rel = 'noopener'; repoA.className = 'btn'; repoA.textContent = 'Repo'; links.appendChild(repoA);
79+
if(repo.homepage){ const demo = document.createElement('a'); demo.href = repo.homepage; demo.target='_blank'; demo.rel='noopener'; demo.className='btn'; demo.textContent='Demo'; links.appendChild(demo); }
80+
81+
card.append(title, desc, chips, links);
82+
return card;
83+
}
84+
85+
async function init(){
86+
if(!grid || !username) return;
87+
try{
88+
const [repos, pins] = await Promise.all([fetchRepos(username), fetchPins()]);
89+
const ordered = prioritizeRepos(repos, pins);
90+
const frag = document.createDocumentFragment();
91+
ordered.slice(0, 12).forEach(r => frag.appendChild(createCard(r)));
92+
grid.textContent = '';
93+
grid.appendChild(frag);
94+
}catch(err){
95+
grid.innerHTML = '<p class="muted">Unable to load projects from GitHub right now.</p>';
96+
console.error(err);
97+
}
98+
}
99+
100+
init();
101+
})();

assets/style.css

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
:root{
2+
--bg: #0e1116;
3+
--surface: #121725;
4+
--surface-2: #131a2a;
5+
--text: #e8eef5;
6+
--muted: #9aa6b2;
7+
--accent: #6aa9ff;
8+
--accent-2: #67d1c4;
9+
--border: #24314a;
10+
--radius: 18px;
11+
--shadow: 0 10px 30px rgba(0,0,0,.35);
12+
}
13+
14+
*{box-sizing:border-box}
15+
html{scroll-behavior:smooth}
16+
body{margin:0;background:var(--bg);color:var(--text);font:16px/1.7 ui-sans-serif,system-ui,-apple-system,Segoe UI,Inter,Roboto,Helvetica,Arial,sans-serif}
17+
18+
.container{max-width:1000px;margin-inline:auto;padding:20px}
19+
20+
/* Header / Nav */
21+
header{position:sticky;top:0;background:linear-gradient(to bottom, rgba(14,17,22,.92), rgba(14,17,22,.65) 60%, transparent);backdrop-filter:saturate(1.1) blur(8px);z-index:20}
22+
.nav{display:flex;align-items:center;justify-content:space-between;gap:12px}
23+
.brand{display:flex;align-items:center;gap:12px;font-weight:700;letter-spacing:.2px}
24+
.logo{width:36px;height:36px;border-radius:50%;background:radial-gradient(85% 85% at 25% 20%, var(--accent-2), var(--accent));box-shadow:0 0 30px rgba(103,209,196,.18)}
25+
.nav-links{display:none;gap:6px;align-items:center}
26+
.nav-links a{color:var(--muted);text-decoration:none;padding:10px 12px;border-radius:12px}
27+
.nav-links a:focus,.nav-links a:hover{background:#0f1422;color:#d9e4f2}
28+
.menu-btn{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:12px;border:1px solid var(--border);background:#0f1422;color:#cfe0f3}
29+
@media(min-width:820px){
30+
.nav-links{display:flex}
31+
.menu-btn{display:none}
32+
}
33+
34+
/* Mobile drawer */
35+
.drawer{position:fixed;inset:auto 0 0 0;transform:translateY(105%);transition:transform .22s ease; background:rgba(15,20,34,.96);backdrop-filter:blur(12px);border-top:1px solid var(--border);padding:12px 16px}
36+
.drawer.open{transform:translateY(0)}
37+
.drawer a{display:block;padding:12px;border-radius:12px;color:#d9e4f2;text-decoration:none}
38+
.drawer a+a{margin-top:6px}
39+
@media(min-width:820px){.drawer{display:none}}
40+
41+
/* Utilities */
42+
.grid{display:grid;gap:16px}
43+
.cols-2{grid-template-columns:1fr}
44+
.cols-3{grid-template-columns:1fr}
45+
@media(min-width:700px){.cols-2{grid-template-columns:1fr 1fr}}
46+
@media(min-width:940px){.cols-3{grid-template-columns:repeat(3,1fr)}}
47+
48+
section{padding-block:36px}
49+
.card{background:linear-gradient(180deg,var(--surface-2),#0f1626);border:1px solid var(--border);border-radius:var(--radius);padding:20px;box-shadow:var(--shadow)}
50+
.chip{display:inline-flex;align-items:center;padding:6px 10px;border-radius:999px;background:#0f1626;border:1px solid var(--border);font-size:13px;color:#cdd7e6}
51+
.chips{display:flex;gap:8px;flex-wrap:wrap}
52+
53+
h1{font-size:clamp(28px,4.2vw,44px);line-height:1.15;margin:0}
54+
h2{font-size:clamp(20px,2.6vw,28px);margin:0 0 10px}
55+
h3{font-size:18px;margin:0}
56+
p{margin:0}
57+
.muted{color:var(--muted)}
58+
.btn{display:inline-flex;align-items:center;gap:10px;padding:12px 16px;border-radius:14px;text-decoration:none;border:1px solid var(--border);background:#11192a;color:#e8eef5;box-shadow:var(--shadow)}
59+
.btn.primary{background:linear-gradient(180deg,var(--accent),#528ee2)}
60+
61+
.project{display:flex;flex-direction:column;gap:10px}
62+
.project .links{display:flex;gap:10px;flex-wrap:wrap}
63+
64+
.divider{height:1px;background:linear-gradient(90deg,transparent,var(--border),transparent);margin:22px 0}
65+
66+
.footer{display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between;color:#9fb0c6;padding-bottom:32px}
67+
.social{display:flex;gap:10px}
68+
.social a{display:inline-flex;align-items:center;gap:8px;text-decoration:none;color:#c7d2df;border:1px solid var(--border);border-radius:999px;padding:8px 12px;background:#0f1626}

certifications.html

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1" />
6+
<title>Certifications · Erik Aranda‑Wikman</title>
7+
<meta name="description" content="Personal portfolio of Erik Aranda‑Wikman" />
8+
<meta property="og:title" content="Certifications · Erik Aranda‑Wikman" />
9+
<meta property="og:description" content="Personal portfolio" />
10+
<meta property="og:type" content="website" />
11+
<meta name="color-scheme" content="dark" />
12+
<meta name="gh-username" content="your-github" />
13+
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='46' fill='%230e1116'/%3E%3Ctext x='50' y='58' font-size='56' text-anchor='middle' fill='%236aa9ff' font-family='Arial,Helvetica,sans-serif'%3EE%3C/text%3E%3C/svg%3E" />
14+
<link rel="stylesheet" href="assets/style.css" />
15+
</head>
16+
<body>
17+
<header>
18+
<div class="container nav">
19+
<div class="brand">
20+
<div class="logo" aria-hidden="true"></div>
21+
<span>Erik Aranda‑Wikman</span>
22+
</div>
23+
<nav class="nav-links" aria-label="Primary">
24+
<a href="index.html">Projects</a>
25+
<a href="experience.html">Experience</a>
26+
<a href="education.html">Education</a>
27+
<a href="skills.html">Skills</a>
28+
<a href="certifications.html" style="color:#d9e4f2;background:#0f1422">Certifications</a>
29+
<a href="publications.html">Publications</a>
30+
<a href="#contact">Contact</a>
31+
</nav>
32+
<button class="menu-btn" id="menuBtn" aria-expanded="false" aria-controls="mobileMenu" aria-label="Open menu"></button>
33+
</div>
34+
<div class="drawer" id="mobileMenu" role="dialog" aria-label="Mobile Menu">
35+
<a href="index.html">Projects</a>
36+
<a href="experience.html">Experience</a>
37+
<a href="education.html">Education</a>
38+
<a href="skills.html">Skills</a>
39+
<a href="certifications.html">Certifications</a>
40+
<a href="publications.html">Publications</a>
41+
<a href="#contact">Contact</a>
42+
</div>
43+
</header>
44+
<main class="container">
45+
46+
<section id="certifications">
47+
<h2>Certifications</h2>
48+
<div class="grid cols-2" style="margin-top:10px">
49+
<article class="card">
50+
<h3>Certification Name</h3>
51+
<p class="muted">Issuer · Year · Credential ID</p>
52+
</article>
53+
<article class="card">
54+
<h3>Another Certification</h3>
55+
<p class="muted">Issuer · Year</p>
56+
</article>
57+
</div>
58+
</section>
59+
60+
<section id="contact">
61+
<div class="divider" role="separator" aria-hidden="true"></div>
62+
<h2>Contact</h2>
63+
<p class="muted">Open to interesting work and collaborations.</p>
64+
<div style="display:flex;gap:10px;margin-top:12px;flex-wrap:wrap">
65+
<a class="btn" href="mailto:hello@yourdomain.com">Email me</a>
66+
<a class="btn" href="https://www.linkedin.com/in/your-handle" target="_blank" rel="noopener">LinkedIn</a>
67+
<a class="btn" href="https://x.com/your-handle" target="_blank" rel="noopener">Twitter/X</a>
68+
</div>
69+
</section>
70+
71+
<footer class="footer">
72+
<div class="social">
73+
<a href="https://github.com/your-github" target="_blank" rel="noopener" aria-label="GitHub">GitHub</a>
74+
<a href="https://linkedin.com/in/your-handle" target="_blank" rel="noopener" aria-label="LinkedIn">LinkedIn</a>
75+
<a href="https://x.com/your-handle" target="_blank" rel="noopener" aria-label="Twitter">X</a>
76+
</div>
77+
<small>© <span id="year"></span> Erik Aranda‑Wikman. Dark‑mode, mobile‑first.</small>
78+
</footer>
79+
</main>
80+
<script src="assets/app.js"></script>
81+
</body>
82+
</html>

education.html

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1" />
6+
<title>Education · Erik Aranda‑Wikman</title>
7+
<meta name="description" content="Personal portfolio of Erik Aranda‑Wikman" />
8+
<meta property="og:title" content="Education · Erik Aranda‑Wikman" />
9+
<meta property="og:description" content="Personal portfolio" />
10+
<meta property="og:type" content="website" />
11+
<meta name="color-scheme" content="dark" />
12+
<meta name="gh-username" content="your-github" />
13+
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='46' fill='%230e1116'/%3E%3Ctext x='50' y='58' font-size='56' text-anchor='middle' fill='%236aa9ff' font-family='Arial,Helvetica,sans-serif'%3EE%3C/text%3E%3C/svg%3E" />
14+
<link rel="stylesheet" href="assets/style.css" />
15+
</head>
16+
<body>
17+
<header>
18+
<div class="container nav">
19+
<div class="brand">
20+
<div class="logo" aria-hidden="true"></div>
21+
<span>Erik Aranda‑Wikman</span>
22+
</div>
23+
<nav class="nav-links" aria-label="Primary">
24+
<a href="index.html">Projects</a>
25+
<a href="experience.html">Experience</a>
26+
<a href="education.html" style="color:#d9e4f2;background:#0f1422">Education</a>
27+
<a href="skills.html">Skills</a>
28+
<a href="certifications.html">Certifications</a>
29+
<a href="publications.html">Publications</a>
30+
<a href="#contact">Contact</a>
31+
</nav>
32+
<button class="menu-btn" id="menuBtn" aria-expanded="false" aria-controls="mobileMenu" aria-label="Open menu"></button>
33+
</div>
34+
<div class="drawer" id="mobileMenu" role="dialog" aria-label="Mobile Menu">
35+
<a href="index.html">Projects</a>
36+
<a href="experience.html">Experience</a>
37+
<a href="education.html">Education</a>
38+
<a href="skills.html">Skills</a>
39+
<a href="certifications.html">Certifications</a>
40+
<a href="publications.html">Publications</a>
41+
<a href="#contact">Contact</a>
42+
</div>
43+
</header>
44+
<main class="container">
45+
46+
<section id="education">
47+
<h2>Education</h2>
48+
<div class="grid cols-2" style="margin-top:10px">
49+
<article class="card">
50+
<h3>MPA — University of San Francisco</h3>
51+
<p class="muted">Year · Public Administration</p>
52+
</article>
53+
<article class="card">
54+
<h3>BA — Sonoma State University</h3>
55+
<p class="muted">Year · Criminal Justice & Criminology</p>
56+
</article>
57+
</div>
58+
</section>
59+
60+
<section id="contact">
61+
<div class="divider" role="separator" aria-hidden="true"></div>
62+
<h2>Contact</h2>
63+
<p class="muted">Open to interesting work and collaborations.</p>
64+
<div style="display:flex;gap:10px;margin-top:12px;flex-wrap:wrap">
65+
<a class="btn" href="mailto:hello@yourdomain.com">Email me</a>
66+
<a class="btn" href="https://www.linkedin.com/in/your-handle" target="_blank" rel="noopener">LinkedIn</a>
67+
<a class="btn" href="https://x.com/your-handle" target="_blank" rel="noopener">Twitter/X</a>
68+
</div>
69+
</section>
70+
71+
<footer class="footer">
72+
<div class="social">
73+
<a href="https://github.com/your-github" target="_blank" rel="noopener" aria-label="GitHub">GitHub</a>
74+
<a href="https://linkedin.com/in/your-handle" target="_blank" rel="noopener" aria-label="LinkedIn">LinkedIn</a>
75+
<a href="https://x.com/your-handle" target="_blank" rel="noopener" aria-label="Twitter">X</a>
76+
</div>
77+
<small>© <span id="year"></span> Erik Aranda‑Wikman. Dark‑mode, mobile‑first.</small>
78+
</footer>
79+
</main>
80+
<script src="assets/app.js"></script>
81+
</body>
82+
</html>

0 commit comments

Comments
 (0)