fix(editor): missing doc mode extension in frame preview (#11348)

Close [BS-2777](https://linear.app/affine-design/issue/BS-2777/frame-preview里的embed-card展示的doc-mode不对)
This commit is contained in:
L-Sun
2025-04-01 11:57:53 +00:00
parent bed02f2520
commit cad4dde4b1
5 changed files with 34 additions and 13 deletions

View File

@@ -265,6 +265,7 @@ export class FramePanelBody extends SignalWatcher(
html`<affine-frame-card html`<affine-frame-card
data-frame-id=${frame.id} data-frame-id=${frame.id}
.frame=${frame} .frame=${frame}
.std=${this.editorHost.std}
.cardIndex=${cardIndex} .cardIndex=${cardIndex}
.frameIndex=${frameIndex} .frameIndex=${frameIndex}
.status=${selectedFrames.has(frame.id) .status=${selectedFrames.has(frame.id)

View File

@@ -1,7 +1,7 @@
import type { FrameBlockModel } from '@blocksuite/affine-model'; import type { FrameBlockModel } from '@blocksuite/affine-model';
import { on, once } from '@blocksuite/affine-shared/utils'; import { on, once } from '@blocksuite/affine-shared/utils';
import { WithDisposable } from '@blocksuite/global/lit'; import { WithDisposable } from '@blocksuite/global/lit';
import { ShadowlessElement } from '@blocksuite/std'; import { type BlockStdScope, ShadowlessElement } from '@blocksuite/std';
import { css, html, nothing } from 'lit'; import { css, html, nothing } from 'lit';
import { property, query } from 'lit/decorators.js'; import { property, query } from 'lit/decorators.js';
import { styleMap } from 'lit/directives/style-map.js'; import { styleMap } from 'lit/directives/style-map.js';
@@ -177,18 +177,18 @@ export class FrameCard extends WithDisposable(ShadowlessElement) {
override render() { override render() {
const { pos, stackOrder, width } = this; const { pos, stackOrder, width } = this;
const containerStyle = const containerStyle = styleMap(
this.status === 'dragging' this.status === 'dragging'
? styleMap({ ? {
transform: `${ transform: `${
stackOrder === 0 stackOrder === 0
? `translate(${pos.x - 16}px, ${pos.y - 8}px)` ? `translate(${pos.x - 16}px, ${pos.y - 8}px)`
: `translate(${pos.x - 10}px, ${pos.y - 16}px) scale(0.96)` : `translate(${pos.x - 10}px, ${pos.y - 16}px) scale(0.96)`
}`, }`,
width: width ? `${width}px` : undefined, width: width ? `${width}px` : undefined,
}) }
: {}; : {}
);
return html`<div return html`<div
class="frame-card-container ${this.status ?? ''}" class="frame-card-container ${this.status ?? ''}"
style=${containerStyle} style=${containerStyle}
@@ -207,12 +207,18 @@ export class FrameCard extends WithDisposable(ShadowlessElement) {
> >
${this.status === 'dragging' && stackOrder !== 0 ${this.status === 'dragging' && stackOrder !== 0
? nothing ? nothing
: html`<frame-preview .frame=${this.frame}></frame-preview>`} : html`<frame-preview
.frame=${this.frame}
.std=${this.std}
></frame-preview>`}
${this._DraggingCardNumber()} ${this._DraggingCardNumber()}
</div> </div>
</div>`; </div>`;
} }
@property({ attribute: false })
accessor std!: BlockStdScope;
@property({ attribute: false }) @property({ attribute: false })
accessor cardIndex!: number; accessor cardIndex!: number;

View File

@@ -1,5 +1,9 @@
import type { FrameBlockModel } from '@blocksuite/affine-model'; import type { FrameBlockModel } from '@blocksuite/affine-model';
import { ViewportElementExtension } from '@blocksuite/affine-shared/services'; import {
DocModeExtension,
DocModeProvider,
ViewportElementExtension,
} from '@blocksuite/affine-shared/services';
import { SpecProvider } from '@blocksuite/affine-shared/utils'; import { SpecProvider } from '@blocksuite/affine-shared/utils';
import { DisposableGroup } from '@blocksuite/global/disposable'; import { DisposableGroup } from '@blocksuite/global/disposable';
import { Bound, deserializeXYWH } from '@blocksuite/global/gfx'; import { Bound, deserializeXYWH } from '@blocksuite/global/gfx';
@@ -47,12 +51,15 @@ const styles = css`
overflow: hidden; overflow: hidden;
pointer-events: none; pointer-events: none;
user-select: none; user-select: none;
}
.edgeless-background { .frame-preview-viewport
> editor-host
> affine-edgeless-root-preview
> .edgeless-background {
background-color: transparent; background-color: transparent;
background-image: none; background-image: none;
} }
}
`; `;
export const AFFINE_FRAME_PREVIEW = 'frame-preview'; export const AFFINE_FRAME_PREVIEW = 'frame-preview';
@@ -134,9 +141,12 @@ export class FramePreview extends WithDisposable(ShadowlessElement) {
}); });
} }
} }
const docModeService = this.std.get(DocModeProvider);
this._previewSpec.extend([ this._previewSpec.extend([
ViewportElementExtension('.frame-preview-viewport'), ViewportElementExtension('.frame-preview-viewport'),
FramePreviewWatcher, FramePreviewWatcher,
DocModeExtension(docModeService),
]); ]);
} }
@@ -220,6 +230,9 @@ export class FramePreview extends WithDisposable(ShadowlessElement) {
} }
} }
@property({ attribute: false })
accessor std!: BlockStdScope;
@state() @state()
accessor fillScreen = false; accessor fillScreen = false;

View File

@@ -55,6 +55,7 @@ export function startDragging(
el.stackOrder = arr.length - 1 - idx; el.stackOrder = arr.length - 1 - idx;
el.pos = start; el.pos = start;
el.width = options.width; el.width = options.width;
el.std = container.editorHost.std;
if (frames.length > 1 && el.stackOrder === 0) if (frames.length > 1 && el.stackOrder === 0)
el.draggingCardNumber = frames.length; el.draggingCardNumber = frames.length;

View File

@@ -148,7 +148,7 @@ test.describe('presentation', () => {
}) => { }) => {
await edgelessCommonSetup(page); await edgelessCommonSetup(page);
await createFrame(page, [100, 100], [100, 200]); await createFrame(page, [100, 100], [200, 200]);
await createFrame(page, [200, 100], [300, 200]); await createFrame(page, [200, 100], [300, 200]);
await createFrame(page, [300, 100], [400, 200]); await createFrame(page, [300, 100], [400, 200]);
await createFrame(page, [400, 100], [500, 200]); await createFrame(page, [400, 100], [500, 200]);