@edv4h/usketch-plugin-shape-freedraw 3.0.2 → 3.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 +59 -0
- package/dist/config.d.ts +54 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +46 -0
- package/dist/config.js.map +1 -0
- package/dist/draw-tool.d.ts +12 -0
- package/dist/draw-tool.d.ts.map +1 -0
- package/dist/draw-tool.js +202 -0
- package/dist/draw-tool.js.map +1 -0
- package/dist/eraser.d.ts +10 -0
- package/dist/eraser.d.ts.map +1 -0
- package/dist/eraser.js +33 -0
- package/dist/eraser.js.map +1 -0
- package/dist/geometry/brush-outline.d.ts +19 -0
- package/dist/geometry/brush-outline.d.ts.map +1 -0
- package/dist/geometry/brush-outline.js +59 -0
- package/dist/geometry/brush-outline.js.map +1 -0
- package/dist/geometry/hit.d.ts +17 -0
- package/dist/geometry/hit.d.ts.map +1 -0
- package/dist/geometry/hit.js +101 -0
- package/dist/geometry/hit.js.map +1 -0
- package/dist/geometry/simplify.d.ts +7 -0
- package/dist/geometry/simplify.d.ts.map +1 -0
- package/dist/geometry/simplify.js +47 -0
- package/dist/geometry/simplify.js.map +1 -0
- package/dist/geometry/smooth-path.d.ts +9 -0
- package/dist/geometry/smooth-path.d.ts.map +1 -0
- package/dist/geometry/smooth-path.js +21 -0
- package/dist/geometry/smooth-path.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/pen-meta.d.ts +26 -0
- package/dist/pen-meta.d.ts.map +1 -0
- package/dist/pen-meta.js +39 -0
- package/dist/pen-meta.js.map +1 -0
- package/dist/plugin.d.ts +3 -2
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +106 -255
- package/dist/plugin.js.map +1 -1
- package/dist/settings-store.d.ts +22 -0
- package/dist/settings-store.d.ts.map +1 -0
- package/dist/settings-store.js +65 -0
- package/dist/settings-store.js.map +1 -0
- package/dist/shape.d.ts +6 -0
- package/dist/shape.d.ts.map +1 -0
- package/dist/shape.js +193 -0
- package/dist/shape.js.map +1 -0
- package/dist/types.d.ts +20 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/cursor-overlay.d.ts +21 -0
- package/dist/ui/cursor-overlay.d.ts.map +1 -0
- package/dist/ui/cursor-overlay.js +48 -0
- package/dist/ui/cursor-overlay.js.map +1 -0
- package/dist/ui/palette.d.ts +14 -0
- package/dist/ui/palette.d.ts.map +1 -0
- package/dist/ui/palette.js +89 -0
- package/dist/ui/palette.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { penMeta } from "../pen-meta.js";
|
|
2
|
+
/** 点ごとの実効半幅(world px)。可変ペンは p×size、一定ペンは size 基準。 */
|
|
3
|
+
function halfWidthAt(pt, pen, size) {
|
|
4
|
+
const m = penMeta(pen);
|
|
5
|
+
if (m.variable) {
|
|
6
|
+
const min = Math.max(0.6, size * 0.22);
|
|
7
|
+
const max = size * 1.55;
|
|
8
|
+
const w = min + (max - min) * (pt.p ?? 0.5);
|
|
9
|
+
return w / 2;
|
|
10
|
+
}
|
|
11
|
+
return size / 2;
|
|
12
|
+
}
|
|
13
|
+
/** ストロークの最大半幅。 */
|
|
14
|
+
export function maxHalfWidth(data) {
|
|
15
|
+
const size = data.style?.strokeWidth ?? 1;
|
|
16
|
+
const m = penMeta(data.pen);
|
|
17
|
+
return m.variable ? (size * 1.55) / 2 : size / 2;
|
|
18
|
+
}
|
|
19
|
+
/** 点列 + 最大半幅で bbox を算出(細い線でも掴める)。 */
|
|
20
|
+
export function strokeBounds(data) {
|
|
21
|
+
const points = data.points ?? [];
|
|
22
|
+
if (points.length === 0) {
|
|
23
|
+
return { x: data.x, y: data.y, width: 0, height: 0 };
|
|
24
|
+
}
|
|
25
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
26
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
27
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
28
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
29
|
+
for (const p of points) {
|
|
30
|
+
if (p.x < minX)
|
|
31
|
+
minX = p.x;
|
|
32
|
+
if (p.y < minY)
|
|
33
|
+
minY = p.y;
|
|
34
|
+
if (p.x > maxX)
|
|
35
|
+
maxX = p.x;
|
|
36
|
+
if (p.y > maxY)
|
|
37
|
+
maxY = p.y;
|
|
38
|
+
}
|
|
39
|
+
const pad = maxHalfWidth(data);
|
|
40
|
+
return {
|
|
41
|
+
x: minX - pad,
|
|
42
|
+
y: minY - pad,
|
|
43
|
+
width: maxX - minX + pad * 2,
|
|
44
|
+
height: maxY - minY + pad * 2,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** 点 p から線分 ab までの距離の2乗。 */
|
|
48
|
+
function distToSegment2(p, a, b) {
|
|
49
|
+
const dx = b.x - a.x;
|
|
50
|
+
const dy = b.y - a.y;
|
|
51
|
+
const len2 = dx * dx + dy * dy;
|
|
52
|
+
let t = len2 > 0 ? ((p.x - a.x) * dx + (p.y - a.y) * dy) / len2 : 0;
|
|
53
|
+
t = Math.max(0, Math.min(1, t));
|
|
54
|
+
const cx = a.x + t * dx;
|
|
55
|
+
const cy = a.y + t * dy;
|
|
56
|
+
const ex = p.x - cx;
|
|
57
|
+
const ey = p.y - cy;
|
|
58
|
+
return ex * ex + ey * ey;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 折れ線距離による hitTest。点が線(半幅 + tolerance 内)に乗っていれば true。
|
|
62
|
+
* 1点ストロークは円として判定。
|
|
63
|
+
*/
|
|
64
|
+
export function hitStroke(data, point, tolerance = 2) {
|
|
65
|
+
const points = data.points ?? [];
|
|
66
|
+
const size = data.style?.strokeWidth ?? 1;
|
|
67
|
+
if (points.length === 0)
|
|
68
|
+
return false;
|
|
69
|
+
if (points.length === 1) {
|
|
70
|
+
const r = halfWidthAt(points[0], data.pen, size) + tolerance;
|
|
71
|
+
const dx = point.x - points[0].x;
|
|
72
|
+
const dy = point.y - points[0].y;
|
|
73
|
+
return dx * dx + dy * dy <= r * r;
|
|
74
|
+
}
|
|
75
|
+
for (let i = 1; i < points.length; i++) {
|
|
76
|
+
const a = points[i - 1];
|
|
77
|
+
const b = points[i];
|
|
78
|
+
const half = Math.max(halfWidthAt(a, data.pen, size), halfWidthAt(b, data.pen, size));
|
|
79
|
+
const r = half + tolerance;
|
|
80
|
+
if (distToSegment2(point, a, b) <= r * r)
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 消しゴム判定(設計書 §8)。いずれかの点が消しゴム円(r + 半幅)に入れば true。
|
|
87
|
+
* @param r 消しゴム半径 = eraserSize/2 + 1
|
|
88
|
+
*/
|
|
89
|
+
export function eraserHits(data, cursor, r) {
|
|
90
|
+
const points = data.points ?? [];
|
|
91
|
+
const size = data.style?.strokeWidth ?? 1;
|
|
92
|
+
for (const pt of points) {
|
|
93
|
+
const half = halfWidthAt(pt, data.pen, size);
|
|
94
|
+
const dx = pt.x - cursor.x;
|
|
95
|
+
const dy = pt.y - cursor.y;
|
|
96
|
+
if (Math.hypot(dx, dy) <= r + half)
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=hit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hit.js","sourceRoot":"","sources":["../../src/geometry/hit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { StrokePoint } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Ramer–Douglas–Peucker 間引き。確定時に点数を削減して store/Yjs サイズを抑える。
|
|
4
|
+
* 端点と各点の `p`(疑似筆圧)は保持。tolerance が 0 以下なら原本を返す。
|
|
5
|
+
*/
|
|
6
|
+
export declare function simplifyPoints(points: StrokePoint[], tolerance: number): StrokePoint[];
|
|
7
|
+
//# sourceMappingURL=simplify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simplify.d.ts","sourceRoot":"","sources":["../../src/geometry/simplify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAe/C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,CA4BtF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
function segDist2(p, a, b) {
|
|
2
|
+
const dx = b.x - a.x;
|
|
3
|
+
const dy = b.y - a.y;
|
|
4
|
+
const len2 = dx * dx + dy * dy;
|
|
5
|
+
let t = len2 > 0 ? ((p.x - a.x) * dx + (p.y - a.y) * dy) / len2 : 0;
|
|
6
|
+
t = Math.max(0, Math.min(1, t));
|
|
7
|
+
const cx = a.x + t * dx;
|
|
8
|
+
const cy = a.y + t * dy;
|
|
9
|
+
const ex = p.x - cx;
|
|
10
|
+
const ey = p.y - cy;
|
|
11
|
+
return ex * ex + ey * ey;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Ramer–Douglas–Peucker 間引き。確定時に点数を削減して store/Yjs サイズを抑える。
|
|
15
|
+
* 端点と各点の `p`(疑似筆圧)は保持。tolerance が 0 以下なら原本を返す。
|
|
16
|
+
*/
|
|
17
|
+
export function simplifyPoints(points, tolerance) {
|
|
18
|
+
if (tolerance <= 0 || points.length <= 2)
|
|
19
|
+
return points;
|
|
20
|
+
const tol2 = tolerance * tolerance;
|
|
21
|
+
const keep = new Array(points.length).fill(false);
|
|
22
|
+
keep[0] = true;
|
|
23
|
+
keep[points.length - 1] = true;
|
|
24
|
+
const stack = [[0, points.length - 1]];
|
|
25
|
+
while (stack.length) {
|
|
26
|
+
const [first, last] = stack.pop();
|
|
27
|
+
let maxD = 0;
|
|
28
|
+
let idx = -1;
|
|
29
|
+
for (let i = first + 1; i < last; i++) {
|
|
30
|
+
const d = segDist2(points[i], points[first], points[last]);
|
|
31
|
+
if (d > maxD) {
|
|
32
|
+
maxD = d;
|
|
33
|
+
idx = i;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (maxD > tol2 && idx !== -1) {
|
|
37
|
+
keep[idx] = true;
|
|
38
|
+
stack.push([first, idx], [idx, last]);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const out = [];
|
|
42
|
+
for (let i = 0; i < points.length; i++)
|
|
43
|
+
if (keep[i])
|
|
44
|
+
out.push(points[i]);
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=simplify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simplify.js","sourceRoot":"","sources":["../../src/geometry/simplify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { StrokePoint } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* 一定幅ペンの平滑化パス(設計書 4.2)。
|
|
4
|
+
* 点列を結ぶのではなく「各点間の中点を通る二次ベジェ」で描く。
|
|
5
|
+
* 制御点=実点, 終点=中点。最後は最終点へ直線。
|
|
6
|
+
* 点が2未満なら空文字(呼び出し側が円で描画)。
|
|
7
|
+
*/
|
|
8
|
+
export declare function smoothPathD(points: StrokePoint[]): string;
|
|
9
|
+
//# sourceMappingURL=smooth-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smooth-path.d.ts","sourceRoot":"","sources":["../../src/geometry/smooth-path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAWzD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const r2 = (n) => Math.round(n * 100) / 100;
|
|
2
|
+
/**
|
|
3
|
+
* 一定幅ペンの平滑化パス(設計書 4.2)。
|
|
4
|
+
* 点列を結ぶのではなく「各点間の中点を通る二次ベジェ」で描く。
|
|
5
|
+
* 制御点=実点, 終点=中点。最後は最終点へ直線。
|
|
6
|
+
* 点が2未満なら空文字(呼び出し側が円で描画)。
|
|
7
|
+
*/
|
|
8
|
+
export function smoothPathD(points) {
|
|
9
|
+
const n = points.length;
|
|
10
|
+
if (n < 2)
|
|
11
|
+
return "";
|
|
12
|
+
let d = `M ${r2(points[0].x)} ${r2(points[0].y)}`;
|
|
13
|
+
for (let i = 1; i < n - 1; i++) {
|
|
14
|
+
const mx = (points[i].x + points[i + 1].x) / 2;
|
|
15
|
+
const my = (points[i].y + points[i + 1].y) / 2;
|
|
16
|
+
d += ` Q ${r2(points[i].x)} ${r2(points[i].y)} ${r2(mx)} ${r2(my)}`;
|
|
17
|
+
}
|
|
18
|
+
d += ` L ${r2(points[n - 1].x)} ${r2(points[n - 1].y)}`;
|
|
19
|
+
return d;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=smooth-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smooth-path.js","sourceRoot":"","sources":["../../src/geometry/smooth-path.ts"],"names":[],"mappings":"AAEA,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,MAAqB;IAChD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACrB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC,IAAI,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACrE,CAAC;IACD,CAAC,IAAI,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,OAAO,CAAC,CAAC;AACV,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export { type FreedrawConfig, type FreedrawConfigInput, FreedrawConfigSchema, parseFreedrawConfig, } from "./config.js";
|
|
2
|
+
export { DEFAULT_PEN, PEN_KINDS, PEN_META, PRESET_COLORS } from "./pen-meta.js";
|
|
1
3
|
export { createFreedrawPlugin } from "./plugin.js";
|
|
2
|
-
export type { FreedrawShapeData } from "./types.js";
|
|
4
|
+
export type { FreedrawShapeData, PenKind, StrokePoint } from "./types.js";
|
|
3
5
|
//# 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,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,oBAAoB,EACpB,mBAAmB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,oBAAoB,EACpB,mBAAmB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { PenKind } from "./types.js";
|
|
2
|
+
/** 合成モード(CSS mix-blend-mode に対応)。 */
|
|
3
|
+
export type BlendMode = "normal" | "multiply";
|
|
4
|
+
export interface PenMeta {
|
|
5
|
+
label: string;
|
|
6
|
+
/** 既定太さ(設計書 §3)。 */
|
|
7
|
+
defaultSize: number;
|
|
8
|
+
/** 線幅が可変か(筆ペンのみ true)。 */
|
|
9
|
+
variable: boolean;
|
|
10
|
+
/** 不透明度。 */
|
|
11
|
+
alpha: number;
|
|
12
|
+
/** 合成モード。 */
|
|
13
|
+
blend: BlendMode;
|
|
14
|
+
}
|
|
15
|
+
/** 設計書 §3 のペン表。 */
|
|
16
|
+
export declare const PEN_META: Record<PenKind, PenMeta>;
|
|
17
|
+
export declare const PEN_KINDS: PenKind[];
|
|
18
|
+
/** 省略時のペン(後方互換)。 */
|
|
19
|
+
export declare const DEFAULT_PEN: PenKind;
|
|
20
|
+
/** プリセット8色(Wevox グラフパレット由来、設計書 §6)。既定は先頭。 */
|
|
21
|
+
export declare const PRESET_COLORS: string[];
|
|
22
|
+
/** ペンの太さの既定値。 */
|
|
23
|
+
export declare const DEFAULT_SIZES: Record<PenKind, number>;
|
|
24
|
+
/** `pen` から PenMeta を取得(不明値は ballpoint にフォールバック)。 */
|
|
25
|
+
export declare function penMeta(pen: PenKind | undefined): PenMeta;
|
|
26
|
+
//# sourceMappingURL=pen-meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pen-meta.d.ts","sourceRoot":"","sources":["../src/pen-meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE9C,MAAM,WAAW,OAAO;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,KAAK,EAAE,SAAS,CAAC;CACjB;AAED,mBAAmB;AACnB,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAW7C,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,OAAO,EAAkD,CAAC;AAElF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,OAAqB,CAAC;AAEhD,6CAA6C;AAC7C,eAAO,MAAM,aAAa,UASzB,CAAC;AAEF,iBAAiB;AACjB,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAKjD,CAAC;AAEF,qDAAqD;AACrD,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAEzD"}
|
package/dist/pen-meta.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** 設計書 §3 のペン表。 */
|
|
2
|
+
export const PEN_META = {
|
|
3
|
+
ballpoint: { label: "ボールペン", defaultSize: 2.5, variable: false, alpha: 1, blend: "normal" },
|
|
4
|
+
felt: { label: "サインペン", defaultSize: 6, variable: false, alpha: 1, blend: "normal" },
|
|
5
|
+
brush: { label: "筆ペン", defaultSize: 11, variable: true, alpha: 1, blend: "normal" },
|
|
6
|
+
highlighter: {
|
|
7
|
+
label: "蛍光ペン",
|
|
8
|
+
defaultSize: 22,
|
|
9
|
+
variable: false,
|
|
10
|
+
alpha: 0.4,
|
|
11
|
+
blend: "multiply",
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
export const PEN_KINDS = ["ballpoint", "felt", "brush", "highlighter"];
|
|
15
|
+
/** 省略時のペン(後方互換)。 */
|
|
16
|
+
export const DEFAULT_PEN = "ballpoint";
|
|
17
|
+
/** プリセット8色(Wevox グラフパレット由来、設計書 §6)。既定は先頭。 */
|
|
18
|
+
export const PRESET_COLORS = [
|
|
19
|
+
"#191C1C",
|
|
20
|
+
"#DA3F00",
|
|
21
|
+
"#FF8C00",
|
|
22
|
+
"#E49D00",
|
|
23
|
+
"#00A573",
|
|
24
|
+
"#008484",
|
|
25
|
+
"#0050E4",
|
|
26
|
+
"#A42C80",
|
|
27
|
+
];
|
|
28
|
+
/** ペンの太さの既定値。 */
|
|
29
|
+
export const DEFAULT_SIZES = {
|
|
30
|
+
ballpoint: PEN_META.ballpoint.defaultSize,
|
|
31
|
+
felt: PEN_META.felt.defaultSize,
|
|
32
|
+
brush: PEN_META.brush.defaultSize,
|
|
33
|
+
highlighter: PEN_META.highlighter.defaultSize,
|
|
34
|
+
};
|
|
35
|
+
/** `pen` から PenMeta を取得(不明値は ballpoint にフォールバック)。 */
|
|
36
|
+
export function penMeta(pen) {
|
|
37
|
+
return PEN_META[pen ?? DEFAULT_PEN] ?? PEN_META[DEFAULT_PEN];
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=pen-meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pen-meta.js","sourceRoot":"","sources":["../src/pen-meta.ts"],"names":[],"mappings":"AAiBA,mBAAmB;AACnB,MAAM,CAAC,MAAM,QAAQ,GAA6B;IACjD,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC3F,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;IACpF,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;IACnF,WAAW,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,EAAE;QACf,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,UAAU;KACjB;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AAElF,oBAAoB;AACpB,MAAM,CAAC,MAAM,WAAW,GAAY,WAAW,CAAC;AAEhD,6CAA6C;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAG;IAC5B,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACT,CAAC;AAEF,iBAAiB;AACjB,MAAM,CAAC,MAAM,aAAa,GAA4B;IACrD,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,WAAW;IACzC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW;IAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW;IACjC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAW;CAC7C,CAAC;AAEF,qDAAqD;AACrD,MAAM,UAAU,OAAO,CAAC,GAAwB;IAC/C,OAAO,QAAQ,CAAC,GAAG,IAAI,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC9D,CAAC"}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import type { UsketchPlugin } from "@edv4h/usketch-shared";
|
|
2
|
+
import { type FreedrawConfigInput } from "./config.js";
|
|
3
|
+
export declare function createFreedrawPlugin(configInput?: FreedrawConfigInput): UsketchPlugin;
|
|
3
4
|
//# 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.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,KAAK,mBAAmB,EAAuB,MAAM,aAAa,CAAC;AA2C5E,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,aAAa,CAqGrF"}
|