simo 2 veckor sedan
förälder
incheckning
86e31e295f
5 ändrade filer med 341 tillägg och 34 borttagningar
  1. 5 0
      .kb-context.md
  2. 1 1
      data/spotify-last-known.json
  3. 0 10
      opencode.json
  4. 290 0
      src/components/pastwork.astro
  5. 45 23
      src/pages/index.astro

+ 5 - 0
.kb-context.md

@@ -1,4 +1,9 @@
 <!-- KB managed: ~/knowledge-base/projects/simo2/context.md -->
 <!-- Always edit THIS file for project context. Do NOT edit the repo's CLAUDE.md. -->
+<!-- KB:REFS
+  - site-structure-and-window-system.md (134 lines)
+    kb_read: projects/simo2/site-structure-and-window-system.md
+  Use kb_search or kb_read to access these docs.
+-->
 
 # simo2

+ 1 - 1
data/spotify-last-known.json

@@ -6,6 +6,6 @@
   "trackUrl": "https://open.spotify.com/track/11IzgLRXV7Cgek3tEgGgjw",
   "durationMs": 248440,
   "stoppedAtMs": 1776291222996,
-  "stoppedProgressMs": 4603,
+  "stoppedProgressMs": 19546,
   "lastUpdatedAtMs": 1776291216786
 }

+ 0 - 10
opencode.json

@@ -1,10 +0,0 @@
-{
-  "$schema": "https://opencode.ai/config.json",
-  "mcp": {
-    "kb": {
-      "type": "local",
-      "command": ["kb"],
-      "enabled": true
-    }
-  }
-}

+ 290 - 0
src/components/pastwork.astro

