t3-code-android-nightly/.repos/alchemy-effect/examples/neon/web/index.html
Julius Marminge 6f9cea00ae
chore(refs): sync Effect and Alchemy references to 4.0.1 and beta.80 (#16170)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 13:22:30 -07:00

95 lines
3.3 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Upload journal · Neon + Alchemy</title>
</head>
<body>
<main>
<header>
<span class="eyebrow">NEON + ALCHEMY</span>
<h1>Upload journal</h1>
<p>Private files. A real upload event. A durable processing record.</p>
</header>
<p id="message" role="status" aria-live="polite">
Connecting to managed authentication…
</p>
<section aria-labelledby="account-heading">
<h2 id="account-heading">Your account</h2>
<p id="identity">Signed out</p>
<form id="account">
<label
>Name<input
name="name"
autocomplete="name"
value="Neon explorer"
maxlength="100"
/></label>
<label
>Email<input
name="email"
type="email"
autocomplete="username"
required
/></label>
<label
>Password<input
name="password"
type="password"
autocomplete="current-password"
minlength="8"
required
/></label>
<div class="actions">
<button name="mode" value="signup">Create account</button
><button name="mode" value="signin" class="secondary">
Sign in
</button>
</div>
</form>
<button id="signout" class="secondary" hidden>Sign out</button>
</section>
<section aria-labelledby="upload-heading">
<h2 id="upload-heading">Add a file</h2>
<p>
Choose a file up to 10 MiB. Your browser uploads directly to a private
bucket using a short-lived signed URL.
</p>
<form id="upload">
<label>File<input name="file" type="file" required /></label
><button id="upload-button" disabled>Upload file</button>
</form>
</section>
<section aria-labelledby="files-heading">
<div class="section-title">
<h2 id="files-heading">Your uploads</h2>
<button id="refresh" class="secondary">Refresh status</button>
</div>
<p id="empty">Sign in to see your files.</p>
<ul id="files"></ul>
</section>
<details>
<summary>Security and processing</summary>
<p>
Only the signed-in owner can request upload or download URLs. The
Function verifies JWT signatures and expiry. A bucket event verifies
file metadata and updates Postgres; the browser never marks a file
ready.
</p>
<p>
Signout ends your session. Previously issued JWTs can remain valid
until their short expiry. This tutorial disables email verification
and allows localhost; enable verification and restrict origins before
production.
</p>
<p>
Size is checked before signing and again after delivery, not enforced
as a storage quota by the signed PUT. This is metadata processing, not
malware scanning. No AI calls or credits are required.
</p>
</details>
</main>
<script type="module" src="/src/main.ts"></script>
</body>
</html>