diff --git a/apps/web/index.html b/apps/web/index.html index 660456e..d75bab3 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -6,7 +6,7 @@ HyperLab — an open-source, AI-native successor to HyperCard @@ -36,8 +36,9 @@

Welcome to HyperLab

- An open-source, AI-native successor to HyperCard. Cards, - buttons, fields and HyperTalk, and a stack stays editable while it runs. + An open-source, AI-native successor to HyperCard. A script + can stop and ask a language model, and the stack stays editable the whole time + it runs.

 on mouseUp
@@ -114,16 +115,16 @@ 

Examples

- Each opens in the playground, running. Switch to the edit tool to read the - scripts that make it work. + Open any of these and it starts running in the playground. Switch to the edit + tool to read the scripts behind it.

@@ -210,9 +218,9 @@

The desktop application

same file.

- Stacks export as a PDF, as a PNG of the map, as a self-contained web page, and - as a Decker deck — from the - playground as readily as from the application. + Every export the application offers works in the playground too: PDF, a PNG of + the map, a self-contained web page, and a + Decker deck.

diff --git a/apps/web/src/landing.css b/apps/web/src/landing.css index 0cfc19f..7e4e76e 100644 --- a/apps/web/src/landing.css +++ b/apps/web/src/landing.css @@ -293,3 +293,45 @@ body { .colophon a { color: var(--ink); } + +/* ----------------------------------------------------------------- phones */ + +/* + * A phone is narrower than `put ai("Summarize this card") into field + * "Summary"`. Scrolling the sample sideways is no help when nothing on + * screen says it scrolls — the line just stops at the edge and looks + * broken — and shrinking it to fit would take it under ten pixels. So on a + * narrow screen it wraps instead. + */ +@media (max-width: 34rem) { + .desk { + padding: 20px 10px 32px; + gap: 20px; + } + + .window__body { + padding: 12px 14px; + } + + .hero__script { + white-space: pre-wrap; + overflow-wrap: break-word; + font-size: 11px; + } + + .hero__line { + font-size: 15px; + } + + /* Thumb-sized, and each on its own line rather than three cramped side + by side. */ + .hero__buttons { + flex-direction: column; + align-items: stretch; + } + + .button { + text-align: center; + padding: 8px 18px; + } +} diff --git a/docs/website.md b/docs/website.md index 0d6814a..75b70b1 100644 --- a/docs/website.md +++ b/docs/website.md @@ -12,17 +12,17 @@ follows from there being no server. ## The playground is the application -The playground page renders the desktop's own React components — the card, -the inspector, the assistant sidebar, the map, the dialogs. It can, because +The playground page renders the desktop's own React components, down to the +dialog a script blocks on. It can, because the desktop keeps its whole shell behind one module (`apps/desktop/src/api.ts`, a typed wrapper per command), and the renderer never learns which shell answers. Vite swaps that one module for `apps/web/src/api.ts`; nothing else in the desktop tree is touched, so the two interfaces cannot drift apart — they are the same files. -Behind the web `api.ts` sits `crates/web` (`hyperlab-web`): the same crates -the desktop wraps — runtime, parser, persistence, graph, the assistant — -compiled to WebAssembly, exporting one function per desktop command. Its +Behind the web `api.ts` sits `crates/web` (`hyperlab-web`), which wraps the +same crates the Tauri shell wraps, compiled to WebAssembly and exporting one +function per desktop command. Its `view.rs` is a hand-kept twin of the desktop's, and a test serializes a snapshot and checks the field names against what the renderer expects. @@ -110,8 +110,8 @@ keeps the same shape with the parts a page has: script blocked mid-line on `ai("…")`. The wire protocol is the same Rust code the desktop uses (`hyperlab-ai-providers` built without its native clients); only the transport is the browser's. -- The site being static files is the guarantee's other half: there is no - HyperLab server for a key, a stack, or a question to visit. +- The site being static files is the guarantee's other half: nothing a + browser sends has anywhere of ours to stop off at on the way. Anthropic requires the `anthropic-dangerous-direct-browser-access` header before answering a browser at all. Sending it is honest here: the request