@edv4h/usketch-plugin-comments 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,10 @@
1
+ import type { BoardStore, EventBus, LayerRenderContext, ShapeRegistry } from "@edv4h/usketch-shared";
2
+ interface CommentBadgeLayerProps {
3
+ ctx: LayerRenderContext;
4
+ store: BoardStore;
5
+ shapes: ShapeRegistry;
6
+ events: EventBus;
7
+ }
8
+ export declare function CommentBadgeLayer({ ctx, store, shapes, events }: CommentBadgeLayerProps): import("react/jsx-runtime").JSX.Element | null;
9
+ export {};
10
+ //# sourceMappingURL=comment-badge-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-badge-layer.d.ts","sourceRoot":"","sources":["../src/comment-badge-layer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,UAAU,EACV,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,MAAM,uBAAuB,CAAC;AAK/B,UAAU,sBAAsB;IAC/B,GAAG,EAAE,kBAAkB,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,QAAQ,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,sBAAsB,kDAoGvF"}
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { worldToScreen } from "@edv4h/usketch-shared";
3
+ import { useEffect, useState } from "react";
4
+ export function CommentBadgeLayer({ ctx, store, shapes, events }) {
5
+ const [threads, setThreads] = useState([]);
6
+ // コメントスレッドの更新をリッスン
7
+ useEffect(() => {
8
+ const unsubs = [];
9
+ unsubs.push(events.on("comments:threads-loaded", (loaded) => {
10
+ setThreads(loaded);
11
+ }));
12
+ unsubs.push(events.on("comments:badge-update", (thread) => {
13
+ setThreads((prev) => [thread, ...prev]);
14
+ }));
15
+ return () => {
16
+ for (const u of unsubs)
17
+ u();
18
+ };
19
+ }, [events]);
20
+ // シェイプごとにバッジ集約
21
+ const badgesByShape = new Map();
22
+ for (const t of threads) {
23
+ if (t.resolved)
24
+ continue;
25
+ badgesByShape.set(t.anchorShapeId, (badgesByShape.get(t.anchorShapeId) ?? 0) + t.messages.length);
26
+ }
27
+ const badges = [];
28
+ for (const [shapeId, count] of badgesByShape) {
29
+ const shape = store.getShape(shapeId);
30
+ if (!shape)
31
+ continue;
32
+ const def = shapes.get(shape.type);
33
+ const bounds = def
34
+ ? def.getBounds(shape)
35
+ : { x: shape.x, y: shape.y, width: shape.width, height: shape.height };
36
+ // バッジ位置: シェイプの右上
37
+ badges.push({
38
+ shapeId,
39
+ x: bounds.x + bounds.width,
40
+ y: bounds.y,
41
+ count,
42
+ });
43
+ }
44
+ if (badges.length === 0)
45
+ return null;
46
+ const { viewport } = ctx;
47
+ return (_jsx(_Fragment, { children: badges.map((badge) => {
48
+ const screen = worldToScreen(badge.x, badge.y, viewport);
49
+ return (_jsx("button", { type: "button", onPointerDown: (e) => e.stopPropagation(), onPointerUp: (e) => e.stopPropagation(), onClick: (e) => {
50
+ e.stopPropagation();
51
+ events.emit("side-panel:open", { tabId: "comments" });
52
+ }, style: {
53
+ position: "absolute",
54
+ left: screen.x - 10,
55
+ top: screen.y - 10,
56
+ width: 20,
57
+ height: 20,
58
+ borderRadius: "50%",
59
+ background: "#f59e0b",
60
+ color: "#fff",
61
+ border: "2px solid #fff",
62
+ fontSize: 10,
63
+ fontWeight: 700,
64
+ display: "flex",
65
+ alignItems: "center",
66
+ justifyContent: "center",
67
+ cursor: "pointer",
68
+ boxShadow: "0 1px 4px rgba(0,0,0,0.2)",
69
+ fontFamily: "system-ui, sans-serif",
70
+ padding: 0,
71
+ lineHeight: 1,
72
+ }, children: badge.count }, badge.shapeId));
73
+ }) }));
74
+ }
75
+ //# sourceMappingURL=comment-badge-layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-badge-layer.js","sourceRoot":"","sources":["../src/comment-badge-layer.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAU5C,MAAM,UAAU,iBAAiB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAA0B;IACvF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IAE5D,mBAAmB;IACnB,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,MAAM,GAAmB,EAAE,CAAC;QAElC,MAAM,CAAC,IAAI,CACV,MAAM,CAAC,EAAE,CAAkB,yBAAyB,EAAE,CAAC,MAAM,EAAE,EAAE;YAChE,UAAU,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,IAAI,CACV,MAAM,CAAC,EAAE,CAAgB,uBAAuB,EAAE,CAAC,MAAM,EAAE,EAAE;YAC5D,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CACF,CAAC;QAEF,OAAO,GAAG,EAAE;YACX,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,CAAC,EAAE,CAAC;QAC7B,CAAC,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,eAAe;IACf,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,QAAQ;YAAE,SAAS;QACzB,aAAa,CAAC,GAAG,CAChB,CAAC,CAAC,aAAa,EACf,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAC7D,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAA+D,EAAE,CAAC;IAE9E,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,GAAG;YACjB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC;YACtB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAExE,iBAAiB;QACjB,MAAM,CAAC,IAAI,CAAC;YACX,OAAO;YACP,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK;YAC1B,CAAC,EAAE,MAAM,CAAC,CAAC;YACX,KAAK;SACL,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IAEzB,OAAO,CACN,4BACE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACrB,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAEzD,OAAO,CACN,iBAEC,IAAI,EAAC,QAAQ,EACb,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EACzC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EACvC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oBACd,CAAC,CAAC,eAAe,EAAE,CAAC;oBACpB,MAAM,CAAC,IAAI,CAAqB,iBAAiB,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC3E,CAAC,EACD,KAAK,EAAE;oBACN,QAAQ,EAAE,UAAU;oBACpB,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE;oBACnB,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE;oBAClB,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,EAAE;oBACV,YAAY,EAAE,KAAK;oBACnB,UAAU,EAAE,SAAS;oBACrB,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,gBAAgB;oBACxB,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,GAAG;oBACf,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,QAAQ;oBACxB,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,2BAA2B;oBACtC,UAAU,EAAE,uBAAuB;oBACnC,OAAO,EAAE,CAAC;oBACV,UAAU,EAAE,CAAC;iBACb,YAEA,KAAK,CAAC,KAAK,IA9BP,KAAK,CAAC,OAAO,CA+BV,CACT,CAAC;QACH,CAAC,CAAC,GACA,CACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { CommentMessage, CommentThread } from "./types.js";
2
+ export interface CommentClientOptions {
3
+ apiUrl: string;
4
+ boardId: string;
5
+ extraHeaders?: Record<string, string>;
6
+ }
7
+ export declare function createCommentClient(options: CommentClientOptions): {
8
+ list: () => Promise<CommentThread[]>;
9
+ createThread: (params: {
10
+ anchorShapeId: string;
11
+ anchorX?: number;
12
+ anchorY?: number;
13
+ text: string;
14
+ }) => Promise<CommentThread | null>;
15
+ addMessage: (commentId: string, text: string) => Promise<CommentMessage | null>;
16
+ resolve: (commentId: string, resolved: boolean) => Promise<boolean>;
17
+ deleteThread: (commentId: string) => Promise<boolean>;
18
+ };
19
+ export type CommentClient = ReturnType<typeof createCommentClient>;
20
+ //# sourceMappingURL=comment-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-client.d.ts","sourceRoot":"","sources":["../src/comment-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB;gBAezC,OAAO,CAAC,aAAa,EAAE,CAAC;2BAUX;QACnC,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACb,KAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;4BAeI,MAAM,QAAQ,MAAM,KAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;yBAexD,MAAM,YAAY,OAAO,KAAG,OAAO,CAAC,OAAO,CAAC;8BAcvC,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;EAchE;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,85 @@
1
+ export function createCommentClient(options) {
2
+ const { apiUrl, boardId, extraHeaders } = options;
3
+ const base = `${apiUrl}/api/boards/${boardId}/comments`;
4
+ function jsonHeaders() {
5
+ return {
6
+ "Content-Type": "application/json",
7
+ ...extraHeaders,
8
+ };
9
+ }
10
+ function baseHeaders() {
11
+ return { ...extraHeaders };
12
+ }
13
+ async function list() {
14
+ try {
15
+ const res = await fetch(base, { credentials: "include", headers: baseHeaders() });
16
+ if (!res.ok)
17
+ return [];
18
+ return (await res.json());
19
+ }
20
+ catch {
21
+ return [];
22
+ }
23
+ }
24
+ async function createThread(params) {
25
+ try {
26
+ const res = await fetch(base, {
27
+ method: "POST",
28
+ credentials: "include",
29
+ headers: jsonHeaders(),
30
+ body: JSON.stringify(params),
31
+ });
32
+ if (!res.ok)
33
+ return null;
34
+ return (await res.json());
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ async function addMessage(commentId, text) {
41
+ try {
42
+ const res = await fetch(`${base}/${commentId}/messages`, {
43
+ method: "POST",
44
+ credentials: "include",
45
+ headers: jsonHeaders(),
46
+ body: JSON.stringify({ text }),
47
+ });
48
+ if (!res.ok)
49
+ return null;
50
+ return (await res.json());
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ async function resolve(commentId, resolved) {
57
+ try {
58
+ const res = await fetch(`${base}/${commentId}`, {
59
+ method: "PATCH",
60
+ credentials: "include",
61
+ headers: jsonHeaders(),
62
+ body: JSON.stringify({ resolved }),
63
+ });
64
+ return res.ok;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ async function deleteThread(commentId) {
71
+ try {
72
+ const res = await fetch(`${base}/${commentId}`, {
73
+ method: "DELETE",
74
+ credentials: "include",
75
+ headers: baseHeaders(),
76
+ });
77
+ return res.ok;
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ return { list, createThread, addMessage, resolve, deleteThread };
84
+ }
85
+ //# sourceMappingURL=comment-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-client.js","sourceRoot":"","sources":["../src/comment-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { EventBus } from "@edv4h/usketch-shared";
2
+ import type { CommentClient } from "./comment-client.js";
3
+ interface CommentsTabWrapperProps {
4
+ client: CommentClient;
5
+ events: EventBus;
6
+ }
7
+ export declare function CommentsTabWrapper({ client, events }: CommentsTabWrapperProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=comments-tab-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-tab-wrapper.d.ts","sourceRoot":"","sources":["../src/comments-tab-wrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,UAAU,uBAAuB;IAChC,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,QAAQ,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,uBAAuB,2CAU7E"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { CommentsTab } from "./comments-tab.js";
4
+ export function CommentsTabWrapper({ client, events }) {
5
+ const [focusThreadId, setFocusThreadId] = useState(null);
6
+ useEffect(() => {
7
+ return events.on("comments:focus-thread", ({ threadId }) => {
8
+ setFocusThreadId(threadId);
9
+ });
10
+ }, [events]);
11
+ return _jsx(CommentsTab, { client: client, events: events, focusThreadId: focusThreadId });
12
+ }
13
+ //# sourceMappingURL=comments-tab-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-tab-wrapper.js","sourceRoot":"","sources":["../src/comments-tab-wrapper.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOhD,MAAM,UAAU,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,EAA2B;IAC7E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExE,SAAS,CAAC,GAAG,EAAE;QACd,OAAO,MAAM,CAAC,EAAE,CAAuB,uBAAuB,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;YAChF,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAI,CAAC;AACtF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { EventBus } from "@edv4h/usketch-shared";
2
+ import type { CommentClient } from "./comment-client.js";
3
+ interface CommentsTabProps {
4
+ client: CommentClient;
5
+ events: EventBus;
6
+ focusThreadId: string | null;
7
+ }
8
+ export declare function CommentsTab({ client, events, focusThreadId }: CommentsTabProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=comments-tab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-tab.d.ts","sourceRoot":"","sources":["../src/comments-tab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,UAAU,gBAAgB;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,QAAQ,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAgPD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,gBAAgB,2CA0I9E"}
@@ -0,0 +1,199 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ function formatTime(iso) {
4
+ const d = new Date(iso);
5
+ return d.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
6
+ }
7
+ function ThreadItem({ thread, isFocused, onReply, onResolve, onDelete, }) {
8
+ const [replyText, setReplyText] = useState("");
9
+ const [isComposing, setIsComposing] = useState(false);
10
+ const inputRef = useRef(null);
11
+ const threadRef = useRef(null);
12
+ useEffect(() => {
13
+ if (isFocused && threadRef.current) {
14
+ threadRef.current.scrollIntoView({ behavior: "smooth", block: "nearest" });
15
+ }
16
+ }, [isFocused]);
17
+ const handleSubmit = useCallback(() => {
18
+ const text = replyText.trim();
19
+ if (!text)
20
+ return;
21
+ onReply(thread.id, text);
22
+ setReplyText("");
23
+ }, [replyText, thread.id, onReply]);
24
+ return (_jsxs("div", { ref: threadRef, style: {
25
+ padding: "12px 16px",
26
+ borderBottom: "1px solid var(--border-subtle)",
27
+ background: isFocused ? "var(--bg-active)" : "transparent",
28
+ color: "var(--fg-primary)",
29
+ }, children: [_jsxs("div", { style: {
30
+ display: "flex",
31
+ justifyContent: "space-between",
32
+ alignItems: "center",
33
+ marginBottom: 8,
34
+ }, children: [_jsxs("span", { style: { fontSize: 11, color: "var(--fg-tertiary)" }, children: ["on shape ", thread.anchorShapeId.slice(0, 8), "\u2026"] }), _jsxs("div", { style: { display: "flex", gap: 4 }, children: [_jsx("button", { type: "button", onClick: () => onResolve(thread.id, !thread.resolved), title: thread.resolved ? "Reopen" : "Resolve", style: {
35
+ border: "none",
36
+ background: "none",
37
+ cursor: "pointer",
38
+ fontSize: 14,
39
+ color: thread.resolved ? "var(--success)" : "var(--fg-tertiary)",
40
+ padding: "2px 4px",
41
+ }, children: thread.resolved ? "✓" : "○" }), _jsx("button", { type: "button", onClick: () => onDelete(thread.id), title: "Delete thread", style: {
42
+ border: "none",
43
+ background: "none",
44
+ cursor: "pointer",
45
+ fontSize: 12,
46
+ color: "var(--fg-disabled)",
47
+ padding: "2px 4px",
48
+ }, children: "\uD83D\uDDD1" })] })] }), thread.messages.map((msg) => (_jsxs("div", { style: { marginBottom: 6 }, children: [_jsx("div", { style: { fontSize: 13, color: "var(--fg-primary)", lineHeight: 1.4 }, children: msg.text }), _jsxs("div", { style: { fontSize: 10, color: "var(--fg-tertiary)", marginTop: 2 }, children: [msg.authorId.slice(0, 8), "\u2026 \u00B7 ", formatTime(msg.createdAt)] })] }, msg.id))), !thread.resolved && (_jsxs("div", { style: { display: "flex", gap: 6, marginTop: 8 }, children: [_jsx("input", { ref: inputRef, type: "text", value: replyText, onChange: (e) => setReplyText(e.target.value), onCompositionStart: () => setIsComposing(true), onCompositionEnd: () => setIsComposing(false), onKeyDown: (e) => {
49
+ e.stopPropagation();
50
+ if (e.key === "Enter" && !isComposing)
51
+ handleSubmit();
52
+ }, placeholder: "Reply\u2026", style: {
53
+ flex: 1,
54
+ border: "1px solid var(--border-default)",
55
+ background: "var(--bg-input)",
56
+ color: "var(--fg-primary)",
57
+ borderRadius: 6,
58
+ padding: "6px 10px",
59
+ fontSize: 12,
60
+ outline: "none",
61
+ fontFamily: "inherit",
62
+ } }), _jsx("button", { type: "button", onClick: handleSubmit, style: {
63
+ border: "none",
64
+ background: "var(--brand-gradient)",
65
+ color: "white",
66
+ borderRadius: 6,
67
+ padding: "6px 10px",
68
+ fontSize: 12,
69
+ cursor: "pointer",
70
+ flexShrink: 0,
71
+ fontFamily: "inherit",
72
+ fontWeight: 500,
73
+ }, children: "\u9001\u4FE1" })] }))] }));
74
+ }
75
+ function NewThreadForm({ prompt, onSubmit, onCancel, }) {
76
+ const [text, setText] = useState("");
77
+ const [isComposing, setIsComposing] = useState(false);
78
+ const inputRef = useRef(null);
79
+ useEffect(() => {
80
+ inputRef.current?.focus();
81
+ }, []);
82
+ return (_jsxs("div", { style: {
83
+ padding: "12px 16px",
84
+ borderBottom: "1px solid var(--border-subtle)",
85
+ background: "var(--bg-active)",
86
+ }, children: [_jsxs("div", { style: { fontSize: 12, color: "var(--fg-secondary)", marginBottom: 8 }, children: ["\u65B0\u3057\u3044\u30B3\u30E1\u30F3\u30C8: ", prompt.anchorShapeId.slice(0, 8), "\u2026"] }), _jsxs("div", { style: { display: "flex", gap: 6 }, children: [_jsx("input", { ref: inputRef, type: "text", value: text, onChange: (e) => setText(e.target.value), onCompositionStart: () => setIsComposing(true), onCompositionEnd: () => setIsComposing(false), onKeyDown: (e) => {
87
+ e.stopPropagation();
88
+ if (e.key === "Enter" && !isComposing && text.trim())
89
+ onSubmit(text.trim());
90
+ if (e.key === "Escape")
91
+ onCancel();
92
+ }, placeholder: "\u30B3\u30E1\u30F3\u30C8\u3092\u66F8\u304F\u2026", style: {
93
+ flex: 1,
94
+ border: "1px solid var(--border-default)",
95
+ background: "var(--bg-input)",
96
+ color: "var(--fg-primary)",
97
+ borderRadius: 6,
98
+ padding: "6px 10px",
99
+ fontSize: 12,
100
+ outline: "none",
101
+ fontFamily: "inherit",
102
+ } }), _jsx("button", { type: "button", onClick: () => text.trim() && onSubmit(text.trim()), style: {
103
+ border: "none",
104
+ background: "var(--brand-gradient)",
105
+ color: "white",
106
+ borderRadius: 6,
107
+ padding: "6px 10px",
108
+ fontSize: 12,
109
+ cursor: "pointer",
110
+ flexShrink: 0,
111
+ fontFamily: "inherit",
112
+ fontWeight: 500,
113
+ }, children: "\u6295\u7A3F" })] })] }));
114
+ }
115
+ export function CommentsTab({ client, events, focusThreadId }) {
116
+ const [threads, setThreads] = useState([]);
117
+ const [loading, setLoading] = useState(true);
118
+ const [newThreadPrompt, setNewThreadPrompt] = useState(null);
119
+ const fetchedRef = useRef(false);
120
+ useEffect(() => {
121
+ if (fetchedRef.current)
122
+ return;
123
+ fetchedRef.current = true;
124
+ client
125
+ .list()
126
+ .then((loaded) => {
127
+ setThreads(loaded);
128
+ // バッジレイヤーにもデータを共有
129
+ events.emit("comments:threads-loaded", loaded);
130
+ })
131
+ .finally(() => setLoading(false));
132
+ }, [client, events]);
133
+ // 新規スレッド作成プロンプトをリッスン
134
+ useEffect(() => {
135
+ return events.on("comments:prompt-new-thread", (prompt) => {
136
+ setNewThreadPrompt(prompt);
137
+ });
138
+ }, [events]);
139
+ // バッジレイヤーにスレッド一覧を同期
140
+ const syncBadges = useCallback((updated) => {
141
+ events.emit("comments:threads-loaded", updated);
142
+ }, [events]);
143
+ const handleReply = useCallback(async (threadId, text) => {
144
+ const msg = await client.addMessage(threadId, text);
145
+ if (!msg)
146
+ return;
147
+ setThreads((prev) => {
148
+ const updated = prev.map((t) => t.id === threadId ? { ...t, messages: [...t.messages, msg] } : t);
149
+ syncBadges(updated);
150
+ return updated;
151
+ });
152
+ }, [client, syncBadges]);
153
+ const handleResolve = useCallback(async (threadId, resolved) => {
154
+ const ok = await client.resolve(threadId, resolved);
155
+ if (!ok)
156
+ return;
157
+ setThreads((prev) => {
158
+ const updated = prev.map((t) => t.id === threadId ? { ...t, resolved: resolved ? 1 : 0 } : t);
159
+ syncBadges(updated);
160
+ return updated;
161
+ });
162
+ }, [client, syncBadges]);
163
+ const handleDelete = useCallback(async (threadId) => {
164
+ const ok = await client.deleteThread(threadId);
165
+ if (!ok)
166
+ return;
167
+ setThreads((prev) => {
168
+ const updated = prev.filter((t) => t.id !== threadId);
169
+ syncBadges(updated);
170
+ return updated;
171
+ });
172
+ }, [client, syncBadges]);
173
+ const handleCreateThread = useCallback(async (text) => {
174
+ if (!newThreadPrompt)
175
+ return;
176
+ const thread = await client.createThread({
177
+ anchorShapeId: newThreadPrompt.anchorShapeId,
178
+ anchorX: newThreadPrompt.anchorX,
179
+ anchorY: newThreadPrompt.anchorY,
180
+ text,
181
+ });
182
+ if (thread) {
183
+ setThreads((prev) => [thread, ...prev]);
184
+ // バッジレイヤー用にイベント発火(タブ内のリスナーはスキップ)
185
+ events.emit("comments:badge-update", thread);
186
+ }
187
+ setNewThreadPrompt(null);
188
+ }, [client, newThreadPrompt, events]);
189
+ if (loading) {
190
+ return (_jsx("div", { style: { padding: 16, textAlign: "center", color: "var(--fg-tertiary)", fontSize: 13 }, children: "\u30B3\u30E1\u30F3\u30C8\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026" }));
191
+ }
192
+ return (_jsxs("div", { children: [newThreadPrompt && (_jsx(NewThreadForm, { prompt: newThreadPrompt, onSubmit: handleCreateThread, onCancel: () => setNewThreadPrompt(null) })), threads.length === 0 && !newThreadPrompt ? (_jsx("div", { style: {
193
+ padding: 24,
194
+ textAlign: "center",
195
+ color: "var(--fg-tertiary)",
196
+ fontSize: 13,
197
+ }, children: "\u307E\u3060\u30B3\u30E1\u30F3\u30C8\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u30B7\u30A7\u30A4\u30D7\u3092\u9078\u629E\u3057\u3066\u30B9\u30EC\u30C3\u30C9\u3092\u958B\u59CB\u3057\u3066\u304F\u3060\u3055\u3044\u3002" })) : (threads.map((thread) => (_jsx(ThreadItem, { thread: thread, isFocused: focusThreadId === thread.id, onReply: handleReply, onResolve: handleResolve, onDelete: handleDelete }, thread.id))))] }));
198
+ }
199
+ //# sourceMappingURL=comments-tab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-tab.js","sourceRoot":"","sources":["../src/comments-tab.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { CommentsPluginOptions } from "./plugin.js";
2
+ export { createCommentsPlugin } from "./plugin.js";
3
+ export type { CommentMessage, CommentThread } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { createCommentsPlugin } from "./plugin.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { UsketchPlugin } from "@edv4h/usketch-shared";
2
+ export interface CommentsPluginOptions {
3
+ boardId: string;
4
+ apiUrl: string;
5
+ extraHeaders?: Record<string, string>;
6
+ }
7
+ export declare function createCommentsPlugin(options: CommentsPluginOptions): UsketchPlugin;
8
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAuB1E,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAoElF"}
package/dist/plugin.js ADDED
@@ -0,0 +1,61 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { CommentBadgeLayer } from "./comment-badge-layer.js";
3
+ import { createCommentClient } from "./comment-client.js";
4
+ import { CommentsTabWrapper } from "./comments-tab-wrapper.js";
5
+ function CommentIcon() {
6
+ return (_jsx("svg", { width: 13, height: 13, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M2.5 7.5c0-2.8 2.5-5 5.5-5s5.5 2.2 5.5 5-2.5 5-5.5 5c-.7 0-1.4-.1-2-.3L3 13.5l.8-2.4a4.8 4.8 0 0 1-1.3-3.6Z" }) }));
7
+ }
8
+ export function createCommentsPlugin(options) {
9
+ const { boardId, apiUrl, extraHeaders } = options;
10
+ let cleanup;
11
+ return {
12
+ id: "usketch-plugin-comments",
13
+ name: "Comments",
14
+ setup(ctx) {
15
+ const client = createCommentClient({ apiUrl, boardId, extraHeaders });
16
+ // サイドパネルにコメントタブ登録
17
+ ctx.events.emit("side-panel:register-tab", {
18
+ tab: {
19
+ id: "comments",
20
+ label: "コメント",
21
+ icon: "💬",
22
+ iconComponent: () => _jsx(CommentIcon, {}),
23
+ order: 10,
24
+ render: () => _jsx(CommentsTabWrapper, { client: client, events: ctx.events }),
25
+ },
26
+ });
27
+ // バッジレイヤー(fixedレイヤー = スクリーン座標系で描画)
28
+ ctx.layers.register({
29
+ id: "comment-badges",
30
+ order: 55,
31
+ fixed: true,
32
+ render: (renderCtx) => (_jsx(CommentBadgeLayer, { ctx: renderCtx, store: ctx.store, shapes: ctx.shapes, events: ctx.events })),
33
+ });
34
+ // フローティングバーからのコメント開始イベント
35
+ const unsubStartThread = ctx.events.on("comments:start-thread", ({ selectedShapeIds }) => {
36
+ if (selectedShapeIds.length === 0)
37
+ return;
38
+ const shapeId = selectedShapeIds[0];
39
+ const shape = ctx.store.getShape(shapeId);
40
+ if (!shape)
41
+ return;
42
+ // プロンプト入力なしで即サイドパネルを開いてスレッド作成準備
43
+ ctx.events.emit("side-panel:open", { tabId: "comments" });
44
+ ctx.events.emit("comments:prompt-new-thread", {
45
+ anchorShapeId: shapeId,
46
+ anchorX: shape.x,
47
+ anchorY: shape.y,
48
+ });
49
+ });
50
+ cleanup = () => {
51
+ unsubStartThread();
52
+ ctx.events.emit("side-panel:unregister-tab", { tabId: "comments" });
53
+ ctx.layers.unregister("comment-badges");
54
+ };
55
+ },
56
+ teardown() {
57
+ cleanup?.();
58
+ },
59
+ };
60
+ }
61
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface CommentMessage {
2
+ id: string;
3
+ commentId: string;
4
+ authorId: string;
5
+ text: string;
6
+ createdAt: string;
7
+ }
8
+ export interface CommentThread {
9
+ id: string;
10
+ boardId: string;
11
+ anchorShapeId: string;
12
+ anchorX: number;
13
+ anchorY: number;
14
+ resolved: number;
15
+ createdBy: string;
16
+ createdAt: string;
17
+ updatedAt: string;
18
+ messages: CommentMessage[];
19
+ }
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC3B"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@edv4h/usketch-plugin-comments",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "source": "./src/index.ts",
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "@edv4h/usketch-shared": "1.0.0",
16
+ "@edv4h/usketch-plugin-side-panel": "1.0.0"
17
+ },
18
+ "peerDependencies": {
19
+ "react": ">=19"
20
+ },
21
+ "devDependencies": {
22
+ "@types/react": "19.2.14",
23
+ "typescript": "5.9.3",
24
+ "vitest": "3.2.4"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "README.md"
32
+ ],
33
+ "license": "MIT",
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/EdV4H/usketch.git",
37
+ "directory": "plugins/usketch-plugin-comments"
38
+ },
39
+ "homepage": "https://github.com/EdV4H/usketch#readme",
40
+ "bugs": {
41
+ "url": "https://github.com/EdV4H/usketch/issues"
42
+ },
43
+ "scripts": {
44
+ "build": "tsc -p tsconfig.json",
45
+ "typecheck": "tsc --noEmit",
46
+ "test": "vitest run --passWithNoTests",
47
+ "clean": "rm -rf dist"
48
+ }
49
+ }