- From: Jochen Kühner via GitHub <noreply@w3.org>
- Date: Mon, 28 Jul 2025 15:30:18 +0000
- To: public-css-archive@w3.org
jogibear9988 has just created a new issue for https://github.com/w3c/csswg-drafts:
== Extend GeometryUtils with transformation and size utilities ==
**Title:** Proposal: Extend `GeometryUtils` with transformation and size utilities
---
## Summary
This is a proposal to extend the [`GeometryUtils`](https://drafts.fxtf.org/geometry/#geometryutils) interface with two additional methods:
### 1. `getResultingTransformationBetweenNodeAndAncestor(node, ancestor)`
Returns a `DOMMatrix` representing the *complete transformation* matrix from `node` to the specified `ancestor`. This includes all `transform`, `transform-style`, `will-change`, scrolling offsets, and coordinate space effects in between.
**Key requirements:**
- Works across Shadow DOM boundaries.
- Optional: To be discussed whether it works across same-origin `<iframe>` boundaries.
- Returns a precise transformation that allows UI overlays (e.g. rotation handles) to match visually transformed elements.
---
### 2. `getNodeSize(node)`
Returns the *intrinsic size* (`{width, height}`) of the node **before** any applied transformations. This differs from `getBoundingClientRect`, which reflects the *rendered* size including transformations and possibly even effects like `zoom`.
**Use case:** Needed for applications such as visual designers or element inspectors that must display untransformed element dimensions alongside transformed overlays.
---
## Information
When the getBoxQuads is implemented, these values are already calculated to get the boxQuads, so this would not be much overhead.
## Use Case
In design or inspection tools (e.g. web page builders, Figma-like apps, DevTools), we need to:
- Show overlays (rotation arrows, transform handles, highlights) that accurately match an element’s visual placement and size.
- Calculate transformation deltas between elements and ancestors (e.g. an element inside a deeply nested shadow root) in order to properly align editor components.
- Retrieve the untransformed size of an element for layout calculations.
### Example
```js
const matrix = GeometryUtils.getResultingTransformationBetweenNodeAndAncestor(
innerElement,
topLevelHost
);
const { width, height } = GeometryUtils.getNodeSize(innerElement);
```
---
## Naming Discussion
### Proposed:
- `getResultingTransformationBetweenNodeAndAncestor(node, ancestor)`
- `getNodeSize(node)`
### Alternatives:
- `getTransformMatrixRelativeTo(node, ancestor)` – shorter, commonly used naming pattern
- `getUntransformedSize(node)` – emphasizes distinction from transformed box
Would appreciate feedback from the community on preferred terminology.
---
## Compatibility and Cross-Domain Concerns
### Shadow DOM:
These APIs must resolve correctly across open and closed ShadowRoots for maximum utility in real-world component trees.
### IFrames:
Behavior across same-origin iframes could follow the model of `getBoundingClientRect`, possibly throwing a security error for cross-origin access. More discussion is needed here.
---
## Prior Art
- `element.getBoundingClientRect()` – includes transformations
- `element.offsetWidth/offsetHeight` – does not consider fractional values or precise box models
- `element.computedStyle.transform` – string parsing required, does not yield complete matrix
These are insufficient for accurate matrix composition or untransformed size in tooling contexts.
---
## Suggested Spec Target
This could fit into the [CSSOM View Module](https://drafts.csswg.org/cssom-view/) or be a focused addition to [`GeometryUtils`](https://drafts.fxtf.org/geometry/#geometryutils) in the [Geometry Interfaces Module Level 1](https://drafts.fxtf.org/geometry/).
---
## Related Issues
None found directly related, but if there are existing discussions on extending `GeometryUtils`, please link here.
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/12534 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Monday, 28 July 2025 15:30:19 UTC