@sketch-ruler/core 3.0.0-beta.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +376 -170
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,230 +1,436 @@
1
- # @sketch-ruler/core
1
+ # vue3-sketch-ruler
2
2
 
3
- > 框架无关的核心层:坐标变换引擎、多画布管理、参考线状态、吸附引擎、Minimap 引擎、刻度计算等。零外部依赖。
3
+ > 是一个基于 Vue 3 + TypeScript 的标尺组件库,适用于低代码平台、大屏可视化、做图工具等场景,提供类似 Photoshop 的缩放与标尺辅助线体验。
4
4
 
5
- ## 安装
5
+ [![](https://camo.githubusercontent.com/28479a7a834310a667f36760a27283f7389e864a/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f6c2f76322d646174657069636b65722e737667)](https://camo.githubusercontent.com/28479a7a834310a667f36760a27283f7389e864a/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f6c2f76322d646174657069636b65722e737667) [![build status](https://github.com/kakajun/vue3-sketch-ruler/actions/workflows/gh-pages.yml/badge.svg?branch=master)](https://github.com/kakajun/vue3-sketch-ruler/actions/workflows/gh-pages.yml)
6
6
 
7
- ```bash
8
- npm install @sketch-ruler/core
9
- # 或
10
- pnpm add @sketch-ruler/core
11
- ```
7
+ [![Cloud Studio Template](https://cs-res.codehub.cn/common/assets/icon-badge.svg)](https://cloudstudio.net/a/21005994397405184?channel=share&sharetype=Markdown)
12
8
 
13
- ## 快速上手
9
+ <div align=center>
10
+ <img src="https://github.com/kakajun/vue3-sketch-ruler/blob/master/packages/docs/src/assets/logo.png" width="392" height="300">
11
+ </div>
14
12
 
15
- ### TransformEngine — 2D 变换引擎
13
+ ## 🚀 Features
16
14
 
17
- 维护缩放/平移状态,内置多种动画插值模式。
15
+ - 💪 Vue 3 Composition API / `<script setup>`
16
+ - 🔥 基于 TypeScript,类型完整
17
+ - 🎯 内置 TransformEngine 变换引擎,零外部依赖
18
+ - 🖱️ 多种缩放模式:鼠标中心、视口中心、内容中心
19
+ - 📐 可配置参考线(拖拽创建、吸附、锁定)
20
+ - 🗺️ 内置 Minimap 缩略图导航(支持拖拽视口、点击跳转)
21
+ - 🔌 插件系统(生命周期钩子 + 自定义渲染器)
22
+ - 🎨 动画支持:ease-out / damped / exponential / direct
23
+ - 📦 平台与业务代码通过插槽分离,专注业务即可
18
24
 
19
- ```ts
20
- import { TransformEngine } from '@sketch-ruler/core'
25
+ ## 🦄 Demo
21
26
 
22
- const engine = new TransformEngine(
23
- { x: 0, y: 0, scale: 1 }, // 初始状态
24
- { minZoom: 0.1, maxZoom: 10, enableAnimation: true, animationMode: 'ease-out' }
25
- )
27
+ 案例浏览: [https://kakajun.github.io/vue3-sketch-ruler](https://kakajun.github.io/vue3-sketch-ruler) ![image](https://github.com/kakajun/vue3-sketch-ruler/blob/master/packages/docs/src/assets/1.png)
26
28
 
27
- // 监听状态变化(注册时立即回调一次当前状态)
28
- const unsubscribe = engine.onUpdate((state) => {
29
- console.log('scale', state.scale, 'offset', state.x, state.y)
30
- })
29
+ [CodePen 示例](https://codepen.io/kakajun/pen/eYwagJb)
31
30
 
32
- // 以屏幕坐标 (400, 300) 为原点放大 0.5
33
- engine.zoomBy(0.5, 400, 300)
34
-
35
- // 缩放到指定比例
36
- engine.zoomTo(2, 400, 300)
37
-
38
- // 平移
39
- engine.panBy(100, -50)
31
+ ## 安装
40
32
 
41
- // 直接设置
42
- engine.setTransform({ scale: 1, x: 0, y: 0 })
33
+ ```bash
34
+ npm install --save vue3-sketch-ruler
43
35
 
44
- // 坐标转换
45
- const world = engine.toWorldPoint(100, 100) // 屏幕 → 世界
46
- const screen = engine.toScreenPoint(50, 50) // 世界 → 屏幕
36
+ #
37
+ yarn add vue3-sketch-ruler
47
38
 
48
- // 清理
49
- unsubscribe()
50
- engine.destroy()
39
+ #
40
+ pnpm add vue3-sketch-ruler
51
41
  ```
52
42
 
53
- ### CanvasManager — 多画布管理器
43
+ ## 引入方式
54
44
 
55
- 管理多个画布配置,支持模板、切换、导入导出。
45
+ ### ESM
56
46
 
57
47
  ```ts
58
- import { CanvasManager, BUILTIN_TEMPLATES, exportLines, importLines } from '@sketch-ruler/core'
59
-
60
- const manager = new CanvasManager([
61
- { name: '首页', width: 1920, height: 1080, lines: { h: [100], v: [200] } },
62
- { name: '详情页', width: 375, height: 812 }
63
- ])
48
+ import { SketchRuler, Minimap } from 'vue3-sketch-ruler'
49
+ import type { SketchRulerProps, SketchRulerPlugin } from 'vue3-sketch-ruler'
50
+ import 'vue3-sketch-ruler/lib/style.css'
51
+ ```
64
52
 
65
- // 监听状态变化
66
- manager.onUpdate((state) => {
67
- console.log('当前画布:', state.activeId, '总数:', state.canvases.length)
68
- })
53
+ ### CDN
69
54
 
70
- // 应用内置模板
71
- const id = manager.applyTemplate('A4 Portrait')
55
+ ```html
56
+ <script src="https://unpkg.com/vue3-sketch-ruler/lib/index.umd.js"></script>
57
+ <link rel="stylesheet" href="https://unpkg.com/vue3-sketch-ruler/lib/style.css" />
72
58
 
73
- // 切换画布(自动保存缩略图)
74
- manager.switchCanvas(id)
59
+ <script>
60
+ const { SketchRuler, Minimap } = window.Vue3SketchRuler
61
+ </script>
62
+ ```
75
63
 
76
- // 更新当前画布的缩放与偏移
77
- manager.updateCanvasState(id, { scale: 0.8, offsetX: 100, offsetY: 50 })
64
+ ## 使用
65
+
66
+ ### 基础用法
67
+
68
+ ```vue
69
+ <template>
70
+ <div class="wrapper" :style="{ width: width + 'px', height: height + 'px' }">
71
+ <SketchRuler
72
+ ref="sketchRef"
73
+ v-model:scale="state.scale"
74
+ :width="width"
75
+ :height="height"
76
+ :canvas-width="canvasWidth"
77
+ :canvas-height="canvasHeight"
78
+ :thick="state.thick"
79
+ :lines="state.lines"
80
+ :is-show-refer-line="state.isShowReferLine"
81
+ :enable-animation="true"
82
+ animation-mode="ease-out"
83
+ @zoomchange="handleZoomChange"
84
+ @update:lines="handleLinesChange"
85
+ >
86
+ <template #default>
87
+ <div data-type="page" :style="canvasStyle">
88
+ <img :src="bgImg" style="width:100%;height:100%" />
89
+ </div>
90
+ </template>
91
+
92
+ <template #toolbar="{ tools, state }">
93
+ <div class="btns">
94
+ <button @click="tools.reset">还原</button>
95
+ <button @click="tools.zoomIn">放大</button>
96
+ <button @click="tools.zoomOut">缩小</button>
97
+ <button @click="tools.zoomToPreset(1)">100%</button>
98
+ <span>{{ (state.scale * 100).toFixed(0) }}%</span>
99
+ </div>
100
+ </template>
101
+ </SketchRuler>
102
+ </div>
103
+ </template>
104
+
105
+ <script setup lang="ts">
106
+ import { reactive, ref } from 'vue'
107
+ import { SketchRuler } from 'vue3-sketch-ruler'
108
+ import 'vue3-sketch-ruler/lib/style.css'
109
+
110
+ const sketchRef = ref()
111
+ const width = 1470
112
+ const height = 700
113
+ const canvasWidth = 1000
114
+ const canvasHeight = 500
115
+
116
+ const state = reactive({
117
+ scale: 1,
118
+ thick: 20,
119
+ isShowReferLine: true,
120
+ lines: { h: [0, 250], v: [0, 500] }
121
+ })
78
122
 
79
- // 更新参考线(SketchRuler 发出的是 {h, v},需先 importLines)
80
- manager.updateCanvasLines(id, importLines({ h: [0, 250], v: [0, 500] }))
123
+ const canvasStyle = {
124
+ width: canvasWidth + 'px',
125
+ height: canvasHeight + 'px'
126
+ }
81
127
 
82
- // 导出参考线(转回 {h, v} SketchRuler)
83
- const canvas = manager.activeCanvas
84
- if (canvas) {
85
- const lines = exportLines(canvas.lines) // => { h: number[], v: number[] }
128
+ const handleZoomChange = (detail: { scale: number; x: number; y: number }) => {
129
+ console.log('zoomchange', detail)
86
130
  }
87
131
 
88
- // 删除画布
89
- manager.removeCanvas(id)
132
+ const handleLinesChange = (lines: { h: number[]; v: number[] }) => {
133
+ console.log('lines changed', lines)
134
+ }
135
+ </script>
90
136
  ```
91
137
 
92
- ### 插件系统 — PluginManager
93
-
94
- ```ts
95
- import { PluginManager } from '@sketch-ruler/core'
96
- import type { SketchRulerPlugin } from '@sketch-ruler/core'
97
-
98
- const pluginManager = new PluginManager()
99
-
100
- const myPlugin: SketchRulerPlugin = {
101
- name: 'logger',
102
- beforeZoom: (ctx) => {
103
- console.log('zoom from', ctx.from, 'to', ctx.to)
104
- return true // return false 可阻止缩放
105
- },
106
- onLineCreate: (ctx) => console.log('line created', ctx.line.id),
107
- onLineDelete: (ctx) => console.log('line deleted', ctx.line.id)
138
+ ### 配合 Minimap
139
+
140
+ ```vue
141
+ <template>
142
+ <SketchRuler ref="sketchRef" v-model:scale="state.scale" ...>
143
+ <template #default>...</template>
144
+ </SketchRuler>
145
+
146
+ <Minimap
147
+ :content-width="canvasWidth"
148
+ :content-height="canvasHeight"
149
+ :viewport-x="viewportOffset.x"
150
+ :viewport-y="viewportOffset.y"
151
+ :viewport-width="width"
152
+ :viewport-height="height"
153
+ :scale="state.scale"
154
+ :width="200"
155
+ :height="150"
156
+ @navigate="handleNavigate"
157
+ />
158
+ </template>
159
+
160
+ <script setup>
161
+ import { SketchRuler, Minimap } from 'vue3-sketch-ruler'
162
+
163
+ const sketchRef = ref()
164
+ const viewportOffset = reactive({ x: 0, y: 0 })
165
+
166
+ const handleZoomChange = (detail) => {
167
+ viewportOffset.x = detail.x
168
+ viewportOffset.y = detail.y
108
169
  }
109
170
 
110
- pluginManager.register(myPlugin)
171
+ const handleNavigate = (x, y) => {
172
+ sketchRef.value?.setTransform({ x, y })
173
+ }
174
+ </script>
111
175
  ```
112
176
 
113
- ### 吸附引擎 — SnapEngine
177
+ ### 插件系统
114
178
 
115
179
  ```ts
116
- import { SnapEngine } from '@sketch-ruler/core'
180
+ import type { SketchRulerPlugin } from 'vue3-sketch-ruler'
181
+
182
+ const plugins: SketchRulerPlugin[] = [
183
+ {
184
+ name: 'demo-logger',
185
+ onLineCreate: (ctx) => console.log('line created', ctx.line.id),
186
+ onLineDelete: (ctx) => console.log('line deleted', ctx.line.id)
187
+ }
188
+ ]
189
+ ```
117
190
 
118
- const snapEngine = new SnapEngine({ threshold: 5 })
191
+ ## API
192
+
193
+ ### Props
194
+
195
+ | 属性 | 描述 | 类型 | 默认值 |
196
+ | --- | --- | --- | --- |
197
+ | width | 容器宽度 | `number` | `1400` |
198
+ | height | 容器高度 | `number` | `800` |
199
+ | canvasWidth | 画布宽度 | `number` | `700` |
200
+ | canvasHeight | 画布高度 | `number` | `700` |
201
+ | thick | 标尺厚度 | `number` | `16` |
202
+ | scale | 缩放值(支持 `v-model:scale`) | `number` | `1` |
203
+ | showRuler | 是否显示标尺 | `boolean` | `true` |
204
+ | isShowReferLine | 是否显示参考线 | `boolean` | `true` |
205
+ | lines | 初始化参考线 | `{ h: number[]; v: number[] }` | `{ h: [], v: [] }` |
206
+ | palette | 标尺样式配置 | `Partial<RulerPalette>` | `{}` |
207
+ | shadow | 阴影高亮区域 | `{ x, y, width, height }` | `{ x:0, y:0, width:0, height:0 }` |
208
+ | zoomMode | 缩放原点模式 | `'pointer' \| 'viewport-center' \| 'content-center'` | `'pointer'` |
209
+ | zoomStep | 缩放步长 | `number` | `0.25` |
210
+ | minZoom | 最小缩放 | `number` | `0.1` |
211
+ | maxZoom | 最大缩放 | `number` | `10` |
212
+ | enableAnimation | 是否启用动画 | `boolean` | `false` |
213
+ | animationMode | 动画模式 | `'direct' \| 'ease-out' \| 'damped' \| 'exponential'` | `'ease-out'` |
214
+ | autoCenter | 初始化自动居中 | `boolean` | `true` |
215
+ | initialOffset | 初始偏移(autoCenter=false 时生效) | `{ x: number; y: number }` | `{ x:0, y:0 }` |
216
+ | snapThreshold | 吸附阈值 | `number` | `5` |
217
+ | lockLine | 是否锁定参考线 | `boolean` | `false` |
218
+ | selfHandle | 自行处理输入事件 | `boolean` | `false` |
219
+ | plugins | 插件列表 | `SketchRulerPlugin[]` | `[]` |
220
+
221
+ ### Events
222
+
223
+ | 事件 | 描述 | 回调参数 |
224
+ | --------------- | ------------------ | ------------------------------ |
225
+ | update:scale | 缩放值双向绑定 | `number` |
226
+ | update:offset | 偏移值双向绑定 | `{ x: number; y: number }` |
227
+ | zoomchange | 缩放/平移变化 | `{ scale, x, y }` |
228
+ | update:lines | 参考线变化 | `{ h: number[]; v: number[] }` |
229
+ | update:lockLine | 参考线锁定状态变化 | `boolean` |
230
+ | onCornerClick | 左上角按钮点击 | `boolean`(参考线显示状态) |
231
+
232
+ ### Slots
233
+
234
+ | 插槽名 | 描述 | 作用域参数 |
235
+ | --- | --- | --- |
236
+ | default | 画布内容(**必须用 `<template #default>` 包裹**) | — |
237
+ | toolbar | 右下角工具栏 | `{ tools: { reset, zoomIn, zoomOut, zoomToPreset, setZoomMode, toggleReferLine }, state: { scale, offset, zoomMode, showReferLine } }` |
238
+
239
+ ### Expose
240
+
241
+ 通过 `ref` 可以调用以下方法:
242
+
243
+ | 方法 | 描述 |
244
+ | ---------------------------------- | -------------------- |
245
+ | `setTransform({ x?, y?, scale? })` | 设置变换状态 |
246
+ | `zoomIn()` | 放大 |
247
+ | `zoomOut()` | 缩小 |
248
+ | `reset()` | 重置到初始状态 |
249
+ | `zoomToPreset(scale)` | 缩放到预设比例 |
250
+ | `setZoomMode(mode)` | 设置缩放模式 |
251
+ | `engine` | TransformEngine 实例 |
252
+ | `stateManager` | 参考线状态管理器 |
253
+
254
+ ### Palette
255
+
256
+ | 属性 | 描述 | 默认值 |
257
+ | -------------------- | -------------- | ---------- |
258
+ | bgColor | 画布背景 | `#f6f7f9` |
259
+ | tickColor | 刻度颜色 | `#BABBBC` |
260
+ | labelColor | 刻度标签颜色 | `#7D8694` |
261
+ | guideLineColor | 参考线颜色 | `#51d6a9` |
262
+ | guideLineLockedColor | 锁定参考线颜色 | `#d4d7dc` |
263
+ | hoverBg | 标签背景色 | `#000` |
264
+ | hoverColor | 标签文字色 | `#fff` |
265
+ | borderColor | 尺子边框颜色 | `#eeeeef` |
266
+ | guideLineStyle | 参考线样式 | `'dashed'` |
267
+ | guideLineWidth | 参考线宽度 | `1` |
268
+ | labelEnabled | 是否显示标签 | `true` |
269
+
270
+ ## Minimap API
271
+
272
+ | 属性 | 描述 | 类型 | 默认值 |
273
+ | -------------- | ----------- | -------- | ------ |
274
+ | contentWidth | 内容宽度 | `number` | — |
275
+ | contentHeight | 内容高度 | `number` | — |
276
+ | viewportX | 视口 X 偏移 | `number` | — |
277
+ | viewportY | 视口 Y 偏移 | `number` | — |
278
+ | viewportWidth | 视口宽度 | `number` | — |
279
+ | viewportHeight | 视口高度 | `number` | — |
280
+ | scale | 缩放比例 | `number` | — |
281
+ | width | 缩略图宽度 | `number` | `200` |
282
+ | height | 缩略图高度 | `number` | `150` |
283
+
284
+ | 事件 | 描述 | 回调参数 |
285
+ | --------- | -------------- | ------------------------ |
286
+ | navigate | 导航到指定位置 | `(x: number, y: number)` |
287
+ | dragstart | 开始拖拽 | — |
288
+ | dragend | 结束拖拽 | — |
289
+
290
+ ## 2.x → 3.x 迁移指南
291
+
292
+ v3.x 是架构重构版本,内置 TransformEngine 替代了外部 `simple-panzoom` 依赖,并引入了 Minimap、插件系统、动画系统等全新能力。以下是核心差异与迁移要点:
293
+
294
+ ### 主要 Breaking Changes
295
+
296
+ | 变更项 | 2.x 写法 | 3.x 写法 | 说明 |
297
+ | --- | --- | --- | --- |
298
+ | **组件名** | `<SketchRule>` / `<sketch-rule>` | `<SketchRuler>` | 统一为 PascalCase 完整拼写 |
299
+ | **导入方式** | `import SketchRule from 'vue3-sketch-ruler'` | `import { SketchRuler } from 'vue3-sketch-ruler'` | 改为命名导出,同时仍保留默认导出兼容 |
300
+ | **工具栏插槽** | `#btn="{ reset, zoomIn, zoomOut }"` | `#toolbar="{ tools, state }"` | `tools` 包含 `reset`、`zoomIn`、`zoomOut`、`zoomToPreset`、`setZoomMode`、`toggleReferLine`;`state` 包含 `scale`、`offset`、`zoomMode`、`showReferLine` |
301
+ | **缩放事件** | `@zoomStart` | `v-model:scale` / `@update:scale` | 支持双向绑定,无需手动监听缩放开始 |
302
+ | **参考线事件** | `@handleLine` | `@update:lines` | 统一为 `update:` 风格事件 |
303
+ | **偏移事件** | 无 | `@update:offset` / `@zoomchange` | 3.x 新增,返回 `{ scale, x, y }` |
304
+ | **锁定事件** | 无 | `v-model:lockLine` / `@update:lockLine` | 3.x 新增双向绑定 |
305
+ | **缩放控制** | `panzoomOption` | `zoomMode`、`zoomStep`、`minZoom`、`maxZoom` | 移除 `panzoomOption`,改为内置引擎直接配置 |
306
+ | **动画系统** | 无 | `enableAnimation`、`animationMode` | 3.x 新增,支持 `ease-out`、`damped`、`exponential`、`direct` |
307
+ | **自动居中** | 依赖 panzoom 的 `startX/startY` | `autoCenter`、`initialOffset` | `autoCenter` 为 `true` 时自动计算初始偏移 |
308
+ | **阴影文字** | `showShadowText` | 移除 | 3.x 已移除该属性 |
309
+ | **palette 属性** | `lineType`、`lineColor`、`longfgColor`、`fontColor` | `guideLineStyle`、`guideLineColor`、`tickColor`、`labelColor` | 命名规范化 |
310
+ | **Expose** | `panzoomInstance` | `engine`(TransformEngine) | 直接暴露内置引擎实例 |
311
+ | **Expose 方法** | `zoomIn()`、`zoomOut()`、`reset()` | 同上,并新增 `setTransform()`、`zoomToPreset()`、`setZoomMode()` | 方法更丰富 |
312
+ | **外部依赖** | `simple-panzoom` | 零外部 panzoom 依赖 | 需从项目中移除 `simple-panzoom` |
313
+
314
+ ### 快速迁移示例
315
+
316
+ **2.x 代码:**
317
+
318
+ ```vue
319
+ <template>
320
+ <sketch-rule
321
+ ref="sketchruleRef"
322
+ v-model:scale="state.scale"
323
+ :panzoomOption="panzoomOption"
324
+ :palette="{ lineType: 'dashed', lineColor: '#51d6a9' }"
325
+ @handleLine="handleLinesChange"
326
+ >
327
+ <template #default>...</template>
328
+ <template #btn="{ reset, zoomIn, zoomOut }">
329
+ <button @click="reset">还原</button>
330
+ <button @click="zoomIn">放大</button>
331
+ <button @click="zoomOut">缩小</button>
332
+ </template>
333
+ </sketch-rule>
334
+ </template>
335
+
336
+ <script setup>
337
+ import SketchRule from 'vue3-sketch-ruler'
338
+ import { simplePanzoom } from 'simple-panzoom' // 需移除
339
+ </script>
340
+ ```
119
341
 
120
- const result = snapEngine.snap({
121
- x: 102,
122
- y: 198,
123
- targets: [
124
- { type: 'line', orientation: 'h', value: 100 },
125
- { type: 'line', orientation: 'v', value: 200 }
126
- ]
127
- })
342
+ **3.x 代码:**
343
+
344
+ ```vue
345
+ <template>
346
+ <SketchRuler
347
+ ref="sketchRef"
348
+ v-model:scale="state.scale"
349
+ v-model:offset="state.offset"
350
+ :zoom-mode="'pointer'"
351
+ :enable-animation="true"
352
+ animation-mode="ease-out"
353
+ :palette="{ guideLineStyle: 'dashed', guideLineColor: '#51d6a9' }"
354
+ @update:lines="handleLinesChange"
355
+ @zoomchange="handleZoomChange"
356
+ >
357
+ <template #default>...</template>
358
+ <template #toolbar="{ tools }">
359
+ <button @click="tools.reset">还原</button>
360
+ <button @click="tools.zoomIn">放大</button>
361
+ <button @click="tools.zoomOut">缩小</button>
362
+ <button @click="tools.zoomToPreset(1)">100%</button>
363
+ <span>{{ (tools.state.scale * 100).toFixed(0) }}%</span>
364
+ </template>
365
+ </SketchRuler>
366
+ </template>
367
+
368
+ <script setup>
369
+ import { SketchRuler } from 'vue3-sketch-ruler'
370
+ </script>
371
+ ```
128
372
 
129
- if (result.snapped) {
130
- console.log('吸附到', result.x, result.y)
131
- }
373
+ ### 自动化迁移脚本
374
+
375
+ 项目提供了官方迁移脚本,可自动处理大部分替换:
376
+
377
+ ```bash
378
+ npx vue3-sketch-ruler-migrate <path>
132
379
  ```
133
380
 
134
- ### MinimapEngine — 缩略图导航引擎
381
+ 脚本会自动处理:
135
382
 
136
- ```ts
137
- import { MinimapEngine, MinimapDragSession } from '@sketch-ruler/core'
383
+ - 组件名 `SketchRule` → `SketchRuler`
384
+ - 插槽 `#btn` `#toolbar`
385
+ - 事件 `zoomStart` → `update:scale`、`handleLine` → `update:lines`
386
+ - 检测 `simple-panzoom`、`useLine` 等需手动移除的依赖并发出警告
138
387
 
139
- const engine = new MinimapEngine({
140
- contentWidth: 1920,
141
- contentHeight: 1080,
142
- viewportWidth: 1470,
143
- viewportHeight: 700
144
- })
388
+ > ⚠️ 脚本仅为辅助工具,执行后请务必 review 变更并运行测试。
145
389
 
146
- // 更新视口状态
147
- engine.updateViewport({ x: 100, y: 50, scale: 0.5 })
390
+ ### 新增能力速览
148
391
 
149
- // 计算视口在缩略图中的矩形
150
- const rect = engine.getViewportRect(200, 150)
392
+ - **Minimap 缩略图**:独立组件,支持拖拽视口与点击跳转
393
+ - **插件系统**:通过 `plugins` 属性注入生命周期钩子
394
+ - **多画布管理器**:`CanvasManager` + `BUILTIN_TEMPLATES`
395
+ - **吸附引擎**:`snapThreshold` 配置参考线吸附阈值
396
+ - **动画引擎**:`enableAnimation` + `animationMode` 实现平滑缩放/平移
151
397
 
152
- // 拖拽会话
153
- const session = engine.startDrag(50, 50)
154
- const newPos = session.move(60, 60)
155
- engine.endDrag()
156
- ```
398
+ ---
157
399
 
158
- ### 参考线工具函数
400
+ ## 变更记录
159
401
 
160
- ```ts
161
- import { importLines, exportLines, computeLineStyle } from '@sketch-ruler/core'
162
- import type { GuideLine } from '@sketch-ruler/core'
402
+ - **v3.x** 内置 TransformEngine 替代外部 panzoom,新增 Minimap、插件系统、多画布管理器、吸附引擎、动画系统
403
+ - **v2.4.x** 多实例支持
404
+ - **v2.3.x** 引用简化版 simple-panzoom,提升性能,更新全部依赖
163
405
 
164
- // SketchRuler {h, v} 内部 GuideLine[]
165
- const guideLines: GuideLine[] = importLines({ h: [0, 250], v: [0, 500] })
406
+ ## 🌈 Who is using this?
166
407
 
167
- // 内部 GuideLine[] → SketchRuler {h, v}
168
- const lines = exportLines(guideLines) // { h: [0, 250], v: [0, 500] }
408
+ [avue大屏可视化工具](https://data.avuejs.com/build/1) ![image](https://github.com/kakajun/vue3-sketch-ruler/blob/1x/example/v2/assets/dp.png)
169
409
 
170
- // 计算参考线在 DOM 中的样式
171
- const style = computeLineStyle(guideLines[0], 1, 0, false, '#51d6a9')
172
- ```
410
+ [GoView 高效拖拽式低代码数据可视化开发平台](https://vue.mtruning.club/#/project/items)
173
411
 
174
- ### 矩阵与坐标工具
412
+ > open a PR to add your library ;)
175
413
 
176
- ```ts
177
- import {
178
- createMatrix, fromTransform, multiply, invert, toCSSString,
179
- toWorldPoint, toScreenPoint, fitRect
180
- } from '@sketch-ruler/core'
414
+ ### QQ 技术交流群:
181
415
 
182
- // 从变换状态生成矩阵
183
- const matrix = fromTransform(1.5, 100, 50)
416
+ <a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=oqnBX-qn7gkWsdfYQdvNCzYbkeNknuOc&jump_from=webapi&authKey=4YXd2jvmWYU0cN8zUky5DoCD6kz+fjUyWv782GLUjDEIHctXYviSXD/pbqxm/ZDD"><img border="0" src="https://github.com/kakajun/vue3-sketch-ruler/blob/master/packages/docs/src/assets/group.png" alt="vue3-sketch-ruler" title="点击这里加入QQ群640166628"></a>
184
417
 
185
- // 转 CSS matrix 字符串
186
- const css = toCSSString(matrix) // "matrix(1.5, 0, 0, 1.5, 100, 50)"
418
+ <div align=center>
419
+ <img src="https://github.com/kakajun/vue3-sketch-ruler/blob/master/packages/docs/src/assets/qq.png" width="243" height="287">
420
+ </div>
187
421
 
188
- // 屏幕坐标 → 世界坐标
189
- const world = toWorldPoint(matrix, 200, 200)
422
+ ## 贡献者
190
423
 
191
- // 将内容矩形适配到视口
192
- const fitted = fitRect({ width: 1920, height: 1080 }, { width: 1470, height: 700 }, 0.2)
193
- ```
424
+ <a href="https://github.com/kakajun/vue3-sketch-ruler/graphs/contributors">
425
+ <img src="https://contrib.rocks/image?repo=kakajun/vue3-sketch-ruler" />
426
+ </a>
194
427
 
195
- ### 刻度计算
428
+ ## 最后
196
429
 
197
- ```ts
198
- import { computeScaleMarks, getTickConfig, applyHysteresis } from '@sketch-ruler/core'
430
+ 这是个开源业余做的功能,欢迎加强该插件的小伙伴加入。如果 `vue3-sketch-ruler` 对您有帮助,请给个 star,您的鼓励是我最大的动力。
199
431
 
200
- const marks = computeScaleMarks({
201
- scale: 1,
202
- offset: 0,
203
- length: 800,
204
- thick: 20,
205
- config: getTickConfig(1)
206
- })
432
+ <a href='https://gitee.com/majun2232/vue3-sketch-Ruler'><img src='https://gitee.com/majun2232/vue3-sketch-Ruler/widgets/widget_4.svg' alt='Fork me on Gitee'></img></a>
207
433
 
208
- // 应用滞回避免频繁跳变
209
- const stableConfig = applyHysteresis(0.85, getTickConfig(0.8), getTickConfig(1))
210
- ```
434
+ ## 引用
211
435
 
212
- ## API 概览
213
-
214
- | 模块 | 导出 | 说明 |
215
- |------|------|------|
216
- | `TransformEngine` | 类 | 2D 仿射变换引擎,支持动画 |
217
- | `CanvasManager` | 类 | 多画布生命周期管理 |
218
- | `BUILTIN_TEMPLATES` | 常量 | 内置画布模板(A4、Web 1920、Mobile 等) |
219
- | `PluginManager` | 类 | 插件注册与生命周期调度 |
220
- | `SnapEngine` | 类 | 参考线吸附计算 |
221
- | `MinimapEngine` | 类 | 缩略图视口映射与拖拽 |
222
- | `LineManager` | 类 | 参考线增删改查 |
223
- | `importLines` / `exportLines` | 函数 | 参考线格式转换 |
224
- | `computeLineStyle` | 函数 | 参考线 DOM 样式计算 |
225
- | `computeScaleMarks` | 函数 | 刻度标记计算 |
226
- | `fromTransform` / `toWorldPoint` / `toScreenPoint` | 函数 | 矩阵与坐标转换 |
227
-
228
- ## License
229
-
230
- MIT
436
+ vue标尺组件 [vue-sketch-ruler](https://github.com/chuxiaoguo/vue-sketch-ruler.git)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sketch-ruler/core",
3
- "version": "3.0.0-beta.0",
3
+ "version": "3.0.0",
4
4
  "private": false,
5
5
  "description": "Framework-agnostic core for sketch-ruler: transform engine, state management, plugins, and scale computation.",
6
6
  "keywords": [