iamseeley-clientmultiroutereact.web.val.run
Readme

🌐 Client-Side Rendered React App via CDN

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**
* @title Client-Side Rendered React App
* @description Create a personal portfolio website with client-side rendering using React and React Router.
*/
import { websiteStyles } from "https://esm.town/v/iamseeley/websiteStyles";
import { personalData } from "https://esm.town/v/iamseeley/personalData";
export default function handler(req: Request): Response {
const html = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>${personalData.name} | Client-side React via CDN</title>
<script src="https://cdn.jsdelivr.net/npm/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/react-router-dom@5.2.0/umd/react-router-dom.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@babel/standalone@7.14.5/babel.min.js"></script>
<style>
${websiteStyles}
</style>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
const { useState, useEffect } = React;
const { BrowserRouter, Route, NavLink, Switch } = ReactRouterDOM;
const Navigation = () => (
<nav>
<NavLink to="/" activeClassName="active" exact>Home</NavLink>
<NavLink to="/projects" activeClassName="active">Projects</NavLink>
<NavLink to="/about" activeClassName="active">About</NavLink>
</nav>
);
const HomePage = () => (
<div>
<h2>Welcome to My Portfolio</h2>
<p>${personalData.summary}</p>
<p><strong>This website is rendered client-side with React.</strong></p>
<p>Check out the <a href='https://www.val.town/v/iamseeley/clientMultirouteReact'>source</a> and start building your own site!</p>
</div>
);
const AboutPage = () => (
<div>
<h2>About Me</h2>
<p>${personalData.about}</p>
</div>
);
const ProjectsPage = () => (
<div>
<h2>My Projects</h2>
${personalData.projects.map((project, index) => `
<a className="projectLink" target="_blank" href='${project.url}'>
<div key={${index}} className="project">
<h3>${project.name}</h3>
<p>${project.description}</p>
</div>
</a>
`).join('')}
</div>
);
const App = () => (
<BrowserRouter>
<header>
<h1>${personalData.name}</h1>
<p>${personalData.label}</p>
</header>
<Navigation />
<main>
<Switch>
<Route exact path="/" component={HomePage} />
<Route path="/about" component={AboutPage} />
<Route path="/projects" component={ProjectsPage} />
</Switch>
</main>
<footer>
<ul>
${personalData.profiles.map((profile, index) => `
<li key={${index}}>
<a href='${profile.url}' target="_blank" rel="noopener noreferrer">
${profile.network}
</a>
</li>
`).join('')}
</ul>
</footer>
</BrowserRouter>
);
ReactDOM.render(<App />, document.getElementById('root'));
</script>
</body>
</html>
`;
Val Town is a social website to write and deploy JavaScript.
Build APIs and schedule functions from your browser.
Comments
Nobody has commented on this val yet: be the first!
June 26, 2024