mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-24 18:02:47 +08:00
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:
@@ -298,7 +298,10 @@ export class DomRenderer {
|
|||||||
viewportBounds,
|
viewportBounds,
|
||||||
zoom
|
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);
|
Object.assign(domElement.style, PLACEHOLDER_RESET_STYLES);
|
||||||
|
|
||||||
// Clear classes specific to shapes, if applicable
|
// Clear classes specific to shapes, if applicable
|
||||||
@@ -335,7 +338,10 @@ export class DomRenderer {
|
|||||||
zoom
|
zoom
|
||||||
);
|
);
|
||||||
const opacityStyle = getOpacity(elementModel);
|
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);
|
this._renderElement(elementModel, domElement);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,8 +65,5 @@ export const BrushDomRendererExtension = DomElementRendererExtension(
|
|||||||
domElement.style.height = `${h * zoom}px`;
|
domElement.style.height = `${h * zoom}px`;
|
||||||
domElement.style.overflow = 'visible';
|
domElement.style.overflow = 'visible';
|
||||||
domElement.style.pointerEvents = 'none';
|
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.height = `${h * zoom}px`;
|
||||||
domElement.style.overflow = 'visible';
|
domElement.style.overflow = 'visible';
|
||||||
domElement.style.pointerEvents = 'none';
|
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.overflow = 'visible';
|
||||||
element.style.pointerEvents = 'none';
|
element.style.pointerEvents = 'none';
|
||||||
|
|
||||||
// Set z-index for layering
|
|
||||||
element.style.zIndex = renderer.layerManager.getZIndex(model).toString();
|
|
||||||
|
|
||||||
// Render label if present
|
// Render label if present
|
||||||
renderConnectorLabel(model, element, renderer, zoom);
|
renderConnectorLabel(model, element, renderer, zoom);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -181,8 +181,6 @@ export const shapeDomRenderer = (
|
|||||||
|
|
||||||
applyTransformStyles(model, element);
|
applyTransformStyles(model, element);
|
||||||
|
|
||||||
element.style.zIndex = renderer.layerManager.getZIndex(model).toString();
|
|
||||||
|
|
||||||
manageClassNames(model, element);
|
manageClassNames(model, element);
|
||||||
applyShadowStyles(model, element, renderer);
|
applyShadowStyles(model, element, renderer);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ export type CanvasLayer = BaseLayer<GfxPrimitiveElementModel> & {
|
|||||||
type: 'canvas';
|
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,
|
* A canvas layer renders all the elements in a single canvas,
|
||||||
* this property is used to render the canvas with correct z-index.
|
* this property is used to render the canvas with correct z-index.
|
||||||
@@ -165,8 +165,7 @@ export class LayerManager extends GfxExtension {
|
|||||||
];
|
];
|
||||||
curLayer.zIndex = currentCSSZindex;
|
curLayer.zIndex = currentCSSZindex;
|
||||||
layers.push(curLayer as LayerManager['layers'][number]);
|
layers.push(curLayer as LayerManager['layers'][number]);
|
||||||
currentCSSZindex +=
|
currentCSSZindex += curLayer.elements.length;
|
||||||
curLayer.type === 'block' ? curLayer.elements.length : 1;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const addLayer = (type: 'canvas' | 'block') => {
|
const addLayer = (type: 'canvas' | 'block') => {
|
||||||
|
|||||||
@@ -12,11 +12,7 @@ import type { SurfaceBlockModel } from '../gfx/model/surface/surface-model.js';
|
|||||||
|
|
||||||
export function getLayerEndZIndex(layers: Layer[], layerIndex: number) {
|
export function getLayerEndZIndex(layers: Layer[], layerIndex: number) {
|
||||||
const layer = layers[layerIndex];
|
const layer = layers[layerIndex];
|
||||||
return layer
|
return layer ? layer.zIndex + layer.elements.length - 1 : 0;
|
||||||
? layer.type === 'block'
|
|
||||||
? layer.zIndex + layer.elements.length - 1
|
|
||||||
: layer.zIndex
|
|
||||||
: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function updateLayersZIndex(layers: Layer[], startIdx: number) {
|
export function updateLayersZIndex(layers: Layer[], startIdx: number) {
|
||||||
@@ -27,7 +23,7 @@ export function updateLayersZIndex(layers: Layer[], startIdx: number) {
|
|||||||
const curLayer = layers[i];
|
const curLayer = layers[i];
|
||||||
|
|
||||||
curLayer.zIndex = curIndex;
|
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[1].zIndex).toBe(3);
|
||||||
|
|
||||||
expect(service.layer.layers[2].type).toBe('block');
|
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();
|
assert2StepState();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user