Skip to content

Commit 6d5cd63

Browse files
authored
Merge pull request #20 from mikerowehl/mikerowehl-personal-page
Simple personal page for Mike Rowehl (0x9c9234420501c820f73cfA44e822D…
2 parents 14e96e5 + dc51859 commit 6d5cd63

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import React from "react";
2+
import Image from "next/image";
3+
import { Address } from "@scaffold-ui/components";
4+
import type { NextPage } from "next";
5+
6+
interface TimelineEvent {
7+
date: string;
8+
title: string;
9+
description: string;
10+
location?: string;
11+
}
12+
13+
const events: TimelineEvent[] = [
14+
{
15+
date: "2004",
16+
title: "Mobile Monday Silicon Valley",
17+
description: "Started a group that would grow to 10s of thousands of developers",
18+
location: "Palo Alto, CA",
19+
},
20+
{
21+
date: "2006",
22+
title: "AdMob",
23+
description: "Early technical team for a mobile advertising network, sold to Google",
24+
location: "Palo Alto, CA",
25+
},
26+
{
27+
date: "2009",
28+
title: "Chomp",
29+
description: "Server side work for an app recommendation service, sold to Apple",
30+
location: "San Francisco, CA",
31+
},
32+
{
33+
date: "2012",
34+
title: "Metaresolver",
35+
description: "Founder of a realtime bidding mobile platform, sold to Millenial Media",
36+
location: "San Francisco, CA",
37+
},
38+
{
39+
date: "2018",
40+
title: "Blochaus",
41+
description: "Work with content creators using NFTs and tokens to manage communities",
42+
location: "San Francisco, CA",
43+
},
44+
{
45+
date: "2021",
46+
title: "Glystn",
47+
description: "Used learning models and LLMs to help content creators digest feedback",
48+
location: "Half Moon Bay, CA",
49+
},
50+
];
51+
52+
interface SocialLink {
53+
name: string;
54+
url: string;
55+
}
56+
57+
const socials: SocialLink[] = [
58+
{ name: "Github", url: "https://github.com/mikerowehl" },
59+
{ name: "Blog", url: "https://rowehl.com" },
60+
{ name: "Mastodon", url: "https://mastodon.social/@mikerowehl" },
61+
{ name: "X/Twitter", url: "https://x.com/miker" },
62+
];
63+
64+
const MikeRowehl: NextPage = () => {
65+
return (
66+
<div className="flex items-center flex-col grow pt-10">
67+
<Image src="/MikeRowehl.webp" alt="Mike Rowehl" width={120} height={120} className="rounded-full" />
68+
<h1 className="text-center">
69+
<span className="block text-4xl font-bold">Mike Rowehl</span>
70+
</h1>
71+
<div className="flex items-center">
72+
<Address address="0x9c9234420501c820f73cfA44e822D27e1baAb4D5" />
73+
</div>
74+
<p className="max-w-prose">
75+
{socials.map((social, index) => (
76+
<React.Fragment key={index}>
77+
{index > 0 && " | "}
78+
<a
79+
href={social.url}
80+
className="text-blue-600 dark:text-blue-400 underline hover:text-blue-800 dark:hover:text-blue-300"
81+
target="_blank"
82+
>
83+
{social.name}
84+
</a>
85+
</React.Fragment>
86+
))}
87+
</p>
88+
<div className="max-w-4xl mx-auto p-8">
89+
<div className="relative">
90+
{/* Vertical line */}
91+
<div className="absolute left-4 top-0 bottom-0 w-0.5 bg-blue-200" />
92+
93+
{events.map((event, index) => (
94+
<div key={index} className="relative mb-12 ml-12">
95+
{/* Circle dot */}
96+
<div className="absolute -left-8 top-2 w-4 h-4 rounded-full bg-blue-500 border-4 border-white shadow" />
97+
98+
{/* Content card */}
99+
<div className="bg-white rounded-lg shadow-lg p-6 border border-gray-200 hover:shadow-xl transition-shadow">
100+
<span className="text-sm font-semibold text-blue-600">{event.date}</span>
101+
<h3 className="text-2xl font-semibold text-gray-900 mt-1 mb-2">{event.title}</h3>
102+
{event.location && <p className="text-gray-600 text-sm mb-3">{event.location}</p>}
103+
<p className="text-gray-700">{event.description}</p>
104+
</div>
105+
</div>
106+
))}
107+
</div>
108+
</div>
109+
</div>
110+
);
111+
};
112+
113+
export default MikeRowehl;
7.38 KB
Loading

0 commit comments

Comments
 (0)