- Server: nests API, persistence, core-first picking, borrowed flag (built by the backend agent against EVENTS.md; tests pass with -race) - UI: nests in the sidebar, one feed per nest, header shows the core team, New nest dialog, borrowed crows labeled, per-nest waiting count - start.command: one-click local server in controlled mode (mock crows, localhost only, state in .crows/) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UQnSw4RRWp8uqpj3nsnnXF
64 lines
3.0 KiB
HTML
64 lines
3.0 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=EB+Garamond:ital,wght@0,500;0,700;1,500&family=IM+Fell+English+SC&display=swap" rel="stylesheet" />
|
|
</head>
|
|
<body>
|
|
<div class="app" id="app" data-view="room">
|
|
<nav class="tabs" aria-label="Views">
|
|
<span class="brand">So Many Crows</span>
|
|
<button class="tab" id="tab-room" type="button" aria-pressed="true"># todo</button>
|
|
<button class="tab" id="tab-flock" type="button" aria-pressed="false">Flock</button>
|
|
</nav>
|
|
<aside class="side" aria-label="The flock">
|
|
<div class="brand">So Many Crows</div>
|
|
<h2>Nests</h2>
|
|
<nav class="nests" id="nests" aria-label="Nests"></nav>
|
|
<button class="new-nest" id="new-nest" type="button">+ New nest</button>
|
|
<h2>The flock</h2>
|
|
<div class="roster" id="roster"></div>
|
|
<label class="who">You are <input id="requester" maxlength="40" autocomplete="off" /></label>
|
|
</aside>
|
|
|
|
<section class="room">
|
|
<header class="room-head">
|
|
<h1 id="room-title"># todo</h1>
|
|
<p class="room-sub" id="room-sub">The whole flock roosts here. Hand it a list: the Sentry sorts it, crows fly, you judge.</p>
|
|
</header>
|
|
|
|
<div class="feeds" id="feeds"></div>
|
|
<p class="typing" id="typing" aria-live="polite"></p>
|
|
|
|
<form class="composer" id="composer">
|
|
<label class="sr-only" for="list">Your todo list, one item per line</label>
|
|
<div class="field inked"><textarea id="list" rows="3" placeholder="One item per line, e.g. What is the difference between a crow and a raven"></textarea></div>
|
|
<button class="btn btn-go inked" id="send" type="submit">Send</button>
|
|
<p class="hint">Ctrl or ⌘ + Enter to send</p>
|
|
</form>
|
|
</section>
|
|
</div>
|
|
<dialog class="nest-dialog inked" id="nest-dialog">
|
|
<form method="dialog" id="nest-form">
|
|
<h2>New nest</h2>
|
|
<p class="dialog-sub">A room where a team of crows works together. The Sentry can borrow other crows when a job needs more hands.</p>
|
|
<label class="dialog-field">Name <input id="nest-name" maxlength="40" required autocomplete="off" placeholder="Launch copy" /></label>
|
|
<fieldset class="pick">
|
|
<legend>Core crows</legend>
|
|
<div class="pick-grid" id="nest-crows"></div>
|
|
</fieldset>
|
|
<p class="err" id="nest-err"></p>
|
|
<div class="dialog-actions">
|
|
<button class="btn btn-no inked" value="cancel" formnovalidate>Cancel</button>
|
|
<button class="btn btn-go inked" id="nest-create" value="create">Build the nest</button>
|
|
</div>
|
|
</form>
|
|
</dialog>
|
|
<script type="module" src="/src/main.ts"></script>
|
|
</body>
|
|
</html>
|