diff --git a/packages/review/app/src/blocks.browser.test.tsx b/packages/review/app/src/blocks.browser.test.tsx index 9f8ef7713..105f6b886 100644 --- a/packages/review/app/src/blocks.browser.test.tsx +++ b/packages/review/app/src/blocks.browser.test.tsx @@ -1058,6 +1058,45 @@ describe("block components", () => { ).toBe("200px"); }); + it("keeps a hand-made layout's own position for a node with a form", async () => { + const { container } = await mountFixture("animation", { + document: [ + { + id: "block-1", + type: "animation", + title: "Placed nodes", + height: "auto", + pins: { repositoryId: "repo", base: "base", head: "head" }, + frames: [{ key: "only", title: "Only" }], + code: { proof: "head/order.ts#L1" }, + html: [ + "", + '
', + '
Ingest
', + '
Transcode
', + "
", + "", + ].join(""), + }, + ], + }); + + const width = () => + container.querySelector("[data-animation-slot='code']") + ?.style.width; + + expect( + await settled(() => + width() === "100px" || width() === "200px" ? width() : undefined, + ), + ).toBe("200px"); + }); + it("does not report a ResizeObserver that resizes its own target", async () => { const { container } = await mountFixture("animation", { document: [ diff --git a/packages/review/src/animation-stage-kit.ts b/packages/review/src/animation-stage-kit.ts index 4d382d911..830460202 100644 --- a/packages/review/src/animation-stage-kit.ts +++ b/packages/review/src/animation-stage-kit.ts @@ -268,7 +268,7 @@ body { /* A store's text sits in the middle of its drum or cylinder, as a label on a tank does; a pill's too. */ -:is(.wb-card, .wb-node):is([data-form="cylinder"], [data-form="drum"], [data-form="pill"]) { align-items: center; text-align: center; } +:where(.wb-card, .wb-node):is([data-form="cylinder"], [data-form="drum"], [data-form="pill"]) { align-items: center; text-align: center; } .wb-card:is([data-form="cylinder"], [data-form="drum"], [data-form="pill"]) :is(.wb-card-head, .wb-items) { justify-content: center; } /* Shapes: a card's or node's silhouette says what it stands for before its title does. data-form is box (the default), pill, cut (a branch), @@ -276,48 +276,51 @@ body { client) or bars (a service of this codebase). data-outline is solid, dashed (outside the system) or dotted. data-color is the resting border colour: ink, accent, teal or violet; a tone takes over while set. The - scene's cards take these as options. */ -:is(.wb-card, .wb-node)[data-form] { position: relative; } -:is(.wb-card, .wb-node)[data-form]::before, :is(.wb-card, .wb-node)[data-form]::after { pointer-events: none; } -:is(.wb-card, .wb-node)[data-form="pill"] { padding-inline: var(--wb-space-16); border-radius: var(--wb-radius-pill); } -:is(.wb-card, .wb-node)[data-form="cut"] { border-radius: var(--wb-space-12); corner-shape: bevel; } -:is(.wb-card, .wb-node)[data-form="cylinder"] { padding-top: var(--wb-space-28); padding-bottom: var(--wb-space-12); border-radius: 50% / var(--wb-space-10); } -:is(.wb-card, .wb-node)[data-form="cylinder"]::before { + scene's cards take these as options. These rules and the change marks + weigh one class, as the card rules do: a hand-made layout's own rule for + its nodes, say position: absolute, comes later and wins. A tone or a + highlight still takes over. */ +:where(.wb-card, .wb-node)[data-form] { position: relative; } +:where(.wb-card, .wb-node)[data-form]::before, :where(.wb-card, .wb-node)[data-form]::after { pointer-events: none; } +:where(.wb-card, .wb-node)[data-form="pill"] { padding-inline: var(--wb-space-16); border-radius: var(--wb-radius-pill); } +:where(.wb-card, .wb-node)[data-form="cut"] { border-radius: var(--wb-space-12); corner-shape: bevel; } +:where(.wb-card, .wb-node)[data-form="cylinder"] { padding-top: var(--wb-space-28); padding-bottom: var(--wb-space-12); border-radius: 50% / var(--wb-space-10); } +:where(.wb-card, .wb-node)[data-form="cylinder"]::before { content: ""; position: absolute; inset: -1px -1px auto; height: var(--wb-space-20); border: 1px solid; border-color: inherit; border-radius: 50%; background: inherit; } -:is(.wb-card, .wb-node)[data-form="drum"] { padding-left: var(--wb-space-28); padding-right: var(--wb-space-16); border-radius: var(--wb-space-12) / 50%; } -:is(.wb-card, .wb-node)[data-form="drum"]::before { +:where(.wb-card, .wb-node)[data-form="drum"] { padding-left: var(--wb-space-28); padding-right: var(--wb-space-16); border-radius: var(--wb-space-12) / 50%; } +:where(.wb-card, .wb-node)[data-form="drum"]::before { content: ""; position: absolute; inset: -1px auto -1px -1px; width: var(--wb-space-24); border: 1px solid; border-color: inherit; border-radius: 50%; background: inherit; } -:is(.wb-card, .wb-node)[data-form="stack"] { +:where(.wb-card, .wb-node)[data-form="stack"] { margin-right: var(--wb-space-8); margin-bottom: var(--wb-space-8); box-shadow: 4px 4px 0 -1px var(--wb-surface), 4px 4px 0 0 var(--wb-rule), 8px 8px 0 -1px var(--wb-surface), 8px 8px 0 0 var(--wb-rule); } -:is(.wb-card, .wb-node)[data-form="window"] { padding-top: var(--wb-space-16); } -:is(.wb-card, .wb-node)[data-form="window"]::before { content: ""; position: absolute; top: var(--wb-space-8); right: 0; left: 0; border-top: 1px solid; border-color: inherit; } -:is(.wb-card, .wb-node)[data-form="bars"] { padding-inline: var(--wb-space-18); } -:is(.wb-card, .wb-node)[data-form="bars"]::before, :is(.wb-card, .wb-node)[data-form="bars"]::after { content: ""; position: absolute; top: 0; bottom: 0; border-left: 1px solid; border-color: inherit; } -:is(.wb-card, .wb-node)[data-form="bars"]::before { left: var(--wb-space-6); } -:is(.wb-card, .wb-node)[data-form="bars"]::after { right: var(--wb-space-6); } +:where(.wb-card, .wb-node)[data-form="window"] { padding-top: var(--wb-space-16); } +:where(.wb-card, .wb-node)[data-form="window"]::before { content: ""; position: absolute; top: var(--wb-space-8); right: 0; left: 0; border-top: 1px solid; border-color: inherit; } +:where(.wb-card, .wb-node)[data-form="bars"] { padding-inline: var(--wb-space-18); } +:where(.wb-card, .wb-node)[data-form="bars"]::before, :where(.wb-card, .wb-node)[data-form="bars"]::after { content: ""; position: absolute; top: 0; bottom: 0; border-left: 1px solid; border-color: inherit; } +:where(.wb-card, .wb-node)[data-form="bars"]::before { left: var(--wb-space-6); } +:where(.wb-card, .wb-node)[data-form="bars"]::after { right: var(--wb-space-6); } /* What the change under review did to a part: its dot and a stripe down its left edge in the change colour, at rest; a removed part's title is struck. A frame's tone still colours the whole card over it. */ -:is(.wb-card, .wb-node)[data-change] { border-left-width: 3px; } -:is(.wb-card, .wb-node)[data-change="added"] { border-left-color: var(--wb-added); } -:is(.wb-card, .wb-node)[data-change="modified"] { border-left-color: var(--wb-modified); } -:is(.wb-card, .wb-node)[data-change="removed"] { border-left-color: var(--wb-removed); } +:where(.wb-card, .wb-node)[data-change] { border-left-width: 3px; } +:where(.wb-card, .wb-node)[data-change="added"] { border-left-color: var(--wb-added); } +:where(.wb-card, .wb-node)[data-change="modified"] { border-left-color: var(--wb-modified); } +:where(.wb-card, .wb-node)[data-change="removed"] { border-left-color: var(--wb-removed); } .wb-card[data-change="added"] .wb-card-dot { background: var(--wb-added); } .wb-card[data-change="modified"] .wb-card-dot { background: var(--wb-modified); } .wb-card[data-change="removed"] .wb-card-dot { background: var(--wb-removed); } .wb-card[data-change="removed"] .wb-card-title { color: var(--wb-ink-muted); text-decoration: line-through; } -:is(.wb-card, .wb-node)[data-outline="dashed"] { border-style: dashed; } -:is(.wb-card, .wb-node)[data-outline="dotted"] { border-style: dotted; } -:is(.wb-card, .wb-node)[data-color="ink"] { border-color: var(--wb-ink); } -:is(.wb-card, .wb-node)[data-color="accent"] { border-color: var(--wb-accent); } -:is(.wb-card, .wb-node)[data-color="teal"] { border-color: var(--wb-teal); } -:is(.wb-card, .wb-node)[data-color="violet"] { border-color: var(--wb-violet); } +:where(.wb-card, .wb-node)[data-outline="dashed"] { border-style: dashed; } +:where(.wb-card, .wb-node)[data-outline="dotted"] { border-style: dotted; } +:where(.wb-card, .wb-node)[data-color="ink"] { border-color: var(--wb-ink); } +:where(.wb-card, .wb-node)[data-color="accent"] { border-color: var(--wb-accent); } +:where(.wb-card, .wb-node)[data-color="teal"] { border-color: var(--wb-teal); } +:where(.wb-card, .wb-node)[data-color="violet"] { border-color: var(--wb-violet); } .wb-card[data-color="ink"] .wb-card-dot { background: var(--wb-ink); } .wb-card[data-color="accent"] .wb-card-dot { background: var(--wb-accent); } .wb-card[data-color="teal"] .wb-card-dot { background: var(--wb-teal); }