Live loops
A [for-each] whose list is runtime ${ }$ keeps one row per item in the browser. With key, rows stay with their items: added, removed and moved, never redrawn.
[for-each = runtime ${ todos() }$, as: "todo", key: "id"]
[li]runtime ${ todo.title }$[end]
[end]The first rows of a live loop are in the HTML
When the list starts as a literal or an exported value, its first rows are written at build time and adopted in the browser: no empty list before the script runs.
await in runtime code
A runtime code block can await at its top level. Its live values and events attach once its code has run.
runtime ${
import { signal } from "arcmoon/reactive";
const books = signal(await (await fetch("/books.json")).json());
}$Imports from a URL
import x from "https://…" in runtime code stays an import, and the browser loads it. The new packages option maps npm names to URLs.
Warnings for easy mistakes
A signal shown without (), non-ASCII text without <meta charset>, content in [img], an unknown arcm- prop, [for-each] over an object, [doctype!] after content, props on [slot], and a name only another file's runtime code declares.
Smaller pages with only event props
A page whose only live values are events no longer ships the signals library: about 2 kB instead of 5 kB.
Clearer protector message
A template outside the project shows its full path, and the message says when the page itself is outside the folder where arcmoon runs.
[A] is written as <a>
A capitalized HTML name that isn't imported is written in lowercase, as its warning says.
base with -o
With base: "/", a build into dist/blog links its files under /blog/.
The [doctype] error shows where it is
It now has the file, line and column, like every other error.