@backmatter/next 0.0.33 → 0.0.34

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backmatter/next",
3
- "version": "0.0.33",
3
+ "version": "0.0.34",
4
4
  "description": "Experimental Next.js adapter for Backmatter. APIs will break. Not ready for production.",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -50,7 +50,7 @@
50
50
  "@backmatter/core": "^0.0.26",
51
51
  "@mdx-js/mdx": "^3.1.1",
52
52
  "remark-gfm": "^4.0.1",
53
- "@backmatter/studio": "^0.0.11"
53
+ "@backmatter/studio": "^0.0.12"
54
54
  },
55
55
  "peerDependencies": {
56
56
  "next": ">=16.3.0",
@@ -8,9 +8,14 @@ import {
8
8
  createPreviewPage,
9
9
  createWindowPreviewTransport,
10
10
  type PreviewChannelRef,
11
+ type PreviewPageSession,
11
12
  type PreviewRenderDoc,
12
13
  type PreviewTransport,
13
14
  } from "@backmatter/core/preview";
15
+ import { POINTER_ARM_EVENT } from "@backmatter/studio/src/chat/pointer-arm";
16
+ import { installPreviewPointer } from "@backmatter/studio/src/install-preview-pointer";
17
+ import { registerPreviewPointerHost } from "@backmatter/studio/src/preview-pointer-host";
18
+ import { findPointedElement, highlightPointedElement } from "@backmatter/studio/src/site-pointer";
14
19
  import { fanInPreviewTransports, sitePageTransport } from "./site-channel";
15
20
  import { PreviewPageReloader as PreviewStreamReloader, PreviewRemoved } from "./preview-live";
16
21
 
@@ -189,9 +194,27 @@ export function PreviewClient({
189
194
  startTransition(() => router.refresh());
190
195
  };
191
196
  const unsubscribeTree = subscribeTreeStream(ref, refreshOthers);
192
- const session = createPreviewPage({
197
+ let session: PreviewPageSession;
198
+ const previewPointer = installPreviewPointer(document, {
199
+ bar: () => document.querySelector("[data-backmatter-devbar]"),
200
+ ignore: (target) => {
201
+ if (!(target instanceof Element)) return true;
202
+ if (target.closest("[data-backmatter-panel]")) return true;
203
+ return target.closest("iframe") !== null;
204
+ },
205
+ onEditorGrab: (grab) => session.grab(grab),
206
+ onDevbarGrab: (grab) => {
207
+ window.dispatchEvent(new CustomEvent("backmatter:devbar-grab", { detail: grab }));
208
+ },
209
+ onEscape: (source) => {
210
+ if (source === "editor") session.point(false);
211
+ window.dispatchEvent(new CustomEvent(POINTER_ARM_EVENT, { detail: { on: false } }));
212
+ },
213
+ });
214
+ session = createPreviewPage({
193
215
  ref,
194
216
  transport,
217
+ capabilities: ["point"],
195
218
  subscribeSse: (onEvent) => subscribeDocStream(ref, onEvent),
196
219
  renderer: async (_ref, doc) => {
197
220
  const result = await renderPreview(ref, doc, checkoutToken);
@@ -212,10 +235,34 @@ export function PreviewClient({
212
235
  onNavigate: (path) => {
213
236
  startTransition(() => router.push(path));
214
237
  },
238
+ onPoint(on) {
239
+ if (on) {
240
+ previewPointer.arm("editor");
241
+ window.dispatchEvent(new CustomEvent(POINTER_ARM_EVENT, { detail: { on: false } }));
242
+ return;
243
+ }
244
+ if (previewPointer.source() === "editor") previewPointer.disarm();
245
+ },
246
+ onHighlight(blockId) {
247
+ const target = blockId ? findPointedElement(document, { blockId, quote: "" }) : null;
248
+ highlightPointedElement(document, target);
249
+ },
250
+ },
251
+ });
252
+ const stopHost = registerPreviewPointerHost({
253
+ armFromDevbar() {
254
+ previewPointer.arm("devbar");
255
+ session.point(false);
256
+ },
257
+ disarmFromDevbar() {
258
+ if (previewPointer.source() !== "devbar") return;
259
+ previewPointer.disarm();
215
260
  },
216
261
  });
217
262
  return () => {
218
263
  unsubscribeTree();
264
+ stopHost();
265
+ previewPointer.dispose();
219
266
  session.close();
220
267
  windowTransport?.close();
221
268
  };