Skip to content

视口、工具与主题 ​

示例以已有Editor为参数,SkyNoteEditor和CanvasThemeSeed从@skynote/editor导入。

坐标系统 ​

属性 / 方法单位与含义
viewport只读{x,y,zoom},本地会话状态
viewportSize当前宿主容器的像素宽高
viewportCenter视口中心对应的世界坐标
screenToWorld(point)容器内屏幕坐标转世界坐标
worldToScreen(point)世界坐标转容器内屏幕坐标

两个转换方法的屏幕点相对于画布容器左上角,不是浏览器clientX/clientY。宿主先减去容器的位置;滚动、全屏或布局变化后不要长期复用旧的DOM矩形。

ts
export function placeAtPointer(
  editor: SkyNoteEditor<HTMLElement>,
  localPoint: { x: number; y: number }
): string | null {
  const world = editor.screenToWorld(localPoint);
  return editor.insertNodeAt({ nodeType: 'sticky', options: { text: '从这里开始' } }, world);
}

缩放与定位 ​

接口默认与边界
zoomAt(factor, center?)倍数缩放,缺省锚点为视口中心;center是容器内屏幕点
fitContent()容纳全部内容;内容较少时不放大到超过原始尺寸,空画布回原点
fitEntities(refs)只适配指定实体;全部不存在时不改变视口
applyInitialView(mode?, viewport?)mode缺省沿用构造配置
revealEntities(refs, options?)保持缩放,平移以揭示目标;可指定居中、padding和面板insets
previewEntities(refs)临时预览目标,返回结束预览的清理函数

打开策略:actual-size按100%缩放居中(受zoomRange限制);fit-content适配内容;preserve只在提供视口时写入,不自动居中。直接传initialViewport却保留默认actual-size会在挂载时应用打开策略,恢复旧位置应配套使用preserve。

全屏或容器尺寸改变时,渲染器更新像素尺寸,不代表会自动重新居中。希望内容跟随适配的宿主,应等尺寸更新后调用fitContent();不要在每次用户平移时调用,否则会把用户拉回原位。

工具与只读 ​

tool读取当前工具,默认选择工具。startConnectorTool(type?)进入连线工具,type缺省沿用当前线型;stopTool()退出当前工具。线型取straight / orthogonal / curved。

setReadOnly(value)切换只读,isReadOnly查询状态,onReadOnlyChange(listener)返回解绑函数。只读仍允许会话导航;只读不是宿主鉴权,文档的访问权限、账号与插件开放范围由宿主负责。

主题与光标 ​

ts
export function useCanvasTheme(editor: SkyNoteEditor<HTMLElement>, seed: CanvasThemeSeed): void {
  editor.setTheme({ seed });
}

CanvasThemeSeed提供背景、前景与强调色等种子配置;setTheme({seed, overrides?})改变画布会话主题,theme读取推导结果。resolveColor(colorOrToken)解析当前主题颜色,例如$teal调色板引用。

宿主CSS明暗切换不会自动调用setTheme。宿主应从同一组主题配置同时更新CSS和画布,避免界面变暗、画布仍保持浅色。

registerCursor(definition)注册或覆盖光标并返回恢复函数;setCursorStyle(style)改变整套光标的配色。DOM悬停区域应通过宿主桥接统一光标,不另外叠加一套与画布不一致的鼠标样式。

可组合的画布能力,从一个想法开始。