-
Notifications
You must be signed in to change notification settings - Fork 166
Expand file tree
/
Copy pathauth-layout.tsx
More file actions
90 lines (82 loc) · 3.41 KB
/
Copy pathauth-layout.tsx
File metadata and controls
90 lines (82 loc) · 3.41 KB
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
import type { ReactNode } from "react";
import { Wordmark } from "@executor-js/react/components/wordmark";
// Split auth layout for the chromeless pages (setup, login, join): a promo
// panel on the left, the form on the right. The panel follows design.md's
// registry-minimal rules — graph-paper texture, mono eyebrow + index numerals,
// grayscale only — so the first screen a person ever sees speaks the same
// language as the app behind it. Collapses to form-only below lg.
const PANEL_POINTS: ReadonlyArray<{ index: string; title: string; body: string }> = [
{
index: "01",
title: "Connect",
body: "OpenAPI, GraphQL, and MCP sources become tools your agent can call.",
},
{
index: "02",
title: "Control",
body: "Policies decide which tools run, which ask first, and which are blocked.",
},
{
index: "03",
title: "Audit",
body: "Every invocation is recorded, with approvals where they matter.",
},
];
export function AuthLayout(props: { readonly children: ReactNode }) {
return (
<div className="grid min-h-screen bg-background lg:grid-cols-[1.1fr_1fr]">
<aside className="relative hidden flex-col justify-between overflow-hidden border-r border-border bg-sidebar p-12 lg:flex">
{/* Graph-paper texture, faded toward the bottom (design.md signature). */}
<div
aria-hidden
className="pointer-events-none absolute inset-0 text-foreground opacity-[0.05]"
style={{
backgroundImage:
"linear-gradient(currentColor 1px, transparent 1px), linear-gradient(90deg, currentColor 1px, transparent 1px)",
backgroundSize: "32px 32px",
maskImage: "linear-gradient(to bottom, black 30%, transparent 85%)",
}}
/>
<div className="relative">
<Wordmark />
</div>
<div className="relative max-w-md space-y-10">
<div className="space-y-4">
<p className="font-mono text-[11px] font-medium uppercase tracking-[0.18em] text-muted-foreground">
The integration layer for AI agents
</p>
<h2 className="text-4xl font-semibold tracking-[-0.04em] text-foreground">
Every tool your agent needs, behind one endpoint.
</h2>
<p className="text-sm leading-6 text-muted-foreground">
Connect your APIs once. Any MCP-compatible agent gets the whole catalog, governed by
your policies.
</p>
</div>
<ul className="space-y-5">
{PANEL_POINTS.map((point) => (
<li key={point.index} className="flex gap-4">
<span className="font-mono text-[11px] font-medium tracking-[0.08em] text-muted-foreground/70 pt-0.5">
{point.index}
</span>
<div>
<p className="text-sm font-medium text-foreground">{point.title}</p>
<p className="text-sm leading-6 text-muted-foreground">{point.body}</p>
</div>
</li>
))}
</ul>
</div>
<p className="relative font-mono text-[11px] tracking-[0.08em] text-muted-foreground">
self-hosted
</p>
</aside>
<main className="flex flex-col items-center justify-center gap-6 p-6">
<div className="lg:hidden">
<Wordmark />
</div>
{props.children}
</main>
</div>
);
}