@@ -0,0 +1,290 @@
+---
+import Win98Window from "./win98window.astro";
+
+type PastWorkEvent = {
+	from: string;
+	to?: string;
+	title: string;
+	org?: string;
+	details: string[];
+	leadership?: boolean;
+};
+
+const events: PastWorkEvent[] = [
+	{
+		from: "2025",
+		to: "Current",
+		title: "BA, Computer Science",
+		org: "Widener University (Chester, PA)",
+		details: ["Currently studying Computer Science"],
+	},
+	{
+		from: "2025",
+		to: "2026",
+		title: "Computer Science Tutor",
+		org: "Widener University (Chester, PA)",
+		leadership: true,
+		details: [
+			"Tutored computer science coursework across the 2025–2026 school year",
+			"Helped students debug, understand core concepts, and build confidence",
+		],
+	},
+	{
+		from: "Spring 2026",
+		title: "Representative",
+		org: "Computer Science Club / Student Government Association",
+		leadership: true,
+		details: [
+			"Served as CS Club representative within student government",
+			"Advocated for CS students and coordinated between orgs",
+		],
+	},
+	{
+		from: "Jun 2024",
+		to: "Jul 2024",
+		title: "Sales Associate",
+		org: "Cramers Uniforms (Philadelphia, PA)",
+		details: [
+			"Delivered exceptional customer service in a fast-paced retail environment",
+			"Oversaw inventory management: accurate stock levels and timely restocking",
+			"Operated and maintained POS systems; resolved payment issues promptly",
+		],
+	},
+	{
+		from: "Jan 2022",
+		to: "Jun 2022",
+		title: "IT Help Desk Intern",
+		org: "String Theory Schools (Philadelphia, PA)",
+		details: [
+			"Engineered internal tools (custom Chrome extensions) to automate routine staff workflows",
+			"Provided hands-on support for student-issued iPads; diagnosed and resolved software issues",
+			"Used internal systems to remotely manage, reset, and troubleshoot student devices",
+		],
+	},
+	{
+		from: "Jan 2021",
+		to: "Dec 2021",
+		title: "Software Engineer / Lead Developer",
+		org: "Freelance (Philadelphia, PA)",
+		leadership: true,
+		details: [
+			"Collaborated with a client to architect and develop scripts for managing cryptocurrency assets",
+			"Quickly adapted to new languages/frameworks to deliver scalable, maintainable code",
+		],
+	},
+	{
+		from: "2021",
+		to: "2025",
+		title: "High School",
+		org: "String Theory Schools (Philadelphia, PA)",
+		details: ["Completed high school"],
+	},
+];
+---
+
+<Win98Window
+	title="Past Work"
+	layout={{
+		mobile: { left: "5%", top: "14%", width: "90%", height: "70vh" },
+		desktop: { left: "18%", top: "16%", width: "44%", height: "62vh" },
+	}}
+>
+	<div class="pw">
+		<div class="pw-header" aria-hidden="true">
+			<span class="pw-path">C:\Users\simon\Career\PASTWORK.TXT</span>
+			<span class="pw-stamp">Last saved: just now</span>
+		</div>
+
+		<div class="pw-body">
+			<ol class="pw-timeline" aria-label="Past work timeline">
+				{events.map((e) => (
+					<li class="pw-item">
+						<div class="pw-rail" aria-hidden="true">
+							<div class="pw-dot"></div>
+						</div>
+						<div class="pw-card">
+							<div class="pw-top">
+								<div class="pw-when">
+									<span class="pw-from">{e.from}</span>
+									{e.to ? <span class="pw-to">→ {e.to}</span> : null}
+								</div>
+								{e.leadership ? <span class="pw-badge">Leadership</span> : null}
+							</div>
+							<div class="pw-title">{e.title}</div>
+							{e.org ? <div class="pw-org">{e.org}</div> : null}
+							<ul class="pw-details">
+								{e.details.map((d) => (
+									<li>{d}</li>
+								))}
+							</ul>
+						</div>
+					</li>
+				))}
+			</ol>
+		</div>
+	</div>
+</Win98Window>
+
+<style>
+	.pw {
+		height: 100%;
+		background: #fff;
+		box-shadow: inset -1px -1px #fff, inset 1px 1px grey, inset -2px -2px #dfdfdf,
+			inset 2px 2px #0a0a0a;
+		overflow: hidden;
+	}
+
+	.pw-header {
+		display: flex;
+		gap: 8px;
+		align-items: center;
+		justify-content: space-between;
+		padding: 8px 10px;
+		background: #d4d0c8;
+		border-bottom: 1px solid #808080;
+		box-shadow: inset 0 1px #fff;
+	}
+
+	.pw-path {
+		flex: 1;
+		min-height: 26px;
+		padding: 6px 10px;
+		background: #fff;
+		box-shadow: inset -1px -1px #fff, inset 1px 1px grey, inset -2px -2px #dfdfdf,
+			inset 2px 2px #0a0a0a;
+		white-space: nowrap;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		font-size: 12px;
+	}
+
+	.pw-stamp {
+		flex-shrink: 0;
+		font-size: 11px;
+		color: #222;
+		padding: 4px 6px;
+		border: 1px solid #808080;
+		background: #efefef;
+		box-shadow: inset 0 1px #fff;
+	}
+
+	.pw-body {
+		height: calc(100% - 44px);
+		overflow: auto;
+		padding: 10px;
+	}
+
+	.pw-note {
+		border: 1px solid #000;
+		background: #ffffe1;
+		box-shadow: 2px 2px 0 #000;
+		padding: 8px 10px;
+		margin-bottom: 10px;
+	}
+	.pw-note-title {
+		font-weight: 700;
+		margin-bottom: 4px;
+	}
+	.pw-note-text {
+		font-size: 12px;
+	}
+
+	.pw-timeline {
+		list-style: none;
+		padding: 0;
+		margin: 0;
+		display: flex;
+		flex-direction: column;
+		gap: 10px;
+	}
+
+	.pw-item {
+		display: grid;
+		grid-template-columns: 18px 1fr;
+		gap: 10px;
+		align-items: stretch;
+	}
+
+	.pw-rail {
+		position: relative;
+	}
+	.pw-rail::before {
+		content: "";
+		position: absolute;
+		left: 8px;
+		top: 0;
+		bottom: 0;
+		border-left: 2px dotted #000;
+	}
+	.pw-dot {
+		position: sticky;
+		top: 8px;
+		width: 12px;
+		height: 12px;
+		margin-left: 2px;
+		background: #c0c0c0;
+		border: 1px solid #000;
+		box-shadow: inset 1px 1px #fff, inset -1px -1px #808080;
+	}
+
+	.pw-card {
+		background: #fff;
+		border: 1px solid #000;
+		box-shadow: 2px 2px 0 #000;
+		padding: 10px;
+	}
+
+	.pw-top {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		gap: 10px;
+		margin-bottom: 6px;
+	}
+
+	.pw-when {
+		font-weight: 700;
+		font-size: 12px;
+	}
+	.pw-to {
+		margin-left: 6px;
+		font-weight: 400;
+	}
+
+	.pw-badge {
+		font-size: 11px;
+		font-weight: 700;
+		padding: 2px 6px;
+		background: #000080;
+		color: #fff;
+		border: 1px solid #000;
+		box-shadow: inset 1px 1px #1084d0;
+		white-space: nowrap;
+	}
+
+	.pw-title {
+		font-size: 14px;
+		font-weight: 700;
+		margin-bottom: 2px;
+	}
+	.pw-org {
+		font-size: 12px;
+		color: #222;
+		margin-bottom: 8px;
+	}
+
+	.pw-details {
+		margin: 0;
+		padding-left: 18px;
+		font-size: 12px;
+	}
+	.pw-details li {
+		margin: 4px 0;
+	}
+
+	@media (max-width: 510px) {
+		.pw-stamp {
+			display: none;
+		}
+	}
+</style>

