@actuate-media/cms-admin 0.12.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/dist/__tests__/components/comment-mark.test.d.ts +2 -0
  2. package/dist/__tests__/components/comment-mark.test.d.ts.map +1 -0
  3. package/dist/__tests__/components/comment-mark.test.js +89 -0
  4. package/dist/__tests__/components/comment-mark.test.js.map +1 -0
  5. package/dist/__tests__/components/comment-side-panel.test.d.ts +2 -0
  6. package/dist/__tests__/components/comment-side-panel.test.d.ts.map +1 -0
  7. package/dist/__tests__/components/comment-side-panel.test.js +291 -0
  8. package/dist/__tests__/components/comment-side-panel.test.js.map +1 -0
  9. package/dist/__tests__/components/notification-bell.test.d.ts +2 -0
  10. package/dist/__tests__/components/notification-bell.test.d.ts.map +1 -0
  11. package/dist/__tests__/components/notification-bell.test.js +200 -0
  12. package/dist/__tests__/components/notification-bell.test.js.map +1 -0
  13. package/dist/__tests__/components/offline-status.test.d.ts +2 -0
  14. package/dist/__tests__/components/offline-status.test.d.ts.map +1 -0
  15. package/dist/__tests__/components/offline-status.test.js +56 -0
  16. package/dist/__tests__/components/offline-status.test.js.map +1 -0
  17. package/dist/__tests__/components/presence-chips-helpers.test.d.ts +2 -0
  18. package/dist/__tests__/components/presence-chips-helpers.test.d.ts.map +1 -0
  19. package/dist/__tests__/components/presence-chips-helpers.test.js +35 -0
  20. package/dist/__tests__/components/presence-chips-helpers.test.js.map +1 -0
  21. package/dist/__tests__/lib/active-editor.test.d.ts +2 -0
  22. package/dist/__tests__/lib/active-editor.test.d.ts.map +1 -0
  23. package/dist/__tests__/lib/active-editor.test.js +57 -0
  24. package/dist/__tests__/lib/active-editor.test.js.map +1 -0
  25. package/dist/__tests__/lib/coauthor-client.test.d.ts +2 -0
  26. package/dist/__tests__/lib/coauthor-client.test.d.ts.map +1 -0
  27. package/dist/__tests__/lib/coauthor-client.test.js +173 -0
  28. package/dist/__tests__/lib/coauthor-client.test.js.map +1 -0
  29. package/dist/__tests__/lib/collaboration-provider.test.d.ts +2 -0
  30. package/dist/__tests__/lib/collaboration-provider.test.d.ts.map +1 -0
  31. package/dist/__tests__/lib/collaboration-provider.test.js +335 -0
  32. package/dist/__tests__/lib/collaboration-provider.test.js.map +1 -0
  33. package/dist/__tests__/lib/comment-anchor.test.d.ts +2 -0
  34. package/dist/__tests__/lib/comment-anchor.test.d.ts.map +1 -0
  35. package/dist/__tests__/lib/comment-anchor.test.js +173 -0
  36. package/dist/__tests__/lib/comment-anchor.test.js.map +1 -0
  37. package/dist/__tests__/lib/comments-client.test.d.ts +2 -0
  38. package/dist/__tests__/lib/comments-client.test.d.ts.map +1 -0
  39. package/dist/__tests__/lib/comments-client.test.js +202 -0
  40. package/dist/__tests__/lib/comments-client.test.js.map +1 -0
  41. package/dist/__tests__/lib/notifications-client.test.d.ts +2 -0
  42. package/dist/__tests__/lib/notifications-client.test.d.ts.map +1 -0
  43. package/dist/__tests__/lib/notifications-client.test.js +155 -0
  44. package/dist/__tests__/lib/notifications-client.test.js.map +1 -0
  45. package/dist/__tests__/lib/slash-command.test.d.ts +2 -0
  46. package/dist/__tests__/lib/slash-command.test.d.ts.map +1 -0
  47. package/dist/__tests__/lib/slash-command.test.js +123 -0
  48. package/dist/__tests__/lib/slash-command.test.js.map +1 -0
  49. package/dist/actuate-admin.css +1 -1
  50. package/dist/components/AICoauthorBubbleMenu.d.ts +18 -0
  51. package/dist/components/AICoauthorBubbleMenu.d.ts.map +1 -0
  52. package/dist/components/AICoauthorBubbleMenu.js +113 -0
  53. package/dist/components/AICoauthorBubbleMenu.js.map +1 -0
  54. package/dist/components/CoauthorResultPopover.d.ts +28 -0
  55. package/dist/components/CoauthorResultPopover.d.ts.map +1 -0
  56. package/dist/components/CoauthorResultPopover.js +42 -0
  57. package/dist/components/CoauthorResultPopover.js.map +1 -0
  58. package/dist/components/CommandPalette.d.ts +1 -1
  59. package/dist/components/CommandPalette.d.ts.map +1 -1
  60. package/dist/components/CommandPalette.js +138 -40
  61. package/dist/components/CommandPalette.js.map +1 -1
  62. package/dist/components/CommentMark.d.ts +54 -0
  63. package/dist/components/CommentMark.d.ts.map +1 -0
  64. package/dist/components/CommentMark.js +104 -0
  65. package/dist/components/CommentMark.js.map +1 -0
  66. package/dist/components/CommentSidePanel.d.ts +86 -0
  67. package/dist/components/CommentSidePanel.d.ts.map +1 -0
  68. package/dist/components/CommentSidePanel.js +165 -0
  69. package/dist/components/CommentSidePanel.js.map +1 -0
  70. package/dist/components/LivePreview.d.ts.map +1 -1
  71. package/dist/components/LivePreview.js +80 -16
  72. package/dist/components/LivePreview.js.map +1 -1
  73. package/dist/components/NotificationBell.d.ts +45 -0
  74. package/dist/components/NotificationBell.d.ts.map +1 -0
  75. package/dist/components/NotificationBell.js +90 -0
  76. package/dist/components/NotificationBell.js.map +1 -0
  77. package/dist/components/OfflineStatus.d.ts +39 -0
  78. package/dist/components/OfflineStatus.d.ts.map +1 -0
  79. package/dist/components/OfflineStatus.js +47 -0
  80. package/dist/components/OfflineStatus.js.map +1 -0
  81. package/dist/components/PresenceChips.d.ts +31 -0
  82. package/dist/components/PresenceChips.d.ts.map +1 -0
  83. package/dist/components/PresenceChips.js +58 -0
  84. package/dist/components/PresenceChips.js.map +1 -0
  85. package/dist/components/TipTapEditor.d.ts +61 -1
  86. package/dist/components/TipTapEditor.d.ts.map +1 -1
  87. package/dist/components/TipTapEditor.js +211 -8
  88. package/dist/components/TipTapEditor.js.map +1 -1
  89. package/dist/components/ui/Badge.d.ts +1 -1
  90. package/dist/index.d.ts +8 -0
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +4 -0
  93. package/dist/index.js.map +1 -1
  94. package/dist/lib/active-editor.d.ts +6 -0
  95. package/dist/lib/active-editor.d.ts.map +1 -0
  96. package/dist/lib/active-editor.js +35 -0
  97. package/dist/lib/active-editor.js.map +1 -0
  98. package/dist/lib/coauthor-client.d.ts +72 -0
  99. package/dist/lib/coauthor-client.d.ts.map +1 -0
  100. package/dist/lib/coauthor-client.js +98 -0
  101. package/dist/lib/coauthor-client.js.map +1 -0
  102. package/dist/lib/collaboration-provider.d.ts +142 -0
  103. package/dist/lib/collaboration-provider.d.ts.map +1 -0
  104. package/dist/lib/collaboration-provider.js +168 -0
  105. package/dist/lib/collaboration-provider.js.map +1 -0
  106. package/dist/lib/comment-anchor.d.ts +86 -0
  107. package/dist/lib/comment-anchor.d.ts.map +1 -0
  108. package/dist/lib/comment-anchor.js +139 -0
  109. package/dist/lib/comment-anchor.js.map +1 -0
  110. package/dist/lib/comments-client.d.ts +106 -0
  111. package/dist/lib/comments-client.d.ts.map +1 -0
  112. package/dist/lib/comments-client.js +138 -0
  113. package/dist/lib/comments-client.js.map +1 -0
  114. package/dist/lib/notifications-client.d.ts +68 -0
  115. package/dist/lib/notifications-client.d.ts.map +1 -0
  116. package/dist/lib/notifications-client.js +85 -0
  117. package/dist/lib/notifications-client.js.map +1 -0
  118. package/dist/lib/slash-command.d.ts +39 -0
  119. package/dist/lib/slash-command.d.ts.map +1 -0
  120. package/dist/lib/slash-command.js +50 -0
  121. package/dist/lib/slash-command.js.map +1 -0
  122. package/package.json +12 -3
  123. package/src/__tests__/components/comment-mark.test.ts +99 -0
  124. package/src/__tests__/components/comment-side-panel.test.tsx +343 -0
  125. package/src/__tests__/components/notification-bell.test.tsx +213 -0
  126. package/src/__tests__/components/offline-status.test.tsx +66 -0
  127. package/src/__tests__/components/presence-chips-helpers.test.ts +44 -0
  128. package/src/__tests__/lib/active-editor.test.ts +70 -0
  129. package/src/__tests__/lib/coauthor-client.test.ts +213 -0
  130. package/src/__tests__/lib/collaboration-provider.test.ts +425 -0
  131. package/src/__tests__/lib/comment-anchor.test.ts +188 -0
  132. package/src/__tests__/lib/comments-client.test.ts +239 -0
  133. package/src/__tests__/lib/notifications-client.test.ts +195 -0
  134. package/src/__tests__/lib/slash-command.test.ts +146 -0
  135. package/src/components/AICoauthorBubbleMenu.tsx +187 -0
  136. package/src/components/CoauthorResultPopover.tsx +193 -0
  137. package/src/components/CommandPalette.tsx +397 -209
  138. package/src/components/CommentMark.ts +138 -0
  139. package/src/components/CommentSidePanel.tsx +521 -0
  140. package/src/components/LivePreview.tsx +117 -11
  141. package/src/components/NotificationBell.tsx +242 -0
  142. package/src/components/OfflineStatus.tsx +90 -0
  143. package/src/components/PresenceChips.tsx +150 -0
  144. package/src/components/TipTapEditor.tsx +310 -12
  145. package/src/index.ts +20 -0
  146. package/src/lib/active-editor.ts +39 -0
  147. package/src/lib/coauthor-client.ts +160 -0
  148. package/src/lib/collaboration-provider.ts +306 -0
  149. package/src/lib/comment-anchor.ts +179 -0
  150. package/src/lib/comments-client.ts +208 -0
  151. package/src/lib/notifications-client.ts +146 -0
  152. package/src/lib/slash-command.ts +67 -0
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import type { CollaborationStatus, OfflinePersistenceStatus } from '../lib/collaboration-provider.js';
3
+ /**
4
+ * Compact connection + offline-draft indicator. Rendered alongside the
5
+ * presence chips above the editor toolbar so editors get a single,
6
+ * always-visible signal:
7
+ *
8
+ * - **Saved & synced** — IndexedDB store is ready and the gateway
9
+ * socket is connected.
10
+ * - **Saved locally** — IndexedDB ready but the socket is disconnected
11
+ * (offline drafts in flight; will sync on reconnect).
12
+ * - **Syncing local copy…** — IndexedDB is replaying the last snapshot
13
+ * into the doc. The editor is still usable but undo / cursor sync
14
+ * may flicker briefly.
15
+ * - **Local drafts unsupported** — `indexedDB` is unavailable; the
16
+ * editor will rely on the gateway only. Refresh loses uncommitted
17
+ * edits.
18
+ * - **Local drafts failed** — IndexedDB threw on init (quota, private
19
+ * browsing). Same risk as "unsupported", but with a different cause.
20
+ *
21
+ * Keeping the component dumb and prop-driven keeps the unit tests
22
+ * trivial — the parent owns the status transitions.
23
+ */
24
+ export interface OfflineStatusProps {
25
+ connection: CollaborationStatus;
26
+ offline: OfflinePersistenceStatus;
27
+ }
28
+ export declare function OfflineStatus({ connection, offline }: OfflineStatusProps): React.JSX.Element;
29
+ export type OfflineTone = 'good' | 'warn' | 'info' | 'bad';
30
+ /**
31
+ * Pure helper that maps the (connection, offline) status pair to a
32
+ * single user-facing label + colour tone. Exported so the unit tests
33
+ * can exercise every combination without rendering React.
34
+ */
35
+ export declare function describeOfflineStatus(connection: CollaborationStatus, offline: OfflinePersistenceStatus): {
36
+ label: string;
37
+ tone: OfflineTone;
38
+ };
39
+ //# sourceMappingURL=OfflineStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OfflineStatus.d.ts","sourceRoot":"","sources":["../../src/components/OfflineStatus.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,kCAAkC,CAAA;AAEzC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,mBAAmB,CAAA;IAC/B,OAAO,EAAE,wBAAwB,CAAA;CAClC;AAED,wBAAgB,aAAa,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAa5F;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;AAgB1D;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,mBAAmB,EAC/B,OAAO,EAAE,wBAAwB,GAChC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAetC"}
@@ -0,0 +1,47 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ export function OfflineStatus({ connection, offline }) {
4
+ const { label, tone } = describeOfflineStatus(connection, offline);
5
+ const baseClass = 'inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[11px] font-medium';
6
+ const toneClass = TONE_CLASSES[tone];
7
+ return (_jsxs("span", { className: `${baseClass} ${toneClass}`, "data-testid": "offline-status", "data-tone": tone, children: [_jsx("span", { "aria-hidden": "true", className: `inline-block h-1.5 w-1.5 rounded-full ${DOT_CLASSES[tone]}` }), label] }));
8
+ }
9
+ const TONE_CLASSES = {
10
+ good: 'bg-emerald-50 text-emerald-700',
11
+ warn: 'bg-amber-50 text-amber-800',
12
+ info: 'bg-blue-50 text-blue-700',
13
+ bad: 'bg-red-50 text-red-700',
14
+ };
15
+ const DOT_CLASSES = {
16
+ good: 'bg-emerald-500',
17
+ warn: 'bg-amber-500',
18
+ info: 'bg-blue-500',
19
+ bad: 'bg-red-500',
20
+ };
21
+ /**
22
+ * Pure helper that maps the (connection, offline) status pair to a
23
+ * single user-facing label + colour tone. Exported so the unit tests
24
+ * can exercise every combination without rendering React.
25
+ */
26
+ export function describeOfflineStatus(connection, offline) {
27
+ if (offline === 'error')
28
+ return { label: 'Local drafts failed', tone: 'bad' };
29
+ if (offline === 'unsupported') {
30
+ // No local persistence; the WebSocket is the only safety net.
31
+ if (connection === 'connected')
32
+ return { label: 'Synced', tone: 'good' };
33
+ if (connection === 'connecting')
34
+ return { label: 'Connecting…', tone: 'info' };
35
+ return { label: 'Offline — drafts not persisted', tone: 'warn' };
36
+ }
37
+ if (offline === 'loading' || offline === 'pending') {
38
+ return { label: 'Restoring local copy…', tone: 'info' };
39
+ }
40
+ // offline === 'ready' from here on.
41
+ if (connection === 'connected')
42
+ return { label: 'Saved & synced', tone: 'good' };
43
+ if (connection === 'connecting')
44
+ return { label: 'Saved locally — reconnecting…', tone: 'warn' };
45
+ return { label: 'Saved locally — offline', tone: 'warn' };
46
+ }
47
+ //# sourceMappingURL=OfflineStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OfflineStatus.js","sourceRoot":"","sources":["../../src/components/OfflineStatus.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAmCZ,MAAM,UAAU,aAAa,CAAC,EAAE,UAAU,EAAE,OAAO,EAAsB;IACvE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,qBAAqB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAClE,MAAM,SAAS,GAAG,8EAA8E,CAAA;IAChG,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IACpC,OAAO,CACL,gBAAM,SAAS,EAAE,GAAG,SAAS,IAAI,SAAS,EAAE,iBAAc,gBAAgB,eAAY,IAAI,aACxF,8BACc,MAAM,EAClB,SAAS,EAAE,yCAAyC,WAAW,CAAC,IAAI,CAAC,EAAE,GACvE,EACD,KAAK,IACD,CACR,CAAA;AACH,CAAC;AAID,MAAM,YAAY,GAAgC;IAChD,IAAI,EAAE,gCAAgC;IACtC,IAAI,EAAE,4BAA4B;IAClC,IAAI,EAAE,0BAA0B;IAChC,GAAG,EAAE,wBAAwB;CAC9B,CAAA;AAED,MAAM,WAAW,GAAgC;IAC/C,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,aAAa;IACnB,GAAG,EAAE,YAAY;CAClB,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAA+B,EAC/B,OAAiC;IAEjC,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IAC7E,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC9B,8DAA8D;QAC9D,IAAI,UAAU,KAAK,WAAW;YAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;QACxE,IAAI,UAAU,KAAK,YAAY;YAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;QAC9E,OAAO,EAAE,KAAK,EAAE,gCAAgC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAClE,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACnD,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IACzD,CAAC;IACD,oCAAoC;IACpC,IAAI,UAAU,KAAK,WAAW;QAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAChF,IAAI,UAAU,KAAK,YAAY;QAAE,OAAO,EAAE,KAAK,EAAE,+BAA+B,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAChG,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAC3D,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { Awareness } from 'y-protocols/awareness';
2
+ import { type CollaborationStatus } from '../lib/collaboration-provider.js';
3
+ export interface PresenceChipsProps {
4
+ /** Awareness instance returned from `createCollaborationProvider`. */
5
+ awareness: Awareness;
6
+ /**
7
+ * Optional connection status. When provided the strip renders a small
8
+ * status pill (Connected / Connecting / Disconnected) on the left side.
9
+ */
10
+ status?: CollaborationStatus;
11
+ /**
12
+ * Hide the local user from the strip. Defaults to `true` — the local user
13
+ * already knows they're editing.
14
+ */
15
+ hideSelf?: boolean;
16
+ /** Max chips to show before collapsing to "+N". Defaults to 5. */
17
+ maxVisible?: number;
18
+ className?: string;
19
+ }
20
+ /**
21
+ * Small avatar / initials strip showing who else is currently editing the
22
+ * document. Subscribes to the supplied `Awareness` instance for live
23
+ * updates.
24
+ *
25
+ * The component is intentionally stateless about transport — it only reads
26
+ * from Awareness and `status`. Wiring is the caller's job.
27
+ */
28
+ export declare function PresenceChips({ awareness, status, hideSelf, maxVisible, className, }: PresenceChipsProps): import("react/jsx-runtime").JSX.Element;
29
+ /** Convert "Alice Cooper" → "AC", single names → "A", empty → "?". */
30
+ export declare function nameToInitials(name: string): string;
31
+ //# sourceMappingURL=PresenceChips.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PresenceChips.d.ts","sourceRoot":"","sources":["../../src/components/PresenceChips.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEjD,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,kCAAkC,CAAA;AAEzC,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,SAAS,EAAE,SAAS,CAAA;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,MAAM,EACN,QAAe,EACf,UAAc,EACd,SAAS,GACV,EAAE,kBAAkB,2CA8CpB;AAiDD,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUnD"}
@@ -0,0 +1,58 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from 'react';
4
+ import { summarisePresence, } from '../lib/collaboration-provider.js';
5
+ /**
6
+ * Small avatar / initials strip showing who else is currently editing the
7
+ * document. Subscribes to the supplied `Awareness` instance for live
8
+ * updates.
9
+ *
10
+ * The component is intentionally stateless about transport — it only reads
11
+ * from Awareness and `status`. Wiring is the caller's job.
12
+ */
13
+ export function PresenceChips({ awareness, status, hideSelf = true, maxVisible = 5, className, }) {
14
+ const [snapshot, setSnapshot] = useState(() => summarisePresence(awareness));
15
+ useEffect(() => {
16
+ const update = () => {
17
+ setSnapshot(summarisePresence(awareness));
18
+ };
19
+ update();
20
+ awareness.on('update', update);
21
+ awareness.on('change', update);
22
+ return () => {
23
+ awareness.off('update', update);
24
+ awareness.off('change', update);
25
+ };
26
+ }, [awareness]);
27
+ const visible = hideSelf
28
+ ? snapshot.users.filter((u) => u.clientId !== snapshot.selfClientId)
29
+ : snapshot.users;
30
+ const overflow = Math.max(0, visible.length - maxVisible);
31
+ const shown = visible.slice(0, maxVisible);
32
+ return (_jsxs("div", { className: `inline-flex items-center gap-1.5 text-xs ${className ?? ''}`, "data-testid": "presence-chips", children: [status && _jsx(StatusPill, { status: status }), shown.length === 0 && status !== 'connecting' && (_jsx("span", { className: "text-gray-500", "data-testid": "presence-empty", children: "You're the only one here" })), shown.map(({ clientId, user }) => (_jsx(Chip, { name: user.name, color: user.color, avatarUrl: user.avatarUrl }, clientId))), overflow > 0 && (_jsxs("span", { className: "rounded-full bg-gray-100 px-2 py-0.5 text-gray-700", "data-testid": "presence-overflow", children: ["+", overflow] }))] }));
33
+ }
34
+ function StatusPill({ status }) {
35
+ const palette = {
36
+ connected: { dot: 'bg-emerald-500', label: 'Live', text: 'text-emerald-700' },
37
+ connecting: { dot: 'bg-amber-400 animate-pulse', label: 'Connecting', text: 'text-amber-700' },
38
+ disconnected: { dot: 'bg-gray-300', label: 'Offline', text: 'text-gray-500' },
39
+ };
40
+ const cfg = palette[status];
41
+ return (_jsxs("span", { className: `inline-flex items-center gap-1 rounded-full bg-gray-50 px-2 py-0.5 ${cfg.text}`, "data-testid": `presence-status-${status}`, children: [_jsx("span", { className: `h-1.5 w-1.5 rounded-full ${cfg.dot}` }), cfg.label] }));
42
+ }
43
+ function Chip({ name, color, avatarUrl }) {
44
+ const initials = nameToInitials(name);
45
+ return (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-white px-1.5 py-0.5 ring-1 ring-gray-200", title: name, "data-testid": "presence-chip", children: [avatarUrl ? (_jsx("img", { src: avatarUrl, alt: "", className: "h-4 w-4 rounded-full object-cover", style: { boxShadow: `0 0 0 1.5px ${color}` } })) : (_jsx("span", { "aria-hidden": "true", className: "flex h-4 w-4 items-center justify-center rounded-full text-[8px] font-semibold text-white", style: { backgroundColor: color }, children: initials })), _jsx("span", { className: "max-w-[80px] truncate text-gray-700", children: name })] }));
46
+ }
47
+ /** Convert "Alice Cooper" → "AC", single names → "A", empty → "?". */
48
+ export function nameToInitials(name) {
49
+ const cleaned = name.trim();
50
+ if (!cleaned)
51
+ return '?';
52
+ const parts = cleaned.split(/\s+/).slice(0, 2);
53
+ return (parts
54
+ .map((p) => (p[0] ?? '').toUpperCase())
55
+ .filter(Boolean)
56
+ .join('') || '?');
57
+ }
58
+ //# sourceMappingURL=PresenceChips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PresenceChips.js","sourceRoot":"","sources":["../../src/components/PresenceChips.tsx"],"names":[],"mappings":"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"}
@@ -1,9 +1,69 @@
1
+ import { type CollaborationUser } from '../lib/collaboration-provider.js';
2
+ /**
3
+ * Configuration for real-time collaboration on this editor.
4
+ *
5
+ * When supplied the editor switches into CRDT mode: history is delegated to
6
+ * Yjs, edits sync through the cms-core realtime gateway, and a presence
7
+ * strip with live cursors appears beside the toolbar. The `content` prop is
8
+ * ignored in collaboration mode (the gateway is the source of truth);
9
+ * `onChange` still fires on every local update so existing autosave wiring
10
+ * keeps working.
11
+ */
12
+ export interface TipTapCollaborationConfig {
13
+ documentId: string;
14
+ /**
15
+ * Base URL of the realtime gateway. `wss://your.app/api/cms/realtime/sync`
16
+ * in production, `ws://localhost:3000/api/cms/realtime/sync` for dev.
17
+ */
18
+ url: string;
19
+ user: CollaborationUser;
20
+ /** Extra query params (e.g. auth token for cross-origin deployments). */
21
+ params?: Record<string, string>;
22
+ }
1
23
  export interface TipTapEditorProps {
2
24
  content: string;
3
25
  onChange: (html: string) => void;
4
26
  placeholder?: string;
5
27
  editable?: boolean;
6
28
  className?: string;
29
+ /**
30
+ * Toggle the AI co-author bubble menu on text selection.
31
+ * Defaults to `true` when the editor is editable. Set to `false` to opt
32
+ * out (e.g. for preview-only renders, or environments where the
33
+ * `/ai/coauthor` endpoint is intentionally disabled).
34
+ */
35
+ enableAI?: boolean;
36
+ /**
37
+ * Enable real-time collaboration via the cms-core realtime gateway. When
38
+ * set, the editor swaps in Yjs-backed history + the collaboration cursor
39
+ * extension and renders a presence strip above the toolbar.
40
+ */
41
+ collaboration?: TipTapCollaborationConfig;
42
+ /**
43
+ * Enable inline comments. When set, the `CommentMark` extension is
44
+ * loaded and a `CommentSidePanel` renders next to the editor. Anchors
45
+ * are encoded against the active Yjs text node when collaboration is
46
+ * also on, so highlights survive concurrent edits.
47
+ *
48
+ * Comments are independent of the collaboration prop — you can attach
49
+ * comments to a static document, but cross-user "live" highlighting
50
+ * only kicks in when collaboration is also enabled.
51
+ */
52
+ comments?: TipTapCommentsConfig;
53
+ }
54
+ /**
55
+ * Configuration for the comments side panel. The panel issues REST calls
56
+ * against the slice-4 endpoints; this prop is just the small set of
57
+ * presentation + identity bits the panel can't infer from the editor.
58
+ */
59
+ export interface TipTapCommentsConfig {
60
+ documentId: string;
61
+ /** Logged-in user id — gates edit + delete affordances. */
62
+ currentUserId: string;
63
+ /** Set to true to expose moderation actions on every comment. */
64
+ isAdmin?: boolean;
65
+ /** Error sink so the host shell can show a toast. */
66
+ onError?: (message: string) => void;
7
67
  }
8
- export declare function TipTapEditor({ content, onChange, placeholder, editable, className, }: TipTapEditorProps): import("react/jsx-runtime").JSX.Element | null;
68
+ export declare function TipTapEditor({ content, onChange, placeholder, editable, className, enableAI, collaboration, comments, }: TipTapEditorProps): import("react/jsx-runtime").JSX.Element | null;
9
69
  //# sourceMappingURL=TipTapEditor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TipTapEditor.d.ts","sourceRoot":"","sources":["../../src/components/TipTapEditor.tsx"],"names":[],"mappings":"AA+CA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAwVD,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,QAAQ,EACR,WAAW,EACX,QAAe,EACf,SAAS,GACV,EAAE,iBAAiB,kDA6DnB"}
1
+ {"version":3,"file":"TipTapEditor.d.ts","sourceRoot":"","sources":["../../src/components/TipTapEditor.tsx"],"names":[],"mappings":"AAWA,OAAO,EAIL,KAAK,iBAAiB,EAEvB,MAAM,kCAAkC,CAAA;AAgDzC;;;;;;;;;GASG;AACH,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,iBAAiB,CAAA;IACvB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;OAIG;IACH,aAAa,CAAC,EAAE,yBAAyB,CAAA;IACzC;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAA;CAChC;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAA;IACrB,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAwVD,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,QAAQ,EACR,WAAW,EACX,QAAe,EACf,SAAS,EACT,QAAe,EACf,aAAa,EACb,QAAQ,GACT,EAAE,iBAAiB,kDAiOnB"}
@@ -1,8 +1,17 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState } from 'react';
3
+ import { useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { useEditor, EditorContent } from '@tiptap/react';
5
5
  import { MediaPickerModal } from './MediaPickerModal.js';
6
+ import { AICoauthorBubbleMenu } from './AICoauthorBubbleMenu.js';
7
+ import { PresenceChips } from './PresenceChips.js';
8
+ import { OfflineStatus } from './OfflineStatus.js';
9
+ import { CommentMark, COMMENT_MARK_STYLES } from './CommentMark.js';
10
+ import { CommentSidePanel } from './CommentSidePanel.js';
11
+ import { clearActiveEditorIf, setActiveEditor } from '../lib/active-editor.js';
12
+ import { createCollaborationProvider, } from '../lib/collaboration-provider.js';
13
+ import { encodeAnchor } from '../lib/comment-anchor.js';
14
+ import * as Y from 'yjs';
6
15
  import StarterKit from '@tiptap/starter-kit';
7
16
  import UnderlineExt from '@tiptap/extension-underline';
8
17
  import Link from '@tiptap/extension-link';
@@ -15,6 +24,8 @@ import TextAlign from '@tiptap/extension-text-align';
15
24
  import Placeholder from '@tiptap/extension-placeholder';
16
25
  import CodeBlockLowlight from '@tiptap/extension-code-block-lowlight';
17
26
  import HorizontalRule from '@tiptap/extension-horizontal-rule';
27
+ import Collaboration from '@tiptap/extension-collaboration';
28
+ import CollaborationCursor from '@tiptap/extension-collaboration-cursor';
18
29
  import { common, createLowlight } from 'lowlight';
19
30
  import { Bold, Italic, Underline, Strikethrough, Code, Heading1, Heading2, Heading3, List, ListOrdered, Quote, FileCode, Minus, AlignLeft, AlignCenter, AlignRight, Link as LinkIcon, Image as ImageIcon, Table as TableIcon, Columns, Rows, Trash2, Undo, Redo, } from 'lucide-react';
20
31
  const lowlight = createLowlight(common);
@@ -123,13 +134,63 @@ function Toolbar({ editor, onOpenMediaPicker }) {
123
134
  const isInTable = editor.isActive('table');
124
135
  return (_jsxs("div", { className: "sticky top-0 z-10 flex flex-wrap items-center gap-0.5 border-b border-gray-200 bg-gray-50 p-2", children: [_jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), isActive: editor.isActive('bold'), title: "Bold (Ctrl+B)", children: _jsx(Bold, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleItalic().run(), isActive: editor.isActive('italic'), title: "Italic (Ctrl+I)", children: _jsx(Italic, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleUnderline().run(), isActive: editor.isActive('underline'), title: "Underline (Ctrl+U)", children: _jsx(Underline, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleStrike().run(), isActive: editor.isActive('strike'), title: "Strikethrough", children: _jsx(Strikethrough, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleCode().run(), isActive: editor.isActive('code'), title: "Inline code", children: _jsx(Code, { className: "h-4 w-4" }) }), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleHeading({ level: 1 }).run(), isActive: editor.isActive('heading', { level: 1 }), title: "Heading 1", children: _jsx(Heading1, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), isActive: editor.isActive('heading', { level: 2 }), title: "Heading 2", children: _jsx(Heading2, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), isActive: editor.isActive('heading', { level: 3 }), title: "Heading 3", children: _jsx(Heading3, { className: "h-4 w-4" }) }), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleBulletList().run(), isActive: editor.isActive('bulletList'), title: "Bullet list", children: _jsx(List, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleOrderedList().run(), isActive: editor.isActive('orderedList'), title: "Ordered list", children: _jsx(ListOrdered, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleBlockquote().run(), isActive: editor.isActive('blockquote'), title: "Blockquote", children: _jsx(Quote, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleCodeBlock().run(), isActive: editor.isActive('codeBlock'), title: "Code block", children: _jsx(FileCode, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setHorizontalRule().run(), title: "Horizontal rule", children: _jsx(Minus, { className: "h-4 w-4" }) }), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('left').run(), isActive: editor.isActive({ textAlign: 'left' }), title: "Align left", children: _jsx(AlignLeft, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('center').run(), isActive: editor.isActive({ textAlign: 'center' }), title: "Align center", children: _jsx(AlignCenter, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('right').run(), isActive: editor.isActive({ textAlign: 'right' }), title: "Align right", children: _jsx(AlignRight, { className: "h-4 w-4" }) }), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: addLink, isActive: editor.isActive('link'), title: "Insert link", children: _jsx(LinkIcon, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: onOpenMediaPicker, title: "Insert image", children: _jsx(ImageIcon, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: insertTable, title: "Insert table (3\u00D73)", children: _jsx(TableIcon, { className: "h-4 w-4" }) }), isInTable && (_jsxs(_Fragment, { children: [_jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().addColumnBefore().run(), title: "Add column before", children: _jsx(Columns, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().addColumnAfter().run(), title: "Add column after", children: _jsx(Columns, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().deleteColumn().run(), title: "Delete column", children: _jsx(Columns, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().addRowBefore().run(), title: "Add row before", children: _jsx(Rows, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().addRowAfter().run(), title: "Add row after", children: _jsx(Rows, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().deleteRow().run(), title: "Delete row", children: _jsx(Rows, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().deleteTable().run(), title: "Delete table", children: _jsx(Trash2, { className: "h-4 w-4" }) })] })), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().undo().run(), disabled: !editor.can().undo(), title: "Undo", children: _jsx(Undo, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().redo().run(), disabled: !editor.can().redo(), title: "Redo", children: _jsx(Redo, { className: "h-4 w-4" }) })] }));
125
136
  }
126
- export function TipTapEditor({ content, onChange, placeholder, editable = true, className, }) {
137
+ export function TipTapEditor({ content, onChange, placeholder, editable = true, className, enableAI = true, collaboration, comments, }) {
127
138
  const [mediaPickerOpen, setMediaPickerOpen] = useState(false);
128
- const editor = useEditor({
129
- extensions: [
139
+ // The collaboration context is created once per (documentId, url) tuple
140
+ // and torn down on prop changes / unmount. We deliberately key on a
141
+ // stringified tuple so swapping users keeps the same Y.Doc (their seat at
142
+ // the document doesn't drop) while swapping documents creates a new one.
143
+ const collabKey = collaboration ? `${collaboration.documentId}::${collaboration.url}` : null;
144
+ const collabRef = useRef(null);
145
+ const [collabStatus, setCollabStatus] = useState('connecting');
146
+ const [offlineStatus, setOfflineStatus] = useState('pending');
147
+ useEffect(() => {
148
+ if (!collaboration) {
149
+ collabRef.current = null;
150
+ return;
151
+ }
152
+ const ctx = createCollaborationProvider({
153
+ documentId: collaboration.documentId,
154
+ url: collaboration.url,
155
+ user: collaboration.user,
156
+ params: collaboration.params,
157
+ onStatus: setCollabStatus,
158
+ onOfflineStatus: setOfflineStatus,
159
+ });
160
+ collabRef.current = ctx;
161
+ return () => {
162
+ ctx.destroy();
163
+ if (collabRef.current === ctx)
164
+ collabRef.current = null;
165
+ };
166
+ // We rely on collabKey to scope effect identity. user / params are
167
+ // tolerated to mutate freely; the Yjs awareness state is updated
168
+ // separately in the awareness-seeding effect below.
169
+ // eslint-disable-next-line react-hooks/exhaustive-deps
170
+ }, [collabKey]);
171
+ // Keep the local awareness state in sync with user info changes without
172
+ // tearing down the collaboration session.
173
+ useEffect(() => {
174
+ if (!collaboration || !collabRef.current)
175
+ return;
176
+ collabRef.current.awareness.setLocalState({ user: collaboration.user });
177
+ }, [
178
+ collaboration?.user.name,
179
+ collaboration?.user.color,
180
+ collaboration?.user.avatarUrl,
181
+ collaboration?.user.userId,
182
+ collaboration,
183
+ ]);
184
+ const extensions = useMemo(() => {
185
+ // The TipTap extension union is hostile to mutation (the inferred
186
+ // element type is too narrow). We collect into `unknown[]` and let
187
+ // `useEditor`'s prop typing carry the contract from the call site.
188
+ const base = [
130
189
  StarterKit.configure({
131
190
  codeBlock: false,
132
191
  horizontalRule: false,
192
+ // History is owned by Yjs when collaboration is enabled.
193
+ history: collaboration ? false : undefined,
133
194
  }),
134
195
  UnderlineExt,
135
196
  Link.configure({
@@ -150,13 +211,48 @@ export function TipTapEditor({ content, onChange, placeholder, editable = true,
150
211
  }),
151
212
  CodeBlockLowlight.configure({ lowlight }),
152
213
  HorizontalRule,
153
- ],
154
- content,
214
+ ];
215
+ if (collaboration && collabRef.current) {
216
+ base.push(Collaboration.configure({ document: collabRef.current.ydoc }), CollaborationCursor.configure({
217
+ provider: collabRef.current.provider,
218
+ user: collaboration.user,
219
+ }));
220
+ }
221
+ if (comments) {
222
+ base.push(CommentMark);
223
+ }
224
+ return base;
225
+ // Re-derive extensions when the collaboration session or comments
226
+ // toggle changes.
227
+ // eslint-disable-next-line react-hooks/exhaustive-deps
228
+ }, [collabKey, placeholder, comments != null]);
229
+ const editor = useEditor({
230
+ // TipTap's `Extensions` type is the union of every loaded extension's
231
+ // typed shape, which we can't satisfy when we conditionally append
232
+ // collaboration extensions. The runtime contract is correct — TipTap
233
+ // duck-types — so we cast through the narrow `any` slot.
234
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
235
+ extensions: extensions,
236
+ // When collaboration is enabled the Y.Doc is the source of truth; we
237
+ // pass `content: ''` to avoid double-applying the initial HTML.
238
+ content: collaboration ? '' : content,
155
239
  editable: editable !== false,
156
240
  onUpdate: ({ editor: ed }) => {
157
241
  onChange(ed.getHTML());
158
242
  },
159
- });
243
+ onFocus: ({ editor: ed }) => {
244
+ setActiveEditor(ed);
245
+ },
246
+ },
247
+ // Force re-init when collaboration extensions change.
248
+ [collabKey]);
249
+ useEffect(() => {
250
+ if (!editor)
251
+ return;
252
+ return () => {
253
+ clearActiveEditorIf(editor);
254
+ };
255
+ }, [editor]);
160
256
  if (!editor)
161
257
  return null;
162
258
  const handleImageSelected = (url, alt) => {
@@ -166,6 +262,113 @@ export function TipTapEditor({ content, onChange, placeholder, editable = true,
166
262
  .setImage({ src: url, alt: alt ?? '' })
167
263
  .run();
168
264
  };
169
- return (_jsxs("div", { className: `overflow-hidden rounded-lg border border-gray-200 bg-white ${className ?? ''}`, children: [editable && _jsx(Toolbar, { editor: editor, onOpenMediaPicker: () => setMediaPickerOpen(true) }), _jsx(EditorContent, { editor: editor }), _jsx("style", { dangerouslySetInnerHTML: { __html: editorStyles } }), _jsx(MediaPickerModal, { open: mediaPickerOpen, onClose: () => setMediaPickerOpen(false), onSelect: handleImageSelected, accept: "image/*" })] }));
265
+ const awareness = collabRef.current?.awareness ?? null;
266
+ /**
267
+ * Encode an anchor for the current selection. Returns `null` when the
268
+ * selection is empty (the panel falls back to a doc-level comment),
269
+ * or when collaboration isn't enabled (we have no Yjs text node to
270
+ * anchor against — slice 5's anchors are CRDT-relative by design).
271
+ */
272
+ const composeAnchor = () => {
273
+ if (!collabRef.current)
274
+ return null;
275
+ const sel = editor.state.selection;
276
+ if (sel.empty)
277
+ return null;
278
+ // The Y.Doc shape that TipTap collaboration uses is
279
+ // doc.getXmlFragment('default') → [paragraph, …] → [text, …]
280
+ // We anchor against the first XmlText child of the paragraph that
281
+ // contains the selection start. This is the simple-but-correct
282
+ // single-node case; multi-paragraph selections fall back to a
283
+ // doc-level comment (anchor: null) and the user can re-anchor
284
+ // later.
285
+ const fragment = collabRef.current.ydoc.getXmlFragment('default');
286
+ const yType = findTextNodeForPosition(fragment, sel.from);
287
+ if (!yType)
288
+ return null;
289
+ // The relative offset within the text node mirrors the PM offset
290
+ // minus the paragraph's opening token. For the canonical single-
291
+ // text-child case this is `sel.from - paragraphStart - 1`.
292
+ const offset = computeTextOffset(fragment, sel.from);
293
+ if (offset === null)
294
+ return null;
295
+ return encodeAnchor({
296
+ doc: collabRef.current.ydoc,
297
+ yType,
298
+ from: offset,
299
+ to: offset + (sel.to - sel.from),
300
+ });
301
+ };
302
+ const editorPane = (_jsxs("div", { className: `flex-1 overflow-hidden rounded-lg border border-gray-200 bg-white ${className ?? ''}`, children: [collaboration && awareness && (_jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-gray-100 bg-white px-2 py-1.5", children: [_jsx(PresenceChips, { awareness: awareness, status: collabStatus }), _jsx(OfflineStatus, { connection: collabStatus, offline: offlineStatus })] })), editable && _jsx(Toolbar, { editor: editor, onOpenMediaPicker: () => setMediaPickerOpen(true) }), editable && enableAI && _jsx(AICoauthorBubbleMenu, { editor: editor }), _jsx(EditorContent, { editor: editor }), _jsx("style", { dangerouslySetInnerHTML: { __html: editorStyles + COMMENT_MARK_STYLES } }), _jsx(MediaPickerModal, { open: mediaPickerOpen, onClose: () => setMediaPickerOpen(false), onSelect: handleImageSelected, accept: "image/*" })] }));
303
+ if (!comments)
304
+ return editorPane;
305
+ return (_jsxs("div", { className: "flex h-full gap-3", children: [editorPane, _jsx("div", { className: "w-80 shrink-0", children: _jsx(CommentSidePanel, { documentId: comments.documentId, currentUserId: comments.currentUserId, isAdmin: comments.isAdmin, onComposeAnchor: composeAnchor, onError: comments.onError, onActiveCommentChange: (id) => {
306
+ // When a thread is opened in the panel, paint the matching
307
+ // CommentMark with the active modifier so it stands out in
308
+ // the doc. We do this by toggling a class on the rendered
309
+ // span — purely visual; no doc mutation.
310
+ if (typeof document === 'undefined')
311
+ return;
312
+ document
313
+ .querySelectorAll('span.actuate-comment--active')
314
+ .forEach((el) => el.classList.remove('actuate-comment--active'));
315
+ if (id) {
316
+ document
317
+ .querySelectorAll(`span[data-comment-id="${cssEscape(id)}"]`)
318
+ .forEach((el) => el.classList.add('actuate-comment--active'));
319
+ }
320
+ } }) })] }));
321
+ }
322
+ /**
323
+ * Walk the XmlFragment's children until we reach the paragraph
324
+ * containing the given ProseMirror position. Return its first XmlText
325
+ * child, or null when the structure is anything other than the canonical
326
+ * `paragraph → [text]` shape we anchor against.
327
+ *
328
+ * This is the *simple-case* mapping — slice 5 anchors to a single text
329
+ * node per comment. Selections that span multiple paragraphs fall back
330
+ * to a document-level comment (anchor: null) and the user can re-anchor
331
+ * later from the side panel. y-prosemirror has a richer mapping we may
332
+ * pull in once slice 5 ships.
333
+ */
334
+ function findTextNodeForPosition(fragment, pmPos) {
335
+ let walked = 0;
336
+ for (const child of fragment.toArray()) {
337
+ if (!(child instanceof Y.XmlElement))
338
+ continue;
339
+ const textChild = child.firstChild;
340
+ const textLen = textChild instanceof Y.XmlText ? textChild.length : 0;
341
+ // Each paragraph contributes `1 + textLen + 1` PM positions
342
+ // (open token, contents, close token).
343
+ const blockSpan = 2 + textLen;
344
+ if (pmPos <= walked + blockSpan) {
345
+ return textChild instanceof Y.XmlText ? textChild : null;
346
+ }
347
+ walked += blockSpan;
348
+ }
349
+ return null;
350
+ }
351
+ function computeTextOffset(fragment, pmPos) {
352
+ let walked = 0;
353
+ for (const child of fragment.toArray()) {
354
+ if (!(child instanceof Y.XmlElement))
355
+ continue;
356
+ const textChild = child.firstChild;
357
+ const textLen = textChild instanceof Y.XmlText ? textChild.length : 0;
358
+ const blockSpan = 2 + textLen;
359
+ if (pmPos <= walked + blockSpan) {
360
+ // PM positions skip the paragraph's open token (1 char).
361
+ const inside = pmPos - walked - 1;
362
+ if (inside < 0 || inside > textLen)
363
+ return null;
364
+ return inside;
365
+ }
366
+ walked += blockSpan;
367
+ }
368
+ return null;
369
+ }
370
+ /** Cheap CSS attr-value escaper for `data-comment-id` lookups. */
371
+ function cssEscape(value) {
372
+ return value.replace(/(["\\])/g, '\\$1');
170
373
  }
171
374
  //# sourceMappingURL=TipTapEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TipTapEditor.js","sourceRoot":"","sources":["../../src/components/TipTapEditor.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TipTapEditor.js","sourceRoot":"","sources":["../../src/components/TipTapEditor.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { HTMLAttributes, ReactNode } from 'react';
2
2
  import { type VariantProps } from '../../lib/cv.js';
3
3
  declare const badge: (props?: ({
4
- tone?: "primary" | "danger" | "neutral" | "success" | "warning" | "info" | undefined;
4
+ tone?: "info" | "primary" | "danger" | "neutral" | "success" | "warning" | undefined;
5
5
  size?: "sm" | "md" | "lg" | undefined;
6
6
  } & {
7
7
  class?: string | false | null | undefined;