Find Element Call's root by attribute, not by being the body
Six selectors named `body` directly — the gradient backdrop and the platform font overrides in index.css, and the iOS adjustments in AppBar.module.css and Modal.module.css — so they only applied when Element Call owned the page. A host mounting it into a container would have got an interface decorated correctly and styled incorrectly, with nothing to show that anything was wrong. Mark the root element with data-element-call-root and match on that instead. Scoping this way keeps the selectors more specific than they were, rather than less: widening them to a bare [data-platform=…] would have dropped specificity from (0,1,1) to (0,1,0) and changed which rules win. The platform attribute moves with them, from the initializer's write onto document.body to a layout effect on the root, alongside the theme — so it still lands before anything is painted. No visual change while Element Call owns the page: the root is the body, which now carries the attribute, so every rewritten selector matches the element it always did.
This commit is contained in:
@@ -16,17 +16,18 @@ import { createContext, use } from "react";
|
||||
* that when embedded in a host application it becomes the container the host
|
||||
* mounted it into, so that Element Call does not reach outside its own subtree.
|
||||
*
|
||||
* That intent is not yet achievable: several selectors still name `body`
|
||||
* directly — `body[data-background="gradient"]` and `body[data-platform=…]` in
|
||||
* `index.css`, and `body[data-platform="ios"]` in `AppBar.module.css` and
|
||||
* `Modal.module.css` — and `Initializer.initBeforeReact` writes
|
||||
* `data-platform` straight onto the body. So anything other than the body will
|
||||
* be decorated correctly and styled incorrectly, silently. Until those are
|
||||
* scoped, treat this as preparation rather than a working seam.
|
||||
* The stylesheets find this element by its `data-element-call-root` attribute,
|
||||
* which {@link useTheme} sets along with the platform and theme, so they no
|
||||
* longer depend on it being the body.
|
||||
*
|
||||
* What remains body-specific is the standalone page's own furniture: the
|
||||
* `body` rule in `index.css` still sets the page background and margin, and
|
||||
* `index.html` starts the body hidden with `no-theme` until the theme lands.
|
||||
* Neither applies when a host mounts Element Call into a container of its own.
|
||||
*/
|
||||
// No provider is exported yet: nothing supplies a root element, so every
|
||||
// consumer falls back to the document body. M1 adds one along with the
|
||||
// component that mounts Element Call into a container.
|
||||
// consumer falls back to the document body. One arrives with the entry point
|
||||
// that mounts Element Call into a container.
|
||||
const RootElementContext = createContext<HTMLElement | null>(null);
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user