fix(editor): incorrect z-index in dom renderer (#13465)

#### PR Dependency Tree


* **PR #13464**
  * **PR #13465** 👈
    * **PR #13471**
      * **PR #13472**
        * **PR #13473**

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved stacking order across canvas elements (shapes, connectors,
brush, highlighter), reducing unexpected overlap.
* Corrected z-index application for placeholders and fully rendered
elements to ensure consistent layering during edits.
* **Refactor**
* Centralized z-index handling for canvas elements to provide
predictable, uniform layering behavior across the app.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
L-Sun
2025-08-14 11:10:32 +08:00
committed by GitHub
parent aa052096c1
commit 66c2bf3151
8 changed files with 13 additions and 23 deletions
@@ -298,7 +298,10 @@ export class DomRenderer {
viewportBounds,
zoom
);
Object.assign(domElement.style, geometricStyles);
const zIndexStyle = {
'z-index': this.layerManager.getZIndex(elementModel),
};
Object.assign(domElement.style, geometricStyles, zIndexStyle);
Object.assign(domElement.style, PLACEHOLDER_RESET_STYLES);
// Clear classes specific to shapes, if applicable
@@ -335,7 +338,10 @@ export class DomRenderer {
zoom
);
const opacityStyle = getOpacity(elementModel);
Object.assign(domElement.style, geometricStyles, opacityStyle);
const zIndexStyle = {
'z-index': this.layerManager.getZIndex(elementModel),
};
Object.assign(domElement.style, geometricStyles, opacityStyle, zIndexStyle);
this._renderElement(elementModel, domElement);
}
@@ -65,8 +65,5 @@ export const BrushDomRendererExtension = DomElementRendererExtension(
domElement.style.height = `${h * zoom}px`;
domElement.style.overflow = 'visible';
domElement.style.pointerEvents = 'none';
// Set z-index for layering
domElement.style.zIndex = renderer.layerManager.getZIndex(model).toString();
}
);
@@ -69,8 +69,5 @@ export const HighlighterDomRendererExtension = DomElementRendererExtension(
domElement.style.height = `${h * zoom}px`;
domElement.style.overflow = 'visible';
domElement.style.pointerEvents = 'none';
// Set z-index for layering
domElement.style.zIndex = renderer.layerManager.getZIndex(model).toString();
}
);
@@ -359,9 +359,6 @@ export const connectorDomRenderer = (
element.style.overflow = 'visible';
element.style.pointerEvents = 'none';
// Set z-index for layering
element.style.zIndex = renderer.layerManager.getZIndex(model).toString();
// Render label if present
renderConnectorLabel(model, element, renderer, zoom);
};
@@ -181,8 +181,6 @@ export const shapeDomRenderer = (
applyTransformStyles(model, element);
element.style.zIndex = renderer.layerManager.getZIndex(model).toString();
manageClassNames(model, element);
applyShadowStyles(model, element, renderer);
};
+2 -3
View File
@@ -57,7 +57,7 @@ export type CanvasLayer = BaseLayer<GfxPrimitiveElementModel> & {
type: 'canvas';
/**
* The z-index of canvas layer.
* The z-index of the first element in this canvas layer.
*
* A canvas layer renders all the elements in a single canvas,
* this property is used to render the canvas with correct z-index.
@@ -165,8 +165,7 @@ export class LayerManager extends GfxExtension {
];
curLayer.zIndex = currentCSSZindex;
layers.push(curLayer as LayerManager['layers'][number]);
currentCSSZindex +=
curLayer.type === 'block' ? curLayer.elements.length : 1;
currentCSSZindex += curLayer.elements.length;
}
};
const addLayer = (type: 'canvas' | 'block') => {
+2 -6
View File
@@ -12,11 +12,7 @@ import type { SurfaceBlockModel } from '../gfx/model/surface/surface-model.js';
export function getLayerEndZIndex(layers: Layer[], layerIndex: number) {
const layer = layers[layerIndex];
return layer
? layer.type === 'block'
? layer.zIndex + layer.elements.length - 1
: layer.zIndex
: 0;
return layer ? layer.zIndex + layer.elements.length - 1 : 0;
}
export function updateLayersZIndex(layers: Layer[], startIdx: number) {
@@ -27,7 +23,7 @@ export function updateLayersZIndex(layers: Layer[], startIdx: number) {
const curLayer = layers[i];
curLayer.zIndex = curIndex;
curIndex += curLayer.type === 'block' ? curLayer.elements.length : 1;
curIndex += curLayer.elements.length;
}
}
@@ -200,7 +200,7 @@ test('layer zindex should update correctly when elements changed', async () => {
expect(service.layer.layers[1].zIndex).toBe(3);
expect(service.layer.layers[2].type).toBe('block');
expect(service.layer.layers[2].zIndex).toBe(4);
expect(service.layer.layers[2].zIndex).toBe(5);
};
assert2StepState();