feat(gui): useProjection — the fifth framework hook seat through the standard kit

React half of the session-projection client base: the renderer contract gains
an open-key projections face on SessionMaybeProvideInfo (cellOf(key), distinct
from the static hooks roster), web-react mints projectionHook (per-bundle cache;
per-cell uSES binding via the shared observableHook cache; unresolved keys read
undefined through the absent source so hook order stays constant), standardKit
delivers kit.useProjection, and the runtime merges UseProjection into
SessionStandardProps/SessionMaybeStandardProps (overloads mirror useSession).
3 jsdom specs (kit delivery + live re-render, selector over undefined, faceless
bundle = all absent); existing direct-prop-feed specs gain the one-line stub the
new required seat mandates.
This commit is contained in:
imccyu
2026-07-27 15:37:42 +08:00
parent fbebe1757a
commit 90addbf53c
14 changed files with 196 additions and 1 deletions
+8
View File
@@ -44,6 +44,14 @@ export interface SessionMaybeProvideInfo {
hooks: Record<string, HostObservable<unknown> | undefined>
/** Static plain-member roster; values are undefined with the session. */
props: Record<string, unknown>
/**
* Key-addressed projection-cell sources (the useProjection framework seat,
* session-projection RFC). Unlike `hooks`, the key space is open — cells
* come and go with domain plugins — so the render side binds per resolved
* cell instead of per static roster member. Absent with the session; an
* unresolved key uniformly reads as capability absent.
*/
projections?: { cellOf(key: string): HostObservable<unknown> | undefined } | undefined
}
/** Definite per-session standard props resolved for strict session slots. */