- ui/: Vite + plain TypeScript, builds into ./web for `crows serve` - CrowView mirrors CrowModel in RIVE_CONTRACT.md (pose, trust, reactions) so the .riv can replace the SVG later - Event handling follows the contract's mapping table; server text is only ever inserted as text - Prank: toast plus a send-button cooldown countdown - art/crow.svg: source art for Rive import Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UQnSw4RRWp8uqpj3nsnnXF
35 lines
1.4 KiB
HTML
35 lines
1.4 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>So Many Crows</title>
|
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@600;800;900&display=swap" rel="stylesheet" />
|
|
</head>
|
|
<body>
|
|
<header class="top">
|
|
<h1>So Many Crows</h1>
|
|
<label class="who">You are <input id="requester" maxlength="40" autocomplete="off" /></label>
|
|
</header>
|
|
|
|
<main>
|
|
<section class="perch" id="perch" aria-label="The flock"></section>
|
|
<p class="banner" id="banner" role="status" hidden></p>
|
|
|
|
<form class="composer" id="composer">
|
|
<label for="list">Your todo list, one item per line</label>
|
|
<textarea id="list" rows="5" placeholder="- [ ] What is the difference between a crow and a raven - [ ] Draft a tagline for So Many Crows"></textarea>
|
|
<button class="btn btn-go" id="send" type="submit">Send the flock</button>
|
|
</form>
|
|
|
|
<ol class="cards" id="cards" aria-live="polite"></ol>
|
|
<p class="meter" id="meter" hidden></p>
|
|
</main>
|
|
|
|
<div class="toast" id="toast" role="alert" hidden></div>
|
|
<script type="module" src="/src/main.ts"></script>
|
|
</body>
|
|
</html>
|