People working in the same template can see each other: their pointers and what they have selected. Off unless the host turns it on.
collaboration option, everyone who has the
same template open sees the others' pointers, each an arrow with the person's name in their own
color, and an outline in that color around what they have selected. A pointer stays on the same
spot of the paper whatever anyone's zoom or scroll, shows only to people looking at the same
spread, and disappears when the person leaves. Nobody's edits travel yet: this is presence only,
and saving is unchanged. A host that does not pass the option sees no change at all. See
docs/Collaboration.md.typograph_collaboration_changed event tells the host who is here and whether the
connection is up, for avatars and a status dot in its own header.editing field says who has it, so the host can
explain why the tools are gone; a host that offers Editing only gets the editor's own locked
label with the reason. See "One person
edits at a time" in docs/Collaboration.md.collaboration.take_over() moves
the pen from the user's own other window to this one; that window saves first through the new
release() option. A window that gets the pen after someone else held it loads the latest saved
version through the new catch_up() option before editing starts; if that load fails, editing
stays withheld (editing.catch_up_failed) until collaboration.retry_catch_up() succeeds, and
nobody counts the window as editing while it loads. People and the pen's holder carry an
avatar_url from the collab token.people starts with the user, marked you: true, once for
all their windows on the template, so the host can show their photo next to everyone else's.feat/TYP-918-presence-cursors): src/collaboration.ts connects to
collab-service with @hocuspocus/provider and sends the pointer (at most 20 a second, in
millimetres on the spread) and the selection over Yjs awareness. Name and color come from the
collab token. It needs canvas's set_remote_presence(), spread_point_at() and
get_selected_uuids() (canvas feat/TYP-918-presence-cursors), so the canvas pin moves with it.
latency_samples() gives the pointer-to-screen delay for the WBSO record. The pen is decided in
Collaboration.decide_editing() from awareness fields joined_at and editing_since (earliest
wins, ties to the lower client id) and enforced with the new EditorUI.hold_editing(). Vitest
collaboration.test.ts.