59cc6720b5
`?` now enters `Help` — the keymap says so and this client resolves `enter-mode` — but the page has no help overlay: `src/ui/help.rs` is 600 lines of ratatui and nothing shared carries its content. Landing the key without this would have swapped the mode label to HELP over an unchanged grid, which looks broken rather than unfinished. `AppMode::hint_text()` already exists in the protocol crate and is what the TUI's footer draws, so `RenderModel::hint` relays it. Every mode now states its own keys in the browser, the page spells none of them, and the modes this client can enter but not yet draw say what they are. A real help overlay needs the content moved into the shared layer first, which is the same move design-principles §5 asks for and is filed rather than faked. `web/*` is unrun; `node --check` only. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EoW5BB87ZZdm96SvBTWawH
81 lines
3.3 KiB
HTML
81 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" />
|
|
<title>improvise</title>
|
|
<link rel="stylesheet" href="./style.css" />
|
|
</head>
|
|
<body>
|
|
<!--
|
|
The browser shell (improvise-cr3, improvise-djm).
|
|
|
|
Deliberately four elements and no framework. Everything that could be
|
|
*wrong* — what a cell is, whether it may be typed into, where the
|
|
selection sits, how the category tree flattens — is decided in Rust and
|
|
arrives already decided (see `render.rs`). This page paints it.
|
|
|
|
Build both wasm bundles first:
|
|
|
|
./web/build.sh
|
|
|
|
then serve this directory over http (a module script will not load from
|
|
file://):
|
|
|
|
python3 -m http.server 8080 --directory web
|
|
|
|
That is the whole standalone deployment: the document lives in an
|
|
in-page Web Worker and persists to this browser's private storage.
|
|
?doc= and ?seed= name the document and the file it is first seeded from.
|
|
|
|
To talk to a separate `improvise-ws-server` process instead — which is
|
|
how a document open in the TUI is shared — pass ?ws=wss://host:port
|
|
(or ws:// when this page is served over http://localhost).
|
|
-->
|
|
<header>
|
|
<h1>improvise</h1>
|
|
<span id="view-name"></span>
|
|
<span id="mode"></span>
|
|
<span id="hint"></span>
|
|
<span id="status" role="status"></span>
|
|
</header>
|
|
|
|
<!--
|
|
This page is the *client* half and nothing else: it holds no model. What
|
|
it now has is a peer it can always reach — a Web Worker in this same tab
|
|
hosting the whole App over OPFS (improvise-9x6, improvise-djm) — so a
|
|
copy served from a static host, GitHub Pages included, is a working
|
|
application rather than a client with nowhere to connect.
|
|
|
|
The notice below stays static HTML rather than something app.js decides,
|
|
for the same reason as before: it is true on every load in either mode,
|
|
and a page that cannot reach its peer cannot be trusted to explain why.
|
|
What the peer is actually *doing* — starting, connected, unreachable,
|
|
gone — is live, and app.js writes it to #status.
|
|
-->
|
|
<p id="backend-notice">
|
|
Everything here runs in this tab: the document lives in a Web Worker
|
|
and is saved to this browser's private storage, so edits survive a
|
|
reload and never leave the machine. Load a different document with
|
|
<code>?doc=name.improv</code>, seeded from
|
|
<code>?seed=url</code>. To open a document hosted by a separate
|
|
process instead, run
|
|
<code>improvise-ws-server model.improv --port 8787</code> and reload
|
|
with <code>?ws=wss://host:port</code>. From this https page the
|
|
address must be <code>wss://</code> — a <code>ws://</code> one is
|
|
blocked as mixed content — and
|
|
<code>improvise-ws-server</code> speaks plain <code>ws://</code> only,
|
|
so it needs TLS terminated in front of it. Served over
|
|
<code>http://localhost</code> the same page takes
|
|
<code>?ws=ws://127.0.0.1:8787</code> directly.
|
|
</p>
|
|
|
|
<main>
|
|
<aside id="categories" aria-label="Categories"></aside>
|
|
<div id="grid" tabindex="0" aria-label="Grid"></div>
|
|
</main>
|
|
|
|
<script type="module" src="./app.js"></script>
|
|
</body>
|
|
</html>
|