comment-mode 0.1.2 → 0.1.3
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 +27 -8
- package/dist/index.d.mts +21 -1
- package/dist/index.d.ts +21 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +22 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,22 +8,23 @@ Embeddable commenting for live prototypes (Next.js / React). Add a comment overl
|
|
|
8
8
|
npm install comment-mode
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
### Basic usage
|
|
11
|
+
### Basic usage (recommended)
|
|
12
|
+
|
|
13
|
+
Wrap your app with **Commentator** so the comment surface (tap-to-pin area) and overlay are wired correctly with one component:
|
|
12
14
|
|
|
13
15
|
```tsx
|
|
14
|
-
import {
|
|
16
|
+
import { Commentator } from "comment-mode";
|
|
15
17
|
|
|
16
18
|
function App() {
|
|
17
19
|
return (
|
|
18
|
-
<
|
|
20
|
+
<Commentator
|
|
19
21
|
config={{
|
|
20
22
|
projectSlug: "my-prototype",
|
|
21
23
|
surfaceId: window.location.pathname,
|
|
22
24
|
}}
|
|
23
25
|
>
|
|
24
|
-
{/* your prototype UI */}
|
|
25
|
-
|
|
26
|
-
</CommentProvider>
|
|
26
|
+
{/* your prototype UI — taps here create comment pins when comment mode is on */}
|
|
27
|
+
</Commentator>
|
|
27
28
|
);
|
|
28
29
|
}
|
|
29
30
|
```
|
|
@@ -33,9 +34,27 @@ function App() {
|
|
|
33
34
|
- **projectSlug** — Identifies your project (e.g. `"my-prototype"`).
|
|
34
35
|
- **surfaceId** — Identifies the page/surface (e.g. `window.location.pathname`).
|
|
35
36
|
|
|
37
|
+
Optional: **position** — `"left"` or `"right"` (default `"right"`) for where the comment panel appears.
|
|
38
|
+
|
|
39
|
+
### Advanced: separate Provider, Surface, and Overlay
|
|
40
|
+
|
|
41
|
+
If you need custom layout (e.g. only a specific canvas should receive pins), use the building blocks directly. **You must wrap the tappable area with CommentSurface** or taps will not create pins:
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import { CommentProvider, CommentSurface, CommentOverlay } from "comment-mode";
|
|
45
|
+
|
|
46
|
+
<CommentProvider config={config}>
|
|
47
|
+
<CommentSurface>
|
|
48
|
+
{/* only this area receives tap-to-pin */}
|
|
49
|
+
</CommentSurface>
|
|
50
|
+
<CommentOverlay position="right" />
|
|
51
|
+
</CommentProvider>
|
|
52
|
+
```
|
|
36
53
|
|
|
37
54
|
### What you get
|
|
38
55
|
|
|
39
|
-
- **
|
|
40
|
-
- **
|
|
56
|
+
- **Commentator** — One wrapper: Provider + Surface + Overlay (use for minimal setup).
|
|
57
|
+
- **CommentProvider** — Connects to the Comment Mode API.
|
|
58
|
+
- **CommentSurface** — The area that receives taps to create pins; must wrap the content that should be commentable.
|
|
59
|
+
- **CommentOverlay** — Toggle, pins, and comment panel.
|
|
41
60
|
- **useComments** — Hook for creating threads, loading comments, and adding replies.
|
package/dist/index.d.mts
CHANGED
|
@@ -17,6 +17,26 @@ type CommentProviderProps = {
|
|
|
17
17
|
};
|
|
18
18
|
declare function CommentProvider(props: CommentProviderProps): JSX.Element;
|
|
19
19
|
|
|
20
|
+
type CommentatorProps = {
|
|
21
|
+
/** Project and surface identifiers + optional API URL. */
|
|
22
|
+
config: CommentConfig;
|
|
23
|
+
/** Where the comment panel appears. Default `"right"`. */
|
|
24
|
+
position?: "left" | "right";
|
|
25
|
+
/** Optional style for the surface wrapper (the tappable area for pins). */
|
|
26
|
+
surfaceStyle?: React.CSSProperties;
|
|
27
|
+
/** Optional class for the surface wrapper. */
|
|
28
|
+
surfaceClassName?: string;
|
|
29
|
+
children: React.ReactNode;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* All-in-one wrapper: Provider + Surface + Overlay. Use this for minimal setup
|
|
33
|
+
* so the area that receives taps is correctly wired for creating pins.
|
|
34
|
+
*
|
|
35
|
+
* If you need to customize layout (e.g. surface only around a canvas), use
|
|
36
|
+
* CommentProvider, CommentSurface, and CommentOverlay separately.
|
|
37
|
+
*/
|
|
38
|
+
declare function Commentator(props: CommentatorProps): JSX.Element;
|
|
39
|
+
|
|
20
40
|
type CommentSurfaceProps = {
|
|
21
41
|
children?: React.ReactNode;
|
|
22
42
|
style?: React.CSSProperties;
|
|
@@ -81,4 +101,4 @@ type AuthContextValue = {
|
|
|
81
101
|
|
|
82
102
|
declare function useCommentAuth(): AuthContextValue;
|
|
83
103
|
|
|
84
|
-
export { type CommentConfig, CommentOverlay, type CommentOverlayProps, CommentProvider, type CommentProviderProps, CommentSettings, CommentSurface, type CommentSurfaceProps, useCommentAuth, useComments };
|
|
104
|
+
export { type CommentConfig, CommentOverlay, type CommentOverlayProps, CommentProvider, type CommentProviderProps, CommentSettings, CommentSurface, type CommentSurfaceProps, Commentator, type CommentatorProps, useCommentAuth, useComments };
|
package/dist/index.d.ts
CHANGED
|
@@ -17,6 +17,26 @@ type CommentProviderProps = {
|
|
|
17
17
|
};
|
|
18
18
|
declare function CommentProvider(props: CommentProviderProps): JSX.Element;
|
|
19
19
|
|
|
20
|
+
type CommentatorProps = {
|
|
21
|
+
/** Project and surface identifiers + optional API URL. */
|
|
22
|
+
config: CommentConfig;
|
|
23
|
+
/** Where the comment panel appears. Default `"right"`. */
|
|
24
|
+
position?: "left" | "right";
|
|
25
|
+
/** Optional style for the surface wrapper (the tappable area for pins). */
|
|
26
|
+
surfaceStyle?: React.CSSProperties;
|
|
27
|
+
/** Optional class for the surface wrapper. */
|
|
28
|
+
surfaceClassName?: string;
|
|
29
|
+
children: React.ReactNode;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* All-in-one wrapper: Provider + Surface + Overlay. Use this for minimal setup
|
|
33
|
+
* so the area that receives taps is correctly wired for creating pins.
|
|
34
|
+
*
|
|
35
|
+
* If you need to customize layout (e.g. surface only around a canvas), use
|
|
36
|
+
* CommentProvider, CommentSurface, and CommentOverlay separately.
|
|
37
|
+
*/
|
|
38
|
+
declare function Commentator(props: CommentatorProps): JSX.Element;
|
|
39
|
+
|
|
20
40
|
type CommentSurfaceProps = {
|
|
21
41
|
children?: React.ReactNode;
|
|
22
42
|
style?: React.CSSProperties;
|
|
@@ -81,4 +101,4 @@ type AuthContextValue = {
|
|
|
81
101
|
|
|
82
102
|
declare function useCommentAuth(): AuthContextValue;
|
|
83
103
|
|
|
84
|
-
export { type CommentConfig, CommentOverlay, type CommentOverlayProps, CommentProvider, type CommentProviderProps, CommentSettings, CommentSurface, type CommentSurfaceProps, useCommentAuth, useComments };
|
|
104
|
+
export { type CommentConfig, CommentOverlay, type CommentOverlayProps, CommentProvider, type CommentProviderProps, CommentSettings, CommentSurface, type CommentSurfaceProps, Commentator, type CommentatorProps, useCommentAuth, useComments };
|
package/dist/index.js
CHANGED
|
@@ -1039,6 +1039,7 @@ function CommentOverlay(props) {
|
|
|
1039
1039
|
placeholder: "Add a comment...",
|
|
1040
1040
|
style: {
|
|
1041
1041
|
width: "100%",
|
|
1042
|
+
color: "#000000",
|
|
1042
1043
|
resize: "none",
|
|
1043
1044
|
fontSize: 13,
|
|
1044
1045
|
fontFamily: "system-ui, -apple-system, BlinkMacSystemFont, sans-serif",
|
|
@@ -1105,11 +1106,32 @@ function CommentOverlay(props) {
|
|
|
1105
1106
|
)
|
|
1106
1107
|
] });
|
|
1107
1108
|
}
|
|
1109
|
+
function Commentator(props) {
|
|
1110
|
+
const {
|
|
1111
|
+
config,
|
|
1112
|
+
position = "right",
|
|
1113
|
+
surfaceStyle,
|
|
1114
|
+
surfaceClassName,
|
|
1115
|
+
children
|
|
1116
|
+
} = props;
|
|
1117
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(CommentProvider, { config, children: [
|
|
1118
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1119
|
+
CommentSurface,
|
|
1120
|
+
{
|
|
1121
|
+
style: { minHeight: "100%", position: "relative", ...surfaceStyle },
|
|
1122
|
+
className: surfaceClassName,
|
|
1123
|
+
children
|
|
1124
|
+
}
|
|
1125
|
+
),
|
|
1126
|
+
/* @__PURE__ */ jsxRuntime.jsx(CommentOverlay, { position })
|
|
1127
|
+
] });
|
|
1128
|
+
}
|
|
1108
1129
|
|
|
1109
1130
|
exports.CommentOverlay = CommentOverlay;
|
|
1110
1131
|
exports.CommentProvider = CommentProvider;
|
|
1111
1132
|
exports.CommentSettings = CommentSettings;
|
|
1112
1133
|
exports.CommentSurface = CommentSurface;
|
|
1134
|
+
exports.Commentator = Commentator;
|
|
1113
1135
|
exports.useCommentAuth = useCommentAuth;
|
|
1114
1136
|
exports.useComments = useComments;
|
|
1115
1137
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/auth/AuthContext.tsx","../src/context/CommentsContext.tsx","../src/CommentProvider.tsx","../src/hooks.ts","../src/CommentSurface.tsx","../src/auth.ts","../src/CommentSettings.tsx","../src/CommentOverlay.tsx"],"names":["createContext","useState","useEffect","getDisplayNameFromUser","_a","createClient","session","useCallback","useMemo","jsx","useContext","useRef","jsxs","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Default base URL for the shared Comment Mode API.\n */\nexport const DEFAULT_API_BASE_URL = \"https://api.commentmode.dev/api/commentator\";\n","\"use client\";\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { createClient, SupabaseClient, User } from \"@supabase/supabase-js\";\nimport type { CommentConfig } from \"../types\";\nimport { DEFAULT_API_BASE_URL } from \"../constants\";\n\ntype AuthUser = Pick<User, \"id\" | \"email\">;\n\nexport type AuthContextValue = {\n supabase: SupabaseClient | null;\n user: AuthUser | null;\n accessToken: string | null;\n isReady: boolean;\n /** Resolved from GitHub: full_name, or username if name not set. Read-only. */\n displayName: string;\n signInWithEmail: (email: string) => Promise<void>;\n signInWithGitHub: () => Promise<void>;\n signOut: () => Promise<void>;\n};\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\n\nexport function AuthProvider(props: {\n config: CommentConfig;\n children: React.ReactNode;\n}): JSX.Element {\n const { config, children } = props;\n\n const [supabase, setSupabase] = useState<SupabaseClient | null>(null);\n const [user, setUser] = useState<AuthUser | null>(null);\n const [accessToken, setAccessToken] = useState<string | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [displayName, setDisplayNameState] = useState(\"\");\n\n const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n\n useEffect(() => {\n let cancelled = false;\n\n async function init() {\n try {\n const response = await fetch(`${apiBaseUrl}/auth/config`);\n if (!response.ok) {\n throw new Error(`Failed to load auth config: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n supabaseUrl: string;\n supabaseAnonKey: string;\n };\n\n if (cancelled) return;\n\n const client = createClient(data.supabaseUrl, data.supabaseAnonKey, {\n auth: {\n persistSession: true,\n },\n });\n\n setSupabase(client);\n\n function getDisplayNameFromUser(u: User): string {\n const meta = u.user_metadata as Record<string, unknown> | undefined;\n const fullName =\n (meta?.full_name as string)?.trim() ||\n (meta?.name as string)?.trim();\n const userName =\n (meta?.user_name as string)?.trim() ||\n (meta?.preferred_username as string)?.trim();\n const emailPrefix = u.email?.split(\"@\")[0]?.trim();\n return fullName || userName || emailPrefix || \"\";\n }\n\n const {\n data: { session },\n } = await client.auth.getSession();\n\n if (session?.user) {\n setUser({ id: session.user.id, email: session.user.email });\n setAccessToken(session.access_token);\n setDisplayNameState(getDisplayNameFromUser(session.user));\n }\n\n client.auth.onAuthStateChange((_event, session) => {\n if (!session || !session.user) {\n setUser(null);\n setAccessToken(null);\n setDisplayNameState(\"\");\n } else {\n setUser({ id: session.user.id, email: session.user.email });\n setAccessToken(session.access_token);\n setDisplayNameState(getDisplayNameFromUser(session.user));\n }\n });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"[commentator] Failed to initialise auth\", err);\n } finally {\n if (!cancelled) {\n setIsReady(true);\n }\n }\n }\n\n void init();\n\n return () => {\n cancelled = true;\n };\n }, [apiBaseUrl]);\n\n const signInWithEmail = useCallback(\n async (email: string) => {\n if (!supabase) return;\n\n const trimmed = email.trim();\n if (!trimmed) return;\n\n const redirectTo =\n typeof window !== \"undefined\"\n ? `${window.location.origin}${window.location.pathname}${window.location.search}`\n : undefined;\n\n await supabase.auth.signInWithOtp({\n email: trimmed,\n options: {\n emailRedirectTo: redirectTo,\n },\n });\n },\n [supabase],\n );\n\n const signInWithGitHub = useCallback(async () => {\n if (!supabase) return;\n\n const redirectTo =\n typeof window !== \"undefined\"\n ? `${window.location.origin}${window.location.pathname}${window.location.search}`\n : undefined;\n\n await supabase.auth.signInWithOAuth({\n provider: \"github\",\n options: { redirectTo },\n });\n }, [supabase]);\n\n const signOut = useCallback(async () => {\n if (!supabase) return;\n await supabase.auth.signOut();\n setUser(null);\n setAccessToken(null);\n setDisplayNameState(\"\");\n }, [supabase]);\n\n const value = useMemo<AuthContextValue>(\n () => ({\n supabase,\n user,\n accessToken,\n isReady,\n displayName,\n signInWithEmail,\n signInWithGitHub,\n signOut,\n }),\n [\n supabase,\n user,\n accessToken,\n isReady,\n displayName,\n signInWithEmail,\n signInWithGitHub,\n signOut,\n ],\n );\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useAuthInternal(): AuthContextValue {\n const ctx = useContext(AuthContext);\n if (!ctx) {\n throw new Error(\"useAuthInternal must be used within an AuthProvider\");\n }\n return ctx;\n}\n\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { CommentConfig } from \"../types\";\nimport { DEFAULT_API_BASE_URL } from \"../constants\";\nimport { useAuthInternal } from \"../auth/AuthContext\";\n\nexport type HoveredRect = {\n left: number;\n top: number;\n width: number;\n height: number;\n} | null;\n\nexport type ThreadAnchor = {\n x: number; // 0..1 relative to surface width\n y: number; // 0..1 relative to surface height\n};\n\nexport type Thread = {\n id: string;\n anchor: ThreadAnchor;\n status: \"open\" | \"resolved\";\n};\n\nexport type Comment = {\n id: string;\n threadId: string;\n body: string;\n createdAt?: string;\n authorName?: string | null;\n};\n\nexport type CommentsContextValue = {\n config: CommentConfig;\n threads: Thread[];\n commentsByThread: Record<string, Comment[]>;\n isLoading: boolean;\n error: Error | null;\n createThread: (\n anchor: ThreadAnchor,\n initialCommentBody?: string,\n initialAuthorName?: string | null,\n ) => Promise<Thread>;\n loadComments: (threadId: string) => Promise<void>;\n addComment: (\n threadId: string,\n body: string,\n authorName?: string | null,\n ) => Promise<Comment>;\n deleteThread: (threadId: string) => Promise<void>;\n // Comment mode: element hover + surface click\n commentModeEnabled: boolean;\n setCommentModeEnabled: (enabled: boolean) => void;\n surfaceRef: React.RefObject<HTMLDivElement>;\n hoveredRect: HoveredRect;\n setHoveredRect: (rect: HoveredRect) => void;\n surfaceClickHandlerRef: React.MutableRefObject<((e: React.MouseEvent<HTMLDivElement>) => void) | null>;\n pendingAnchor: { x: number; y: number } | null;\n setPendingAnchor: (anchor: { x: number; y: number } | null) => void;\n onPinClickRef: React.MutableRefObject<((threadId: string, clientX: number, clientY: number) => void) | null>;\n};\n\nconst CommentsContext = createContext<CommentsContextValue | undefined>(undefined);\n\nexport function CommentsProvider(props: {\n config: CommentConfig;\n children: React.ReactNode;\n}): JSX.Element {\n const { config, children } = props;\n\n const { accessToken, isReady: isAuthReady } = useAuthInternal();\n const [threads, setThreads] = useState<Thread[]>([]);\n const [commentsByThread, setCommentsByThread] = useState<\n Record<string, Comment[]>\n >({});\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [commentModeEnabled, setCommentModeEnabled] = useState(true);\n const [hoveredRect, setHoveredRect] = useState<HoveredRect>(null);\n const [pendingAnchor, setPendingAnchor] = useState<{ x: number; y: number } | null>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const surfaceClickHandlerRef = useRef<((e: React.MouseEvent<HTMLDivElement>) => void) | null>(null);\n const onPinClickRef = useRef<((threadId: string, clientX: number, clientY: number) => void) | null>(null);\n\n const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n\n // Load existing threads on mount / when config changes.\n useEffect(() => {\n let cancelled = false;\n\n async function fetchThreads() {\n if (!isAuthReady) return;\n\n try {\n setIsLoading(true);\n setError(null);\n\n const url = new URL(`${apiBaseUrl}/threads`);\n url.searchParams.set(\"projectSlug\", config.projectSlug);\n url.searchParams.set(\"surfaceId\", config.surfaceId);\n\n const headers: HeadersInit = {};\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(url.toString(), { headers });\n if (!response.ok) {\n throw new Error(`Failed to load threads: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n threads?: {\n id: string;\n surfaceId: string;\n anchorX: number;\n anchorY: number;\n }[];\n };\n\n if (cancelled) return;\n\n const mapped: Thread[] =\n data.threads?.map((t) => ({\n id: t.id,\n anchor: { x: t.anchorX, y: t.anchorY },\n status: \"open\",\n })) ?? [];\n\n setThreads(mapped);\n } catch (err) {\n if (cancelled) return;\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n }\n\n fetchThreads();\n\n return () => {\n cancelled = true;\n };\n }, [apiBaseUrl, config.projectSlug, config.surfaceId, accessToken, isAuthReady]);\n\n const createThread = useCallback(\n async (\n anchor: ThreadAnchor,\n initialCommentBody?: string,\n initialAuthorName?: string | null,\n ): Promise<Thread> => {\n const optimisticThread: Thread = {\n id: `${Date.now()}`,\n anchor,\n status: \"open\",\n };\n\n setThreads((prev) => [...prev, optimisticThread]);\n\n try {\n setIsLoading(true);\n setError(null);\n\n const response = await fetch(`${apiBaseUrl}/threads`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n },\n body: JSON.stringify({\n projectSlug: config.projectSlug,\n surfaceId: config.surfaceId,\n anchorX: anchor.x,\n anchorY: anchor.y,\n initialCommentBody: initialCommentBody ?? null,\n initialAuthorName: initialAuthorName ?? null,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create thread: ${response.status}`);\n }\n\n const data = (await response.json()) as { id: string };\n\n const persistedThread: Thread = {\n ...optimisticThread,\n id: data.id,\n };\n\n setThreads((prev) =>\n prev.map((t) => (t === optimisticThread ? persistedThread : t)),\n );\n\n return persistedThread;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n // Roll back optimistic thread\n setThreads((prev) => prev.filter((t) => t !== optimisticThread));\n throw e;\n } finally {\n setIsLoading(false);\n }\n },\n [apiBaseUrl, config.projectSlug, config.surfaceId, accessToken],\n );\n\n const loadComments = useCallback(\n async (threadId: string): Promise<void> => {\n try {\n setError(null);\n\n const url = new URL(`${apiBaseUrl}/comments`);\n url.searchParams.set(\"threadId\", threadId);\n\n const headers: HeadersInit = {};\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(url.toString(), { headers });\n if (!response.ok) {\n throw new Error(`Failed to load comments: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n comments?: {\n id: string;\n threadId: string;\n body: string;\n createdAt?: string;\n authorName?: string | null;\n }[];\n };\n\n const mapped: Comment[] =\n data.comments?.map((c) => ({\n id: c.id,\n threadId: c.threadId,\n body: c.body,\n createdAt: c.createdAt,\n authorName: c.authorName ?? null,\n })) ?? [];\n\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: mapped,\n }));\n } catch (err) {\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n throw e;\n }\n },\n [apiBaseUrl, accessToken],\n );\n\n const addComment = useCallback(\n async (\n threadId: string,\n body: string,\n authorName?: string | null,\n ): Promise<Comment> => {\n const trimmed = body.trim();\n if (!trimmed) {\n throw new Error(\"Comment body is empty\");\n }\n\n const optimistic: Comment = {\n id: `${Date.now()}`,\n threadId,\n body: trimmed,\n authorName: authorName ?? null,\n };\n\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: [...(prev[threadId] ?? []), optimistic],\n }));\n\n try {\n const response = await fetch(`${apiBaseUrl}/comments`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n },\n body: JSON.stringify({ threadId, body: trimmed, authorName }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create comment: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n id: string;\n createdAt?: string;\n };\n\n const persisted: Comment = {\n id: data.id,\n threadId,\n body: trimmed,\n createdAt: data.createdAt,\n };\n\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: (prev[threadId] ?? []).map((c) =>\n c === optimistic ? persisted : c,\n ),\n }));\n\n return persisted;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n // Roll back optimistic comment\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: (prev[threadId] ?? []).filter((c) => c !== optimistic),\n }));\n throw e;\n }\n },\n [apiBaseUrl, accessToken],\n );\n\n const deleteThread = useCallback(\n async (threadId: string): Promise<void> => {\n const headers: HeadersInit = {\n ...(accessToken ? { Authorization: `Bearer ${accessToken}` } : {}),\n };\n\n const response = await fetch(`${apiBaseUrl}/threads/${threadId}`, {\n method: \"DELETE\",\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete thread: ${response.status}`);\n }\n\n setThreads((prev) => prev.filter((t) => t.id !== threadId));\n setCommentsByThread((prev) => {\n const next = { ...prev };\n delete next[threadId];\n return next;\n });\n },\n [apiBaseUrl, accessToken],\n );\n\n const value = useMemo<CommentsContextValue>(\n () => ({\n config,\n threads,\n commentsByThread,\n isLoading,\n error,\n createThread,\n loadComments,\n addComment,\n deleteThread,\n commentModeEnabled,\n setCommentModeEnabled,\n surfaceRef,\n hoveredRect,\n setHoveredRect,\n surfaceClickHandlerRef,\n pendingAnchor,\n setPendingAnchor,\n onPinClickRef,\n }),\n [\n config,\n threads,\n commentsByThread,\n isLoading,\n error,\n createThread,\n loadComments,\n addComment,\n deleteThread,\n commentModeEnabled,\n hoveredRect,\n pendingAnchor,\n ],\n );\n\n return <CommentsContext.Provider value={value}>{children}</CommentsContext.Provider>;\n}\n\nexport function useCommentsInternal(): CommentsContextValue {\n const ctx = useContext(CommentsContext);\n if (!ctx) {\n throw new Error(\"useCommentsInternal must be used within a CommentsProvider\");\n }\n return ctx;\n}\n\n","import React from \"react\";\nimport type { CommentConfig } from \"./types\";\nimport { CommentsProvider } from \"./context/CommentsContext\";\nimport { AuthProvider } from \"./auth/AuthContext\";\n\nexport type CommentProviderProps = {\n config: CommentConfig;\n children: React.ReactNode;\n};\n\nexport function CommentProvider(props: CommentProviderProps): JSX.Element {\n const { config, children } = props;\n return (\n <AuthProvider config={config}>\n <CommentsProvider config={config}>{children}</CommentsProvider>\n </AuthProvider>\n );\n}\n\n","import { useCommentsInternal } from \"./context/CommentsContext\";\n\nexport function useComments() {\n const ctx = useCommentsInternal();\n\n return {\n config: ctx.config,\n threads: ctx.threads,\n commentsByThread: ctx.commentsByThread,\n isLoading: ctx.isLoading,\n error: ctx.error,\n createThread: ctx.createThread,\n loadComments: ctx.loadComments,\n addComment: ctx.addComment,\n deleteThread: ctx.deleteThread,\n };\n}\n\n","import React, { useCallback } from \"react\";\nimport { useCommentsInternal } from \"./context/CommentsContext\";\nimport { useComments } from \"./hooks\";\n\nconst PIN_STYLE: React.CSSProperties = {\n position: \"absolute\",\n transform: \"translate(-50%, -50%)\",\n width: 18,\n height: 18,\n borderRadius: \"999px\",\n background: \"#f97316\",\n border: \"2px solid #fff\",\n boxShadow: \"0 4px 10px rgba(0,0,0,0.25)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#fff\",\n fontSize: 10,\n fontWeight: 600,\n cursor: \"pointer\",\n};\n\nexport type CommentSurfaceProps = {\n children?: React.ReactNode;\n style?: React.CSSProperties;\n className?: string;\n};\n\n/**\n * Wraps the area that can receive comment pins. When comment mode is on,\n * mouse move highlights the element under the cursor and click creates a thread.\n * Pins are rendered inside the surface so they scroll with the content.\n * Must be used inside CommentProvider and wrap the same DOM that CommentOverlay covers.\n */\nexport function CommentSurface(props: CommentSurfaceProps): JSX.Element {\n const {\n commentModeEnabled,\n setHoveredRect,\n surfaceRef,\n surfaceClickHandlerRef,\n pendingAnchor,\n onPinClickRef,\n } = useCommentsInternal();\n const { threads } = useComments();\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!commentModeEnabled) return;\n const el = e.target as HTMLElement;\n const rect = el.getBoundingClientRect();\n setHoveredRect({\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n });\n },\n [commentModeEnabled, setHoveredRect],\n );\n\n const handleMouseLeave = useCallback(() => {\n setHoveredRect(null);\n }, [setHoveredRect]);\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!commentModeEnabled) return;\n // Let pin clicks through so opening a thread still works\n const target = e.target as HTMLElement;\n if (target.closest?.(\"[data-commentator-pin]\")) return;\n e.preventDefault();\n e.stopPropagation();\n surfaceClickHandlerRef.current?.(e);\n },\n [commentModeEnabled, surfaceClickHandlerRef],\n );\n\n return (\n <div\n ref={surfaceRef}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n onClickCapture={handleClick}\n style={{ ...props.style, minHeight: \"100%\", position: \"relative\" }}\n className={props.className}\n >\n {props.children}\n\n {/* Pins layer: same scroll context as content so pins move with the page */}\n <div\n aria-hidden\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 1,\n }}\n >\n {threads.map((thread) => (\n <div\n key={thread.id}\n data-commentator-pin\n role=\"button\"\n tabIndex={0}\n onClick={(e) => {\n e.stopPropagation();\n onPinClickRef.current?.(thread.id, e.clientX, e.clientY);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.stopPropagation();\n onPinClickRef.current?.(thread.id, 0, 0);\n }\n }}\n style={{\n ...PIN_STYLE,\n left: `${thread.anchor.x * 100}%`,\n top: `${thread.anchor.y * 100}%`,\n pointerEvents: \"auto\",\n }}\n >\n ●\n </div>\n ))}\n {pendingAnchor && (\n <div\n aria-hidden\n data-commentator-pin\n style={{\n ...PIN_STYLE,\n left: `${pendingAnchor.x * 100}%`,\n top: `${pendingAnchor.y * 100}%`,\n cursor: \"default\",\n opacity: 0.7,\n pointerEvents: \"auto\",\n }}\n >\n ●\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useAuthInternal } from \"./auth/AuthContext\";\n\nexport function useCommentAuth() {\n return useAuthInternal();\n}\n\n","\"use client\";\n\nimport React from \"react\";\nimport { useCommentAuth } from \"./auth\";\n\nexport function CommentSettings(): JSX.Element {\n const {\n user,\n displayName,\n signOut,\n isReady: isAuthReady,\n signInWithGitHub,\n } = useCommentAuth();\n\n return (\n <div\n style={{\n borderRadius: 16,\n padding: 16,\n backgroundColor: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 4,\n }}\n >\n <span\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: \"#111827\",\n }}\n >\n Commentator settings\n </span>\n {user && (\n <button\n type=\"button\"\n onClick={() => signOut().catch(() => {})}\n style={{\n borderRadius: 999,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#ffffff\",\n padding: \"4px 10px\",\n fontSize: 11,\n color: \"#374151\",\n cursor: \"pointer\",\n }}\n >\n Sign out\n </button>\n )}\n </div>\n\n {user ? (\n <div\n style={{\n fontSize: 12,\n color: \"#6b7280\",\n }}\n >\n <span>Signed in as {displayName || user.email || \"unknown user\"}</span>\n </div>\n ) : (\n <div style={{ marginTop: 4 }}>\n <button\n type=\"button\"\n onClick={() => signInWithGitHub().catch(() => {})}\n disabled={!isAuthReady}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#24292f\",\n color: \"#fff\",\n fontSize: 13,\n fontWeight: 500,\n cursor: isAuthReady ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.464-1.11-1.464-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0112 6.836c.85.004 1.705.114 2.504.336 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z\" />\n </svg>\n Sign in with GitHub\n </button>\n </div>\n )}\n </div>\n );\n}\n\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useComments } from \"./hooks\";\nimport { useCommentAuth } from \"./auth\";\nimport { CommentSettings } from \"./CommentSettings\";\nimport { useCommentsInternal } from \"./context/CommentsContext\";\n\nexport type CommentOverlayProps = {\n position?: \"left\" | \"right\";\n};\n\nconst PANEL_WIDTH = 280;\nconst PANEL_HEIGHT = 260;\nconst PANEL_MARGIN = 16;\n\nfunction computePanelPosition(clientX: number, clientY: number) {\n if (typeof window === \"undefined\") {\n return { top: 72, left: undefined as unknown as number };\n }\n\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Default: open to the right of the click.\n let left = clientX + 24;\n let top = clientY - PANEL_HEIGHT / 2;\n\n // If too close to the right edge, open to the left instead.\n if (left + PANEL_WIDTH + PANEL_MARGIN > vw) {\n left = clientX - PANEL_WIDTH - 24;\n }\n\n // Clamp into viewport with some margin.\n left = Math.min(\n Math.max(PANEL_MARGIN, left),\n vw - PANEL_WIDTH - PANEL_MARGIN,\n );\n top = Math.min(\n Math.max(PANEL_MARGIN, top),\n vh - PANEL_HEIGHT - PANEL_MARGIN,\n );\n\n return { top, left };\n}\n\nexport function CommentOverlay(props: CommentOverlayProps): JSX.Element {\n const { position = \"right\" } = props;\n const {\n threads,\n commentsByThread,\n createThread,\n loadComments,\n addComment,\n deleteThread,\n } = useComments();\n const {\n commentModeEnabled,\n setCommentModeEnabled,\n surfaceRef,\n hoveredRect,\n setHoveredRect,\n surfaceClickHandlerRef,\n pendingAnchor,\n setPendingAnchor,\n onPinClickRef,\n } = useCommentsInternal();\n const {\n user,\n isReady: isAuthReady,\n signInWithGitHub,\n displayName,\n } = useCommentAuth();\n const [activeThreadId, setActiveThreadId] = useState<string | null>(null);\n const [draft, setDraft] = useState(\"\");\n const [panelPosition, setPanelPosition] = useState<{ top: number; left?: number } | null>(null);\n const [showSettings, setShowSettings] = useState(false);\n\n const activeComments = useMemo(\n () => (activeThreadId ? commentsByThread[activeThreadId] ?? [] : []),\n [activeThreadId, commentsByThread],\n );\n\n useEffect(() => {\n if (!activeThreadId || pendingAnchor) return;\n if (commentsByThread[activeThreadId]?.length) return;\n void loadComments(activeThreadId);\n }, [activeThreadId, pendingAnchor, commentsByThread, loadComments]);\n\n const handleSurfaceClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n setShowSettings(false);\n\n const rect = surfaceRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n const x = (event.clientX - rect.left) / rect.width;\n const y = (event.clientY - rect.top) / rect.height;\n\n setPendingAnchor({ x, y });\n setActiveThreadId(null);\n setDraft(\"\");\n setPanelPosition(computePanelPosition(event.clientX, event.clientY));\n },\n [setPendingAnchor, surfaceRef],\n );\n\n useEffect(() => {\n surfaceClickHandlerRef.current = handleSurfaceClick;\n return () => {\n surfaceClickHandlerRef.current = null;\n };\n }, [surfaceClickHandlerRef, handleSurfaceClick]);\n\n useEffect(() => {\n onPinClickRef.current = (threadId: string, clientX: number, clientY: number) => {\n setShowSettings(false);\n setActiveThreadId(threadId);\n setPendingAnchor(null);\n setPanelPosition(computePanelPosition(clientX, clientY));\n };\n return () => {\n onPinClickRef.current = null;\n };\n }, [onPinClickRef]);\n\n const handleToggle = useCallback(() => {\n const next = !commentModeEnabled;\n if (!next) setHoveredRect(null);\n setCommentModeEnabled(next);\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n }, [commentModeEnabled, setCommentModeEnabled, setHoveredRect, setPendingAnchor]);\n\n return (\n <>\n {/* Toggle + settings */}\n <div\n style={{\n position: \"fixed\",\n top: 16,\n [position]: 16,\n zIndex: 2147483000,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-pressed={commentModeEnabled}\n style={{\n padding: \"8px 12px\",\n borderRadius: 999,\n border: \"1px solid rgba(0,0,0,0.12)\",\n background: commentModeEnabled ? \"#111827\" : \"#f9fafb\",\n color: commentModeEnabled ? \"#f9fafb\" : \"#111827\",\n fontSize: 12,\n fontFamily:\n \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n cursor: \"pointer\",\n }}\n >\n {commentModeEnabled ? \"Comment mode: on\" : \"Comment mode: off\"}\n </button>\n <button\n type=\"button\"\n onClick={() =>\n setShowSettings((prev) => {\n const next = !prev;\n if (next) {\n // Close any open comment panel when settings are shown.\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n }\n return next;\n })\n }\n aria-label=\"Commentator settings\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 999,\n border: \"1px solid rgba(0,0,0,0.12)\",\n background: \"#ffffff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.12)\",\n cursor: \"pointer\",\n fontSize: 14,\n color: \"#4b5563\",\n }}\n >\n ⚙️\n </button>\n </div>\n\n {showSettings && (\n <div\n style={{\n position: \"fixed\",\n top: 54,\n [position]: 16,\n zIndex: 2147483000,\n maxWidth: 280,\n }}\n >\n <CommentSettings />\n </div>\n )}\n\n {!showSettings && (activeThreadId || pendingAnchor) && (\n <div\n style={{\n position: \"fixed\",\n top: panelPosition?.top ?? 72,\n left: panelPosition?.left,\n width: PANEL_WIDTH,\n maxHeight: \"70vh\",\n padding: 16,\n borderRadius: 16,\n backgroundColor: \"#ffffff\",\n boxShadow: \"0 18px 45px rgba(15,23,42,0.25)\",\n border: \"1px solid rgba(148,163,184,0.35)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n zIndex: 2147483500,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 4,\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: \"#111827\",\n }}\n >\n {user\n ? activeThreadId\n ? \"Thread\"\n : \"New comment\"\n : \"Sign in to comment\"}\n </span>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {activeThreadId && (\n <button\n type=\"button\"\n onClick={async () => {\n try {\n await deleteThread(activeThreadId);\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n } catch (err) {\n console.error(\"[commentator] Failed to delete thread\", err);\n }\n }}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"#b91c1c\",\n fontSize: 12,\n cursor: \"pointer\",\n }}\n >\n Delete thread\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => {\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n }}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"#6b7280\",\n fontSize: 12,\n cursor: \"pointer\",\n }}\n >\n Close\n </button>\n </div>\n </div>\n\n {user ? (\n <>\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n paddingRight: 4,\n }}\n >\n {activeComments.length === 0 ? (\n <p\n style={{\n fontSize: 13,\n color: \"#9ca3af\",\n margin: 0,\n }}\n >\n No comments yet. Be the first to comment.\n </p>\n ) : (\n activeComments.map((comment) => (\n <div\n key={comment.id}\n style={{\n fontSize: 13,\n color: \"#111827\",\n padding: \"6px 8px\",\n borderRadius: 10,\n backgroundColor: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n marginBottom: 6,\n }}\n >\n {comment.authorName && (\n <div\n style={{\n fontSize: 11,\n color: \"#6b7280\",\n marginBottom: 2,\n }}\n >\n {comment.authorName}\n </div>\n )}\n <div>{comment.body}</div>\n </div>\n ))\n )}\n </div>\n\n <form\n onSubmit={async (event) => {\n event.preventDefault();\n if (!draft.trim()) return;\n\n try {\n if (activeThreadId) {\n await addComment(activeThreadId, draft, displayName);\n // name is not needed here; comments already stored with author_id\n } else if (pendingAnchor) {\n const thread = await createThread(\n pendingAnchor,\n draft,\n displayName || null,\n );\n setActiveThreadId(thread.id);\n setPendingAnchor(null);\n }\n setDraft(\"\");\n } catch (err) {\n console.error(\"[commentator] Failed to save comment\", err);\n }\n }}\n style={{ marginTop: 4 }}\n >\n <textarea\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n rows={3}\n placeholder=\"Add a comment...\"\n style={{\n width: \"100%\",\n resize: \"none\",\n fontSize: 13,\n fontFamily:\n \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n padding: \"6px 8px\",\n borderRadius: 10,\n border: \"1px solid #d1d5db\",\n boxSizing: \"border-box\",\n marginBottom: 6,\n }}\n />\n <button\n type=\"submit\"\n disabled={!draft.trim()}\n style={{\n width: \"100%\",\n padding: \"6px 10px\",\n borderRadius: 999,\n border: \"none\",\n backgroundColor: draft.trim() ? \"#111827\" : \"#e5e7eb\",\n color: draft.trim() ? \"#f9fafb\" : \"#9ca3af\",\n fontSize: 13,\n fontWeight: 500,\n cursor: draft.trim() ? \"pointer\" : \"default\",\n }}\n >\n Post comment\n </button>\n </form>\n </>\n ) : (\n <div style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n onClick={() => signInWithGitHub().catch(() => {})}\n disabled={!isAuthReady}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#24292f\",\n color: \"#fff\",\n fontSize: 13,\n fontWeight: 500,\n cursor: isAuthReady ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.464-1.11-1.464-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0112 6.836c.85.004 1.705.114 2.504.336 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z\" />\n </svg>\n Sign in with GitHub\n </button>\n </div>\n )}\n </div>\n )}\n </>\n );\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/auth/AuthContext.tsx","../src/context/CommentsContext.tsx","../src/CommentProvider.tsx","../src/hooks.ts","../src/CommentSurface.tsx","../src/auth.ts","../src/CommentSettings.tsx","../src/CommentOverlay.tsx","../src/Commentator.tsx"],"names":["createContext","useState","useEffect","getDisplayNameFromUser","_a","createClient","session","useCallback","useMemo","jsx","useContext","useRef","jsxs","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Default base URL for the shared Comment Mode API.\n */\nexport const DEFAULT_API_BASE_URL = \"https://api.commentmode.dev/api/commentator\";\n","\"use client\";\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { createClient, SupabaseClient, User } from \"@supabase/supabase-js\";\nimport type { CommentConfig } from \"../types\";\nimport { DEFAULT_API_BASE_URL } from \"../constants\";\n\ntype AuthUser = Pick<User, \"id\" | \"email\">;\n\nexport type AuthContextValue = {\n supabase: SupabaseClient | null;\n user: AuthUser | null;\n accessToken: string | null;\n isReady: boolean;\n /** Resolved from GitHub: full_name, or username if name not set. Read-only. */\n displayName: string;\n signInWithEmail: (email: string) => Promise<void>;\n signInWithGitHub: () => Promise<void>;\n signOut: () => Promise<void>;\n};\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\n\nexport function AuthProvider(props: {\n config: CommentConfig;\n children: React.ReactNode;\n}): JSX.Element {\n const { config, children } = props;\n\n const [supabase, setSupabase] = useState<SupabaseClient | null>(null);\n const [user, setUser] = useState<AuthUser | null>(null);\n const [accessToken, setAccessToken] = useState<string | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [displayName, setDisplayNameState] = useState(\"\");\n\n const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n\n useEffect(() => {\n let cancelled = false;\n\n async function init() {\n try {\n const response = await fetch(`${apiBaseUrl}/auth/config`);\n if (!response.ok) {\n throw new Error(`Failed to load auth config: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n supabaseUrl: string;\n supabaseAnonKey: string;\n };\n\n if (cancelled) return;\n\n const client = createClient(data.supabaseUrl, data.supabaseAnonKey, {\n auth: {\n persistSession: true,\n },\n });\n\n setSupabase(client);\n\n function getDisplayNameFromUser(u: User): string {\n const meta = u.user_metadata as Record<string, unknown> | undefined;\n const fullName =\n (meta?.full_name as string)?.trim() ||\n (meta?.name as string)?.trim();\n const userName =\n (meta?.user_name as string)?.trim() ||\n (meta?.preferred_username as string)?.trim();\n const emailPrefix = u.email?.split(\"@\")[0]?.trim();\n return fullName || userName || emailPrefix || \"\";\n }\n\n const {\n data: { session },\n } = await client.auth.getSession();\n\n if (session?.user) {\n setUser({ id: session.user.id, email: session.user.email });\n setAccessToken(session.access_token);\n setDisplayNameState(getDisplayNameFromUser(session.user));\n }\n\n client.auth.onAuthStateChange((_event, session) => {\n if (!session || !session.user) {\n setUser(null);\n setAccessToken(null);\n setDisplayNameState(\"\");\n } else {\n setUser({ id: session.user.id, email: session.user.email });\n setAccessToken(session.access_token);\n setDisplayNameState(getDisplayNameFromUser(session.user));\n }\n });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"[commentator] Failed to initialise auth\", err);\n } finally {\n if (!cancelled) {\n setIsReady(true);\n }\n }\n }\n\n void init();\n\n return () => {\n cancelled = true;\n };\n }, [apiBaseUrl]);\n\n const signInWithEmail = useCallback(\n async (email: string) => {\n if (!supabase) return;\n\n const trimmed = email.trim();\n if (!trimmed) return;\n\n const redirectTo =\n typeof window !== \"undefined\"\n ? `${window.location.origin}${window.location.pathname}${window.location.search}`\n : undefined;\n\n await supabase.auth.signInWithOtp({\n email: trimmed,\n options: {\n emailRedirectTo: redirectTo,\n },\n });\n },\n [supabase],\n );\n\n const signInWithGitHub = useCallback(async () => {\n if (!supabase) return;\n\n const redirectTo =\n typeof window !== \"undefined\"\n ? `${window.location.origin}${window.location.pathname}${window.location.search}`\n : undefined;\n\n await supabase.auth.signInWithOAuth({\n provider: \"github\",\n options: { redirectTo },\n });\n }, [supabase]);\n\n const signOut = useCallback(async () => {\n if (!supabase) return;\n await supabase.auth.signOut();\n setUser(null);\n setAccessToken(null);\n setDisplayNameState(\"\");\n }, [supabase]);\n\n const value = useMemo<AuthContextValue>(\n () => ({\n supabase,\n user,\n accessToken,\n isReady,\n displayName,\n signInWithEmail,\n signInWithGitHub,\n signOut,\n }),\n [\n supabase,\n user,\n accessToken,\n isReady,\n displayName,\n signInWithEmail,\n signInWithGitHub,\n signOut,\n ],\n );\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useAuthInternal(): AuthContextValue {\n const ctx = useContext(AuthContext);\n if (!ctx) {\n throw new Error(\"useAuthInternal must be used within an AuthProvider\");\n }\n return ctx;\n}\n\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { CommentConfig } from \"../types\";\nimport { DEFAULT_API_BASE_URL } from \"../constants\";\nimport { useAuthInternal } from \"../auth/AuthContext\";\n\nexport type HoveredRect = {\n left: number;\n top: number;\n width: number;\n height: number;\n} | null;\n\nexport type ThreadAnchor = {\n x: number; // 0..1 relative to surface width\n y: number; // 0..1 relative to surface height\n};\n\nexport type Thread = {\n id: string;\n anchor: ThreadAnchor;\n status: \"open\" | \"resolved\";\n};\n\nexport type Comment = {\n id: string;\n threadId: string;\n body: string;\n createdAt?: string;\n authorName?: string | null;\n};\n\nexport type CommentsContextValue = {\n config: CommentConfig;\n threads: Thread[];\n commentsByThread: Record<string, Comment[]>;\n isLoading: boolean;\n error: Error | null;\n createThread: (\n anchor: ThreadAnchor,\n initialCommentBody?: string,\n initialAuthorName?: string | null,\n ) => Promise<Thread>;\n loadComments: (threadId: string) => Promise<void>;\n addComment: (\n threadId: string,\n body: string,\n authorName?: string | null,\n ) => Promise<Comment>;\n deleteThread: (threadId: string) => Promise<void>;\n // Comment mode: element hover + surface click\n commentModeEnabled: boolean;\n setCommentModeEnabled: (enabled: boolean) => void;\n surfaceRef: React.RefObject<HTMLDivElement>;\n hoveredRect: HoveredRect;\n setHoveredRect: (rect: HoveredRect) => void;\n surfaceClickHandlerRef: React.MutableRefObject<((e: React.MouseEvent<HTMLDivElement>) => void) | null>;\n pendingAnchor: { x: number; y: number } | null;\n setPendingAnchor: (anchor: { x: number; y: number } | null) => void;\n onPinClickRef: React.MutableRefObject<((threadId: string, clientX: number, clientY: number) => void) | null>;\n};\n\nconst CommentsContext = createContext<CommentsContextValue | undefined>(undefined);\n\nexport function CommentsProvider(props: {\n config: CommentConfig;\n children: React.ReactNode;\n}): JSX.Element {\n const { config, children } = props;\n\n const { accessToken, isReady: isAuthReady } = useAuthInternal();\n const [threads, setThreads] = useState<Thread[]>([]);\n const [commentsByThread, setCommentsByThread] = useState<\n Record<string, Comment[]>\n >({});\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [commentModeEnabled, setCommentModeEnabled] = useState(true);\n const [hoveredRect, setHoveredRect] = useState<HoveredRect>(null);\n const [pendingAnchor, setPendingAnchor] = useState<{ x: number; y: number } | null>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const surfaceClickHandlerRef = useRef<((e: React.MouseEvent<HTMLDivElement>) => void) | null>(null);\n const onPinClickRef = useRef<((threadId: string, clientX: number, clientY: number) => void) | null>(null);\n\n const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n\n // Load existing threads on mount / when config changes.\n useEffect(() => {\n let cancelled = false;\n\n async function fetchThreads() {\n if (!isAuthReady) return;\n\n try {\n setIsLoading(true);\n setError(null);\n\n const url = new URL(`${apiBaseUrl}/threads`);\n url.searchParams.set(\"projectSlug\", config.projectSlug);\n url.searchParams.set(\"surfaceId\", config.surfaceId);\n\n const headers: HeadersInit = {};\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(url.toString(), { headers });\n if (!response.ok) {\n throw new Error(`Failed to load threads: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n threads?: {\n id: string;\n surfaceId: string;\n anchorX: number;\n anchorY: number;\n }[];\n };\n\n if (cancelled) return;\n\n const mapped: Thread[] =\n data.threads?.map((t) => ({\n id: t.id,\n anchor: { x: t.anchorX, y: t.anchorY },\n status: \"open\",\n })) ?? [];\n\n setThreads(mapped);\n } catch (err) {\n if (cancelled) return;\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n }\n\n fetchThreads();\n\n return () => {\n cancelled = true;\n };\n }, [apiBaseUrl, config.projectSlug, config.surfaceId, accessToken, isAuthReady]);\n\n const createThread = useCallback(\n async (\n anchor: ThreadAnchor,\n initialCommentBody?: string,\n initialAuthorName?: string | null,\n ): Promise<Thread> => {\n const optimisticThread: Thread = {\n id: `${Date.now()}`,\n anchor,\n status: \"open\",\n };\n\n setThreads((prev) => [...prev, optimisticThread]);\n\n try {\n setIsLoading(true);\n setError(null);\n\n const response = await fetch(`${apiBaseUrl}/threads`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n },\n body: JSON.stringify({\n projectSlug: config.projectSlug,\n surfaceId: config.surfaceId,\n anchorX: anchor.x,\n anchorY: anchor.y,\n initialCommentBody: initialCommentBody ?? null,\n initialAuthorName: initialAuthorName ?? null,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create thread: ${response.status}`);\n }\n\n const data = (await response.json()) as { id: string };\n\n const persistedThread: Thread = {\n ...optimisticThread,\n id: data.id,\n };\n\n setThreads((prev) =>\n prev.map((t) => (t === optimisticThread ? persistedThread : t)),\n );\n\n return persistedThread;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n // Roll back optimistic thread\n setThreads((prev) => prev.filter((t) => t !== optimisticThread));\n throw e;\n } finally {\n setIsLoading(false);\n }\n },\n [apiBaseUrl, config.projectSlug, config.surfaceId, accessToken],\n );\n\n const loadComments = useCallback(\n async (threadId: string): Promise<void> => {\n try {\n setError(null);\n\n const url = new URL(`${apiBaseUrl}/comments`);\n url.searchParams.set(\"threadId\", threadId);\n\n const headers: HeadersInit = {};\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(url.toString(), { headers });\n if (!response.ok) {\n throw new Error(`Failed to load comments: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n comments?: {\n id: string;\n threadId: string;\n body: string;\n createdAt?: string;\n authorName?: string | null;\n }[];\n };\n\n const mapped: Comment[] =\n data.comments?.map((c) => ({\n id: c.id,\n threadId: c.threadId,\n body: c.body,\n createdAt: c.createdAt,\n authorName: c.authorName ?? null,\n })) ?? [];\n\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: mapped,\n }));\n } catch (err) {\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n throw e;\n }\n },\n [apiBaseUrl, accessToken],\n );\n\n const addComment = useCallback(\n async (\n threadId: string,\n body: string,\n authorName?: string | null,\n ): Promise<Comment> => {\n const trimmed = body.trim();\n if (!trimmed) {\n throw new Error(\"Comment body is empty\");\n }\n\n const optimistic: Comment = {\n id: `${Date.now()}`,\n threadId,\n body: trimmed,\n authorName: authorName ?? null,\n };\n\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: [...(prev[threadId] ?? []), optimistic],\n }));\n\n try {\n const response = await fetch(`${apiBaseUrl}/comments`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n },\n body: JSON.stringify({ threadId, body: trimmed, authorName }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create comment: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n id: string;\n createdAt?: string;\n };\n\n const persisted: Comment = {\n id: data.id,\n threadId,\n body: trimmed,\n createdAt: data.createdAt,\n };\n\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: (prev[threadId] ?? []).map((c) =>\n c === optimistic ? persisted : c,\n ),\n }));\n\n return persisted;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n // Roll back optimistic comment\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: (prev[threadId] ?? []).filter((c) => c !== optimistic),\n }));\n throw e;\n }\n },\n [apiBaseUrl, accessToken],\n );\n\n const deleteThread = useCallback(\n async (threadId: string): Promise<void> => {\n const headers: HeadersInit = {\n ...(accessToken ? { Authorization: `Bearer ${accessToken}` } : {}),\n };\n\n const response = await fetch(`${apiBaseUrl}/threads/${threadId}`, {\n method: \"DELETE\",\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete thread: ${response.status}`);\n }\n\n setThreads((prev) => prev.filter((t) => t.id !== threadId));\n setCommentsByThread((prev) => {\n const next = { ...prev };\n delete next[threadId];\n return next;\n });\n },\n [apiBaseUrl, accessToken],\n );\n\n const value = useMemo<CommentsContextValue>(\n () => ({\n config,\n threads,\n commentsByThread,\n isLoading,\n error,\n createThread,\n loadComments,\n addComment,\n deleteThread,\n commentModeEnabled,\n setCommentModeEnabled,\n surfaceRef,\n hoveredRect,\n setHoveredRect,\n surfaceClickHandlerRef,\n pendingAnchor,\n setPendingAnchor,\n onPinClickRef,\n }),\n [\n config,\n threads,\n commentsByThread,\n isLoading,\n error,\n createThread,\n loadComments,\n addComment,\n deleteThread,\n commentModeEnabled,\n hoveredRect,\n pendingAnchor,\n ],\n );\n\n return <CommentsContext.Provider value={value}>{children}</CommentsContext.Provider>;\n}\n\nexport function useCommentsInternal(): CommentsContextValue {\n const ctx = useContext(CommentsContext);\n if (!ctx) {\n throw new Error(\"useCommentsInternal must be used within a CommentsProvider\");\n }\n return ctx;\n}\n\n","import React from \"react\";\nimport type { CommentConfig } from \"./types\";\nimport { CommentsProvider } from \"./context/CommentsContext\";\nimport { AuthProvider } from \"./auth/AuthContext\";\n\nexport type CommentProviderProps = {\n config: CommentConfig;\n children: React.ReactNode;\n};\n\nexport function CommentProvider(props: CommentProviderProps): JSX.Element {\n const { config, children } = props;\n return (\n <AuthProvider config={config}>\n <CommentsProvider config={config}>{children}</CommentsProvider>\n </AuthProvider>\n );\n}\n\n","import { useCommentsInternal } from \"./context/CommentsContext\";\n\nexport function useComments() {\n const ctx = useCommentsInternal();\n\n return {\n config: ctx.config,\n threads: ctx.threads,\n commentsByThread: ctx.commentsByThread,\n isLoading: ctx.isLoading,\n error: ctx.error,\n createThread: ctx.createThread,\n loadComments: ctx.loadComments,\n addComment: ctx.addComment,\n deleteThread: ctx.deleteThread,\n };\n}\n\n","import React, { useCallback } from \"react\";\nimport { useCommentsInternal } from \"./context/CommentsContext\";\nimport { useComments } from \"./hooks\";\n\nconst PIN_STYLE: React.CSSProperties = {\n position: \"absolute\",\n transform: \"translate(-50%, -50%)\",\n width: 18,\n height: 18,\n borderRadius: \"999px\",\n background: \"#f97316\",\n border: \"2px solid #fff\",\n boxShadow: \"0 4px 10px rgba(0,0,0,0.25)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#fff\",\n fontSize: 10,\n fontWeight: 600,\n cursor: \"pointer\",\n};\n\nexport type CommentSurfaceProps = {\n children?: React.ReactNode;\n style?: React.CSSProperties;\n className?: string;\n};\n\n/**\n * Wraps the area that can receive comment pins. When comment mode is on,\n * mouse move highlights the element under the cursor and click creates a thread.\n * Pins are rendered inside the surface so they scroll with the content.\n * Must be used inside CommentProvider and wrap the same DOM that CommentOverlay covers.\n */\nexport function CommentSurface(props: CommentSurfaceProps): JSX.Element {\n const {\n commentModeEnabled,\n setHoveredRect,\n surfaceRef,\n surfaceClickHandlerRef,\n pendingAnchor,\n onPinClickRef,\n } = useCommentsInternal();\n const { threads } = useComments();\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!commentModeEnabled) return;\n const el = e.target as HTMLElement;\n const rect = el.getBoundingClientRect();\n setHoveredRect({\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n });\n },\n [commentModeEnabled, setHoveredRect],\n );\n\n const handleMouseLeave = useCallback(() => {\n setHoveredRect(null);\n }, [setHoveredRect]);\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!commentModeEnabled) return;\n // Let pin clicks through so opening a thread still works\n const target = e.target as HTMLElement;\n if (target.closest?.(\"[data-commentator-pin]\")) return;\n e.preventDefault();\n e.stopPropagation();\n surfaceClickHandlerRef.current?.(e);\n },\n [commentModeEnabled, surfaceClickHandlerRef],\n );\n\n return (\n <div\n ref={surfaceRef}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n onClickCapture={handleClick}\n style={{ ...props.style, minHeight: \"100%\", position: \"relative\" }}\n className={props.className}\n >\n {props.children}\n\n {/* Pins layer: same scroll context as content so pins move with the page */}\n <div\n aria-hidden\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 1,\n }}\n >\n {threads.map((thread) => (\n <div\n key={thread.id}\n data-commentator-pin\n role=\"button\"\n tabIndex={0}\n onClick={(e) => {\n e.stopPropagation();\n onPinClickRef.current?.(thread.id, e.clientX, e.clientY);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.stopPropagation();\n onPinClickRef.current?.(thread.id, 0, 0);\n }\n }}\n style={{\n ...PIN_STYLE,\n left: `${thread.anchor.x * 100}%`,\n top: `${thread.anchor.y * 100}%`,\n pointerEvents: \"auto\",\n }}\n >\n ●\n </div>\n ))}\n {pendingAnchor && (\n <div\n aria-hidden\n data-commentator-pin\n style={{\n ...PIN_STYLE,\n left: `${pendingAnchor.x * 100}%`,\n top: `${pendingAnchor.y * 100}%`,\n cursor: \"default\",\n opacity: 0.7,\n pointerEvents: \"auto\",\n }}\n >\n ●\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useAuthInternal } from \"./auth/AuthContext\";\n\nexport function useCommentAuth() {\n return useAuthInternal();\n}\n\n","\"use client\";\n\nimport React from \"react\";\nimport { useCommentAuth } from \"./auth\";\n\nexport function CommentSettings(): JSX.Element {\n const {\n user,\n displayName,\n signOut,\n isReady: isAuthReady,\n signInWithGitHub,\n } = useCommentAuth();\n\n return (\n <div\n style={{\n borderRadius: 16,\n padding: 16,\n backgroundColor: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 4,\n }}\n >\n <span\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: \"#111827\",\n }}\n >\n Commentator settings\n </span>\n {user && (\n <button\n type=\"button\"\n onClick={() => signOut().catch(() => {})}\n style={{\n borderRadius: 999,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#ffffff\",\n padding: \"4px 10px\",\n fontSize: 11,\n color: \"#374151\",\n cursor: \"pointer\",\n }}\n >\n Sign out\n </button>\n )}\n </div>\n\n {user ? (\n <div\n style={{\n fontSize: 12,\n color: \"#6b7280\",\n }}\n >\n <span>Signed in as {displayName || user.email || \"unknown user\"}</span>\n </div>\n ) : (\n <div style={{ marginTop: 4 }}>\n <button\n type=\"button\"\n onClick={() => signInWithGitHub().catch(() => {})}\n disabled={!isAuthReady}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#24292f\",\n color: \"#fff\",\n fontSize: 13,\n fontWeight: 500,\n cursor: isAuthReady ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.464-1.11-1.464-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0112 6.836c.85.004 1.705.114 2.504.336 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z\" />\n </svg>\n Sign in with GitHub\n </button>\n </div>\n )}\n </div>\n );\n}\n\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useComments } from \"./hooks\";\nimport { useCommentAuth } from \"./auth\";\nimport { CommentSettings } from \"./CommentSettings\";\nimport { useCommentsInternal } from \"./context/CommentsContext\";\n\nexport type CommentOverlayProps = {\n position?: \"left\" | \"right\";\n};\n\nconst PANEL_WIDTH = 280;\nconst PANEL_HEIGHT = 260;\nconst PANEL_MARGIN = 16;\n\nfunction computePanelPosition(clientX: number, clientY: number) {\n if (typeof window === \"undefined\") {\n return { top: 72, left: undefined as unknown as number };\n }\n\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Default: open to the right of the click.\n let left = clientX + 24;\n let top = clientY - PANEL_HEIGHT / 2;\n\n // If too close to the right edge, open to the left instead.\n if (left + PANEL_WIDTH + PANEL_MARGIN > vw) {\n left = clientX - PANEL_WIDTH - 24;\n }\n\n // Clamp into viewport with some margin.\n left = Math.min(\n Math.max(PANEL_MARGIN, left),\n vw - PANEL_WIDTH - PANEL_MARGIN,\n );\n top = Math.min(\n Math.max(PANEL_MARGIN, top),\n vh - PANEL_HEIGHT - PANEL_MARGIN,\n );\n\n return { top, left };\n}\n\nexport function CommentOverlay(props: CommentOverlayProps): JSX.Element {\n const { position = \"right\" } = props;\n const {\n threads,\n commentsByThread,\n createThread,\n loadComments,\n addComment,\n deleteThread,\n } = useComments();\n const {\n commentModeEnabled,\n setCommentModeEnabled,\n surfaceRef,\n hoveredRect,\n setHoveredRect,\n surfaceClickHandlerRef,\n pendingAnchor,\n setPendingAnchor,\n onPinClickRef,\n } = useCommentsInternal();\n const {\n user,\n isReady: isAuthReady,\n signInWithGitHub,\n displayName,\n } = useCommentAuth();\n const [activeThreadId, setActiveThreadId] = useState<string | null>(null);\n const [draft, setDraft] = useState(\"\");\n const [panelPosition, setPanelPosition] = useState<{ top: number; left?: number } | null>(null);\n const [showSettings, setShowSettings] = useState(false);\n\n const activeComments = useMemo(\n () => (activeThreadId ? commentsByThread[activeThreadId] ?? [] : []),\n [activeThreadId, commentsByThread],\n );\n\n useEffect(() => {\n if (!activeThreadId || pendingAnchor) return;\n if (commentsByThread[activeThreadId]?.length) return;\n void loadComments(activeThreadId);\n }, [activeThreadId, pendingAnchor, commentsByThread, loadComments]);\n\n const handleSurfaceClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n setShowSettings(false);\n\n const rect = surfaceRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n const x = (event.clientX - rect.left) / rect.width;\n const y = (event.clientY - rect.top) / rect.height;\n\n setPendingAnchor({ x, y });\n setActiveThreadId(null);\n setDraft(\"\");\n setPanelPosition(computePanelPosition(event.clientX, event.clientY));\n },\n [setPendingAnchor, surfaceRef],\n );\n\n useEffect(() => {\n surfaceClickHandlerRef.current = handleSurfaceClick;\n return () => {\n surfaceClickHandlerRef.current = null;\n };\n }, [surfaceClickHandlerRef, handleSurfaceClick]);\n\n useEffect(() => {\n onPinClickRef.current = (threadId: string, clientX: number, clientY: number) => {\n setShowSettings(false);\n setActiveThreadId(threadId);\n setPendingAnchor(null);\n setPanelPosition(computePanelPosition(clientX, clientY));\n };\n return () => {\n onPinClickRef.current = null;\n };\n }, [onPinClickRef]);\n\n const handleToggle = useCallback(() => {\n const next = !commentModeEnabled;\n if (!next) setHoveredRect(null);\n setCommentModeEnabled(next);\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n }, [commentModeEnabled, setCommentModeEnabled, setHoveredRect, setPendingAnchor]);\n\n return (\n <>\n {/* Toggle + settings */}\n <div\n style={{\n position: \"fixed\",\n top: 16,\n [position]: 16,\n zIndex: 2147483000,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-pressed={commentModeEnabled}\n style={{\n padding: \"8px 12px\",\n borderRadius: 999,\n border: \"1px solid rgba(0,0,0,0.12)\",\n background: commentModeEnabled ? \"#111827\" : \"#f9fafb\",\n color: commentModeEnabled ? \"#f9fafb\" : \"#111827\",\n fontSize: 12,\n fontFamily:\n \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n cursor: \"pointer\",\n }}\n >\n {commentModeEnabled ? \"Comment mode: on\" : \"Comment mode: off\"}\n </button>\n <button\n type=\"button\"\n onClick={() =>\n setShowSettings((prev) => {\n const next = !prev;\n if (next) {\n // Close any open comment panel when settings are shown.\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n }\n return next;\n })\n }\n aria-label=\"Commentator settings\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 999,\n border: \"1px solid rgba(0,0,0,0.12)\",\n background: \"#ffffff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.12)\",\n cursor: \"pointer\",\n fontSize: 14,\n color: \"#4b5563\",\n }}\n >\n ⚙️\n </button>\n </div>\n\n {showSettings && (\n <div\n style={{\n position: \"fixed\",\n top: 54,\n [position]: 16,\n zIndex: 2147483000,\n maxWidth: 280,\n }}\n >\n <CommentSettings />\n </div>\n )}\n\n {!showSettings && (activeThreadId || pendingAnchor) && (\n <div\n style={{\n position: \"fixed\",\n top: panelPosition?.top ?? 72,\n left: panelPosition?.left,\n width: PANEL_WIDTH,\n maxHeight: \"70vh\",\n padding: 16,\n borderRadius: 16,\n backgroundColor: \"#ffffff\",\n boxShadow: \"0 18px 45px rgba(15,23,42,0.25)\",\n border: \"1px solid rgba(148,163,184,0.35)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n zIndex: 2147483500,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 4,\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: \"#111827\",\n }}\n >\n {user\n ? activeThreadId\n ? \"Thread\"\n : \"New comment\"\n : \"Sign in to comment\"}\n </span>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {activeThreadId && (\n <button\n type=\"button\"\n onClick={async () => {\n try {\n await deleteThread(activeThreadId);\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n } catch (err) {\n console.error(\"[commentator] Failed to delete thread\", err);\n }\n }}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"#b91c1c\",\n fontSize: 12,\n cursor: \"pointer\",\n }}\n >\n Delete thread\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => {\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n }}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"#6b7280\",\n fontSize: 12,\n cursor: \"pointer\",\n }}\n >\n Close\n </button>\n </div>\n </div>\n\n {user ? (\n <>\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n paddingRight: 4,\n }}\n >\n {activeComments.length === 0 ? (\n <p\n style={{\n fontSize: 13,\n color: \"#9ca3af\",\n margin: 0,\n }}\n >\n No comments yet. Be the first to comment.\n </p>\n ) : (\n activeComments.map((comment) => (\n <div\n key={comment.id}\n style={{\n fontSize: 13,\n color: \"#111827\",\n padding: \"6px 8px\",\n borderRadius: 10,\n backgroundColor: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n marginBottom: 6,\n }}\n >\n {comment.authorName && (\n <div\n style={{\n fontSize: 11,\n color: \"#6b7280\",\n marginBottom: 2,\n }}\n >\n {comment.authorName}\n </div>\n )}\n <div>{comment.body}</div>\n </div>\n ))\n )}\n </div>\n\n <form\n onSubmit={async (event) => {\n event.preventDefault();\n if (!draft.trim()) return;\n\n try {\n if (activeThreadId) {\n await addComment(activeThreadId, draft, displayName);\n // name is not needed here; comments already stored with author_id\n } else if (pendingAnchor) {\n const thread = await createThread(\n pendingAnchor,\n draft,\n displayName || null,\n );\n setActiveThreadId(thread.id);\n setPendingAnchor(null);\n }\n setDraft(\"\");\n } catch (err) {\n console.error(\"[commentator] Failed to save comment\", err);\n }\n }}\n style={{ marginTop: 4 }}\n >\n <textarea\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n rows={3}\n placeholder=\"Add a comment...\"\n style={{\n width: \"100%\",\n color: \"#000000\",\n resize: \"none\",\n fontSize: 13,\n fontFamily:\n \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n padding: \"6px 8px\",\n borderRadius: 10,\n border: \"1px solid #d1d5db\",\n boxSizing: \"border-box\",\n marginBottom: 6,\n }}\n />\n <button\n type=\"submit\"\n disabled={!draft.trim()}\n style={{\n width: \"100%\",\n padding: \"6px 10px\",\n borderRadius: 999,\n border: \"none\",\n backgroundColor: draft.trim() ? \"#111827\" : \"#e5e7eb\",\n color: draft.trim() ? \"#f9fafb\" : \"#9ca3af\",\n fontSize: 13,\n fontWeight: 500,\n cursor: draft.trim() ? \"pointer\" : \"default\",\n }}\n >\n Post comment\n </button>\n </form>\n </>\n ) : (\n <div style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n onClick={() => signInWithGitHub().catch(() => {})}\n disabled={!isAuthReady}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#24292f\",\n color: \"#fff\",\n fontSize: 13,\n fontWeight: 500,\n cursor: isAuthReady ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.464-1.11-1.464-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0112 6.836c.85.004 1.705.114 2.504.336 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z\" />\n </svg>\n Sign in with GitHub\n </button>\n </div>\n )}\n </div>\n )}\n </>\n );\n}\n\n","import React from \"react\";\nimport type { CommentConfig } from \"./types\";\nimport { CommentProvider } from \"./CommentProvider\";\nimport { CommentSurface } from \"./CommentSurface\";\nimport { CommentOverlay } from \"./CommentOverlay\";\n\nexport type CommentatorProps = {\n /** Project and surface identifiers + optional API URL. */\n config: CommentConfig;\n /** Where the comment panel appears. Default `\"right\"`. */\n position?: \"left\" | \"right\";\n /** Optional style for the surface wrapper (the tappable area for pins). */\n surfaceStyle?: React.CSSProperties;\n /** Optional class for the surface wrapper. */\n surfaceClassName?: string;\n children: React.ReactNode;\n};\n\n/**\n * All-in-one wrapper: Provider + Surface + Overlay. Use this for minimal setup\n * so the area that receives taps is correctly wired for creating pins.\n *\n * If you need to customize layout (e.g. surface only around a canvas), use\n * CommentProvider, CommentSurface, and CommentOverlay separately.\n */\nexport function Commentator(props: CommentatorProps): JSX.Element {\n const {\n config,\n position = \"right\",\n surfaceStyle,\n surfaceClassName,\n children,\n } = props;\n\n return (\n <CommentProvider config={config}>\n <CommentSurface\n style={{ minHeight: \"100%\", position: \"relative\", ...surfaceStyle }}\n className={surfaceClassName}\n >\n {children}\n </CommentSurface>\n <CommentOverlay position={position} />\n </CommentProvider>\n );\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1037,6 +1037,7 @@ function CommentOverlay(props) {
|
|
|
1037
1037
|
placeholder: "Add a comment...",
|
|
1038
1038
|
style: {
|
|
1039
1039
|
width: "100%",
|
|
1040
|
+
color: "#000000",
|
|
1040
1041
|
resize: "none",
|
|
1041
1042
|
fontSize: 13,
|
|
1042
1043
|
fontFamily: "system-ui, -apple-system, BlinkMacSystemFont, sans-serif",
|
|
@@ -1103,7 +1104,27 @@ function CommentOverlay(props) {
|
|
|
1103
1104
|
)
|
|
1104
1105
|
] });
|
|
1105
1106
|
}
|
|
1107
|
+
function Commentator(props) {
|
|
1108
|
+
const {
|
|
1109
|
+
config,
|
|
1110
|
+
position = "right",
|
|
1111
|
+
surfaceStyle,
|
|
1112
|
+
surfaceClassName,
|
|
1113
|
+
children
|
|
1114
|
+
} = props;
|
|
1115
|
+
return /* @__PURE__ */ jsxs(CommentProvider, { config, children: [
|
|
1116
|
+
/* @__PURE__ */ jsx(
|
|
1117
|
+
CommentSurface,
|
|
1118
|
+
{
|
|
1119
|
+
style: { minHeight: "100%", position: "relative", ...surfaceStyle },
|
|
1120
|
+
className: surfaceClassName,
|
|
1121
|
+
children
|
|
1122
|
+
}
|
|
1123
|
+
),
|
|
1124
|
+
/* @__PURE__ */ jsx(CommentOverlay, { position })
|
|
1125
|
+
] });
|
|
1126
|
+
}
|
|
1106
1127
|
|
|
1107
|
-
export { CommentOverlay, CommentProvider, CommentSettings, CommentSurface, useCommentAuth, useComments };
|
|
1128
|
+
export { CommentOverlay, CommentProvider, CommentSettings, CommentSurface, Commentator, useCommentAuth, useComments };
|
|
1108
1129
|
//# sourceMappingURL=index.mjs.map
|
|
1109
1130
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/auth/AuthContext.tsx","../src/context/CommentsContext.tsx","../src/CommentProvider.tsx","../src/hooks.ts","../src/CommentSurface.tsx","../src/auth.ts","../src/CommentSettings.tsx","../src/CommentOverlay.tsx"],"names":["getDisplayNameFromUser","_a","session","createContext","useState","useEffect","useCallback","useMemo","jsx","useContext","jsxs"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Default base URL for the shared Comment Mode API.\n */\nexport const DEFAULT_API_BASE_URL = \"https://api.commentmode.dev/api/commentator\";\n","\"use client\";\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { createClient, SupabaseClient, User } from \"@supabase/supabase-js\";\nimport type { CommentConfig } from \"../types\";\nimport { DEFAULT_API_BASE_URL } from \"../constants\";\n\ntype AuthUser = Pick<User, \"id\" | \"email\">;\n\nexport type AuthContextValue = {\n supabase: SupabaseClient | null;\n user: AuthUser | null;\n accessToken: string | null;\n isReady: boolean;\n /** Resolved from GitHub: full_name, or username if name not set. Read-only. */\n displayName: string;\n signInWithEmail: (email: string) => Promise<void>;\n signInWithGitHub: () => Promise<void>;\n signOut: () => Promise<void>;\n};\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\n\nexport function AuthProvider(props: {\n config: CommentConfig;\n children: React.ReactNode;\n}): JSX.Element {\n const { config, children } = props;\n\n const [supabase, setSupabase] = useState<SupabaseClient | null>(null);\n const [user, setUser] = useState<AuthUser | null>(null);\n const [accessToken, setAccessToken] = useState<string | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [displayName, setDisplayNameState] = useState(\"\");\n\n const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n\n useEffect(() => {\n let cancelled = false;\n\n async function init() {\n try {\n const response = await fetch(`${apiBaseUrl}/auth/config`);\n if (!response.ok) {\n throw new Error(`Failed to load auth config: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n supabaseUrl: string;\n supabaseAnonKey: string;\n };\n\n if (cancelled) return;\n\n const client = createClient(data.supabaseUrl, data.supabaseAnonKey, {\n auth: {\n persistSession: true,\n },\n });\n\n setSupabase(client);\n\n function getDisplayNameFromUser(u: User): string {\n const meta = u.user_metadata as Record<string, unknown> | undefined;\n const fullName =\n (meta?.full_name as string)?.trim() ||\n (meta?.name as string)?.trim();\n const userName =\n (meta?.user_name as string)?.trim() ||\n (meta?.preferred_username as string)?.trim();\n const emailPrefix = u.email?.split(\"@\")[0]?.trim();\n return fullName || userName || emailPrefix || \"\";\n }\n\n const {\n data: { session },\n } = await client.auth.getSession();\n\n if (session?.user) {\n setUser({ id: session.user.id, email: session.user.email });\n setAccessToken(session.access_token);\n setDisplayNameState(getDisplayNameFromUser(session.user));\n }\n\n client.auth.onAuthStateChange((_event, session) => {\n if (!session || !session.user) {\n setUser(null);\n setAccessToken(null);\n setDisplayNameState(\"\");\n } else {\n setUser({ id: session.user.id, email: session.user.email });\n setAccessToken(session.access_token);\n setDisplayNameState(getDisplayNameFromUser(session.user));\n }\n });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"[commentator] Failed to initialise auth\", err);\n } finally {\n if (!cancelled) {\n setIsReady(true);\n }\n }\n }\n\n void init();\n\n return () => {\n cancelled = true;\n };\n }, [apiBaseUrl]);\n\n const signInWithEmail = useCallback(\n async (email: string) => {\n if (!supabase) return;\n\n const trimmed = email.trim();\n if (!trimmed) return;\n\n const redirectTo =\n typeof window !== \"undefined\"\n ? `${window.location.origin}${window.location.pathname}${window.location.search}`\n : undefined;\n\n await supabase.auth.signInWithOtp({\n email: trimmed,\n options: {\n emailRedirectTo: redirectTo,\n },\n });\n },\n [supabase],\n );\n\n const signInWithGitHub = useCallback(async () => {\n if (!supabase) return;\n\n const redirectTo =\n typeof window !== \"undefined\"\n ? `${window.location.origin}${window.location.pathname}${window.location.search}`\n : undefined;\n\n await supabase.auth.signInWithOAuth({\n provider: \"github\",\n options: { redirectTo },\n });\n }, [supabase]);\n\n const signOut = useCallback(async () => {\n if (!supabase) return;\n await supabase.auth.signOut();\n setUser(null);\n setAccessToken(null);\n setDisplayNameState(\"\");\n }, [supabase]);\n\n const value = useMemo<AuthContextValue>(\n () => ({\n supabase,\n user,\n accessToken,\n isReady,\n displayName,\n signInWithEmail,\n signInWithGitHub,\n signOut,\n }),\n [\n supabase,\n user,\n accessToken,\n isReady,\n displayName,\n signInWithEmail,\n signInWithGitHub,\n signOut,\n ],\n );\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useAuthInternal(): AuthContextValue {\n const ctx = useContext(AuthContext);\n if (!ctx) {\n throw new Error(\"useAuthInternal must be used within an AuthProvider\");\n }\n return ctx;\n}\n\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { CommentConfig } from \"../types\";\nimport { DEFAULT_API_BASE_URL } from \"../constants\";\nimport { useAuthInternal } from \"../auth/AuthContext\";\n\nexport type HoveredRect = {\n left: number;\n top: number;\n width: number;\n height: number;\n} | null;\n\nexport type ThreadAnchor = {\n x: number; // 0..1 relative to surface width\n y: number; // 0..1 relative to surface height\n};\n\nexport type Thread = {\n id: string;\n anchor: ThreadAnchor;\n status: \"open\" | \"resolved\";\n};\n\nexport type Comment = {\n id: string;\n threadId: string;\n body: string;\n createdAt?: string;\n authorName?: string | null;\n};\n\nexport type CommentsContextValue = {\n config: CommentConfig;\n threads: Thread[];\n commentsByThread: Record<string, Comment[]>;\n isLoading: boolean;\n error: Error | null;\n createThread: (\n anchor: ThreadAnchor,\n initialCommentBody?: string,\n initialAuthorName?: string | null,\n ) => Promise<Thread>;\n loadComments: (threadId: string) => Promise<void>;\n addComment: (\n threadId: string,\n body: string,\n authorName?: string | null,\n ) => Promise<Comment>;\n deleteThread: (threadId: string) => Promise<void>;\n // Comment mode: element hover + surface click\n commentModeEnabled: boolean;\n setCommentModeEnabled: (enabled: boolean) => void;\n surfaceRef: React.RefObject<HTMLDivElement>;\n hoveredRect: HoveredRect;\n setHoveredRect: (rect: HoveredRect) => void;\n surfaceClickHandlerRef: React.MutableRefObject<((e: React.MouseEvent<HTMLDivElement>) => void) | null>;\n pendingAnchor: { x: number; y: number } | null;\n setPendingAnchor: (anchor: { x: number; y: number } | null) => void;\n onPinClickRef: React.MutableRefObject<((threadId: string, clientX: number, clientY: number) => void) | null>;\n};\n\nconst CommentsContext = createContext<CommentsContextValue | undefined>(undefined);\n\nexport function CommentsProvider(props: {\n config: CommentConfig;\n children: React.ReactNode;\n}): JSX.Element {\n const { config, children } = props;\n\n const { accessToken, isReady: isAuthReady } = useAuthInternal();\n const [threads, setThreads] = useState<Thread[]>([]);\n const [commentsByThread, setCommentsByThread] = useState<\n Record<string, Comment[]>\n >({});\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [commentModeEnabled, setCommentModeEnabled] = useState(true);\n const [hoveredRect, setHoveredRect] = useState<HoveredRect>(null);\n const [pendingAnchor, setPendingAnchor] = useState<{ x: number; y: number } | null>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const surfaceClickHandlerRef = useRef<((e: React.MouseEvent<HTMLDivElement>) => void) | null>(null);\n const onPinClickRef = useRef<((threadId: string, clientX: number, clientY: number) => void) | null>(null);\n\n const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n\n // Load existing threads on mount / when config changes.\n useEffect(() => {\n let cancelled = false;\n\n async function fetchThreads() {\n if (!isAuthReady) return;\n\n try {\n setIsLoading(true);\n setError(null);\n\n const url = new URL(`${apiBaseUrl}/threads`);\n url.searchParams.set(\"projectSlug\", config.projectSlug);\n url.searchParams.set(\"surfaceId\", config.surfaceId);\n\n const headers: HeadersInit = {};\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(url.toString(), { headers });\n if (!response.ok) {\n throw new Error(`Failed to load threads: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n threads?: {\n id: string;\n surfaceId: string;\n anchorX: number;\n anchorY: number;\n }[];\n };\n\n if (cancelled) return;\n\n const mapped: Thread[] =\n data.threads?.map((t) => ({\n id: t.id,\n anchor: { x: t.anchorX, y: t.anchorY },\n status: \"open\",\n })) ?? [];\n\n setThreads(mapped);\n } catch (err) {\n if (cancelled) return;\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n }\n\n fetchThreads();\n\n return () => {\n cancelled = true;\n };\n }, [apiBaseUrl, config.projectSlug, config.surfaceId, accessToken, isAuthReady]);\n\n const createThread = useCallback(\n async (\n anchor: ThreadAnchor,\n initialCommentBody?: string,\n initialAuthorName?: string | null,\n ): Promise<Thread> => {\n const optimisticThread: Thread = {\n id: `${Date.now()}`,\n anchor,\n status: \"open\",\n };\n\n setThreads((prev) => [...prev, optimisticThread]);\n\n try {\n setIsLoading(true);\n setError(null);\n\n const response = await fetch(`${apiBaseUrl}/threads`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n },\n body: JSON.stringify({\n projectSlug: config.projectSlug,\n surfaceId: config.surfaceId,\n anchorX: anchor.x,\n anchorY: anchor.y,\n initialCommentBody: initialCommentBody ?? null,\n initialAuthorName: initialAuthorName ?? null,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create thread: ${response.status}`);\n }\n\n const data = (await response.json()) as { id: string };\n\n const persistedThread: Thread = {\n ...optimisticThread,\n id: data.id,\n };\n\n setThreads((prev) =>\n prev.map((t) => (t === optimisticThread ? persistedThread : t)),\n );\n\n return persistedThread;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n // Roll back optimistic thread\n setThreads((prev) => prev.filter((t) => t !== optimisticThread));\n throw e;\n } finally {\n setIsLoading(false);\n }\n },\n [apiBaseUrl, config.projectSlug, config.surfaceId, accessToken],\n );\n\n const loadComments = useCallback(\n async (threadId: string): Promise<void> => {\n try {\n setError(null);\n\n const url = new URL(`${apiBaseUrl}/comments`);\n url.searchParams.set(\"threadId\", threadId);\n\n const headers: HeadersInit = {};\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(url.toString(), { headers });\n if (!response.ok) {\n throw new Error(`Failed to load comments: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n comments?: {\n id: string;\n threadId: string;\n body: string;\n createdAt?: string;\n authorName?: string | null;\n }[];\n };\n\n const mapped: Comment[] =\n data.comments?.map((c) => ({\n id: c.id,\n threadId: c.threadId,\n body: c.body,\n createdAt: c.createdAt,\n authorName: c.authorName ?? null,\n })) ?? [];\n\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: mapped,\n }));\n } catch (err) {\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n throw e;\n }\n },\n [apiBaseUrl, accessToken],\n );\n\n const addComment = useCallback(\n async (\n threadId: string,\n body: string,\n authorName?: string | null,\n ): Promise<Comment> => {\n const trimmed = body.trim();\n if (!trimmed) {\n throw new Error(\"Comment body is empty\");\n }\n\n const optimistic: Comment = {\n id: `${Date.now()}`,\n threadId,\n body: trimmed,\n authorName: authorName ?? null,\n };\n\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: [...(prev[threadId] ?? []), optimistic],\n }));\n\n try {\n const response = await fetch(`${apiBaseUrl}/comments`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n },\n body: JSON.stringify({ threadId, body: trimmed, authorName }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create comment: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n id: string;\n createdAt?: string;\n };\n\n const persisted: Comment = {\n id: data.id,\n threadId,\n body: trimmed,\n createdAt: data.createdAt,\n };\n\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: (prev[threadId] ?? []).map((c) =>\n c === optimistic ? persisted : c,\n ),\n }));\n\n return persisted;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n // Roll back optimistic comment\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: (prev[threadId] ?? []).filter((c) => c !== optimistic),\n }));\n throw e;\n }\n },\n [apiBaseUrl, accessToken],\n );\n\n const deleteThread = useCallback(\n async (threadId: string): Promise<void> => {\n const headers: HeadersInit = {\n ...(accessToken ? { Authorization: `Bearer ${accessToken}` } : {}),\n };\n\n const response = await fetch(`${apiBaseUrl}/threads/${threadId}`, {\n method: \"DELETE\",\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete thread: ${response.status}`);\n }\n\n setThreads((prev) => prev.filter((t) => t.id !== threadId));\n setCommentsByThread((prev) => {\n const next = { ...prev };\n delete next[threadId];\n return next;\n });\n },\n [apiBaseUrl, accessToken],\n );\n\n const value = useMemo<CommentsContextValue>(\n () => ({\n config,\n threads,\n commentsByThread,\n isLoading,\n error,\n createThread,\n loadComments,\n addComment,\n deleteThread,\n commentModeEnabled,\n setCommentModeEnabled,\n surfaceRef,\n hoveredRect,\n setHoveredRect,\n surfaceClickHandlerRef,\n pendingAnchor,\n setPendingAnchor,\n onPinClickRef,\n }),\n [\n config,\n threads,\n commentsByThread,\n isLoading,\n error,\n createThread,\n loadComments,\n addComment,\n deleteThread,\n commentModeEnabled,\n hoveredRect,\n pendingAnchor,\n ],\n );\n\n return <CommentsContext.Provider value={value}>{children}</CommentsContext.Provider>;\n}\n\nexport function useCommentsInternal(): CommentsContextValue {\n const ctx = useContext(CommentsContext);\n if (!ctx) {\n throw new Error(\"useCommentsInternal must be used within a CommentsProvider\");\n }\n return ctx;\n}\n\n","import React from \"react\";\nimport type { CommentConfig } from \"./types\";\nimport { CommentsProvider } from \"./context/CommentsContext\";\nimport { AuthProvider } from \"./auth/AuthContext\";\n\nexport type CommentProviderProps = {\n config: CommentConfig;\n children: React.ReactNode;\n};\n\nexport function CommentProvider(props: CommentProviderProps): JSX.Element {\n const { config, children } = props;\n return (\n <AuthProvider config={config}>\n <CommentsProvider config={config}>{children}</CommentsProvider>\n </AuthProvider>\n );\n}\n\n","import { useCommentsInternal } from \"./context/CommentsContext\";\n\nexport function useComments() {\n const ctx = useCommentsInternal();\n\n return {\n config: ctx.config,\n threads: ctx.threads,\n commentsByThread: ctx.commentsByThread,\n isLoading: ctx.isLoading,\n error: ctx.error,\n createThread: ctx.createThread,\n loadComments: ctx.loadComments,\n addComment: ctx.addComment,\n deleteThread: ctx.deleteThread,\n };\n}\n\n","import React, { useCallback } from \"react\";\nimport { useCommentsInternal } from \"./context/CommentsContext\";\nimport { useComments } from \"./hooks\";\n\nconst PIN_STYLE: React.CSSProperties = {\n position: \"absolute\",\n transform: \"translate(-50%, -50%)\",\n width: 18,\n height: 18,\n borderRadius: \"999px\",\n background: \"#f97316\",\n border: \"2px solid #fff\",\n boxShadow: \"0 4px 10px rgba(0,0,0,0.25)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#fff\",\n fontSize: 10,\n fontWeight: 600,\n cursor: \"pointer\",\n};\n\nexport type CommentSurfaceProps = {\n children?: React.ReactNode;\n style?: React.CSSProperties;\n className?: string;\n};\n\n/**\n * Wraps the area that can receive comment pins. When comment mode is on,\n * mouse move highlights the element under the cursor and click creates a thread.\n * Pins are rendered inside the surface so they scroll with the content.\n * Must be used inside CommentProvider and wrap the same DOM that CommentOverlay covers.\n */\nexport function CommentSurface(props: CommentSurfaceProps): JSX.Element {\n const {\n commentModeEnabled,\n setHoveredRect,\n surfaceRef,\n surfaceClickHandlerRef,\n pendingAnchor,\n onPinClickRef,\n } = useCommentsInternal();\n const { threads } = useComments();\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!commentModeEnabled) return;\n const el = e.target as HTMLElement;\n const rect = el.getBoundingClientRect();\n setHoveredRect({\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n });\n },\n [commentModeEnabled, setHoveredRect],\n );\n\n const handleMouseLeave = useCallback(() => {\n setHoveredRect(null);\n }, [setHoveredRect]);\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!commentModeEnabled) return;\n // Let pin clicks through so opening a thread still works\n const target = e.target as HTMLElement;\n if (target.closest?.(\"[data-commentator-pin]\")) return;\n e.preventDefault();\n e.stopPropagation();\n surfaceClickHandlerRef.current?.(e);\n },\n [commentModeEnabled, surfaceClickHandlerRef],\n );\n\n return (\n <div\n ref={surfaceRef}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n onClickCapture={handleClick}\n style={{ ...props.style, minHeight: \"100%\", position: \"relative\" }}\n className={props.className}\n >\n {props.children}\n\n {/* Pins layer: same scroll context as content so pins move with the page */}\n <div\n aria-hidden\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 1,\n }}\n >\n {threads.map((thread) => (\n <div\n key={thread.id}\n data-commentator-pin\n role=\"button\"\n tabIndex={0}\n onClick={(e) => {\n e.stopPropagation();\n onPinClickRef.current?.(thread.id, e.clientX, e.clientY);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.stopPropagation();\n onPinClickRef.current?.(thread.id, 0, 0);\n }\n }}\n style={{\n ...PIN_STYLE,\n left: `${thread.anchor.x * 100}%`,\n top: `${thread.anchor.y * 100}%`,\n pointerEvents: \"auto\",\n }}\n >\n ●\n </div>\n ))}\n {pendingAnchor && (\n <div\n aria-hidden\n data-commentator-pin\n style={{\n ...PIN_STYLE,\n left: `${pendingAnchor.x * 100}%`,\n top: `${pendingAnchor.y * 100}%`,\n cursor: \"default\",\n opacity: 0.7,\n pointerEvents: \"auto\",\n }}\n >\n ●\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useAuthInternal } from \"./auth/AuthContext\";\n\nexport function useCommentAuth() {\n return useAuthInternal();\n}\n\n","\"use client\";\n\nimport React from \"react\";\nimport { useCommentAuth } from \"./auth\";\n\nexport function CommentSettings(): JSX.Element {\n const {\n user,\n displayName,\n signOut,\n isReady: isAuthReady,\n signInWithGitHub,\n } = useCommentAuth();\n\n return (\n <div\n style={{\n borderRadius: 16,\n padding: 16,\n backgroundColor: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 4,\n }}\n >\n <span\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: \"#111827\",\n }}\n >\n Commentator settings\n </span>\n {user && (\n <button\n type=\"button\"\n onClick={() => signOut().catch(() => {})}\n style={{\n borderRadius: 999,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#ffffff\",\n padding: \"4px 10px\",\n fontSize: 11,\n color: \"#374151\",\n cursor: \"pointer\",\n }}\n >\n Sign out\n </button>\n )}\n </div>\n\n {user ? (\n <div\n style={{\n fontSize: 12,\n color: \"#6b7280\",\n }}\n >\n <span>Signed in as {displayName || user.email || \"unknown user\"}</span>\n </div>\n ) : (\n <div style={{ marginTop: 4 }}>\n <button\n type=\"button\"\n onClick={() => signInWithGitHub().catch(() => {})}\n disabled={!isAuthReady}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#24292f\",\n color: \"#fff\",\n fontSize: 13,\n fontWeight: 500,\n cursor: isAuthReady ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.464-1.11-1.464-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0112 6.836c.85.004 1.705.114 2.504.336 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z\" />\n </svg>\n Sign in with GitHub\n </button>\n </div>\n )}\n </div>\n );\n}\n\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useComments } from \"./hooks\";\nimport { useCommentAuth } from \"./auth\";\nimport { CommentSettings } from \"./CommentSettings\";\nimport { useCommentsInternal } from \"./context/CommentsContext\";\n\nexport type CommentOverlayProps = {\n position?: \"left\" | \"right\";\n};\n\nconst PANEL_WIDTH = 280;\nconst PANEL_HEIGHT = 260;\nconst PANEL_MARGIN = 16;\n\nfunction computePanelPosition(clientX: number, clientY: number) {\n if (typeof window === \"undefined\") {\n return { top: 72, left: undefined as unknown as number };\n }\n\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Default: open to the right of the click.\n let left = clientX + 24;\n let top = clientY - PANEL_HEIGHT / 2;\n\n // If too close to the right edge, open to the left instead.\n if (left + PANEL_WIDTH + PANEL_MARGIN > vw) {\n left = clientX - PANEL_WIDTH - 24;\n }\n\n // Clamp into viewport with some margin.\n left = Math.min(\n Math.max(PANEL_MARGIN, left),\n vw - PANEL_WIDTH - PANEL_MARGIN,\n );\n top = Math.min(\n Math.max(PANEL_MARGIN, top),\n vh - PANEL_HEIGHT - PANEL_MARGIN,\n );\n\n return { top, left };\n}\n\nexport function CommentOverlay(props: CommentOverlayProps): JSX.Element {\n const { position = \"right\" } = props;\n const {\n threads,\n commentsByThread,\n createThread,\n loadComments,\n addComment,\n deleteThread,\n } = useComments();\n const {\n commentModeEnabled,\n setCommentModeEnabled,\n surfaceRef,\n hoveredRect,\n setHoveredRect,\n surfaceClickHandlerRef,\n pendingAnchor,\n setPendingAnchor,\n onPinClickRef,\n } = useCommentsInternal();\n const {\n user,\n isReady: isAuthReady,\n signInWithGitHub,\n displayName,\n } = useCommentAuth();\n const [activeThreadId, setActiveThreadId] = useState<string | null>(null);\n const [draft, setDraft] = useState(\"\");\n const [panelPosition, setPanelPosition] = useState<{ top: number; left?: number } | null>(null);\n const [showSettings, setShowSettings] = useState(false);\n\n const activeComments = useMemo(\n () => (activeThreadId ? commentsByThread[activeThreadId] ?? [] : []),\n [activeThreadId, commentsByThread],\n );\n\n useEffect(() => {\n if (!activeThreadId || pendingAnchor) return;\n if (commentsByThread[activeThreadId]?.length) return;\n void loadComments(activeThreadId);\n }, [activeThreadId, pendingAnchor, commentsByThread, loadComments]);\n\n const handleSurfaceClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n setShowSettings(false);\n\n const rect = surfaceRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n const x = (event.clientX - rect.left) / rect.width;\n const y = (event.clientY - rect.top) / rect.height;\n\n setPendingAnchor({ x, y });\n setActiveThreadId(null);\n setDraft(\"\");\n setPanelPosition(computePanelPosition(event.clientX, event.clientY));\n },\n [setPendingAnchor, surfaceRef],\n );\n\n useEffect(() => {\n surfaceClickHandlerRef.current = handleSurfaceClick;\n return () => {\n surfaceClickHandlerRef.current = null;\n };\n }, [surfaceClickHandlerRef, handleSurfaceClick]);\n\n useEffect(() => {\n onPinClickRef.current = (threadId: string, clientX: number, clientY: number) => {\n setShowSettings(false);\n setActiveThreadId(threadId);\n setPendingAnchor(null);\n setPanelPosition(computePanelPosition(clientX, clientY));\n };\n return () => {\n onPinClickRef.current = null;\n };\n }, [onPinClickRef]);\n\n const handleToggle = useCallback(() => {\n const next = !commentModeEnabled;\n if (!next) setHoveredRect(null);\n setCommentModeEnabled(next);\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n }, [commentModeEnabled, setCommentModeEnabled, setHoveredRect, setPendingAnchor]);\n\n return (\n <>\n {/* Toggle + settings */}\n <div\n style={{\n position: \"fixed\",\n top: 16,\n [position]: 16,\n zIndex: 2147483000,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-pressed={commentModeEnabled}\n style={{\n padding: \"8px 12px\",\n borderRadius: 999,\n border: \"1px solid rgba(0,0,0,0.12)\",\n background: commentModeEnabled ? \"#111827\" : \"#f9fafb\",\n color: commentModeEnabled ? \"#f9fafb\" : \"#111827\",\n fontSize: 12,\n fontFamily:\n \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n cursor: \"pointer\",\n }}\n >\n {commentModeEnabled ? \"Comment mode: on\" : \"Comment mode: off\"}\n </button>\n <button\n type=\"button\"\n onClick={() =>\n setShowSettings((prev) => {\n const next = !prev;\n if (next) {\n // Close any open comment panel when settings are shown.\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n }\n return next;\n })\n }\n aria-label=\"Commentator settings\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 999,\n border: \"1px solid rgba(0,0,0,0.12)\",\n background: \"#ffffff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.12)\",\n cursor: \"pointer\",\n fontSize: 14,\n color: \"#4b5563\",\n }}\n >\n ⚙️\n </button>\n </div>\n\n {showSettings && (\n <div\n style={{\n position: \"fixed\",\n top: 54,\n [position]: 16,\n zIndex: 2147483000,\n maxWidth: 280,\n }}\n >\n <CommentSettings />\n </div>\n )}\n\n {!showSettings && (activeThreadId || pendingAnchor) && (\n <div\n style={{\n position: \"fixed\",\n top: panelPosition?.top ?? 72,\n left: panelPosition?.left,\n width: PANEL_WIDTH,\n maxHeight: \"70vh\",\n padding: 16,\n borderRadius: 16,\n backgroundColor: \"#ffffff\",\n boxShadow: \"0 18px 45px rgba(15,23,42,0.25)\",\n border: \"1px solid rgba(148,163,184,0.35)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n zIndex: 2147483500,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 4,\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: \"#111827\",\n }}\n >\n {user\n ? activeThreadId\n ? \"Thread\"\n : \"New comment\"\n : \"Sign in to comment\"}\n </span>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {activeThreadId && (\n <button\n type=\"button\"\n onClick={async () => {\n try {\n await deleteThread(activeThreadId);\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n } catch (err) {\n console.error(\"[commentator] Failed to delete thread\", err);\n }\n }}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"#b91c1c\",\n fontSize: 12,\n cursor: \"pointer\",\n }}\n >\n Delete thread\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => {\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n }}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"#6b7280\",\n fontSize: 12,\n cursor: \"pointer\",\n }}\n >\n Close\n </button>\n </div>\n </div>\n\n {user ? (\n <>\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n paddingRight: 4,\n }}\n >\n {activeComments.length === 0 ? (\n <p\n style={{\n fontSize: 13,\n color: \"#9ca3af\",\n margin: 0,\n }}\n >\n No comments yet. Be the first to comment.\n </p>\n ) : (\n activeComments.map((comment) => (\n <div\n key={comment.id}\n style={{\n fontSize: 13,\n color: \"#111827\",\n padding: \"6px 8px\",\n borderRadius: 10,\n backgroundColor: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n marginBottom: 6,\n }}\n >\n {comment.authorName && (\n <div\n style={{\n fontSize: 11,\n color: \"#6b7280\",\n marginBottom: 2,\n }}\n >\n {comment.authorName}\n </div>\n )}\n <div>{comment.body}</div>\n </div>\n ))\n )}\n </div>\n\n <form\n onSubmit={async (event) => {\n event.preventDefault();\n if (!draft.trim()) return;\n\n try {\n if (activeThreadId) {\n await addComment(activeThreadId, draft, displayName);\n // name is not needed here; comments already stored with author_id\n } else if (pendingAnchor) {\n const thread = await createThread(\n pendingAnchor,\n draft,\n displayName || null,\n );\n setActiveThreadId(thread.id);\n setPendingAnchor(null);\n }\n setDraft(\"\");\n } catch (err) {\n console.error(\"[commentator] Failed to save comment\", err);\n }\n }}\n style={{ marginTop: 4 }}\n >\n <textarea\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n rows={3}\n placeholder=\"Add a comment...\"\n style={{\n width: \"100%\",\n resize: \"none\",\n fontSize: 13,\n fontFamily:\n \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n padding: \"6px 8px\",\n borderRadius: 10,\n border: \"1px solid #d1d5db\",\n boxSizing: \"border-box\",\n marginBottom: 6,\n }}\n />\n <button\n type=\"submit\"\n disabled={!draft.trim()}\n style={{\n width: \"100%\",\n padding: \"6px 10px\",\n borderRadius: 999,\n border: \"none\",\n backgroundColor: draft.trim() ? \"#111827\" : \"#e5e7eb\",\n color: draft.trim() ? \"#f9fafb\" : \"#9ca3af\",\n fontSize: 13,\n fontWeight: 500,\n cursor: draft.trim() ? \"pointer\" : \"default\",\n }}\n >\n Post comment\n </button>\n </form>\n </>\n ) : (\n <div style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n onClick={() => signInWithGitHub().catch(() => {})}\n disabled={!isAuthReady}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#24292f\",\n color: \"#fff\",\n fontSize: 13,\n fontWeight: 500,\n cursor: isAuthReady ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.464-1.11-1.464-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0112 6.836c.85.004 1.705.114 2.504.336 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z\" />\n </svg>\n Sign in with GitHub\n </button>\n </div>\n )}\n </div>\n )}\n </>\n );\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/auth/AuthContext.tsx","../src/context/CommentsContext.tsx","../src/CommentProvider.tsx","../src/hooks.ts","../src/CommentSurface.tsx","../src/auth.ts","../src/CommentSettings.tsx","../src/CommentOverlay.tsx","../src/Commentator.tsx"],"names":["getDisplayNameFromUser","_a","session","createContext","useState","useEffect","useCallback","useMemo","jsx","useContext","jsxs"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Default base URL for the shared Comment Mode API.\n */\nexport const DEFAULT_API_BASE_URL = \"https://api.commentmode.dev/api/commentator\";\n","\"use client\";\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { createClient, SupabaseClient, User } from \"@supabase/supabase-js\";\nimport type { CommentConfig } from \"../types\";\nimport { DEFAULT_API_BASE_URL } from \"../constants\";\n\ntype AuthUser = Pick<User, \"id\" | \"email\">;\n\nexport type AuthContextValue = {\n supabase: SupabaseClient | null;\n user: AuthUser | null;\n accessToken: string | null;\n isReady: boolean;\n /** Resolved from GitHub: full_name, or username if name not set. Read-only. */\n displayName: string;\n signInWithEmail: (email: string) => Promise<void>;\n signInWithGitHub: () => Promise<void>;\n signOut: () => Promise<void>;\n};\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\n\nexport function AuthProvider(props: {\n config: CommentConfig;\n children: React.ReactNode;\n}): JSX.Element {\n const { config, children } = props;\n\n const [supabase, setSupabase] = useState<SupabaseClient | null>(null);\n const [user, setUser] = useState<AuthUser | null>(null);\n const [accessToken, setAccessToken] = useState<string | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [displayName, setDisplayNameState] = useState(\"\");\n\n const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n\n useEffect(() => {\n let cancelled = false;\n\n async function init() {\n try {\n const response = await fetch(`${apiBaseUrl}/auth/config`);\n if (!response.ok) {\n throw new Error(`Failed to load auth config: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n supabaseUrl: string;\n supabaseAnonKey: string;\n };\n\n if (cancelled) return;\n\n const client = createClient(data.supabaseUrl, data.supabaseAnonKey, {\n auth: {\n persistSession: true,\n },\n });\n\n setSupabase(client);\n\n function getDisplayNameFromUser(u: User): string {\n const meta = u.user_metadata as Record<string, unknown> | undefined;\n const fullName =\n (meta?.full_name as string)?.trim() ||\n (meta?.name as string)?.trim();\n const userName =\n (meta?.user_name as string)?.trim() ||\n (meta?.preferred_username as string)?.trim();\n const emailPrefix = u.email?.split(\"@\")[0]?.trim();\n return fullName || userName || emailPrefix || \"\";\n }\n\n const {\n data: { session },\n } = await client.auth.getSession();\n\n if (session?.user) {\n setUser({ id: session.user.id, email: session.user.email });\n setAccessToken(session.access_token);\n setDisplayNameState(getDisplayNameFromUser(session.user));\n }\n\n client.auth.onAuthStateChange((_event, session) => {\n if (!session || !session.user) {\n setUser(null);\n setAccessToken(null);\n setDisplayNameState(\"\");\n } else {\n setUser({ id: session.user.id, email: session.user.email });\n setAccessToken(session.access_token);\n setDisplayNameState(getDisplayNameFromUser(session.user));\n }\n });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"[commentator] Failed to initialise auth\", err);\n } finally {\n if (!cancelled) {\n setIsReady(true);\n }\n }\n }\n\n void init();\n\n return () => {\n cancelled = true;\n };\n }, [apiBaseUrl]);\n\n const signInWithEmail = useCallback(\n async (email: string) => {\n if (!supabase) return;\n\n const trimmed = email.trim();\n if (!trimmed) return;\n\n const redirectTo =\n typeof window !== \"undefined\"\n ? `${window.location.origin}${window.location.pathname}${window.location.search}`\n : undefined;\n\n await supabase.auth.signInWithOtp({\n email: trimmed,\n options: {\n emailRedirectTo: redirectTo,\n },\n });\n },\n [supabase],\n );\n\n const signInWithGitHub = useCallback(async () => {\n if (!supabase) return;\n\n const redirectTo =\n typeof window !== \"undefined\"\n ? `${window.location.origin}${window.location.pathname}${window.location.search}`\n : undefined;\n\n await supabase.auth.signInWithOAuth({\n provider: \"github\",\n options: { redirectTo },\n });\n }, [supabase]);\n\n const signOut = useCallback(async () => {\n if (!supabase) return;\n await supabase.auth.signOut();\n setUser(null);\n setAccessToken(null);\n setDisplayNameState(\"\");\n }, [supabase]);\n\n const value = useMemo<AuthContextValue>(\n () => ({\n supabase,\n user,\n accessToken,\n isReady,\n displayName,\n signInWithEmail,\n signInWithGitHub,\n signOut,\n }),\n [\n supabase,\n user,\n accessToken,\n isReady,\n displayName,\n signInWithEmail,\n signInWithGitHub,\n signOut,\n ],\n );\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useAuthInternal(): AuthContextValue {\n const ctx = useContext(AuthContext);\n if (!ctx) {\n throw new Error(\"useAuthInternal must be used within an AuthProvider\");\n }\n return ctx;\n}\n\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { CommentConfig } from \"../types\";\nimport { DEFAULT_API_BASE_URL } from \"../constants\";\nimport { useAuthInternal } from \"../auth/AuthContext\";\n\nexport type HoveredRect = {\n left: number;\n top: number;\n width: number;\n height: number;\n} | null;\n\nexport type ThreadAnchor = {\n x: number; // 0..1 relative to surface width\n y: number; // 0..1 relative to surface height\n};\n\nexport type Thread = {\n id: string;\n anchor: ThreadAnchor;\n status: \"open\" | \"resolved\";\n};\n\nexport type Comment = {\n id: string;\n threadId: string;\n body: string;\n createdAt?: string;\n authorName?: string | null;\n};\n\nexport type CommentsContextValue = {\n config: CommentConfig;\n threads: Thread[];\n commentsByThread: Record<string, Comment[]>;\n isLoading: boolean;\n error: Error | null;\n createThread: (\n anchor: ThreadAnchor,\n initialCommentBody?: string,\n initialAuthorName?: string | null,\n ) => Promise<Thread>;\n loadComments: (threadId: string) => Promise<void>;\n addComment: (\n threadId: string,\n body: string,\n authorName?: string | null,\n ) => Promise<Comment>;\n deleteThread: (threadId: string) => Promise<void>;\n // Comment mode: element hover + surface click\n commentModeEnabled: boolean;\n setCommentModeEnabled: (enabled: boolean) => void;\n surfaceRef: React.RefObject<HTMLDivElement>;\n hoveredRect: HoveredRect;\n setHoveredRect: (rect: HoveredRect) => void;\n surfaceClickHandlerRef: React.MutableRefObject<((e: React.MouseEvent<HTMLDivElement>) => void) | null>;\n pendingAnchor: { x: number; y: number } | null;\n setPendingAnchor: (anchor: { x: number; y: number } | null) => void;\n onPinClickRef: React.MutableRefObject<((threadId: string, clientX: number, clientY: number) => void) | null>;\n};\n\nconst CommentsContext = createContext<CommentsContextValue | undefined>(undefined);\n\nexport function CommentsProvider(props: {\n config: CommentConfig;\n children: React.ReactNode;\n}): JSX.Element {\n const { config, children } = props;\n\n const { accessToken, isReady: isAuthReady } = useAuthInternal();\n const [threads, setThreads] = useState<Thread[]>([]);\n const [commentsByThread, setCommentsByThread] = useState<\n Record<string, Comment[]>\n >({});\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [commentModeEnabled, setCommentModeEnabled] = useState(true);\n const [hoveredRect, setHoveredRect] = useState<HoveredRect>(null);\n const [pendingAnchor, setPendingAnchor] = useState<{ x: number; y: number } | null>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const surfaceClickHandlerRef = useRef<((e: React.MouseEvent<HTMLDivElement>) => void) | null>(null);\n const onPinClickRef = useRef<((threadId: string, clientX: number, clientY: number) => void) | null>(null);\n\n const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n\n // Load existing threads on mount / when config changes.\n useEffect(() => {\n let cancelled = false;\n\n async function fetchThreads() {\n if (!isAuthReady) return;\n\n try {\n setIsLoading(true);\n setError(null);\n\n const url = new URL(`${apiBaseUrl}/threads`);\n url.searchParams.set(\"projectSlug\", config.projectSlug);\n url.searchParams.set(\"surfaceId\", config.surfaceId);\n\n const headers: HeadersInit = {};\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(url.toString(), { headers });\n if (!response.ok) {\n throw new Error(`Failed to load threads: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n threads?: {\n id: string;\n surfaceId: string;\n anchorX: number;\n anchorY: number;\n }[];\n };\n\n if (cancelled) return;\n\n const mapped: Thread[] =\n data.threads?.map((t) => ({\n id: t.id,\n anchor: { x: t.anchorX, y: t.anchorY },\n status: \"open\",\n })) ?? [];\n\n setThreads(mapped);\n } catch (err) {\n if (cancelled) return;\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n }\n\n fetchThreads();\n\n return () => {\n cancelled = true;\n };\n }, [apiBaseUrl, config.projectSlug, config.surfaceId, accessToken, isAuthReady]);\n\n const createThread = useCallback(\n async (\n anchor: ThreadAnchor,\n initialCommentBody?: string,\n initialAuthorName?: string | null,\n ): Promise<Thread> => {\n const optimisticThread: Thread = {\n id: `${Date.now()}`,\n anchor,\n status: \"open\",\n };\n\n setThreads((prev) => [...prev, optimisticThread]);\n\n try {\n setIsLoading(true);\n setError(null);\n\n const response = await fetch(`${apiBaseUrl}/threads`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n },\n body: JSON.stringify({\n projectSlug: config.projectSlug,\n surfaceId: config.surfaceId,\n anchorX: anchor.x,\n anchorY: anchor.y,\n initialCommentBody: initialCommentBody ?? null,\n initialAuthorName: initialAuthorName ?? null,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create thread: ${response.status}`);\n }\n\n const data = (await response.json()) as { id: string };\n\n const persistedThread: Thread = {\n ...optimisticThread,\n id: data.id,\n };\n\n setThreads((prev) =>\n prev.map((t) => (t === optimisticThread ? persistedThread : t)),\n );\n\n return persistedThread;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n // Roll back optimistic thread\n setThreads((prev) => prev.filter((t) => t !== optimisticThread));\n throw e;\n } finally {\n setIsLoading(false);\n }\n },\n [apiBaseUrl, config.projectSlug, config.surfaceId, accessToken],\n );\n\n const loadComments = useCallback(\n async (threadId: string): Promise<void> => {\n try {\n setError(null);\n\n const url = new URL(`${apiBaseUrl}/comments`);\n url.searchParams.set(\"threadId\", threadId);\n\n const headers: HeadersInit = {};\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(url.toString(), { headers });\n if (!response.ok) {\n throw new Error(`Failed to load comments: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n comments?: {\n id: string;\n threadId: string;\n body: string;\n createdAt?: string;\n authorName?: string | null;\n }[];\n };\n\n const mapped: Comment[] =\n data.comments?.map((c) => ({\n id: c.id,\n threadId: c.threadId,\n body: c.body,\n createdAt: c.createdAt,\n authorName: c.authorName ?? null,\n })) ?? [];\n\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: mapped,\n }));\n } catch (err) {\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n throw e;\n }\n },\n [apiBaseUrl, accessToken],\n );\n\n const addComment = useCallback(\n async (\n threadId: string,\n body: string,\n authorName?: string | null,\n ): Promise<Comment> => {\n const trimmed = body.trim();\n if (!trimmed) {\n throw new Error(\"Comment body is empty\");\n }\n\n const optimistic: Comment = {\n id: `${Date.now()}`,\n threadId,\n body: trimmed,\n authorName: authorName ?? null,\n };\n\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: [...(prev[threadId] ?? []), optimistic],\n }));\n\n try {\n const response = await fetch(`${apiBaseUrl}/comments`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n },\n body: JSON.stringify({ threadId, body: trimmed, authorName }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create comment: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n id: string;\n createdAt?: string;\n };\n\n const persisted: Comment = {\n id: data.id,\n threadId,\n body: trimmed,\n createdAt: data.createdAt,\n };\n\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: (prev[threadId] ?? []).map((c) =>\n c === optimistic ? persisted : c,\n ),\n }));\n\n return persisted;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(\"Unknown error\");\n setError(e);\n // Roll back optimistic comment\n setCommentsByThread((prev) => ({\n ...prev,\n [threadId]: (prev[threadId] ?? []).filter((c) => c !== optimistic),\n }));\n throw e;\n }\n },\n [apiBaseUrl, accessToken],\n );\n\n const deleteThread = useCallback(\n async (threadId: string): Promise<void> => {\n const headers: HeadersInit = {\n ...(accessToken ? { Authorization: `Bearer ${accessToken}` } : {}),\n };\n\n const response = await fetch(`${apiBaseUrl}/threads/${threadId}`, {\n method: \"DELETE\",\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete thread: ${response.status}`);\n }\n\n setThreads((prev) => prev.filter((t) => t.id !== threadId));\n setCommentsByThread((prev) => {\n const next = { ...prev };\n delete next[threadId];\n return next;\n });\n },\n [apiBaseUrl, accessToken],\n );\n\n const value = useMemo<CommentsContextValue>(\n () => ({\n config,\n threads,\n commentsByThread,\n isLoading,\n error,\n createThread,\n loadComments,\n addComment,\n deleteThread,\n commentModeEnabled,\n setCommentModeEnabled,\n surfaceRef,\n hoveredRect,\n setHoveredRect,\n surfaceClickHandlerRef,\n pendingAnchor,\n setPendingAnchor,\n onPinClickRef,\n }),\n [\n config,\n threads,\n commentsByThread,\n isLoading,\n error,\n createThread,\n loadComments,\n addComment,\n deleteThread,\n commentModeEnabled,\n hoveredRect,\n pendingAnchor,\n ],\n );\n\n return <CommentsContext.Provider value={value}>{children}</CommentsContext.Provider>;\n}\n\nexport function useCommentsInternal(): CommentsContextValue {\n const ctx = useContext(CommentsContext);\n if (!ctx) {\n throw new Error(\"useCommentsInternal must be used within a CommentsProvider\");\n }\n return ctx;\n}\n\n","import React from \"react\";\nimport type { CommentConfig } from \"./types\";\nimport { CommentsProvider } from \"./context/CommentsContext\";\nimport { AuthProvider } from \"./auth/AuthContext\";\n\nexport type CommentProviderProps = {\n config: CommentConfig;\n children: React.ReactNode;\n};\n\nexport function CommentProvider(props: CommentProviderProps): JSX.Element {\n const { config, children } = props;\n return (\n <AuthProvider config={config}>\n <CommentsProvider config={config}>{children}</CommentsProvider>\n </AuthProvider>\n );\n}\n\n","import { useCommentsInternal } from \"./context/CommentsContext\";\n\nexport function useComments() {\n const ctx = useCommentsInternal();\n\n return {\n config: ctx.config,\n threads: ctx.threads,\n commentsByThread: ctx.commentsByThread,\n isLoading: ctx.isLoading,\n error: ctx.error,\n createThread: ctx.createThread,\n loadComments: ctx.loadComments,\n addComment: ctx.addComment,\n deleteThread: ctx.deleteThread,\n };\n}\n\n","import React, { useCallback } from \"react\";\nimport { useCommentsInternal } from \"./context/CommentsContext\";\nimport { useComments } from \"./hooks\";\n\nconst PIN_STYLE: React.CSSProperties = {\n position: \"absolute\",\n transform: \"translate(-50%, -50%)\",\n width: 18,\n height: 18,\n borderRadius: \"999px\",\n background: \"#f97316\",\n border: \"2px solid #fff\",\n boxShadow: \"0 4px 10px rgba(0,0,0,0.25)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#fff\",\n fontSize: 10,\n fontWeight: 600,\n cursor: \"pointer\",\n};\n\nexport type CommentSurfaceProps = {\n children?: React.ReactNode;\n style?: React.CSSProperties;\n className?: string;\n};\n\n/**\n * Wraps the area that can receive comment pins. When comment mode is on,\n * mouse move highlights the element under the cursor and click creates a thread.\n * Pins are rendered inside the surface so they scroll with the content.\n * Must be used inside CommentProvider and wrap the same DOM that CommentOverlay covers.\n */\nexport function CommentSurface(props: CommentSurfaceProps): JSX.Element {\n const {\n commentModeEnabled,\n setHoveredRect,\n surfaceRef,\n surfaceClickHandlerRef,\n pendingAnchor,\n onPinClickRef,\n } = useCommentsInternal();\n const { threads } = useComments();\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!commentModeEnabled) return;\n const el = e.target as HTMLElement;\n const rect = el.getBoundingClientRect();\n setHoveredRect({\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n });\n },\n [commentModeEnabled, setHoveredRect],\n );\n\n const handleMouseLeave = useCallback(() => {\n setHoveredRect(null);\n }, [setHoveredRect]);\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!commentModeEnabled) return;\n // Let pin clicks through so opening a thread still works\n const target = e.target as HTMLElement;\n if (target.closest?.(\"[data-commentator-pin]\")) return;\n e.preventDefault();\n e.stopPropagation();\n surfaceClickHandlerRef.current?.(e);\n },\n [commentModeEnabled, surfaceClickHandlerRef],\n );\n\n return (\n <div\n ref={surfaceRef}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n onClickCapture={handleClick}\n style={{ ...props.style, minHeight: \"100%\", position: \"relative\" }}\n className={props.className}\n >\n {props.children}\n\n {/* Pins layer: same scroll context as content so pins move with the page */}\n <div\n aria-hidden\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 1,\n }}\n >\n {threads.map((thread) => (\n <div\n key={thread.id}\n data-commentator-pin\n role=\"button\"\n tabIndex={0}\n onClick={(e) => {\n e.stopPropagation();\n onPinClickRef.current?.(thread.id, e.clientX, e.clientY);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.stopPropagation();\n onPinClickRef.current?.(thread.id, 0, 0);\n }\n }}\n style={{\n ...PIN_STYLE,\n left: `${thread.anchor.x * 100}%`,\n top: `${thread.anchor.y * 100}%`,\n pointerEvents: \"auto\",\n }}\n >\n ●\n </div>\n ))}\n {pendingAnchor && (\n <div\n aria-hidden\n data-commentator-pin\n style={{\n ...PIN_STYLE,\n left: `${pendingAnchor.x * 100}%`,\n top: `${pendingAnchor.y * 100}%`,\n cursor: \"default\",\n opacity: 0.7,\n pointerEvents: \"auto\",\n }}\n >\n ●\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useAuthInternal } from \"./auth/AuthContext\";\n\nexport function useCommentAuth() {\n return useAuthInternal();\n}\n\n","\"use client\";\n\nimport React from \"react\";\nimport { useCommentAuth } from \"./auth\";\n\nexport function CommentSettings(): JSX.Element {\n const {\n user,\n displayName,\n signOut,\n isReady: isAuthReady,\n signInWithGitHub,\n } = useCommentAuth();\n\n return (\n <div\n style={{\n borderRadius: 16,\n padding: 16,\n backgroundColor: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 4,\n }}\n >\n <span\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: \"#111827\",\n }}\n >\n Commentator settings\n </span>\n {user && (\n <button\n type=\"button\"\n onClick={() => signOut().catch(() => {})}\n style={{\n borderRadius: 999,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#ffffff\",\n padding: \"4px 10px\",\n fontSize: 11,\n color: \"#374151\",\n cursor: \"pointer\",\n }}\n >\n Sign out\n </button>\n )}\n </div>\n\n {user ? (\n <div\n style={{\n fontSize: 12,\n color: \"#6b7280\",\n }}\n >\n <span>Signed in as {displayName || user.email || \"unknown user\"}</span>\n </div>\n ) : (\n <div style={{ marginTop: 4 }}>\n <button\n type=\"button\"\n onClick={() => signInWithGitHub().catch(() => {})}\n disabled={!isAuthReady}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#24292f\",\n color: \"#fff\",\n fontSize: 13,\n fontWeight: 500,\n cursor: isAuthReady ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.464-1.11-1.464-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0112 6.836c.85.004 1.705.114 2.504.336 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z\" />\n </svg>\n Sign in with GitHub\n </button>\n </div>\n )}\n </div>\n );\n}\n\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useComments } from \"./hooks\";\nimport { useCommentAuth } from \"./auth\";\nimport { CommentSettings } from \"./CommentSettings\";\nimport { useCommentsInternal } from \"./context/CommentsContext\";\n\nexport type CommentOverlayProps = {\n position?: \"left\" | \"right\";\n};\n\nconst PANEL_WIDTH = 280;\nconst PANEL_HEIGHT = 260;\nconst PANEL_MARGIN = 16;\n\nfunction computePanelPosition(clientX: number, clientY: number) {\n if (typeof window === \"undefined\") {\n return { top: 72, left: undefined as unknown as number };\n }\n\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Default: open to the right of the click.\n let left = clientX + 24;\n let top = clientY - PANEL_HEIGHT / 2;\n\n // If too close to the right edge, open to the left instead.\n if (left + PANEL_WIDTH + PANEL_MARGIN > vw) {\n left = clientX - PANEL_WIDTH - 24;\n }\n\n // Clamp into viewport with some margin.\n left = Math.min(\n Math.max(PANEL_MARGIN, left),\n vw - PANEL_WIDTH - PANEL_MARGIN,\n );\n top = Math.min(\n Math.max(PANEL_MARGIN, top),\n vh - PANEL_HEIGHT - PANEL_MARGIN,\n );\n\n return { top, left };\n}\n\nexport function CommentOverlay(props: CommentOverlayProps): JSX.Element {\n const { position = \"right\" } = props;\n const {\n threads,\n commentsByThread,\n createThread,\n loadComments,\n addComment,\n deleteThread,\n } = useComments();\n const {\n commentModeEnabled,\n setCommentModeEnabled,\n surfaceRef,\n hoveredRect,\n setHoveredRect,\n surfaceClickHandlerRef,\n pendingAnchor,\n setPendingAnchor,\n onPinClickRef,\n } = useCommentsInternal();\n const {\n user,\n isReady: isAuthReady,\n signInWithGitHub,\n displayName,\n } = useCommentAuth();\n const [activeThreadId, setActiveThreadId] = useState<string | null>(null);\n const [draft, setDraft] = useState(\"\");\n const [panelPosition, setPanelPosition] = useState<{ top: number; left?: number } | null>(null);\n const [showSettings, setShowSettings] = useState(false);\n\n const activeComments = useMemo(\n () => (activeThreadId ? commentsByThread[activeThreadId] ?? [] : []),\n [activeThreadId, commentsByThread],\n );\n\n useEffect(() => {\n if (!activeThreadId || pendingAnchor) return;\n if (commentsByThread[activeThreadId]?.length) return;\n void loadComments(activeThreadId);\n }, [activeThreadId, pendingAnchor, commentsByThread, loadComments]);\n\n const handleSurfaceClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n setShowSettings(false);\n\n const rect = surfaceRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n const x = (event.clientX - rect.left) / rect.width;\n const y = (event.clientY - rect.top) / rect.height;\n\n setPendingAnchor({ x, y });\n setActiveThreadId(null);\n setDraft(\"\");\n setPanelPosition(computePanelPosition(event.clientX, event.clientY));\n },\n [setPendingAnchor, surfaceRef],\n );\n\n useEffect(() => {\n surfaceClickHandlerRef.current = handleSurfaceClick;\n return () => {\n surfaceClickHandlerRef.current = null;\n };\n }, [surfaceClickHandlerRef, handleSurfaceClick]);\n\n useEffect(() => {\n onPinClickRef.current = (threadId: string, clientX: number, clientY: number) => {\n setShowSettings(false);\n setActiveThreadId(threadId);\n setPendingAnchor(null);\n setPanelPosition(computePanelPosition(clientX, clientY));\n };\n return () => {\n onPinClickRef.current = null;\n };\n }, [onPinClickRef]);\n\n const handleToggle = useCallback(() => {\n const next = !commentModeEnabled;\n if (!next) setHoveredRect(null);\n setCommentModeEnabled(next);\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n }, [commentModeEnabled, setCommentModeEnabled, setHoveredRect, setPendingAnchor]);\n\n return (\n <>\n {/* Toggle + settings */}\n <div\n style={{\n position: \"fixed\",\n top: 16,\n [position]: 16,\n zIndex: 2147483000,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-pressed={commentModeEnabled}\n style={{\n padding: \"8px 12px\",\n borderRadius: 999,\n border: \"1px solid rgba(0,0,0,0.12)\",\n background: commentModeEnabled ? \"#111827\" : \"#f9fafb\",\n color: commentModeEnabled ? \"#f9fafb\" : \"#111827\",\n fontSize: 12,\n fontFamily:\n \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n cursor: \"pointer\",\n }}\n >\n {commentModeEnabled ? \"Comment mode: on\" : \"Comment mode: off\"}\n </button>\n <button\n type=\"button\"\n onClick={() =>\n setShowSettings((prev) => {\n const next = !prev;\n if (next) {\n // Close any open comment panel when settings are shown.\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n }\n return next;\n })\n }\n aria-label=\"Commentator settings\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 999,\n border: \"1px solid rgba(0,0,0,0.12)\",\n background: \"#ffffff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.12)\",\n cursor: \"pointer\",\n fontSize: 14,\n color: \"#4b5563\",\n }}\n >\n ⚙️\n </button>\n </div>\n\n {showSettings && (\n <div\n style={{\n position: \"fixed\",\n top: 54,\n [position]: 16,\n zIndex: 2147483000,\n maxWidth: 280,\n }}\n >\n <CommentSettings />\n </div>\n )}\n\n {!showSettings && (activeThreadId || pendingAnchor) && (\n <div\n style={{\n position: \"fixed\",\n top: panelPosition?.top ?? 72,\n left: panelPosition?.left,\n width: PANEL_WIDTH,\n maxHeight: \"70vh\",\n padding: 16,\n borderRadius: 16,\n backgroundColor: \"#ffffff\",\n boxShadow: \"0 18px 45px rgba(15,23,42,0.25)\",\n border: \"1px solid rgba(148,163,184,0.35)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n zIndex: 2147483500,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 4,\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: \"#111827\",\n }}\n >\n {user\n ? activeThreadId\n ? \"Thread\"\n : \"New comment\"\n : \"Sign in to comment\"}\n </span>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {activeThreadId && (\n <button\n type=\"button\"\n onClick={async () => {\n try {\n await deleteThread(activeThreadId);\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n } catch (err) {\n console.error(\"[commentator] Failed to delete thread\", err);\n }\n }}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"#b91c1c\",\n fontSize: 12,\n cursor: \"pointer\",\n }}\n >\n Delete thread\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => {\n setActiveThreadId(null);\n setPendingAnchor(null);\n setDraft(\"\");\n setPanelPosition(null);\n }}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"#6b7280\",\n fontSize: 12,\n cursor: \"pointer\",\n }}\n >\n Close\n </button>\n </div>\n </div>\n\n {user ? (\n <>\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n paddingRight: 4,\n }}\n >\n {activeComments.length === 0 ? (\n <p\n style={{\n fontSize: 13,\n color: \"#9ca3af\",\n margin: 0,\n }}\n >\n No comments yet. Be the first to comment.\n </p>\n ) : (\n activeComments.map((comment) => (\n <div\n key={comment.id}\n style={{\n fontSize: 13,\n color: \"#111827\",\n padding: \"6px 8px\",\n borderRadius: 10,\n backgroundColor: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n marginBottom: 6,\n }}\n >\n {comment.authorName && (\n <div\n style={{\n fontSize: 11,\n color: \"#6b7280\",\n marginBottom: 2,\n }}\n >\n {comment.authorName}\n </div>\n )}\n <div>{comment.body}</div>\n </div>\n ))\n )}\n </div>\n\n <form\n onSubmit={async (event) => {\n event.preventDefault();\n if (!draft.trim()) return;\n\n try {\n if (activeThreadId) {\n await addComment(activeThreadId, draft, displayName);\n // name is not needed here; comments already stored with author_id\n } else if (pendingAnchor) {\n const thread = await createThread(\n pendingAnchor,\n draft,\n displayName || null,\n );\n setActiveThreadId(thread.id);\n setPendingAnchor(null);\n }\n setDraft(\"\");\n } catch (err) {\n console.error(\"[commentator] Failed to save comment\", err);\n }\n }}\n style={{ marginTop: 4 }}\n >\n <textarea\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n rows={3}\n placeholder=\"Add a comment...\"\n style={{\n width: \"100%\",\n color: \"#000000\",\n resize: \"none\",\n fontSize: 13,\n fontFamily:\n \"system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n padding: \"6px 8px\",\n borderRadius: 10,\n border: \"1px solid #d1d5db\",\n boxSizing: \"border-box\",\n marginBottom: 6,\n }}\n />\n <button\n type=\"submit\"\n disabled={!draft.trim()}\n style={{\n width: \"100%\",\n padding: \"6px 10px\",\n borderRadius: 999,\n border: \"none\",\n backgroundColor: draft.trim() ? \"#111827\" : \"#e5e7eb\",\n color: draft.trim() ? \"#f9fafb\" : \"#9ca3af\",\n fontSize: 13,\n fontWeight: 500,\n cursor: draft.trim() ? \"pointer\" : \"default\",\n }}\n >\n Post comment\n </button>\n </form>\n </>\n ) : (\n <div style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n onClick={() => signInWithGitHub().catch(() => {})}\n disabled={!isAuthReady}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#24292f\",\n color: \"#fff\",\n fontSize: 13,\n fontWeight: 500,\n cursor: isAuthReady ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.464-1.11-1.464-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0112 6.836c.85.004 1.705.114 2.504.336 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z\" />\n </svg>\n Sign in with GitHub\n </button>\n </div>\n )}\n </div>\n )}\n </>\n );\n}\n\n","import React from \"react\";\nimport type { CommentConfig } from \"./types\";\nimport { CommentProvider } from \"./CommentProvider\";\nimport { CommentSurface } from \"./CommentSurface\";\nimport { CommentOverlay } from \"./CommentOverlay\";\n\nexport type CommentatorProps = {\n /** Project and surface identifiers + optional API URL. */\n config: CommentConfig;\n /** Where the comment panel appears. Default `\"right\"`. */\n position?: \"left\" | \"right\";\n /** Optional style for the surface wrapper (the tappable area for pins). */\n surfaceStyle?: React.CSSProperties;\n /** Optional class for the surface wrapper. */\n surfaceClassName?: string;\n children: React.ReactNode;\n};\n\n/**\n * All-in-one wrapper: Provider + Surface + Overlay. Use this for minimal setup\n * so the area that receives taps is correctly wired for creating pins.\n *\n * If you need to customize layout (e.g. surface only around a canvas), use\n * CommentProvider, CommentSurface, and CommentOverlay separately.\n */\nexport function Commentator(props: CommentatorProps): JSX.Element {\n const {\n config,\n position = \"right\",\n surfaceStyle,\n surfaceClassName,\n children,\n } = props;\n\n return (\n <CommentProvider config={config}>\n <CommentSurface\n style={{ minHeight: \"100%\", position: \"relative\", ...surfaceStyle }}\n className={surfaceClassName}\n >\n {children}\n </CommentSurface>\n <CommentOverlay position={position} />\n </CommentProvider>\n );\n}\n"]}
|
package/package.json
CHANGED