+ 45 - 23
src/pages/index.astro

@@ -8,6 +8,7 @@ import Redirect from "../components/redirect.astro";
 import Contact from "../components/contact.astro";
 import Pgp from "../components/pgp.astro";
 import Projects from "../components/projects.astro";
+import PastWork from "../components/pastwork.astro";
 import Duolingo from "../components/duolingo.astro";
 import GitHubGraph from "../components/githubgraph.astro";
 import NowPlaying from "../components/nowplaying.astro";
@@ -162,6 +163,15 @@ let apps: app[] = [
 	// 	logo: pastwork.src,
 	// 	row: 1,
 	// },
+	{
+		name: "Past Work",
+		logo: pastwork.src,
+		onclick: () => {
+			raiseUpSpec("Past Work");
+			document.getElementById("Past Work").style.display = "block";
+		},
+		row: 1,
+	},
 	{
 		name: "Git",
 		logo: github.src,
@@ -280,6 +290,7 @@ apps = apps.map((item) => {
 
 		<Ram />
 		<NowPlaying />
+		<PastWork />
 		<Projects projects={projectsArr} />
 		<Summize />
 		<Notion />
@@ -380,31 +391,42 @@ apps = apps.map((item) => {
 			}
 		);
 
-		Array.from(window.getElementsByClassName("close")).forEach((button, index) => {
-			if (index === 0) {
-				button.addEventListener("click", () => {
-					minimizeWindow(window.id);
-				});
-			} else {
-				button.addEventListener("click", () => {
-					window.classList.add("closed");
-					removeFromTaskbar(window.id);
+		const titleButtons = Array.from(
+			window.querySelectorAll('.title-bar-controls button')
+		) 
 
-					const onEnd = () => {
-						window.classList.remove("closed");
-						window.style.display = "none";
-					};
-					window.addEventListener('animationend', onEnd, { once: true });
+		const minimizeBtn = titleButtons.find(
+			(btn) => (btn.getAttribute('aria-label') || '').toLowerCase() === 'minimize'
+		);
+		const closeBtn = titleButtons.find(
+			(btn) => (btn.getAttribute('aria-label') || '').toLowerCase() === 'close'
+		);
 
-					setTimeout(() => {
-						if (window.style.display !== 'none') {
-							window.classList.remove('closed');
-							window.style.display = 'none';
-						}
-					}, 250);
-				});
-			}
-		});
+		if (minimizeBtn) {
+			minimizeBtn.addEventListener('click', () => {
+				minimizeWindow(window.id);
+			});
+		}
+
+		if (closeBtn) {
+			closeBtn.addEventListener('click', () => {
+				window.classList.add('closed');
+				removeFromTaskbar(window.id);
+
+				const onEnd = () => {
+					window.classList.remove('closed');
+					window.style.display = 'none';
+				};
+				window.addEventListener('animationend', onEnd, { once: true });
+
+				setTimeout(() => {
+					if (window.style.display !== 'none') {
+						window.classList.remove('closed');
+						window.style.display = 'none';
+					}
+				}, 250);
+			});
+		}
 	});
 
 	apps.forEach((app) => {