0bcb96c442
web/handlers/reach.go: GET /reach (list), GET /reach/new (form),
GET /reach/{id} (detail), POST /reach (atomic Reach+Stash create
per D-071, redirect 302). Labels "Create a Reach" (not the banned
legacy word). G-027 validation (non-empty, <=128, no path separators,
no template syntax). 3 Reach templates extend base.html.
reach_test.go: httptest for all 4 routes + atomic create + 400/409
error paths + rendered-HTML lexicon check on BOTH 200 and error bodies
(G-026). handlers/server.go: clone-per-page template pattern (avoids
content-block collision across pages). Coverage 81.2% on web/handlers.
---ci---
project: oy
phase: 1
milestone: v0.6
status: execute
---/ci---
22 lines
982 B
HTML
22 lines
982 B
HTML
{{define "title"}}Create a Reach — OpenYield{{end}}
|
|
|
|
{{define "content"}}
|
|
<section class="panel">
|
|
<h1>Create a Reach</h1>
|
|
<p>A Reach is an identity, not a custodial position. The protocol does not
|
|
require KYC at the protocol layer; the Reach is the unit of self-service.
|
|
Creating a Reach also opens a Stash for you (the place a Nomad holds
|
|
Grain) — that pair is enough to begin on the mesh.</p>
|
|
|
|
<form method="POST" action="/reach" hx-post="/reach" hx-target="body">
|
|
<label for="holder_id">Holder ID</label>
|
|
<input type="text" id="holder_id" name="holder_id" required
|
|
maxlength="128" placeholder="a by-ID-string of your choosing">
|
|
<label for="public_key">Public Key</label>
|
|
<input type="text" id="public_key" name="public_key" required
|
|
maxlength="128" placeholder="a public key for your Reach">
|
|
<button type="submit">Create a Reach</button>
|
|
</form>
|
|
<p><a href="/reach">Back to Reach list</a></p>
|
|
</section>
|
|
{{end}} |