@atlaskit/editor-plugin-collab-edit 3.6.1 → 3.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @atlaskit/editor-plugin-collab-edit
2
2
 
3
+ ## 3.7.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+
9
+ ## 3.7.0
10
+
11
+ ### Minor Changes
12
+
13
+ - [#157183](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/157183)
14
+ [`0e8b7956c0e3d`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/0e8b7956c0e3d) -
15
+ [ux] The telepointer pulse animation and a plugin action to access it have been added. This will
16
+ help users locate telepointers more easily on screen.
17
+
18
+ ### Patch Changes
19
+
20
+ - [#157322](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/157322)
21
+ [`0e61040734cef`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/0e61040734cef) -
22
+ [ED-27842] Consolidate extraneous no_cursor flags into one flag for full rollout
23
+ - Updated dependencies
24
+
3
25
  ## 3.6.1
4
26
 
5
27
  ### Patch Changes
@@ -287,6 +287,17 @@ var collabEditPlugin = exports.collabEditPlugin = function collabEditPlugin(_ref
287
287
  });
288
288
  }
289
289
  }));
290
+ },
291
+ commands: {
292
+ nudgeTelepointer: function nudgeTelepointer(sessionId) {
293
+ return function (_ref7) {
294
+ var tr = _ref7.tr;
295
+ tr.setMeta('nudgeTelepointer', {
296
+ sessionId: sessionId
297
+ });
298
+ return tr;
299
+ };
300
+ }
290
301
  }
291
302
  };
292
303
  };
@@ -37,7 +37,7 @@ var sendTransaction = exports.sendTransaction = function sendTransaction(_ref) {
37
37
  sessionId = currentPluginState.sessionId;
38
38
  var selectionChanged = !oldEditorState.selection.eq(newEditorState.selection);
39
39
  var participantsChanged = prevActiveParticipants && !prevActiveParticipants.eq(activeParticipants);
40
- if (sessionId && viewMode === 'edit' && (selectionChanged && !docChangedTransaction || ((0, _platformFeatureFlags.fg)('platform_editor_no_telecursor_on_live_doc_init') ? participantsChanged && !hideTelecursorOnLoad : participantsChanged))) {
40
+ if (sessionId && viewMode === 'edit' && (selectionChanged && !docChangedTransaction || ((0, _platformFeatureFlags.fg)('platform_editor_no_cursor_on_live_doc_init') ? participantsChanged && !hideTelecursorOnLoad : participantsChanged))) {
41
41
  var selection = (0, _actions.getSendableSelection)(newEditorState.selection);
42
42
  var message = {
43
43
  type: 'telepointer',
@@ -88,6 +88,7 @@ var PluginState = exports.PluginState = /*#__PURE__*/function () {
88
88
  isReady = this.isReady;
89
89
  var presenceData = tr.getMeta('presence');
90
90
  var telepointerData = tr.getMeta('telepointer');
91
+ var nudgeTelepointerData = tr.getMeta('nudgeTelepointer');
91
92
  var sessionIdData = tr.getMeta('sessionId');
92
93
  var collabInitialised = tr.getMeta('collabInitialised');
93
94
  if (typeof collabInitialised !== 'boolean') {
@@ -229,6 +230,21 @@ var PluginState = exports.PluginState = /*#__PURE__*/function () {
229
230
  }
230
231
  }
231
232
  });
233
+ if (nudgeTelepointerData && (0, _platformFeatureFlags.fg)('confluence_team_presence_scroll_to_pointer')) {
234
+ var nudgeSessionId = nudgeTelepointerData === null || nudgeTelepointerData === void 0 ? void 0 : nudgeTelepointerData.sessionId;
235
+
236
+ // Ignored via go/ees005
237
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
238
+ this.decorationSet.find().forEach(function (deco) {
239
+ var _deco$spec, _deco$spec2;
240
+ if (deco.type.toDOM && participants.get(nudgeSessionId) && ((_deco$spec = deco.spec) === null || _deco$spec === void 0 || (_deco$spec = _deco$spec.pointer) === null || _deco$spec === void 0 ? void 0 : _deco$spec.sessionId) === nudgeSessionId && ((_deco$spec2 = deco.spec) === null || _deco$spec2 === void 0 ? void 0 : _deco$spec2.key) === "telepointer-".concat(nudgeSessionId)) {
241
+ // Restart animation by removing and re-adding the class
242
+ deco.type.toDOM.classList.remove(_collab.TELEPOINTER_PULSE_CLASS);
243
+ void deco.type.toDOM.offsetWidth; // Force reflow
244
+ deco.type.toDOM.classList.add(_collab.TELEPOINTER_PULSE_CLASS);
245
+ }
246
+ });
247
+ }
232
248
  if (remove.length) {
233
249
  this.decorationSet = this.decorationSet.remove(remove);
234
250
  }
@@ -10,6 +10,7 @@ exports.scrollToCollabCursor = exports.replaceDocument = exports.originalTransac
10
10
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
11
  var _steps = require("@atlaskit/adf-schema/steps");
12
12
  var _analytics = require("@atlaskit/editor-common/analytics");
13
+ var _collab = require("@atlaskit/editor-common/collab");
13
14
  var _processRawValue = require("@atlaskit/editor-common/process-raw-value");
14
15
  var _whitespace = require("@atlaskit/editor-common/whitespace");
15
16
  var _state = require("@atlaskit/editor-prosemirror/state");
@@ -76,6 +77,7 @@ var createTelepointers = exports.createTelepointers = function createTelepointer
76
77
  }), ";");
