@edv4h/usketch-plugin-viewport-nav 2.0.12 → 2.1.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.
- package/README.md +55 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts +11 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +18 -3
- package/dist/plugin.js.map +1 -1
- package/package.json +5 -5
package/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# @edv4h/usketch-plugin-viewport-nav
|
|
2
|
+
|
|
3
|
+
ビューポート操作(ズーム / パン)を提供するプラグイン。
|
|
4
|
+
|
|
5
|
+
- **ズーム**: `Ctrl`/`Cmd` + ホイール(トラックパッドのピンチ含む)でカーソル位置を中心に拡大・縮小。
|
|
6
|
+
- **パン**: ホイール(修飾キー無し)、および中ボタンドラッグ。
|
|
7
|
+
|
|
8
|
+
## 使い方
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
import { createViewportNavPlugin } from "@edv4h/usketch-plugin-viewport-nav";
|
|
12
|
+
|
|
13
|
+
// 既定(従来どおりの体感)
|
|
14
|
+
createViewportNavPlugin();
|
|
15
|
+
|
|
16
|
+
// ズーム感度を上げる
|
|
17
|
+
createViewportNavPlugin({ zoomSensitivity: 2.5 });
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## オプション
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
interface ViewportNavOptions {
|
|
24
|
+
/**
|
|
25
|
+
* ホイール/トラックパッドのズーム感度。`1` が既定で従来相当。
|
|
26
|
+
* 大きいほど 1 操作あたりの倍率変化が大きくなる(0.25〜3 にクランプ)。
|
|
27
|
+
* 値だけでなく「ライブに読む getter」も渡せる(設定 UI からの即時反映用)。
|
|
28
|
+
*/
|
|
29
|
+
zoomSensitivity?: number | (() => number);
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### ズーム量の算出
|
|
34
|
+
|
|
35
|
+
ズーム係数は `deltaY` の**大きさ**に比例する:
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
factor = exp(-deltaY * 0.001 * zoomSensitivity)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
- 従来は `deltaY` の符号だけで `0.9 / 1.1` に固定していたため、小さい `deltaY` を大量に出す
|
|
42
|
+
トラックパッドのピンチと `deltaY≈±100` のマウスホイールとで体感速度が大きく異なっていた。
|
|
43
|
+
比例式にすることで両者の差が縮まり、ピンチも滑らかになる。
|
|
44
|
+
- `zoomSensitivity` 省略時(=1)は `deltaY≈100` で `factor≈0.905`、`deltaY≈-100` で `≈1.105` と
|
|
45
|
+
なり、**従来の 0.9 / 1.1 とほぼ同じ**(後方互換)。
|
|
46
|
+
|
|
47
|
+
### ライブ反映(getter 形式)
|
|
48
|
+
|
|
49
|
+
設定 UI のスライダー等で感度を即時反映したい場合は getter を渡す。wheel イベントごとに評価される。
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
let zoomSensitivity = 1;
|
|
53
|
+
createViewportNavPlugin({ zoomSensitivity: () => zoomSensitivity });
|
|
54
|
+
// 以降 zoomSensitivity を書き換えれば次のズームから反映される
|
|
55
|
+
```
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { createViewportNavPlugin } from "./plugin.js";
|
|
1
|
+
export { createViewportNavPlugin, type ViewportNavOptions } from "./plugin.js";
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA2B,MAAM,aAAa,CAAC"}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
1
|
import type { UsketchPlugin } from "@edv4h/usketch-shared";
|
|
2
|
-
export
|
|
2
|
+
export interface ViewportNavOptions {
|
|
3
|
+
/**
|
|
4
|
+
* ホイール/トラックパッドのズーム感度。`1` が既定で従来相当。
|
|
5
|
+
* 大きいほど 1 操作あたりの倍率変化が大きくなる({@link MIN_ZOOM_SENSITIVITY}〜{@link MAX_ZOOM_SENSITIVITY} にクランプ)。
|
|
6
|
+
*
|
|
7
|
+
* 設定 UI からの即時反映のため、値だけでなく「ライブに読む getter」も渡せる。
|
|
8
|
+
* getter は wheel イベントごとに評価される。
|
|
9
|
+
*/
|
|
10
|
+
zoomSensitivity?: number | (() => number);
|
|
11
|
+
}
|
|
12
|
+
export declare function createViewportNavPlugin(options?: ViewportNavOptions): UsketchPlugin;
|
|
3
13
|
//# sourceMappingURL=plugin.d.ts.map
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKX,aAAa,EACb,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKX,aAAa,EACb,MAAM,uBAAuB,CAAC;AAW/B,MAAM,WAAW,kBAAkB;IAClC;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;CAC1C;AASD,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,aAAa,CAyDnF"}
|
package/dist/plugin.js
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
/** ホイール/トラックパッドのズーム係数の基準ステップ。
|
|
2
|
+
* 既定感度(=1)で deltaY≈100 → factor≈exp(-0.1)≈0.905、deltaY≈-100 → ≈1.105 となり、
|
|
3
|
+
* 従来の固定 0.9 / 1.1 とほぼ同じ体感になる。 */
|
|
4
|
+
const ZOOM_STEP = 0.001;
|
|
5
|
+
/** zoomSensitivity のクランプ範囲(極端な値で操作不能になるのを防ぐ)。 */
|
|
6
|
+
const MIN_ZOOM_SENSITIVITY = 0.25;
|
|
7
|
+
const MAX_ZOOM_SENSITIVITY = 3;
|
|
8
|
+
/** number | (() => number) を解決し、有効な感度値へクランプする。 */
|
|
9
|
+
function resolveZoomSensitivity(source) {
|
|
10
|
+
const raw = typeof source === "function" ? source() : source;
|
|
11
|
+
if (typeof raw !== "number" || !Number.isFinite(raw))
|
|
12
|
+
return 1;
|
|
13
|
+
return Math.min(MAX_ZOOM_SENSITIVITY, Math.max(MIN_ZOOM_SENSITIVITY, raw));
|
|
14
|
+
}
|
|
15
|
+
export function createViewportNavPlugin(options) {
|
|
2
16
|
return {
|
|
3
17
|
id: "usketch-plugin-viewport-nav",
|
|
4
18
|
name: "ビューポートナビゲーション",
|
|
@@ -8,9 +22,10 @@ export function createViewportNavPlugin() {
|
|
|
8
22
|
// ── Wheel: zoom & pan ──
|
|
9
23
|
const offWheel = ctx.events.on("canvas:wheel", (event) => {
|
|
10
24
|
if (event.ctrlKey || event.metaKey) {
|
|
11
|
-
// Zoom toward cursor
|
|
25
|
+
// Zoom toward cursor — factor は deltaY の大きさに比例(トラックパッドのピンチも滑らか)
|
|
12
26
|
const viewport = ctx.store.getViewport();
|
|
13
|
-
const
|
|
27
|
+
const sensitivity = resolveZoomSensitivity(options?.zoomSensitivity);
|
|
28
|
+
const factor = Math.exp(-event.deltaY * ZOOM_STEP * sensitivity);
|
|
14
29
|
ctx.store.zoomTo(viewport.zoom * factor, event.screenPoint);
|
|
15
30
|
}
|
|
16
31
|
else {
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,uBAAuB;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@edv4h/usketch-plugin-viewport-nav",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@edv4h/usketch-core": "2.4.
|
|
16
|
-
"@edv4h/usketch-shared": "4.
|
|
17
|
-
"@edv4h/usketch-store": "3.5.
|
|
15
|
+
"@edv4h/usketch-core": "2.4.2",
|
|
16
|
+
"@edv4h/usketch-shared": "4.12.0",
|
|
17
|
+
"@edv4h/usketch-store": "3.5.4"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"typescript": "7.0.2",
|
|
21
|
-
"vitest": "4.1.
|
|
21
|
+
"vitest": "4.1.11"
|
|
22
22
|
},
|
|
23
23
|
"publishConfig": {
|
|
24
24
|
"access": "public"
|