@edv4h/usketch-plugin-tool-select 1.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 EdV4H
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,5 @@
1
+ export declare function setMovingSelection(value: boolean): void;
2
+ export declare function getMovingSelection(): boolean;
3
+ export declare function subscribeMovingSelection(cb: () => void): () => void;
4
+ export declare function clearMovingSelectionListeners(): void;
5
+ //# sourceMappingURL=drag-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drag-state.d.ts","sourceRoot":"","sources":["../src/drag-state.ts"],"names":[],"mappings":"AAOA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAIvD;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAGnE;AAED,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD"}
@@ -0,0 +1,23 @@
1
+ let movingSelection = false;
2
+ const listeners = new Set();
3
+ function notify() {
4
+ for (const fn of listeners)
5
+ fn();
6
+ }
7
+ export function setMovingSelection(value) {
8
+ if (movingSelection === value)
9
+ return;
10
+ movingSelection = value;
11
+ notify();
12
+ }
13
+ export function getMovingSelection() {
14
+ return movingSelection;
15
+ }
16
+ export function subscribeMovingSelection(cb) {
17
+ listeners.add(cb);
18
+ return () => listeners.delete(cb);
19
+ }
20
+ export function clearMovingSelectionListeners() {
21
+ listeners.clear();
22
+ }
23
+ //# sourceMappingURL=drag-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drag-state.js","sourceRoot":"","sources":["../src/drag-state.ts"],"names":[],"mappings":"AAAA,IAAI,eAAe,GAAG,KAAK,CAAC;AAC5B,MAAM,SAAS,GAAoB,IAAI,GAAG,EAAE,CAAC;AAE7C,SAAS,MAAM;IACd,KAAK,MAAM,EAAE,IAAI,SAAS;QAAE,EAAE,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAChD,IAAI,eAAe,KAAK,KAAK;QAAE,OAAO;IACtC,eAAe,GAAG,KAAK,CAAC;IACxB,MAAM,EAAE,CAAC;AACV,CAAC;AAED,MAAM,UAAU,kBAAkB;IACjC,OAAO,eAAe,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,EAAc;IACtD,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,6BAA6B;IAC5C,SAAS,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** State for drop target indicator (frame under dragged shape) */
2
+ export declare function getDropTargetId(): string | null;
3
+ export declare function setDropTargetId(id: string | null): void;
4
+ export declare function subscribeDropTarget(listener: () => void): () => void;
5
+ export declare function clearDropTargetListeners(): void;
6
+ //# sourceMappingURL=drop-target-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drop-target-state.d.ts","sourceRoot":"","sources":["../src/drop-target-state.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAKlE,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAMvD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAKpE;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C"}
@@ -0,0 +1,25 @@
1
+ /** State for drop target indicator (frame under dragged shape) */
2
+ let dropTargetId = null;
3
+ const listeners = new Set();
4
+ export function getDropTargetId() {
5
+ return dropTargetId;
6
+ }
7
+ export function setDropTargetId(id) {
8
+ if (dropTargetId === id)
9
+ return;
10
+ dropTargetId = id;
11
+ for (const listener of listeners) {
12
+ listener();
13
+ }
14
+ }
15
+ export function subscribeDropTarget(listener) {
16
+ listeners.add(listener);
17
+ return () => {
18
+ listeners.delete(listener);
19
+ };
20
+ }
21
+ export function clearDropTargetListeners() {
22
+ listeners.clear();
23
+ dropTargetId = null;
24
+ }
25
+ //# sourceMappingURL=drop-target-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drop-target-state.js","sourceRoot":"","sources":["../src/drop-target-state.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,IAAI,YAAY,GAAkB,IAAI,CAAC;AACvC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;AAExC,MAAM,UAAU,eAAe;IAC9B,OAAO,YAAY,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAiB;IAChD,IAAI,YAAY,KAAK,EAAE;QAAE,OAAO;IAChC,YAAY,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,QAAQ,EAAE,CAAC;IACZ,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAoB;IACvD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACX,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB;IACvC,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,YAAY,GAAG,IAAI,CAAC;AACrB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** State for group editing mode (double-click to enter, click outside to exit) */
2
+ export declare function getEditingGroupId(): string | null;
3
+ export declare function setEditingGroupId(id: string | null): void;
4
+ export declare function subscribeEditingGroup(listener: () => void): () => void;
5
+ export declare function clearEditingGroupListeners(): void;
6
+ //# sourceMappingURL=group-edit-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-edit-state.d.ts","sourceRoot":"","sources":["../src/group-edit-state.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAKlF,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAMzD;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAKtE;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAGjD"}
@@ -0,0 +1,25 @@
1
+ /** State for group editing mode (double-click to enter, click outside to exit) */
2
+ let editingGroupId = null;
3
+ const listeners = new Set();
4
+ export function getEditingGroupId() {
5
+ return editingGroupId;
6
+ }
7
+ export function setEditingGroupId(id) {
8
+ if (editingGroupId === id)
9
+ return;
10
+ editingGroupId = id;
11
+ for (const listener of listeners) {
12
+ listener();
13
+ }
14
+ }
15
+ export function subscribeEditingGroup(listener) {
16
+ listeners.add(listener);
17
+ return () => {
18
+ listeners.delete(listener);
19
+ };
20
+ }
21
+ export function clearEditingGroupListeners() {
22
+ listeners.clear();
23
+ editingGroupId = null;
24
+ }
25
+ //# sourceMappingURL=group-edit-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-edit-state.js","sourceRoot":"","sources":["../src/group-edit-state.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,IAAI,cAAc,GAAkB,IAAI,CAAC;AACzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;AAExC,MAAM,UAAU,iBAAiB;IAChC,OAAO,cAAc,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAiB;IAClD,IAAI,cAAc,KAAK,EAAE;QAAE,OAAO;IAClC,cAAc,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,QAAQ,EAAE,CAAC;IACZ,CAAC;AACF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAoB;IACzD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACX,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B;IACzC,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,cAAc,GAAG,IAAI,CAAC;AACvB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** State for hover indicator (shape under cursor) */
2
+ export declare function getHoveredShapeId(): string | null;
3
+ export declare function setHoveredShapeId(id: string | null): void;
4
+ export declare function subscribeHoveredShape(listener: () => void): () => void;
5
+ export declare function clearHoveredShapeListeners(): void;
6
+ //# sourceMappingURL=hover-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-state.d.ts","sourceRoot":"","sources":["../src/hover-state.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAKrD,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAMzD;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAKtE;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAGjD"}
@@ -0,0 +1,25 @@
1
+ /** State for hover indicator (shape under cursor) */
2
+ let hoveredShapeId = null;
3
+ const listeners = new Set();
4
+ export function getHoveredShapeId() {
5
+ return hoveredShapeId;
6
+ }
7
+ export function setHoveredShapeId(id) {
8
+ if (hoveredShapeId === id)
9
+ return;
10
+ hoveredShapeId = id;
11
+ for (const listener of listeners) {
12
+ listener();
13
+ }
14
+ }
15
+ export function subscribeHoveredShape(listener) {
16
+ listeners.add(listener);
17
+ return () => {
18
+ listeners.delete(listener);
19
+ };
20
+ }
21
+ export function clearHoveredShapeListeners() {
22
+ listeners.clear();
23
+ hoveredShapeId = null;
24
+ }
25
+ //# sourceMappingURL=hover-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-state.js","sourceRoot":"","sources":["../src/hover-state.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,IAAI,cAAc,GAAkB,IAAI,CAAC;AACzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;AAExC,MAAM,UAAU,iBAAiB;IAChC,OAAO,cAAc,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAiB;IAClD,IAAI,cAAc,KAAK,EAAE;QAAE,OAAO;IAClC,cAAc,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,QAAQ,EAAE,CAAC;IACZ,CAAC;AACF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAoB;IACzD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACX,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B;IACzC,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,cAAc,GAAG,IAAI,CAAC;AACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { selectToolPlugin } from "./plugin.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { selectToolPlugin } from "./plugin.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface MarqueeRect {
2
+ x: number;
3
+ y: number;
4
+ width: number;
5
+ height: number;
6
+ }
7
+ export type MarqueeMode = "intersect" | "contain";
8
+ export declare function setMarquee(rect: MarqueeRect | null, hitIds?: readonly string[]): void;
9
+ export declare function setMarqueeMode(mode: MarqueeMode): void;
10
+ export declare function getMarqueeMode(): MarqueeMode;
11
+ export declare function subscribeMarquee(cb: () => void): () => void;
12
+ export declare function getMarqueeRect(): MarqueeRect | null;
13
+ export declare function getMarqueeHitIds(): readonly string[];
14
+ export declare function clearMarqueeListeners(): void;
15
+ //# sourceMappingURL=marquee-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marquee-state.d.ts","sourceRoot":"","sources":["../src/marquee-state.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAelD,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAGrF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAItD;AAED,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAG3D;AAED,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAEnD;AAED,wBAAgB,gBAAgB,IAAI,SAAS,MAAM,EAAE,CAEpD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
@@ -0,0 +1,33 @@
1
+ let current = { rect: null, hitIds: [], mode: "intersect" };
2
+ const listeners = new Set();
3
+ function notify() {
4
+ for (const fn of listeners)
5
+ fn();
6
+ }
7
+ export function setMarquee(rect, hitIds) {
8
+ current = { ...current, rect, hitIds: hitIds ?? [] };
9
+ notify();
10
+ }
11
+ export function setMarqueeMode(mode) {
12
+ if (current.mode === mode)
13
+ return;
14
+ current = { ...current, mode };
15
+ notify();
16
+ }
17
+ export function getMarqueeMode() {
18
+ return current.mode;
19
+ }
20
+ export function subscribeMarquee(cb) {
21
+ listeners.add(cb);
22
+ return () => listeners.delete(cb);
23
+ }
24
+ export function getMarqueeRect() {
25
+ return current.rect;
26
+ }
27
+ export function getMarqueeHitIds() {
28
+ return current.hitIds;
29
+ }
30
+ export function clearMarqueeListeners() {
31
+ listeners.clear();
32
+ }
33
+ //# sourceMappingURL=marquee-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marquee-state.js","sourceRoot":"","sources":["../src/marquee-state.ts"],"names":[],"mappings":"AAeA,IAAI,OAAO,GAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC1E,MAAM,SAAS,GAAoB,IAAI,GAAG,EAAE,CAAC;AAE7C,SAAS,MAAM;IACd,KAAK,MAAM,EAAE,IAAI,SAAS;QAAE,EAAE,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAwB,EAAE,MAA0B;IAC9E,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;IACrD,MAAM,EAAE,CAAC;AACV,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAiB;IAC/C,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO;IAClC,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;IAC/B,MAAM,EAAE,CAAC;AACV,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,OAAO,OAAO,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAc;IAC9C,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,OAAO,OAAO,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC/B,OAAO,OAAO,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACpC,SAAS,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { UsketchPlugin } from "@edv4h/usketch-shared";
2
+ export declare const selectToolPlugin: UsketchPlugin;
3
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAQX,aAAa,EACb,MAAM,uBAAuB,CAAC;AA4M/B,eAAO,MAAM,gBAAgB,EAAE,aAi4B9B,CAAC"}