77
78
  cursor.setAttribute('data-initial', initial);
78
79
  if ((0, _platformFeatureFlags.fg)('confluence_team_presence_scroll_to_pointer')) {
80
+ cursor.setAttribute(_collab.TELEPOINTER_DATA_SESSION_ID_ATTR, sessionId);
79
81
  var fullNameEl = document.createElement('span');
80
82
  fullNameEl.textContent = fullName;
81
83
  fullNameEl.className = 'telepointer-fullname';
@@ -234,6 +234,16 @@ export const collabEditPlugin = ({
234
234
  });
235
235
  }
236
236
  });
237
+ },
238
+ commands: {
239
+ nudgeTelepointer: sessionId => ({
240
+ tr
241
+ }) => {
242
+ tr.setMeta('nudgeTelepointer', {
243
+ sessionId
244
+ });
245
+ return tr;
246
+ }
237
247
  }
238
248
  };
239
249
  };
@@ -32,7 +32,7 @@ export const sendTransaction = ({
32
32
  } = currentPluginState;
33
33
  const selectionChanged = !oldEditorState.selection.eq(newEditorState.selection);
34
34
  const participantsChanged = prevActiveParticipants && !prevActiveParticipants.eq(activeParticipants);
35
- if (sessionId && viewMode === 'edit' && (selectionChanged && !docChangedTransaction || (fg('platform_editor_no_telecursor_on_live_doc_init') ? participantsChanged && !hideTelecursorOnLoad : participantsChanged))) {
35
+ if (sessionId && viewMode === 'edit' && (selectionChanged && !docChangedTransaction || (fg('platform_editor_no_cursor_on_live_doc_init') ? participantsChanged && !hideTelecursorOnLoad : participantsChanged))) {
36
36
  const selection = getSendableSelection(newEditorState.selection);
37
37
  const message = {
38
38
  type: 'telepointer',
@@ -1,6 +1,6 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import { browser } from '@atlaskit/editor-common/browser';
3
- import { TELEPOINTER_DIM_CLASS } from '@atlaskit/editor-common/collab';
3
+ import { TELEPOINTER_DIM_CLASS, TELEPOINTER_PULSE_CLASS } from '@atlaskit/editor-common/collab';
4
4
  import { Selection } from '@atlaskit/editor-prosemirror/state';
5
5
  import { DecorationSet } from '@atlaskit/editor-prosemirror/view';
6
6
  import { fg } from '@atlaskit/platform-feature-flags';
@@ -62,6 +62,7 @@ export class PluginState {
62
62
  } = this;
63
63
  const presenceData = tr.getMeta('presence');
64
64
  const telepointerData = tr.getMeta('telepointer');
65
+ const nudgeTelepointerData = tr.getMeta('nudgeTelepointer');
65
66
  const sessionIdData = tr.getMeta('sessionId');
66
67
  let collabInitialised = tr.getMeta('collabInitialised');
67
68
  if (typeof collabInitialised !== 'boolean') {
@@ -214,6 +215,21 @@ export class PluginState {
214
215
  }
215
216
  }
216
217
  });
218
+ if (nudgeTelepointerData && fg('confluence_team_presence_scroll_to_pointer')) {
219
+ const nudgeSessionId = nudgeTelepointerData === null || nudgeTelepointerData === void 0 ? void 0 : nudgeTelepointerData.sessionId;
220
+
221
+ // Ignored via go/ees005
222
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
223
+ this.decorationSet.find().forEach(deco => {
224
+ var _deco$spec, _deco$spec$pointer, _deco$spec2;
225
+ if (deco.type.toDOM && participants.get(nudgeSessionId) && ((_deco$spec = deco.spec) === null || _deco$spec === void 0 ? void 0 : (_deco$spec$pointer = _deco$spec.pointer) === null || _deco$spec$pointer === void 0 ? void 0 : _deco$spec$pointer.sessionId) === nudgeSessionId && ((_deco$spec2 = deco.spec) === null || _deco$spec2 === void 0 ? void 0 : _deco$spec2.key) === `telepointer-${nudgeSessionId}`) {
226
+ // Restart animation by removing and re-adding the class
227
+ deco.type.toDOM.classList.remove(TELEPOINTER_PULSE_CLASS);
228
+ void deco.type.toDOM.offsetWidth; // Force reflow
229
+ deco.type.toDOM.classList.add(TELEPOINTER_PULSE_CLASS);
230
+ }
231
+ });
232
+ }
217
233
  if (remove.length) {
218
234
  this.decorationSet = this.decorationSet.remove(remove);
219
235
  }
@@ -1,5 +1,6 @@
1
1
  import { AnalyticsStep, SetAttrsStep } from '@atlaskit/adf-schema/steps';
2
2
  import { ACTION, ACTION_SUBJECT, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
3
+ import { TELEPOINTER_DATA_SESSION_ID_ATTR } from '@atlaskit/editor-common/collab';
3
4
  import { processRawValueWithoutValidation } from '@atlaskit/editor-common/process-raw-value';
4
5
  import { ZERO_WIDTH_JOINER } from '@atlaskit/editor-common/whitespace';
5
6
  import { Transaction, Selection, TextSelection } from '@atlaskit/editor-prosemirror/state';
@@ -58,6 +59,7 @@ export const createTelepointers = (from, to, sessionId, isSelection, initial, pr
58
59
  })};`;
59
60
  cursor.setAttribute('data-initial', initial);
60
61
  if (fg('confluence_team_presence_scroll_to_pointer')) {
62
+ cursor.setAttribute(TELEPOINTER_DATA_SESSION_ID_ATTR, sessionId);
61
63
  const fullNameEl = document.createElement('span');
62
64
  fullNameEl.textContent = fullName;
63
65
  fullNameEl.className = 'telepointer-fullname';
@@ -280,6 +280,17 @@ export var collabEditPlugin = function collabEditPlugin(_ref4) {
280
280
  });
281
281
  }
282
282
  }));
283
+ },
284
+ commands: {
285
+ nudgeTelepointer: function nudgeTelepointer(sessionId) {
286
+ return function (_ref7) {
287
+ var tr = _ref7.tr;
288
+ tr.setMeta('nudgeTelepointer', {
289
+ sessionId: sessionId
290
+ });
291
+ return tr;
292
+ };
293
+ }
283
294
  }
284
295
  };
285
296
  };
@@ -31,7 +31,7 @@ export var sendTransaction = function sendTransaction(_ref) {
31
31
  sessionId = currentPluginState.sessionId;
32
32
  var selectionChanged = !oldEditorState.selection.eq(newEditorState.selection);
33
33
  var participantsChanged = prevActiveParticipants && !prevActiveParticipants.eq(activeParticipants);
34
- if (sessionId && viewMode === 'edit' && (selectionChanged && !docChangedTransaction || (fg('platform_editor_no_telecursor_on_live_doc_init') ? participantsChanged && !hideTelecursorOnLoad : participantsChanged))) {
34
+ if (sessionId && viewMode === 'edit' && (selectionChanged && !docChangedTransaction || (fg('platform_editor_no_cursor_on_live_doc_init') ? participantsChanged && !hideTelecursorOnLoad : participantsChanged))) {
35
35
  var selection = getSendableSelection(newEditorState.selection);
36
36
  var message = {
37
37
  type: 'telepointer',
@@ -2,7 +2,7 @@ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
2
2
  import _createClass from "@babel/runtime/helpers/createClass";
3
3
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
4
  import { browser } from '@atlaskit/editor-common/browser';
5
- import { TELEPOINTER_DIM_CLASS } from '@atlaskit/editor-common/collab';
5
+ import { TELEPOINTER_DIM_CLASS, TELEPOINTER_PULSE_CLASS } from '@atlaskit/editor-common/collab';
6
6
  import { Selection } from '@atlaskit/editor-prosemirror/state';
7
7
  import { DecorationSet } from '@atlaskit/editor-prosemirror/view';
8
8
  import { fg } from '@atlaskit/platform-feature-flags';
@@ -82,6 +82,7 @@ export var PluginState = /*#__PURE__*/function () {
82
82
  isReady = this.isReady;
83
83
  var presenceData = tr.getMeta('presence');
84
84
  var telepointerData = tr.getMeta('telepointer');
85
+ var nudgeTelepointerData = tr.getMeta('nudgeTelepointer');
85
86
  var sessionIdData = tr.getMeta('sessionId');
86
87
  var collabInitialised = tr.getMeta('collabInitialised');
87
88
  if (typeof collabInitialised !== 'boolean') {
@@ -223,6 +224,21 @@ export var PluginState = /*#__PURE__*/function () {
223
224
  }
224
225
  }
225
226
  });
227
+ if (nudgeTelepointerData && fg('confluence_team_presence_scroll_to_pointer')) {
228
+ var nudgeSessionId = nudgeTelepointerData === null || nudgeTelepointerData === void 0 ? void 0 : nudgeTelepointerData.sessionId;
229
+
230
+ // Ignored via go/ees005
231
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
232
+ this.decorationSet.find().forEach(function (deco) {
233
+ var _deco$spec, _deco$spec2;
234
+ if (deco.type.toDOM && participants.get(nudgeSessionId) && ((_deco$spec = deco.spec) === null || _deco$spec === void 0 || (_deco$spec = _deco$spec.pointer) === null || _deco$spec === void 0 ? void 0 : _deco$spec.sessionId) === nudgeSessionId && ((_deco$spec2 = deco.spec) === null || _deco$spec2 === void 0 ? void 0 : _deco$spec2.key) === "telepointer-".concat(nudgeSessionId)) {
235
+ // Restart animation by removing and re-adding the class
236
+ deco.type.toDOM.classList.remove(TELEPOINTER_PULSE_CLASS);
237
+ void deco.type.toDOM.offsetWidth; // Force reflow
238
+ deco.type.toDOM.classList.add(TELEPOINTER_PULSE_CLASS);
239
+ }
240
+ });
241
+ }
226
242
  if (remove.length) {
227
243
  this.decorationSet = this.decorationSet.remove(remove);
228
244
  }
@@ -1,6 +1,7 @@
1
1
  import _typeof from "@babel/runtime/helpers/typeof";
2
2
  import { AnalyticsStep, SetAttrsStep } from '@atlaskit/adf-schema/steps';
3
3
  import { ACTION, ACTION_SUBJECT, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
4
+ import { TELEPOINTER_DATA_SESSION_ID_ATTR } from '@atlaskit/editor-common/collab';
4
5
  import { processRawValueWithoutValidation } from '@atlaskit/editor-common/process-raw-value';
5
6
  import { ZERO_WIDTH_JOINER } from '@atlaskit/editor-common/whitespace';
6
7
  import { Transaction, Selection, TextSelection } from '@atlaskit/editor-prosemirror/state';
@@ -67,6 +68,7 @@ export var createTelepointers = function createTelepointers(from, to, sessionId,
67
68
  }), ";");
68
69
  cursor.setAttribute('data-initial', initial);
69
70
  if (fg('confluence_team_presence_scroll_to_pointer')) {
71
+ cursor.setAttribute(TELEPOINTER_DATA_SESSION_ID_ATTR, sessionId);
70
72
  var fullNameEl = document.createElement('span');
71
73
  fullNameEl.textContent = fullName;
72
74
  fullNameEl.className = 'telepointer-fullname';
@@ -1,4 +1,4 @@
1
- import type { NextEditorPlugin, OptionalPlugin } from '@atlaskit/editor-common/types';
1
+ import type { EditorCommand, NextEditorPlugin, OptionalPlugin } from '@atlaskit/editor-common/types';
2
2
  import type { JSONNode } from '@atlaskit/editor-json-transformer';
3
3
  import type { AnalyticsPlugin } from '@atlaskit/editor-plugin-analytics';
4
4
  import type { ConnectivityPlugin } from '@atlaskit/editor-plugin-connectivity';
@@ -41,4 +41,7 @@ export type CollabEditPlugin = NextEditorPlugin<'collabEdit', {
41
41
  };
42
42
  validatePMJSONDocument: (doc: any) => boolean;
43
43
  };
44
+ commands: {
45
+ nudgeTelepointer: (sessionId: string) => EditorCommand;
46
+ };
44
47
  }>;
@@ -1,5 +1,5 @@
1
1
  import type { CollabEditProvider } from '@atlaskit/editor-common/collab';
2
- import { ViewMode } from '@atlaskit/editor-plugin-editor-viewmode';
2
+ import type { ViewMode } from '@atlaskit/editor-plugin-editor-viewmode';
3
3
  import type { EditorState, Transaction } from '@atlaskit/editor-prosemirror/state';
4
4
  type Props = {
5
5
  originalTransaction: Readonly<Transaction>;
@@ -1,5 +1,5 @@
1
1
  import type { EditorAnalyticsAPI } from '@atlaskit/editor-common/analytics';
2
- import type { CollabEditOptions, CollabParticipant } from '@atlaskit/editor-common/collab';
2
+ import { type CollabEditOptions, type CollabParticipant } from '@atlaskit/editor-common/collab';
3
3
  import { type EditorState, type ReadonlyTransaction, Transaction } from '@atlaskit/editor-prosemirror/state';
4
4
  import type { Step } from '@atlaskit/editor-prosemirror/transform';
5
5
  import type { DecorationSet, EditorView } from '@atlaskit/editor-prosemirror/view';
@@ -1,4 +1,4 @@
1
- import type { NextEditorPlugin, OptionalPlugin } from '@atlaskit/editor-common/types';
1
+ import type { EditorCommand, NextEditorPlugin, OptionalPlugin } from '@atlaskit/editor-common/types';
2
2
  import type { JSONNode } from '@atlaskit/editor-json-transformer';
3
3
  import type { AnalyticsPlugin } from '@atlaskit/editor-plugin-analytics';
4
4
  import type { ConnectivityPlugin } from '@atlaskit/editor-plugin-connectivity';
@@ -41,4 +41,7 @@ export type CollabEditPlugin = NextEditorPlugin<'collabEdit', {
41
41
  };
42
42
  validatePMJSONDocument: (doc: any) => boolean;
43
43
  };
44
+ commands: {
45
+ nudgeTelepointer: (sessionId: string) => EditorCommand;
46
+ };
44
47
  }>;
@@ -1,5 +1,5 @@
1
1
  import type { CollabEditProvider } from '@atlaskit/editor-common/collab';
2
- import { ViewMode } from '@atlaskit/editor-plugin-editor-viewmode';
2
+ import type { ViewMode } from '@atlaskit/editor-plugin-editor-viewmode';
3
3
  import type { EditorState, Transaction } from '@atlaskit/editor-prosemirror/state';
4
4
  type Props = {
5
5
  originalTransaction: Readonly<Transaction>;
@@ -1,5 +1,5 @@
1
1
  import type { EditorAnalyticsAPI } from '@atlaskit/editor-common/analytics';
2
- import type { CollabEditOptions, CollabParticipant } from '@atlaskit/editor-common/collab';
2
+ import { type CollabEditOptions, type CollabParticipant } from '@atlaskit/editor-common/collab';
3
3
  import { type EditorState, type ReadonlyTransaction, Transaction } from '@atlaskit/editor-prosemirror/state';
4
4
  import type { Step } from '@atlaskit/editor-prosemirror/transform';
5
5
  import type { DecorationSet, EditorView } from '@atlaskit/editor-prosemirror/view';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-collab-edit",
3
- "version": "3.6.1",
3
+ "version": "3.7.1",
4
4
  "description": "Collab Edit plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -33,17 +33,17 @@
33
33
  "dependencies": {
34
34
  "@atlaskit/adf-schema": "^47.6.0",
35
35
  "@atlaskit/custom-steps": "^0.11.0",
36
- "@atlaskit/editor-common": "^105.0.0",
36
+ "@atlaskit/editor-common": "^105.10.0",
37
37
  "@atlaskit/editor-json-transformer": "^8.24.0",
38
- "@atlaskit/editor-plugin-analytics": "^2.2.0",
38
+ "@atlaskit/editor-plugin-analytics": "^2.3.0",
39
39
  "@atlaskit/editor-plugin-connectivity": "^2.0.0",
40
- "@atlaskit/editor-plugin-editor-viewmode": "^3.1.0",
40
+ "@atlaskit/editor-plugin-editor-viewmode": "^4.0.0",
41
41
  "@atlaskit/editor-plugin-feature-flags": "^1.4.0",
42
42
  "@atlaskit/editor-prosemirror": "7.0.0",
43
43
  "@atlaskit/editor-shared-styles": "^3.4.0",
44
44
  "@atlaskit/platform-feature-flags": "^1.1.0",
45
45
  "@atlaskit/prosemirror-collab": "^0.16.0",
46
- "@atlaskit/tmp-editor-statsig": "^4.19.0",
46
+ "@atlaskit/tmp-editor-statsig": "^5.0.0",
47
47
  "@babel/runtime": "^7.0.0",
48
48
  "memoize-one": "^6.0.0"
49
49
  },
@@ -54,9 +54,9 @@
54
54
  "devDependencies": {
55
55
  "@af/integration-testing": "workspace:^",
56
56
  "@af/visual-regression": "workspace:^",
57
- "@atlaskit/editor-plugin-mentions": "^4.6.0",
57
+ "@atlaskit/editor-plugin-mentions": "^4.7.0",
58
58
  "@atlaskit/editor-plugin-text-formatting": "^2.2.0",
59
- "@atlaskit/editor-plugin-type-ahead": "^2.6.0",
59
+ "@atlaskit/editor-plugin-type-ahead": "^2.7.0",
60
60
  "@atlaskit/editor-plugin-unsupported-content": "^2.1.0",
61
61
  "@atlaskit/editor-test-helpers": "workspace:^",
62
62
  "@atlaskit/ssr": "workspace:^",
@@ -110,7 +110,7 @@
110
110
  "platform_editor_selection_without_left_shift": {
111
111
  "type": "boolean"
112
112
  },
113
- "platform_editor_no_telecursor_on_live_doc_init": {
113
+ "platform_editor_no_cursor_on_live_doc_init": {
114
114
  "type": "boolean"
115
115
  },
116
116
  "confluence_team_presence_scroll_to_pointer": {