Peek View System 提供了一个模态预览机制,允许用户在不离开当前上下文的情况下查看各种类型的内容(文档、图片、附件、AI 聊天)。它通过实现快速信息访问和预览功能,在 AFFiNE 中起到了关键的生产力提升作用。
有关在文档中嵌入内容的信息,请参阅编辑器系统文档 2.1。
Peek View System 遵循实体-服务-视图架构,清晰地分离了状态管理和渲染逻辑。
来源: packages/frontend/core/src/modules/peek-view/entities/peek-view.ts230-310 packages/frontend/core/src/modules/peek-view/view/modal-container.tsx21-434 packages/frontend/core/src/modules/peek-view/view/peek-view-manager.tsx1-159
PeekViewEntity 是 Peek View 的中央状态管理器。
该实体通过两个关键的 LiveData 可观测对象维护状态
active$: 跟踪当前活动的 Peek Viewshow$: 控制可见性状态及动画配置来源: packages/frontend/core/src/modules/peek-view/entities/peek-view.ts34-225
PeekViewModalContainer 组件负责模态 UI 和动画。
主要动画方法包括:
animateFade(): 简单的透明度过渡animateFadeBottom(): 带垂直移动的淡入效果animateZoomIn()/animateZoomOut(): 从目标元素缩放进入/退出来源: packages/frontend/core/src/modules/peek-view/view/modal-container.tsx43-434 packages/frontend/core/src/modules/peek-view/view/modal-container.css.ts1-122
PeekViewManagerModal 组件根据 Peek View 类型协调渲染。
来源: packages/frontend/core/src/modules/peek-view/view/peek-view-manager.tsx25-159
该系统提供基于内容类型的专用控制组件。
来源: packages/frontend/core/src/modules/peek-view/view/peek-view-controls.tsx1-293 packages/frontend/core/src/modules/peek-view/view/peek-view-controls.css.ts1-33
Peek View System 支持多种内容类型,每种类型从不同的目标解析。
来源: packages/frontend/core/src/modules/peek-view/entities/peek-view.ts127-225
Image preview functionality provides a rich viewing experience with a comprehensive feature set
功能包括:
来源: packages/frontend/core/src/modules/peek-view/view/image-preview/index.tsx1-511 packages/frontend/core/src/modules/peek-view/view/image-preview/index.css.ts1-135
Attachment Preview system handles different file types with specialized viewers
Special handling exists for PDF files, including
来源: tests/affine-local/e2e/attachment-preview.spec.ts1-346 blocksuite/affine/blocks/attachment/src/embed.ts1-238 blocksuite/affine/blocks/attachment/src/attachment-block.ts1-225
Peek View System uses Web Animations API (WAAPI) for smooth transitions.
来源: packages/frontend/core/src/modules/peek-view/view/modal-container.tsx100-345
Peek View System 与多个其他 AFFiNE 系统集成。
具体的集成包括:
useInsidePeekView() hook 来检测组件是否位于 Peek View 中。来源: packages/frontend/core/src/blocksuite/block-suite-editor/lit-adaper.tsx22-149 packages/frontend/core/src/modules/peek-view/view/modal-container.tsx43-52
The process of opening and closing a peek view follows a specific flow.
来源: packages/frontend/core/src/modules/peek-view/entities/peek-view.ts250-309 packages/frontend/core/src/modules/peek-view/view/modal-container.tsx70-369
The Peek View System is designed for extensibility through custom templates and renderers.
CustomTemplatePeekViewInfo allows rendering custom Lit templates.toReactNode utility converts Lit templates to React nodes.来源: packages/frontend/component/src/lit-react/to-react-node.ts1-37 packages/frontend/core/src/modules/peek-view/view/peek-view-manager.tsx25-60
In shared mode, certain interactions are disabled.
来源:tests/affine-cloud/e2e/share-page.spec.ts461-516 packages/frontend/core/src/blocksuite/block-suite-editor/lit-adaper.tsx158-160
该系统为移动设备适配了其 UI
来源:packages/frontend/core/src/modules/peek-view/view/modal-container.css.ts33-45 packages/frontend/core/src/modules/peek-view/view/peek-view-controls.css.ts9-31
Peek View 系统为在 AFFiNE 中预览各种类型的内容提供了一个灵活、可扩展的框架。其结构良好的架构在状态管理、渲染逻辑和特定内容功能之间分离了关注点,从而易于维护并扩展新的预览类型。
来源:packages/frontend/core/src/modules/peek-view/entities/peek-view.ts packages/frontend/core/src/modules/peek-view/view/modal-container.tsx packages/frontend/core/src/modules/peek-view/view/peek-view-manager.tsx packages/frontend/core/src/modules/peek-view/view/peek-view-controls.tsx