Skip to content

@dragcraft/device-frames

@dragcraft/device-frames 提供设备预览外壳和可选的设备选择器。

先看一个最小示例:

vue
<script setup lang="ts">
import { provide } from 'vue'
import {
  createDeviceFrameContext,
  DEVICE_FRAME_CONTEXT_KEY,
  DevicePicker,
  DeviceFrameShell,
} from '@dragcraft/device-frames'

const deviceCtx = createDeviceFrameContext({ initialDevice: 'iphone' })
provide(DEVICE_FRAME_CONTEXT_KEY, deviceCtx)

const extensions = {
  rendererExtensions: {
    containerShell: DeviceFrameShell,
  },
}
</script>

这段代码先创建设备上下文并提供给设备组件,再把 DeviceFrameShell 放进 rendererExtensions.containerShellprovide() 必须位于承载 Designer 与 DevicePicker 的共同祖先组件中。需要切换设备时,宿主在自己的界面中渲染:

vue
<DevicePicker :context="deviceCtx" />

不渲染 DevicePicker 时,Designer 不显示任何设备选择。普通页面容器或业务自定义预览可以只使用自己的 containerShell

DeviceFrameShell 还消费 Renderer 传入的 selectionPresentation,注册三个 selected 呈现平面:root 平面是 Frame 根元素的直接子节点并覆盖完整设备外框,内容平面位于 scroller surface 内并随页面滚动,视口平面固定在设备 viewport 内。preset 的宽高始终是完整可用 viewport 尺寸;Frame 本体和内部 surface 共享同一内容坐标,设备边框由 Frame 外侧的独立视觉层绘制,不通过 Frame border/padding、content inset、content surface padding 或 node border 移动物料。root 选框通过独立平面覆盖完整外壳。Frame 仍按完整 chrome wrapper 计算真实内容 reserve,并且不读取 selected 状态或计算投影范围。

设备框架与主题的导入顺序、选中投影和画布行为见 主题与设备框架