wiki-viewer 1.13.2 → 1.14.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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/routes-manifest.json +6 -0
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/agent/activity/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/events/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/files/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/file/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/ls/[[...path]]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/move/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/internal/span/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/sidecar/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/app-proxy/[...path]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/app-proxy/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/assets/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/share/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/browse/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/reveal/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/set-root/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/open/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/refresh/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/upload/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/app/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/backlinks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/content/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/download/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/file/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/folder/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-branches/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-checkout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-diff/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-file-info/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-history/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-pull/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/move/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/new-file/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/outlinks/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/wiki/outlinks/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/wiki/outlinks/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js +16 -0
- package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/wiki/outlinks/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/wiki/page/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/presence/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/slugs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/upload/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/watch/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +3 -3
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/s/[token]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/s/[token]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/signin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__01h996g._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0oruwos._.js → [root-of-the-server]__0stkifk._.js} +2 -2
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_wiki_outlinks_route_actions_0v-5x5r.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{0~w0_katex_dist_katex_mjs_0100dfi._.js → 0~w0_katex_dist_katex_mjs_029cdbg._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0~9qfcs._.js → [root-of-the-server]__0z41nrr._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0osa2xb._.js → [root-of-the-server]__10m6c40._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0yevh-d._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0~a9dyk._.js +3 -3
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_01df~jf._.js → node_modules__pnpm_0-_58b8._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0u0.e4r._.js → node_modules__pnpm_0026mgr._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0uo7x8s._.js → node_modules__pnpm_02bje_g._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0z~fyt8._.js → node_modules__pnpm_04v1_ty._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_04l9bx6._.js → node_modules__pnpm_0607~kg._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0lf1dtw._.js → node_modules__pnpm_08edl1n._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0i8hw7q._.js → node_modules__pnpm_08xpp3w._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0nt8do2._.js → node_modules__pnpm_09o_spj._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0a2d3t0._.js → node_modules__pnpm_0aha1~u._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0zgqorw._.js → node_modules__pnpm_0ajqqlq._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0pu-2sk._.js → node_modules__pnpm_0b8odbc._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0hrj.2x._.js → node_modules__pnpm_0e0r_qk._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0a71te0._.js → node_modules__pnpm_0f_n_zp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0mg7y.1._.js → node_modules__pnpm_0gos._c._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_02_h794._.js → node_modules__pnpm_0hzzx9d._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0m-sqwd._.js → node_modules__pnpm_0i2m0b.._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0k.5pst._.js → node_modules__pnpm_0i6_kfe._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0suw78t._.js → node_modules__pnpm_0k-7uzm._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0mmji-1._.js → node_modules__pnpm_0ru1i2-._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0_4caj_._.js → node_modules__pnpm_0t4l89_._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0wqzfz7._.js → node_modules__pnpm_0w.kwue._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0gqcxiq._.js → node_modules__pnpm_0xk042~._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0ca5pep._.js → node_modules__pnpm_0xr.ztu._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0w_zv~3._.js → node_modules__pnpm_0y2h_cz._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0o.ke1-._.js → node_modules__pnpm_0~i3a.i._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_109~spe._.js → node_modules__pnpm_11ede0p._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules__pnpm_0mn3jk_._.js → node_modules__pnpm_13p348f._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_page_tsx_0ss2.w7._.js +2 -2
- package/.next/standalone/.next/server/functions-config-manifest.json +1 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/static/chunks/02kg.lbkfi1yc.css +5 -0
- package/.next/standalone/.next/static/chunks/{0._793qr3oswh.js → 0ey6h_rkpuzxs.js} +8 -8
- package/.next/standalone/.next/static/chunks/{08bdsfl84~3l..js → 0jt1z17mjmjde.js} +7 -7
- package/.next/standalone/.next/static/chunks/{0wnjskl5t63nx.js → 0rcwd6-.iu~nd.js} +3 -3
- package/.next/standalone/.pi/ownership.json +3 -0
- package/.next/standalone/TODO.md +16 -0
- package/.next/standalone/package.json +2 -1
- package/.next/standalone/src/app/api/wiki/outlinks/route.ts +76 -0
- package/.next/standalone/src/app/globals.css +13 -15
- package/.next/standalone/src/components/ai-panel/activity-row.tsx +268 -53
- package/.next/standalone/src/components/ai-panel/ai-panel.tsx +3 -9
- package/.next/standalone/src/components/editor/backlinks-panel.tsx +47 -17
- package/.next/standalone/src/components/editor/bubble-menu.tsx +22 -1
- package/.next/standalone/src/components/editor/comment-thread.tsx +3 -2
- package/.next/standalone/src/components/editor/editor.tsx +9 -1
- package/.next/standalone/src/components/editor/suggestion-card.tsx +4 -0
- package/.next/standalone/src/components/editor/view-mode-comment-button.tsx +77 -0
- package/.next/standalone/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/.next/standalone/.next/static/chunks/0v9z3r.aiug_u.css +0 -5
- /package/.next/standalone/.next/static/{Fe9EDoNlINdV6yroHKsnE → WMOTgfV82apmdovxzgbMx}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{Fe9EDoNlINdV6yroHKsnE → WMOTgfV82apmdovxzgbMx}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{Fe9EDoNlINdV6yroHKsnE → WMOTgfV82apmdovxzgbMx}/_ssgManifest.js +0 -0
|
@@ -58,9 +58,10 @@ interface Props {
|
|
|
58
58
|
comments: Comment[];
|
|
59
59
|
anchorEl: HTMLElement | null;
|
|
60
60
|
onClose: () => void;
|
|
61
|
+
readOnly?: boolean;
|
|
61
62
|
}
|
|
62
63
|
|
|
63
|
-
export function CommentThread({ path, blockRef, comments, anchorEl, onClose }: Props) {
|
|
64
|
+
export function CommentThread({ path, blockRef, comments, anchorEl, onClose, readOnly }: Props) {
|
|
64
65
|
const [anchor, setAnchor] = useState<{ top: number; left: number } | null>(null);
|
|
65
66
|
const [text, setText] = useState("");
|
|
66
67
|
const [busy, setBusy] = useState(false);
|
|
@@ -187,7 +188,7 @@ export function CommentThread({ path, blockRef, comments, anchorEl, onClose }: P
|
|
|
187
188
|
<span className="text-[11px] font-mono text-muted-foreground/60 truncate">
|
|
188
189
|
{blockRef}
|
|
189
190
|
</span>
|
|
190
|
-
{activeComment && (
|
|
191
|
+
{activeComment && !readOnly && (
|
|
191
192
|
<button
|
|
192
193
|
type="button"
|
|
193
194
|
disabled={busy}
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
} from "./wiki-link-create-dialog";
|
|
42
42
|
import { WikiLinkPicker } from "./wiki-link-picker";
|
|
43
43
|
import { FrontmatterHeader } from "@/components/wiki/frontmatter-header";
|
|
44
|
+
import { ViewModeCommentButton } from "./view-mode-comment-button";
|
|
44
45
|
|
|
45
46
|
async function uploadFile(
|
|
46
47
|
pagePath: string,
|
|
@@ -1121,6 +1122,7 @@ export function KBEditor({ mode }: KBEditorProps = {}) {
|
|
|
1121
1122
|
void useProofStore.getState().loadSidecar(currentPath);
|
|
1122
1123
|
void useProofStore.getState().loadSnapshot(currentPath);
|
|
1123
1124
|
}}
|
|
1125
|
+
readOnly={isViewing}
|
|
1124
1126
|
/>
|
|
1125
1127
|
</div>
|
|
1126
1128
|
);
|
|
@@ -1135,6 +1137,7 @@ export function KBEditor({ mode }: KBEditorProps = {}) {
|
|
|
1135
1137
|
comments={commentsByRef[threadTarget.blockRef] ?? []}
|
|
1136
1138
|
anchorEl={threadTarget.el}
|
|
1137
1139
|
onClose={() => setThreadTarget(null)}
|
|
1140
|
+
readOnly={isViewing}
|
|
1138
1141
|
/>
|
|
1139
1142
|
)}
|
|
1140
1143
|
|
|
@@ -1202,7 +1205,12 @@ export function KBEditor({ mode }: KBEditorProps = {}) {
|
|
|
1202
1205
|
/>
|
|
1203
1206
|
</>
|
|
1204
1207
|
)}
|
|
1205
|
-
|
|
1208
|
+
{isViewing && (
|
|
1209
|
+
<ViewModeCommentButton
|
|
1210
|
+
containerRef={scrollContainerRef}
|
|
1211
|
+
onComment={openCommentForSelection}
|
|
1212
|
+
/>
|
|
1213
|
+
)}
|
|
1206
1214
|
{/* AI Edit Prompt + slash hint */}
|
|
1207
1215
|
<div className="max-w-[var(--editor-max-w,48rem)] ml-[var(--editor-ml,auto)] mr-auto px-8 pb-8 flex items-center gap-4">
|
|
1208
1216
|
<button
|
|
@@ -16,6 +16,7 @@ interface Props {
|
|
|
16
16
|
left: number;
|
|
17
17
|
width: number;
|
|
18
18
|
onSettled: () => void; // called after accept or reject so parent can refresh
|
|
19
|
+
readOnly?: boolean;
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
function kindVerb(kind: Suggestion["kind"]): string {
|
|
@@ -68,6 +69,7 @@ export function SuggestionCard({
|
|
|
68
69
|
left,
|
|
69
70
|
width,
|
|
70
71
|
onSettled,
|
|
72
|
+
readOnly,
|
|
71
73
|
}: Props) {
|
|
72
74
|
const [busy, setBusy] = useState(false);
|
|
73
75
|
|
|
@@ -179,6 +181,7 @@ export function SuggestionCard({
|
|
|
179
181
|
</div>
|
|
180
182
|
|
|
181
183
|
{/* Actions */}
|
|
184
|
+
{!readOnly && (
|
|
182
185
|
<div className="flex items-center gap-2 px-3 py-2 border-t border-border bg-muted/30">
|
|
183
186
|
<button
|
|
184
187
|
type="button"
|
|
@@ -197,6 +200,7 @@ export function SuggestionCard({
|
|
|
197
200
|
Reject
|
|
198
201
|
</button>
|
|
199
202
|
</div>
|
|
203
|
+
)}
|
|
200
204
|
</div>
|
|
201
205
|
);
|
|
202
206
|
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { MessageCircle } from "lucide-react";
|
|
4
|
+
import { type RefObject, useEffect, useState } from "react";
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
/** The scrollable container that wraps the editor content. */
|
|
8
|
+
containerRef: RefObject<HTMLElement | null>;
|
|
9
|
+
onComment: () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Floating comment button for read-only view mode.
|
|
14
|
+
*
|
|
15
|
+
* TipTap's BubbleMenu doesn't fire when the editor is non-editable, so this
|
|
16
|
+
* component listens to the native selectionchange event and positions a small
|
|
17
|
+
* button above whatever the user has selected — as long as the selection is
|
|
18
|
+
* inside the editor container.
|
|
19
|
+
*/
|
|
20
|
+
export function ViewModeCommentButton({ containerRef, onComment }: Props) {
|
|
21
|
+
const [pos, setPos] = useState<{ top: number; left: number } | null>(null);
|
|
22
|
+
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
function update() {
|
|
25
|
+
const sel = window.getSelection();
|
|
26
|
+
if (!sel || sel.isCollapsed || sel.rangeCount === 0) {
|
|
27
|
+
setPos(null);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const range = sel.getRangeAt(0);
|
|
31
|
+
const container = containerRef.current;
|
|
32
|
+
if (!container || !container.contains(range.commonAncestorContainer)) {
|
|
33
|
+
setPos(null);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const rect = range.getBoundingClientRect();
|
|
37
|
+
// rect can be all-zeros for collapsed or invisible ranges
|
|
38
|
+
if (rect.width === 0 && rect.height === 0) {
|
|
39
|
+
setPos(null);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
setPos({
|
|
43
|
+
top: rect.top - 38,
|
|
44
|
+
left: rect.left + rect.width / 2,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
document.addEventListener("selectionchange", update);
|
|
49
|
+
return () => document.removeEventListener("selectionchange", update);
|
|
50
|
+
}, [containerRef]);
|
|
51
|
+
|
|
52
|
+
if (!pos) return null;
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<button
|
|
56
|
+
type="button"
|
|
57
|
+
style={{
|
|
58
|
+
position: "fixed",
|
|
59
|
+
top: pos.top,
|
|
60
|
+
left: pos.left,
|
|
61
|
+
transform: "translateX(-50%)",
|
|
62
|
+
zIndex: 50,
|
|
63
|
+
}}
|
|
64
|
+
className="flex items-center gap-1 px-2 py-1 bg-popover border border-border rounded-sm shadow-lg text-[12px] text-foreground/80 hover:text-foreground hover:bg-accent transition-colors"
|
|
65
|
+
onMouseDown={(e) => e.preventDefault()}
|
|
66
|
+
onClick={() => {
|
|
67
|
+
onComment();
|
|
68
|
+
setPos(null);
|
|
69
|
+
}}
|
|
70
|
+
aria-label="Add comment"
|
|
71
|
+
title="Add comment"
|
|
72
|
+
>
|
|
73
|
+
<MessageCircle className="w-3.5 h-3.5" />
|
|
74
|
+
<span>Comment</span>
|
|
75
|
+
</button>
|
|
76
|
+
);
|
|
77
|
+
}
|