@edv4h/usketch-plugin-shape-freedraw 3.0.2 → 3.1.1

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 (60) hide show
  1. package/README.md +59 -0
  2. package/dist/config.d.ts +54 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +46 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/draw-tool.d.ts +12 -0
  7. package/dist/draw-tool.d.ts.map +1 -0
  8. package/dist/draw-tool.js +202 -0
  9. package/dist/draw-tool.js.map +1 -0
  10. package/dist/eraser.d.ts +10 -0
  11. package/dist/eraser.d.ts.map +1 -0
  12. package/dist/eraser.js +33 -0
  13. package/dist/eraser.js.map +1 -0
  14. package/dist/geometry/brush-outline.d.ts +19 -0
  15. package/dist/geometry/brush-outline.d.ts.map +1 -0
  16. package/dist/geometry/brush-outline.js +59 -0
  17. package/dist/geometry/brush-outline.js.map +1 -0
  18. package/dist/geometry/hit.d.ts +17 -0
  19. package/dist/geometry/hit.d.ts.map +1 -0
  20. package/dist/geometry/hit.js +101 -0
  21. package/dist/geometry/hit.js.map +1 -0
  22. package/dist/geometry/simplify.d.ts +7 -0
  23. package/dist/geometry/simplify.d.ts.map +1 -0
  24. package/dist/geometry/simplify.js +47 -0
  25. package/dist/geometry/simplify.js.map +1 -0
  26. package/dist/geometry/smooth-path.d.ts +9 -0
  27. package/dist/geometry/smooth-path.d.ts.map +1 -0
  28. package/dist/geometry/smooth-path.js +21 -0
  29. package/dist/geometry/smooth-path.js.map +1 -0
  30. package/dist/index.d.ts +3 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +2 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/pen-meta.d.ts +26 -0
  35. package/dist/pen-meta.d.ts.map +1 -0
  36. package/dist/pen-meta.js +39 -0
  37. package/dist/pen-meta.js.map +1 -0
  38. package/dist/plugin.d.ts +3 -2
  39. package/dist/plugin.d.ts.map +1 -1
  40. package/dist/plugin.js +106 -255
  41. package/dist/plugin.js.map +1 -1
  42. package/dist/settings-store.d.ts +22 -0
  43. package/dist/settings-store.d.ts.map +1 -0
  44. package/dist/settings-store.js +65 -0
  45. package/dist/settings-store.js.map +1 -0
  46. package/dist/shape.d.ts +6 -0
  47. package/dist/shape.d.ts.map +1 -0
  48. package/dist/shape.js +193 -0
  49. package/dist/shape.js.map +1 -0
  50. package/dist/types.d.ts +20 -3
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/ui/cursor-overlay.d.ts +21 -0
  53. package/dist/ui/cursor-overlay.d.ts.map +1 -0
  54. package/dist/ui/cursor-overlay.js +48 -0
  55. package/dist/ui/cursor-overlay.js.map +1 -0
  56. package/dist/ui/palette.d.ts +14 -0
  57. package/dist/ui/palette.d.ts.map +1 -0
  58. package/dist/ui/palette.js +89 -0
  59. package/dist/ui/palette.js.map +1 -0
  60. package/package.json +6 -4
@@ -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
@@ -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
@@ -1,2 +1,4 @@
1
+ export { 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
4
  //# sourceMappingURL=index.js.map
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"}
@@ -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 { type UsketchPlugin } from "@edv4h/usketch-shared";
2
- export declare function createFreedrawPlugin(): UsketchPlugin;
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
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"AAAA,OAAO,EAYN,KAAK,aAAa,EAClB,MAAM,uBAAuB,CAAC;AAmN/B,wBAAgB,oBAAoB,IAAI,aAAa,CAkGpD"}
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"}