Skip to content

Commit 8247324

Browse files
rascaclaude
andcommitted
Convert to Next.js App Router
Migrate from static HTML/CSS to Next.js with TypeScript. Same GenLayer design system (Switzer font, exact color palette, clamp typography). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 706a7d7 commit 8247324

13 files changed

Lines changed: 1466 additions & 709 deletions

.claude/settings.local.json

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,16 @@
88
"WebFetch(domain:www.genlayer.com)",
99
"WebFetch(domain:en.wikipedia.org)",
1010
"WebFetch(domain:www.argue.fun)",
11-
"Bash(vercel --version:*)"
11+
"Bash(vercel --version:*)",
12+
"Bash(vercel teams ls:*)",
13+
"Bash(gh auth:*)",
14+
"WebFetch(domain:moltlayer.vercel.app)",
15+
"Bash(gh repo create:*)",
16+
"Bash(gh secret set:*)",
17+
"WebFetch(domain:assets-global.website-files.com)",
18+
"WebFetch(domain:cdn.prod.website-files.com)",
19+
"Bash(tmux send-keys:*)",
20+
"Bash(tmux capture-pane:*)"
1221
]
1322
}
1423
}

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
.next/
2+
node_modules/
13
.vercel
24
.DS_Store
3-
node_modules

app/globals.css

Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
/* Switzer font — same as genlayer.com */
2+
@font-face {
3+
font-family: 'Switzer';
4+
src: url('https://cdn.prod.website-files.com/68108d68d0fc0cfa0c26dbc9/6810dee45672d933054c1ef8_Switzer-Regular.woff2') format('woff2');
5+
font-weight: 400;
6+
font-style: normal;
7+
font-display: swap;
8+
}
9+
@font-face {
10+
font-family: 'Switzer';
11+
src: url('https://cdn.prod.website-files.com/68108d68d0fc0cfa0c26dbc9/6810dee4bcef137fc0f03497_Switzer-Semibold.woff2') format('woff2');
12+
font-weight: 600;
13+
font-style: normal;
14+
font-display: swap;
15+
}
16+
@font-face {
17+
font-family: 'Switzer';
18+
src: url('https://cdn.prod.website-files.com/68108d68d0fc0cfa0c26dbc9/6810dee4b37df4757ee9b392_Switzer-Bold.woff2') format('woff2');
19+
font-weight: 700;
20+
font-style: normal;
21+
font-display: swap;
22+
}
23+
@font-face {
24+
font-family: 'Switzer';
25+
src: url('https://cdn.prod.website-files.com/68108d68d0fc0cfa0c26dbc9/6810dee46848ad44b84664af_Switzer-Black.woff2') format('woff2');
26+
font-weight: 900;
27+
font-style: normal;
28+
font-display: swap;
29+
}
30+
31+
*, *::before, *::after {
32+
margin: 0;
33+
padding: 0;
34+
box-sizing: border-box;
35+
}
36+
37+
:root {
38+
--bg: #0e0e0e;
39+
--bg-2: #161616;
40+
--bg-card: #141414;
41+
--bg-card-hover: #1a1a1a;
42+
--text: #ffffff;
43+
--text-2: #999999;
44+
--border: #2e2e2e;
45+
--blue: #4500f9;
46+
--red: #ff307b;
47+
--green: #4aca97;
48+
--purple: #bca2ff;
49+
--site-margin: clamp(1.25rem, 0.795rem + 2.273vw, 2.5rem);
50+
--space-1: clamp(0.5rem, 0.455rem + 0.227vw, 0.625rem);
51+
--space-2: clamp(0.625rem, 0.58rem + 0.227vw, 0.75rem);
52+
--space-3: clamp(0.75rem, 0.614rem + 0.682vw, 1.125rem);
53+
--space-4: clamp(1rem, 0.818rem + 0.909vw, 1.5rem);
54+
--space-5: clamp(1.75rem, 1.477rem + 1.364vw, 2.5rem);
55+
--space-6: clamp(2rem, 1.545rem + 2.273vw, 3.25rem);
56+
--space-7: clamp(3rem, 2.273rem + 3.636vw, 5rem);
57+
--space-8: clamp(4rem, 2.727rem + 6.364vw, 7.5rem);
58+
--fs-display: clamp(3rem, 1.909rem + 5.455vw, 6rem);
59+
--fs-h1: clamp(2.25rem, 1.432rem + 4.091vw, 4.5rem);
60+
--fs-h2: clamp(1.75rem, 1.205rem + 2.727vw, 3.25rem);
61+
--fs-h3: clamp(1.75rem, 1.386rem + 1.818vw, 2.75rem);
62+
--fs-h4: clamp(1.25rem, 1.114rem + 0.682vw, 1.625rem);
63+
--fs-body: clamp(0.9375rem, 0.892rem + 0.227vw, 1.0625rem);
64+
--fs-small: clamp(0.875rem, 0.83rem + 0.227vw, 1rem);
65+
--fs-xs: clamp(0.75rem, 0.705rem + 0.227vw, 0.875rem);
66+
--radius-xs: 0.25rem;
67+
--radius-sm: 0.5rem;
68+
--radius-md: 0.75rem;
69+
--border-width: 0.0625rem;
70+
}
71+
72+
html {
73+
font-size: 16px;
74+
-webkit-font-smoothing: antialiased;
75+
-moz-osx-font-smoothing: grayscale;
76+
}
77+
78+
body {
79+
background-color: var(--bg);
80+
color: var(--text);
81+
font-family: 'Switzer', Arial, sans-serif;
82+
font-size: var(--fs-body);
83+
line-height: 1.5;
84+
min-height: 100vh;
85+
}
86+
87+
a { color: inherit; text-decoration: none; }
88+
89+
.nav {
90+
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
91+
height: 4rem; padding: 0 var(--site-margin);
92+
display: flex; align-items: center; justify-content: space-between;
93+
background-color: rgba(14, 14, 14, 0.85);
94+
backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px);
95+
border-bottom: var(--border-width) solid var(--border);
96+
}
97+
.nav-logo { font-size: 1.125rem; font-weight: 700; letter-spacing: -0.02em; color: var(--text); }
98+
.nav-logo span { color: var(--blue); }
99+
.nav-links { display: flex; gap: var(--space-5); list-style: none; align-items: center; }
100+
.nav-links a { color: var(--text-2); font-size: var(--fs-small); transition: color 0.3s ease; }
101+
.nav-links a:hover { color: var(--text); }
102+
103+
.hero {
104+
min-height: 100vh; display: flex; flex-direction: column;
105+
align-items: center; justify-content: center; text-align: center;
106+
padding: clamp(7rem, 5.455rem + 7.727vw, 11.25rem) var(--site-margin) var(--space-8);
107+
position: relative; overflow: hidden;
108+
}
109+
.hero::before {
110+
content: ''; position: absolute; top: 10%; left: 50%;
111+
transform: translateX(-50%); width: 600px; height: 600px;
112+
background: radial-gradient(circle, rgba(69, 0, 249, 0.06) 0%, transparent 70%);
113+
pointer-events: none;
114+
}
115+
.hero-badge {
116+
display: inline-flex; align-items: center; gap: var(--space-2);
117+
padding: var(--space-1) var(--space-3); border-radius: 100px;
118+
border: var(--border-width) solid var(--border);
119+
background-color: var(--bg-2); font-size: var(--fs-xs);
120+
color: var(--text-2); margin-bottom: var(--space-5);
121+
}
122+
.hero-badge .dot {
123+
width: 6px; height: 6px; border-radius: 50%;
124+
background-color: var(--green); animation: pulse 2s ease-in-out infinite;
125+
}
126+
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } }
127+
.hero h1 {
128+
font-size: var(--fs-display); font-weight: 700;
129+
letter-spacing: -0.03em; line-height: 1.05;
130+
margin-bottom: var(--space-4); max-width: 900px;
131+
}
132+
.hero h1 .accent { color: var(--blue); }
133+
.hero-subtitle {
134+
font-size: clamp(1rem, 0.909rem + 0.455vw, 1.25rem);
135+
color: var(--text-2); max-width: 580px;
136+
margin-bottom: var(--space-6); line-height: 1.6;
137+
}
138+
.hero-ctas {
139+
display: flex; gap: var(--space-3); flex-wrap: wrap;
140+
justify-content: center; margin-bottom: var(--space-7);
141+
}
142+
.btn {
143+
display: inline-flex; align-items: center; gap: 0.5rem;
144+
padding: 1rem 1.5rem; border-radius: var(--radius-xs);
145+
font-family: inherit; font-size: var(--fs-small);
146+
font-weight: 600; line-height: 1.25; cursor: pointer;
147+
transition: all 0.3s ease; border: var(--border-width) solid transparent;
148+
}
149+
.btn-primary { background-color: var(--text); color: var(--bg); border-color: var(--border); }
150+
.btn-primary:hover { background-color: #e0e0e0; }
151+
.btn-secondary { background-color: transparent; color: var(--text); border-color: var(--border); }
152+
.btn-secondary:hover { border-color: var(--text); background-color: var(--text); color: var(--bg); }
153+
.hero-techs { display: flex; gap: var(--space-3); flex-wrap: wrap; justify-content: center; }
154+
.tech-pill {
155+
display: inline-flex; align-items: center; gap: 0.4rem;
156+
padding: var(--space-1) var(--space-3); border-radius: var(--radius-xs);
157+
border: var(--border-width) solid var(--border); background-color: transparent;
158+
font-size: var(--fs-xs); color: var(--text-2);
159+
transition: border-color 0.3s ease, color 0.3s ease;
160+
}
161+
.tech-pill:hover { border-color: var(--blue); color: var(--text); }
162+
163+
.section { padding: var(--space-8) var(--site-margin); max-width: 1200px; margin: 0 auto; }
164+
.section-divider {
165+
border: none; border-top: var(--border-width) solid var(--border);
166+
margin: 0 var(--site-margin);
167+
max-width: calc(1200px - var(--site-margin) * 2);
168+
margin-left: auto; margin-right: auto;
169+
}
170+
.section-header { text-align: center; margin-bottom: var(--space-7); }
171+
.section-label {
172+
font-size: var(--fs-xs); font-weight: 600; color: var(--blue);
173+
text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: var(--space-3);
174+
}
175+
.section-header h2 {
176+
font-size: var(--fs-h2); font-weight: 700;
177+
letter-spacing: -0.02em; margin-bottom: var(--space-3); line-height: 1.1;
178+
}
179+
.section-header p {
180+
color: var(--text-2); font-size: var(--fs-body);
181+
max-width: 520px; margin: 0 auto; line-height: 1.6;
182+
}
183+
184+
.apps-grid {
185+
display: grid;
186+
grid-template-columns: repeat(auto-fit, minmax(min(100%, 460px), 1fr));
187+
gap: var(--space-4);
188+
}
189+
.app-card {
190+
background-color: var(--bg-card); border: var(--border-width) solid var(--border);
191+
border-radius: var(--radius-sm); padding: var(--space-5);
192+
transition: background-color 0.3s ease, border-color 0.3s ease;
193+
position: relative; overflow: hidden;
194+
}
195+
.app-card:hover { background-color: var(--bg-card-hover); border-color: #444; }
196+
.app-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; }
197+
.app-card.argue::before { background: var(--red); }
198+
.app-card.moldcord::before { background: var(--green); }
199+
.app-icon {
200+
width: 48px; height: 48px; border-radius: var(--radius-sm);
201+
display: flex; align-items: center; justify-content: center;
202+
font-size: 1.25rem; margin-bottom: var(--space-4);
203+
}
204+
.app-card.argue .app-icon { background-color: rgba(255, 48, 123, 0.1); color: var(--red); }
205+
.app-card.moldcord .app-icon { background-color: rgba(74, 202, 151, 0.1); color: var(--green); }
206+
.app-card h3 { font-size: var(--fs-h4); font-weight: 700; margin-bottom: 0.25rem; letter-spacing: -0.01em; }
207+
.app-card .domain { color: var(--text-2); font-size: var(--fs-xs); margin-bottom: var(--space-3); }
208+
.app-card .description { color: var(--text-2); font-size: var(--fs-body); line-height: 1.6; margin-bottom: var(--space-4); }
209+
.app-features { list-style: none; display: flex; flex-direction: column; gap: var(--space-2); }
210+
.app-features li { display: flex; align-items: center; gap: var(--space-2); font-size: var(--fs-small); color: var(--text-2); }
211+
.app-features li::before { content: ''; width: 4px; height: 4px; border-radius: 50%; flex-shrink: 0; }
212+
.app-card.argue .app-features li::before { background-color: var(--red); }
213+
.app-card.moldcord .app-features li::before { background-color: var(--green); }
214+
.app-card .status-badge {
215+
display: inline-flex; align-items: center; gap: 0.4rem;
216+
padding: var(--space-1) var(--space-3); border-radius: var(--radius-xs);
217+
font-size: var(--fs-xs); font-weight: 600; margin-top: var(--space-4);
218+
text-transform: uppercase; letter-spacing: 0.06em;
219+
border: var(--border-width) solid;
220+
}
221+
.app-card.argue .status-badge { border-color: rgba(255, 48, 123, 0.3); color: var(--red); }
222+
.app-card.moldcord .status-badge { border-color: rgba(74, 202, 151, 0.3); color: var(--green); }
223+
224+
.tech-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: var(--space-3); }
225+
.tech-card {
226+
background-color: var(--bg-card); border: var(--border-width) solid var(--border);
227+
border-radius: var(--radius-sm); padding: var(--space-5);
228+
transition: border-color 0.3s ease; position: relative;
229+
}
230+
.tech-card:hover { border-color: #444; }
231+
.tech-card h4 { font-size: var(--fs-body); font-weight: 600; margin-bottom: var(--space-2); }
232+
.tech-card p { color: var(--text-2); font-size: var(--fs-small); line-height: 1.6; }
233+
234+
.footer {
235+
border-top: var(--border-width) solid var(--border);
236+
padding: var(--space-6) var(--site-margin);
237+
display: flex; align-items: center; justify-content: space-between;
238+
max-width: 1200px; margin: 0 auto;
239+
}
240+
.footer-links { display: flex; gap: var(--space-5); list-style: none; }
241+
.footer-links a { color: var(--text-2); font-size: var(--fs-small); transition: color 0.3s ease; }
242+
.footer-links a:hover { color: var(--text); }
243+
.footer-copy { color: var(--text-2); font-size: var(--fs-xs); }
244+
245+
@media (max-width: 768px) {
246+
.hero { padding-top: 8rem; }
247+
.hero-ctas { flex-direction: column; align-items: center; }
248+
.btn { width: 100%; max-width: 280px; justify-content: center; }
249+
.footer { flex-direction: column; gap: var(--space-4); text-align: center; }
250+
.app-card { padding: var(--space-4); }
251+
}
252+
@media (max-width: 480px) {
253+
.nav-links { gap: var(--space-3); }
254+
.hero-techs { gap: var(--space-2); }
255+
}

app/layout.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import type { Metadata } from "next";
2+
import "./globals.css";
3+
4+
export const metadata: Metadata = {
5+
title: "Moldlayer — GenLayer-Powered Mold Bot Apps",
6+
description: "Showcasing apps built at the intersection of GenLayer Intelligent Contracts and OpenClaw autonomous agents.",
7+
openGraph: {
8+
title: "Moldlayer — GenLayer-Powered Mold Bot Apps",
9+
description: "Decentralized apps where mold bots argue, collaborate, and transact. Built on GenLayer Intelligent Contracts.",
10+
type: "website",
11+
},
12+
icons: {
13+
icon: "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🧫</text></svg>",
14+
},
15+
};
16+
17+
export default function RootLayout({
18+
children,
19+
}: {
20+
children: React.ReactNode;
21+
}) {
22+
return (
23+
<html lang="en">
24+
<body>{children}</body>
25+
</html>
26+
);
27+
}

0 commit comments

Comments
 (0)