@atlaskit/editor-common 111.11.3 → 111.11.5

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 (47) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/analytics/types/table-events.js +1 -0
  3. package/dist/cjs/monitoring/error.js +1 -1
  4. package/dist/cjs/node-anchor/node-anchor-provider.js +84 -37
  5. package/dist/cjs/ui/DropList/index.js +1 -1
  6. package/dist/cjs/ui-menu/ArrowKeyNavigationProvider/MenuArrowKeyNavigationProvider/index.js +7 -1
  7. package/dist/es2019/analytics/types/table-events.js +1 -0
  8. package/dist/es2019/monitoring/error.js +1 -1
  9. package/dist/es2019/node-anchor/node-anchor-provider.js +84 -37
  10. package/dist/es2019/ui/DropList/index.js +1 -1
  11. package/dist/es2019/ui-menu/ArrowKeyNavigationProvider/MenuArrowKeyNavigationProvider/index.js +7 -1
  12. package/dist/esm/analytics/types/table-events.js +1 -0
  13. package/dist/esm/monitoring/error.js +1 -1
  14. package/dist/esm/node-anchor/node-anchor-provider.js +84 -37
  15. package/dist/esm/ui/DropList/index.js +1 -1
  16. package/dist/esm/ui-menu/ArrowKeyNavigationProvider/MenuArrowKeyNavigationProvider/index.js +7 -1
  17. package/dist/types/analytics/types/ai-streaming.d.ts +1 -0
  18. package/dist/types/analytics/types/table-events.d.ts +6 -1
  19. package/dist/types/element-browser/components/ElementSearch.d.ts +1 -1
  20. package/dist/types/link/ConfigureLinkOverlay/Dropdown.d.ts +1 -1
  21. package/dist/types/link/ConfigureLinkOverlay/index.d.ts +1 -1
  22. package/dist/types/styles/shared/headings.d.ts +1 -1
  23. package/dist/types/styles/shared/media-single.d.ts +2 -2
  24. package/dist/types/styles/shared/native-anchor.d.ts +1 -1
  25. package/dist/types/styles/shared/table.d.ts +1 -1
  26. package/dist/types/styles/shared/tableCell.d.ts +1 -1
  27. package/dist/types/ui/IntlProviderIfMissingWrapper/index.d.ts +2 -1
  28. package/dist/types/ui/MediaSingle/styled.d.ts +2 -2
  29. package/dist/types/ui/ResizerLegacy/styled.d.ts +1 -1
  30. package/dist/types/ui-menu/ArrowKeyNavigationProvider/types.d.ts +7 -1
  31. package/dist/types/ui-menu/ToolbarButton/index.d.ts +1 -1
  32. package/dist/types-ts4.5/analytics/types/ai-streaming.d.ts +1 -0
  33. package/dist/types-ts4.5/analytics/types/table-events.d.ts +6 -1
  34. package/dist/types-ts4.5/element-browser/components/ElementSearch.d.ts +1 -1
  35. package/dist/types-ts4.5/link/ConfigureLinkOverlay/Dropdown.d.ts +1 -1
  36. package/dist/types-ts4.5/link/ConfigureLinkOverlay/index.d.ts +1 -1
  37. package/dist/types-ts4.5/styles/shared/headings.d.ts +1 -1
  38. package/dist/types-ts4.5/styles/shared/media-single.d.ts +2 -2
  39. package/dist/types-ts4.5/styles/shared/native-anchor.d.ts +1 -1
  40. package/dist/types-ts4.5/styles/shared/table.d.ts +1 -1
  41. package/dist/types-ts4.5/styles/shared/tableCell.d.ts +1 -1
  42. package/dist/types-ts4.5/ui/IntlProviderIfMissingWrapper/index.d.ts +2 -1
  43. package/dist/types-ts4.5/ui/MediaSingle/styled.d.ts +2 -2
  44. package/dist/types-ts4.5/ui/ResizerLegacy/styled.d.ts +1 -1
  45. package/dist/types-ts4.5/ui-menu/ArrowKeyNavigationProvider/types.d.ts +7 -1
  46. package/dist/types-ts4.5/ui-menu/ToolbarButton/index.d.ts +1 -1
  47. package/package.json +4 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @atlaskit/editor-common
2
2
 
3
+ ## 111.11.5
4
+
5
+ ### Patch Changes
6
+
7
+ - [`7f6ca0d7b6afc`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/7f6ca0d7b6afc) -
8
+ Updated the table drag menu to fire a track analytic event when the menu is opened
9
+ - [`1ce3b7e203e89`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/1ce3b7e203e89) -
10
+ Add traceid attribute to noDocChange event
11
+ - [`3b3aa281c8524`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/3b3aa281c8524) -
12
+ Editor 4149 Fix keyboard navigation inside turn into
13
+ - [`49dad8567c387`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/49dad8567c387) -
14
+ EDITOR-4948 - Change performance mode threshold condition to include doc size, node count, and LCM
15
+ check.
16
+ - Updated dependencies
17
+
18
+ ## 111.11.4
19
+
20
+ ### Patch Changes
21
+
22
+ - Updated dependencies
23
+
3
24
  ## 111.11.3
4
25
 
5
26
  ### Patch Changes
@@ -35,6 +35,7 @@ var TABLE_ACTION = exports.TABLE_ACTION = /*#__PURE__*/function (TABLE_ACTION) {
35
35
  TABLE_ACTION["MOVED_COLUMN"] = "movedColumn";
36
36
  TABLE_ACTION["CLONED_ROW"] = "clonedRow";
37
37
  TABLE_ACTION["CLONED_COLUMN"] = "clonedColumn";
38
+ TABLE_ACTION["DRAG_MENU_OPENED"] = "dragMenuOpened";
38
39
  /**
39
40
  * This is a unique action that's used to track legacy table move behaviour flow of insert+copy+paste. Please use
40
41
  * the MOVED_ROW | MOVED_COLUMN actions if you want to track events which move row/cols in a single step.
@@ -19,7 +19,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
19
19
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
20
20
  var SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
21
21
  var packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
22
- var packageVersion = "0.0.0-development";
22
+ var packageVersion = "111.11.4";
23
23
  var sanitiseSentryEvents = function sanitiseSentryEvents(data, _hint) {
24
24
  // Remove URL as it has UGC
25
25
  // Ignored via go/ees007
@@ -13,36 +13,23 @@ var _expVal = require("@atlaskit/tmp-editor-statsig/expVal");
13
13
  var _utils = require("../utils");
14
14
  var _dynamicBitArray = require("./dynamic-bit-array");
15
15
  /**
16
- * Counts nodes in the document.
17
- *
18
- * Note: legacy-content macros add a damped contribution based on ADF length to avoid
19
- * parsing nested ADF on every check, which is inefficient.
20
- */
21
- var countNodesInDoc = function countNodesInDoc(doc, lcmDampingFactor) {
22
- var nodeCount = 0;
23
- doc.descendants(function (node) {
24
- var _node$attrs;
25
- nodeCount += 1;
26
- if (((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.extensionKey) === 'legacy-content') {
27
- var _node$attrs2;
28
- var adfLength = (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 || (_node$attrs2 = _node$attrs2.parameters) === null || _node$attrs2 === void 0 || (_node$attrs2 = _node$attrs2.adf) === null || _node$attrs2 === void 0 ? void 0 : _node$attrs2.length;
29
- if (typeof adfLength === 'number' && lcmDampingFactor > 0) {
30
- nodeCount += Math.ceil(adfLength / lcmDampingFactor);
31
- }
32
- }
33
- });
34
- return nodeCount;
35
- };
36
-
37
- /**
38
- * Guard against test overrides returning booleans for numeric params.
16
+ * Gets a numeric experiment param, returning undefined if the value is not a valid number.
17
+ * This guards against test overrides returning booleans or strings for numeric params.
39
18
  */
40
- var getNumericExperimentParam = function getNumericExperimentParam(experimentName, paramName, fallbackValue) {
41
- var rawValue = (0, _expVal.expVal)(experimentName, paramName, fallbackValue);
19
+ var getNumericExperimentParam = function getNumericExperimentParam(paramName, fallbackValue) {
20
+ var rawValue = (0, _expVal.expVal)('cc_editor_limited_mode_expanded', paramName, fallbackValue);
42
21
  if (typeof rawValue === 'number') {
43
22
  return rawValue;
44
23
  }
45
- return fallbackValue;
24
+
25
+ // Handle string values from test overrides
26
+ if (typeof rawValue === 'string') {
27
+ var parsed = parseInt(rawValue, 10);
28
+ if (!isNaN(parsed)) {
29
+ return parsed;
30
+ }
31
+ }
32
+ return undefined;
46
33
  };
47
34
  var NodeAnchorProvider = exports.NodeAnchorProvider = /*#__PURE__*/function () {
48
35
  function NodeAnchorProvider() {
@@ -119,23 +106,83 @@ var NodeAnchorProvider = exports.NodeAnchorProvider = /*#__PURE__*/function () {
119
106
  var nodeIdProviderMap = new WeakMap();
120
107
  var LIMITED_MODE_NODE_SIZE_THRESHOLD = 40000;
121
108
 
122
- // This is duplicate from the limited mode plugin to avoid circular dependency
123
- // We can refactor this later to have a shared util package
109
+ /**
110
+ * Calculates custom document size including LCM ADF lengths (for non-expanded path).
111
+ * This function can be removed when cc_editor_limited_mode_expanded is cleaned up.
112
+ */
113
+ var getCustomDocSize = function getCustomDocSize(doc) {
114
+ var lcmAdfLength = 0;
115
+ doc.descendants(function (node) {
116
+ var _node$attrs;
117
+ if (((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.extensionKey) === 'legacy-content') {
118
+ var _node$attrs$parameter, _node$attrs2;
119
+ lcmAdfLength += (_node$attrs$parameter = (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 || (_node$attrs2 = _node$attrs2.parameters) === null || _node$attrs2 === void 0 || (_node$attrs2 = _node$attrs2.adf) === null || _node$attrs2 === void 0 ? void 0 : _node$attrs2.length) !== null && _node$attrs$parameter !== void 0 ? _node$attrs$parameter : 0;
120
+ }
121
+ });
122
+ return doc.nodeSize + lcmAdfLength;
123
+ };
124
+
125
+ /**
126
+ * Determines whether limited mode should be enabled.
127
+ * This logic mirrors the limited mode plugin implementation, but lives here to avoid a circular dependency.
128
+ * If it changes, update the matching logic in `editor-plugin-limited-mode/src/pm-plugins/main.ts`.
129
+ *
130
+ * Under the expanded gate, limited mode is activated when ANY of the following conditions are met:
131
+ * 1. Document size exceeds `docSizeThreshold` (if defined) - checked first as O(1)
132
+ * 2. Node count exceeds `nodeCountThreshold` (if defined)
133
+ * 3. Document contains a legacy-content macro (LCM) (if `includeLcmInThreshold` is true)
134
+ *
135
+ * Performance optimisations:
136
+ * - Doc size is checked first (O(1)) - if it exceeds threshold, we skip traversal entirely.
137
+ * - If `includeLcmInThreshold` is enabled and we find an LCM, we exit traversal early.
138
+ * - If neither node count nor LCM conditions are configured, we skip traversal entirely.
139
+ */
124
140
  var isLimitedModeEnabled = function isLimitedModeEnabled(editorView) {
141
+ var doc = editorView.state.doc;
125
142
  if ((0, _expVal.expVal)('cc_editor_limited_mode_expanded', 'isEnabled', false)) {
126
- var lcmNodeCountDampingFactor = getNumericExperimentParam('cc_editor_limited_mode_expanded', 'lcmNodeCountDampingFactor', 10);
127
- var nodeCountThreshold = getNumericExperimentParam('cc_editor_limited_mode_expanded', 'nodeCountThreshold', 1000);
128
- var nodeCount = countNodesInDoc(editorView.state.doc, lcmNodeCountDampingFactor);
129
- return nodeCount > nodeCountThreshold;
130
- } else {
131
- var customDocSize = editorView.state.doc.nodeSize;
132
- editorView.state.doc.descendants(function (node) {
143
+ var nodeCountThreshold = getNumericExperimentParam('nodeCountThreshold', 5000);
144
+ var docSizeThreshold = getNumericExperimentParam('docSizeThreshold', 30000);
145
+ var includeLcmInThreshold = Boolean((0, _expVal.expVal)('cc_editor_limited_mode_expanded', 'includeLcmInThreshold', false));
146
+
147
+ // Early exit: doc size exceeds threshold - O(1), no traversal needed
148
+ if (docSizeThreshold !== undefined && doc.nodeSize > docSizeThreshold) {
149
+ return true;
150
+ }
151
+
152
+ // Early exit: no traversal needed if neither condition is configured
153
+ var needNodeCount = nodeCountThreshold !== undefined;
154
+ if (!needNodeCount && !includeLcmInThreshold) {
155
+ return false;
156
+ }
157
+
158
+ // Single traversal for node count and/or LCM detection
159
+ var nodeCount = 0;
160
+ var hasLcm = false;
161
+ doc.descendants(function (node) {
133
162
  var _node$attrs3;
163
+ nodeCount += 1;
134
164
  if (((_node$attrs3 = node.attrs) === null || _node$attrs3 === void 0 ? void 0 : _node$attrs3.extensionKey) === 'legacy-content') {
135
- var _node$attrs$parameter, _node$attrs4;
136
- customDocSize += (_node$attrs$parameter = (_node$attrs4 = node.attrs) === null || _node$attrs4 === void 0 || (_node$attrs4 = _node$attrs4.parameters) === null || _node$attrs4 === void 0 || (_node$attrs4 = _node$attrs4.adf) === null || _node$attrs4 === void 0 ? void 0 : _node$attrs4.length) !== null && _node$attrs$parameter !== void 0 ? _node$attrs$parameter : 0;
165
+ hasLcm = true;
166
+
167
+ // Early exit: LCM found and condition is enabled - no need to continue counting
168
+ if (includeLcmInThreshold) {
169
+ return false;
170
+ }
137
171
  }
138
172
  });
173
+
174
+ // LCM condition takes precedence (if we early exited traversal, this is why)
175
+ if (includeLcmInThreshold && hasLcm) {
176
+ return true;
177
+ }
178
+
179
+ // Check node count threshold
180
+ if (needNodeCount && nodeCount > nodeCountThreshold) {
181
+ return true;
182
+ }
183
+ return false;
184
+ } else {
185
+ var customDocSize = getCustomDocSize(doc);
139
186
  return customDocSize > LIMITED_MODE_NODE_SIZE_THRESHOLD;
140
187
  }
141
188
  };
@@ -24,7 +24,7 @@ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.
24
24
  * @jsx jsx
25
25
  */ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
26
26
  var packageName = "@atlaskit/editor-common";
27
- var packageVersion = "0.0.0-development";
27
+ var packageVersion = "111.11.4";
28
28
  var halfFocusRing = 1;
29
29
  var dropOffset = '0, 8';
30
30
  var fadeIn = (0, _react2.keyframes)({
@@ -74,7 +74,10 @@ var MenuArrowKeyNavigationProvider = exports.MenuArrowKeyNavigationProvider = fu
74
74
  }
75
75
  }, [currentSelectedItemIndex, onSelection, incrementIndex, decrementIndex]);
76
76
  (0, _react.useLayoutEffect)(function () {
77
- if (disableArrowKeyNavigation) {
77
+ // Backwards compatible behaviour:
78
+ // - `true` disables all key handling (no listeners attached)
79
+ // - a function is evaluated per event inside the handler
80
+ if (disableArrowKeyNavigation === true) {
78
81
  return;
79
82
  }
80
83
 
@@ -84,6 +87,9 @@ var MenuArrowKeyNavigationProvider = exports.MenuArrowKeyNavigationProvider = fu
84
87
  */
85
88
  var handleKeyDown = function handleKeyDown(event) {
86
89
  var _wrapperRef$current;
90
+ if (typeof disableArrowKeyNavigation === 'function' && disableArrowKeyNavigation(event)) {
91
+ return;
92
+ }
87
93
  var targetElement = event.target;
88
94
 
89
95
  // Tab key on menu items can be handled in the parent components of dropdown menus with KeydownHandlerContext
@@ -29,6 +29,7 @@ export let TABLE_ACTION = /*#__PURE__*/function (TABLE_ACTION) {
29
29
  TABLE_ACTION["MOVED_COLUMN"] = "movedColumn";
30
30
  TABLE_ACTION["CLONED_ROW"] = "clonedRow";
31
31
  TABLE_ACTION["CLONED_COLUMN"] = "clonedColumn";
32
+ TABLE_ACTION["DRAG_MENU_OPENED"] = "dragMenuOpened";
32
33
  /**
33
34
  * This is a unique action that's used to track legacy table move behaviour flow of insert+copy+paste. Please use
34
35
  * the MOVED_ROW | MOVED_COLUMN actions if you want to track events which move row/cols in a single step.
@@ -4,7 +4,7 @@ import { isFedRamp } from './environment';
4
4
  import { normaliseSentryBreadcrumbs, SERIALIZABLE_ATTRIBUTES } from './normalise-sentry-breadcrumbs';
5
5
  const SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
6
6
  const packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
7
- const packageVersion = "0.0.0-development";
7
+ const packageVersion = "111.11.4";
8
8
  const sanitiseSentryEvents = (data, _hint) => {
9
9
  // Remove URL as it has UGC
10
10
  // Ignored via go/ees007
@@ -5,36 +5,23 @@ import { isEmptyDocument } from '../utils';
5
5
  import { DynamicBitArray } from './dynamic-bit-array';
6
6
 
7
7
  /**
8
- * Counts nodes in the document.
9
- *
10
- * Note: legacy-content macros add a damped contribution based on ADF length to avoid
11
- * parsing nested ADF on every check, which is inefficient.
12
- */
13
- const countNodesInDoc = (doc, lcmDampingFactor) => {
14
- let nodeCount = 0;
15
- doc.descendants(node => {
16
- var _node$attrs;
17
- nodeCount += 1;
18
- if (((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.extensionKey) === 'legacy-content') {
19
- var _node$attrs2, _node$attrs2$paramete, _node$attrs2$paramete2;
20
- const adfLength = (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 ? void 0 : (_node$attrs2$paramete = _node$attrs2.parameters) === null || _node$attrs2$paramete === void 0 ? void 0 : (_node$attrs2$paramete2 = _node$attrs2$paramete.adf) === null || _node$attrs2$paramete2 === void 0 ? void 0 : _node$attrs2$paramete2.length;
21
- if (typeof adfLength === 'number' && lcmDampingFactor > 0) {
22
- nodeCount += Math.ceil(adfLength / lcmDampingFactor);
23
- }
24
- }
25
- });
26
- return nodeCount;
27
- };
28
-
29
- /**
30
- * Guard against test overrides returning booleans for numeric params.
8
+ * Gets a numeric experiment param, returning undefined if the value is not a valid number.
9
+ * This guards against test overrides returning booleans or strings for numeric params.
31
10
  */
32
- const getNumericExperimentParam = (experimentName, paramName, fallbackValue) => {
33
- const rawValue = expVal(experimentName, paramName, fallbackValue);
11
+ const getNumericExperimentParam = (paramName, fallbackValue) => {
12
+ const rawValue = expVal('cc_editor_limited_mode_expanded', paramName, fallbackValue);
34
13
  if (typeof rawValue === 'number') {
35
14
  return rawValue;
36
15
  }
37
- return fallbackValue;
16
+
17
+ // Handle string values from test overrides
18
+ if (typeof rawValue === 'string') {
19
+ const parsed = parseInt(rawValue, 10);
20
+ if (!isNaN(parsed)) {
21
+ return parsed;
22
+ }
23
+ }
24
+ return undefined;
38
25
  };
39
26
  export class NodeAnchorProvider {
40
27
  constructor(limitedMode = false, emptyDoc = false) {
@@ -95,23 +82,83 @@ export class NodeAnchorProvider {
95
82
  const nodeIdProviderMap = new WeakMap();
96
83
  const LIMITED_MODE_NODE_SIZE_THRESHOLD = 40000;
97
84
 
98
- // This is duplicate from the limited mode plugin to avoid circular dependency
99
- // We can refactor this later to have a shared util package
85
+ /**
86
+ * Calculates custom document size including LCM ADF lengths (for non-expanded path).
87
+ * This function can be removed when cc_editor_limited_mode_expanded is cleaned up.
88
+ */
89
+ const getCustomDocSize = doc => {
90
+ let lcmAdfLength = 0;
91
+ doc.descendants(node => {
92
+ var _node$attrs;
93
+ if (((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.extensionKey) === 'legacy-content') {
94
+ var _node$attrs$parameter, _node$attrs2, _node$attrs2$paramete, _node$attrs2$paramete2;
95
+ lcmAdfLength += (_node$attrs$parameter = (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 ? void 0 : (_node$attrs2$paramete = _node$attrs2.parameters) === null || _node$attrs2$paramete === void 0 ? void 0 : (_node$attrs2$paramete2 = _node$attrs2$paramete.adf) === null || _node$attrs2$paramete2 === void 0 ? void 0 : _node$attrs2$paramete2.length) !== null && _node$attrs$parameter !== void 0 ? _node$attrs$parameter : 0;
96
+ }
97
+ });
98
+ return doc.nodeSize + lcmAdfLength;
99
+ };
100
+
101
+ /**
102
+ * Determines whether limited mode should be enabled.
103
+ * This logic mirrors the limited mode plugin implementation, but lives here to avoid a circular dependency.
104
+ * If it changes, update the matching logic in `editor-plugin-limited-mode/src/pm-plugins/main.ts`.
105
+ *
106
+ * Under the expanded gate, limited mode is activated when ANY of the following conditions are met:
107
+ * 1. Document size exceeds `docSizeThreshold` (if defined) - checked first as O(1)
108
+ * 2. Node count exceeds `nodeCountThreshold` (if defined)
109
+ * 3. Document contains a legacy-content macro (LCM) (if `includeLcmInThreshold` is true)
110
+ *
111
+ * Performance optimisations:
112
+ * - Doc size is checked first (O(1)) - if it exceeds threshold, we skip traversal entirely.
113
+ * - If `includeLcmInThreshold` is enabled and we find an LCM, we exit traversal early.
114
+ * - If neither node count nor LCM conditions are configured, we skip traversal entirely.
115
+ */
100
116
  const isLimitedModeEnabled = editorView => {
117
+ const doc = editorView.state.doc;
101
118
  if (expVal('cc_editor_limited_mode_expanded', 'isEnabled', false)) {
102
- const lcmNodeCountDampingFactor = getNumericExperimentParam('cc_editor_limited_mode_expanded', 'lcmNodeCountDampingFactor', 10);
103
- const nodeCountThreshold = getNumericExperimentParam('cc_editor_limited_mode_expanded', 'nodeCountThreshold', 1000);
104
- const nodeCount = countNodesInDoc(editorView.state.doc, lcmNodeCountDampingFactor);
105
- return nodeCount > nodeCountThreshold;
106
- } else {
107
- let customDocSize = editorView.state.doc.nodeSize;
108
- editorView.state.doc.descendants(node => {
119
+ const nodeCountThreshold = getNumericExperimentParam('nodeCountThreshold', 5000);
120
+ const docSizeThreshold = getNumericExperimentParam('docSizeThreshold', 30000);
121
+ const includeLcmInThreshold = Boolean(expVal('cc_editor_limited_mode_expanded', 'includeLcmInThreshold', false));
122
+
123
+ // Early exit: doc size exceeds threshold - O(1), no traversal needed
124
+ if (docSizeThreshold !== undefined && doc.nodeSize > docSizeThreshold) {
125
+ return true;
126
+ }
127
+
128
+ // Early exit: no traversal needed if neither condition is configured
129
+ const needNodeCount = nodeCountThreshold !== undefined;
130
+ if (!needNodeCount && !includeLcmInThreshold) {
131
+ return false;
132
+ }
133
+
134
+ // Single traversal for node count and/or LCM detection
135
+ let nodeCount = 0;
136
+ let hasLcm = false;
137
+ doc.descendants(node => {
109
138
  var _node$attrs3;
139
+ nodeCount += 1;
110
140
  if (((_node$attrs3 = node.attrs) === null || _node$attrs3 === void 0 ? void 0 : _node$attrs3.extensionKey) === 'legacy-content') {
111
- var _node$attrs$parameter, _node$attrs4, _node$attrs4$paramete, _node$attrs4$paramete2;
112
- customDocSize += (_node$attrs$parameter = (_node$attrs4 = node.attrs) === null || _node$attrs4 === void 0 ? void 0 : (_node$attrs4$paramete = _node$attrs4.parameters) === null || _node$attrs4$paramete === void 0 ? void 0 : (_node$attrs4$paramete2 = _node$attrs4$paramete.adf) === null || _node$attrs4$paramete2 === void 0 ? void 0 : _node$attrs4$paramete2.length) !== null && _node$attrs$parameter !== void 0 ? _node$attrs$parameter : 0;
141
+ hasLcm = true;
142
+
143
+ // Early exit: LCM found and condition is enabled - no need to continue counting
144
+ if (includeLcmInThreshold) {
145
+ return false;
146
+ }
113
147
  }
114
148
  });
149
+
150
+ // LCM condition takes precedence (if we early exited traversal, this is why)
151
+ if (includeLcmInThreshold && hasLcm) {
152
+ return true;
153
+ }
154
+
155
+ // Check node count threshold
156
+ if (needNodeCount && nodeCount > nodeCountThreshold) {
157
+ return true;
158
+ }
159
+ return false;
160
+ } else {
161
+ const customDocSize = getCustomDocSize(doc);
115
162
  return customDocSize > LIMITED_MODE_NODE_SIZE_THRESHOLD;
116
163
  }
117
164
  };
@@ -14,7 +14,7 @@ import withAnalyticsEvents from '@atlaskit/analytics-next/withAnalyticsEvents';
14
14
  import { fg } from '@atlaskit/platform-feature-flags';
15
15
  import Layer from '../Layer';
16
16
  const packageName = "@atlaskit/editor-common";
17
- const packageVersion = "0.0.0-development";
17
+ const packageVersion = "111.11.4";
18
18
  const halfFocusRing = 1;
19
19
  const dropOffset = '0, 8';
20
20
  const fadeIn = keyframes({
@@ -56,7 +56,10 @@ export const MenuArrowKeyNavigationProvider = ({
56
56
  }
57
57
  }, [currentSelectedItemIndex, onSelection, incrementIndex, decrementIndex]);
58
58
  useLayoutEffect(() => {
59
- if (disableArrowKeyNavigation) {
59
+ // Backwards compatible behaviour:
60
+ // - `true` disables all key handling (no listeners attached)
61
+ // - a function is evaluated per event inside the handler
62
+ if (disableArrowKeyNavigation === true) {
60
63
  return;
61
64
  }
62
65
 
@@ -66,6 +69,9 @@ export const MenuArrowKeyNavigationProvider = ({
66
69
  */
67
70
  const handleKeyDown = event => {
68
71
  var _wrapperRef$current;
72
+ if (typeof disableArrowKeyNavigation === 'function' && disableArrowKeyNavigation(event)) {
73
+ return;
74
+ }
69
75
  const targetElement = event.target;
70
76
 
71
77
  // Tab key on menu items can be handled in the parent components of dropdown menus with KeydownHandlerContext
@@ -29,6 +29,7 @@ export var TABLE_ACTION = /*#__PURE__*/function (TABLE_ACTION) {
29
29
  TABLE_ACTION["MOVED_COLUMN"] = "movedColumn";
30
30
  TABLE_ACTION["CLONED_ROW"] = "clonedRow";
31
31
  TABLE_ACTION["CLONED_COLUMN"] = "clonedColumn";
32
+ TABLE_ACTION["DRAG_MENU_OPENED"] = "dragMenuOpened";
32
33
  /**
33
34
  * This is a unique action that's used to track legacy table move behaviour flow of insert+copy+paste. Please use
34
35
  * the MOVED_ROW | MOVED_COLUMN actions if you want to track events which move row/cols in a single step.
@@ -10,7 +10,7 @@ import { isFedRamp } from './environment';
10
10
  import { normaliseSentryBreadcrumbs, SERIALIZABLE_ATTRIBUTES } from './normalise-sentry-breadcrumbs';
11
11
  var SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
12
12
  var packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
13
- var packageVersion = "0.0.0-development";
13
+ var packageVersion = "111.11.4";
14
14
  var sanitiseSentryEvents = function sanitiseSentryEvents(data, _hint) {
15
15
  // Remove URL as it has UGC
16
16
  // Ignored via go/ees007
@@ -7,36 +7,23 @@ import { isEmptyDocument } from '../utils';
7
7
  import { DynamicBitArray } from './dynamic-bit-array';
8
8
 
9
9
  /**
10
- * Counts nodes in the document.
11
- *
12
- * Note: legacy-content macros add a damped contribution based on ADF length to avoid
13
- * parsing nested ADF on every check, which is inefficient.
14
- */
15
- var countNodesInDoc = function countNodesInDoc(doc, lcmDampingFactor) {
16
- var nodeCount = 0;
17
- doc.descendants(function (node) {
18
- var _node$attrs;
19
- nodeCount += 1;
20
- if (((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.extensionKey) === 'legacy-content') {
21
- var _node$attrs2;
22
- var adfLength = (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 || (_node$attrs2 = _node$attrs2.parameters) === null || _node$attrs2 === void 0 || (_node$attrs2 = _node$attrs2.adf) === null || _node$attrs2 === void 0 ? void 0 : _node$attrs2.length;
23
- if (typeof adfLength === 'number' && lcmDampingFactor > 0) {
24
- nodeCount += Math.ceil(adfLength / lcmDampingFactor);
25
- }
26
- }
27
- });
28
- return nodeCount;
29
- };
30
-
31
- /**
32
- * Guard against test overrides returning booleans for numeric params.
10
+ * Gets a numeric experiment param, returning undefined if the value is not a valid number.
11
+ * This guards against test overrides returning booleans or strings for numeric params.
33
12
  */
34
- var getNumericExperimentParam = function getNumericExperimentParam(experimentName, paramName, fallbackValue) {
35
- var rawValue = expVal(experimentName, paramName, fallbackValue);
13
+ var getNumericExperimentParam = function getNumericExperimentParam(paramName, fallbackValue) {
14
+ var rawValue = expVal('cc_editor_limited_mode_expanded', paramName, fallbackValue);
36
15
  if (typeof rawValue === 'number') {
37
16
  return rawValue;
38
17
  }
39
- return fallbackValue;
18
+
19
+ // Handle string values from test overrides
20
+ if (typeof rawValue === 'string') {
21
+ var parsed = parseInt(rawValue, 10);
22
+ if (!isNaN(parsed)) {
23
+ return parsed;
24
+ }
25
+ }
26
+ return undefined;
40
27
  };
41
28
  export var NodeAnchorProvider = /*#__PURE__*/function () {
42
29
  function NodeAnchorProvider() {
@@ -113,23 +100,83 @@ export var NodeAnchorProvider = /*#__PURE__*/function () {
113
100
  var nodeIdProviderMap = new WeakMap();
114
101
  var LIMITED_MODE_NODE_SIZE_THRESHOLD = 40000;
115
102
 
116
- // This is duplicate from the limited mode plugin to avoid circular dependency
117
- // We can refactor this later to have a shared util package
103
+ /**
104
+ * Calculates custom document size including LCM ADF lengths (for non-expanded path).
105
+ * This function can be removed when cc_editor_limited_mode_expanded is cleaned up.
106
+ */
107
+ var getCustomDocSize = function getCustomDocSize(doc) {
108
+ var lcmAdfLength = 0;
109
+ doc.descendants(function (node) {
110
+ var _node$attrs;
111
+ if (((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.extensionKey) === 'legacy-content') {
112
+ var _node$attrs$parameter, _node$attrs2;
113
+ lcmAdfLength += (_node$attrs$parameter = (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 || (_node$attrs2 = _node$attrs2.parameters) === null || _node$attrs2 === void 0 || (_node$attrs2 = _node$attrs2.adf) === null || _node$attrs2 === void 0 ? void 0 : _node$attrs2.length) !== null && _node$attrs$parameter !== void 0 ? _node$attrs$parameter : 0;
114
+ }
115
+ });
116
+ return doc.nodeSize + lcmAdfLength;
117
+ };
118
+
119
+ /**
120
+ * Determines whether limited mode should be enabled.
121
+ * This logic mirrors the limited mode plugin implementation, but lives here to avoid a circular dependency.
122
+ * If it changes, update the matching logic in `editor-plugin-limited-mode/src/pm-plugins/main.ts`.
123
+ *
124
+ * Under the expanded gate, limited mode is activated when ANY of the following conditions are met:
125
+ * 1. Document size exceeds `docSizeThreshold` (if defined) - checked first as O(1)
126
+ * 2. Node count exceeds `nodeCountThreshold` (if defined)
127
+ * 3. Document contains a legacy-content macro (LCM) (if `includeLcmInThreshold` is true)
128
+ *
129
+ * Performance optimisations:
130
+ * - Doc size is checked first (O(1)) - if it exceeds threshold, we skip traversal entirely.
131
+ * - If `includeLcmInThreshold` is enabled and we find an LCM, we exit traversal early.
132
+ * - If neither node count nor LCM conditions are configured, we skip traversal entirely.
133
+ */
118
134
  var isLimitedModeEnabled = function isLimitedModeEnabled(editorView) {
135
+ var doc = editorView.state.doc;
119
136
  if (expVal('cc_editor_limited_mode_expanded', 'isEnabled', false)) {
120
- var lcmNodeCountDampingFactor = getNumericExperimentParam('cc_editor_limited_mode_expanded', 'lcmNodeCountDampingFactor', 10);
121
- var nodeCountThreshold = getNumericExperimentParam('cc_editor_limited_mode_expanded', 'nodeCountThreshold', 1000);
122
- var nodeCount = countNodesInDoc(editorView.state.doc, lcmNodeCountDampingFactor);
123
- return nodeCount > nodeCountThreshold;
124
- } else {
125
- var customDocSize = editorView.state.doc.nodeSize;
126
- editorView.state.doc.descendants(function (node) {
137
+ var nodeCountThreshold = getNumericExperimentParam('nodeCountThreshold', 5000);
138
+ var docSizeThreshold = getNumericExperimentParam('docSizeThreshold', 30000);
139
+ var includeLcmInThreshold = Boolean(expVal('cc_editor_limited_mode_expanded', 'includeLcmInThreshold', false));
140
+
141
+ // Early exit: doc size exceeds threshold - O(1), no traversal needed
142
+ if (docSizeThreshold !== undefined && doc.nodeSize > docSizeThreshold) {
143
+ return true;
144
+ }
145
+
146
+ // Early exit: no traversal needed if neither condition is configured
147
+ var needNodeCount = nodeCountThreshold !== undefined;
148
+ if (!needNodeCount && !includeLcmInThreshold) {
149
+ return false;
150
+ }
151
+
152
+ // Single traversal for node count and/or LCM detection
153
+ var nodeCount = 0;
154
+ var hasLcm = false;
155
+ doc.descendants(function (node) {
127
156
  var _node$attrs3;
157
+ nodeCount += 1;
128
158
  if (((_node$attrs3 = node.attrs) === null || _node$attrs3 === void 0 ? void 0 : _node$attrs3.extensionKey) === 'legacy-content') {
129
- var _node$attrs$parameter, _node$attrs4;
130
- customDocSize += (_node$attrs$parameter = (_node$attrs4 = node.attrs) === null || _node$attrs4 === void 0 || (_node$attrs4 = _node$attrs4.parameters) === null || _node$attrs4 === void 0 || (_node$attrs4 = _node$attrs4.adf) === null || _node$attrs4 === void 0 ? void 0 : _node$attrs4.length) !== null && _node$attrs$parameter !== void 0 ? _node$attrs$parameter : 0;
159
+ hasLcm = true;
160
+
161
+ // Early exit: LCM found and condition is enabled - no need to continue counting
162
+ if (includeLcmInThreshold) {
163
+ return false;
164
+ }
131
165
  }
132
166
  });
167
+
168
+ // LCM condition takes precedence (if we early exited traversal, this is why)
169
+ if (includeLcmInThreshold && hasLcm) {
170
+ return true;
171
+ }
172
+
173
+ // Check node count threshold
174
+ if (needNodeCount && nodeCount > nodeCountThreshold) {
175
+ return true;
176
+ }
177
+ return false;
178
+ } else {
179
+ var customDocSize = getCustomDocSize(doc);
133
180
  return customDocSize > LIMITED_MODE_NODE_SIZE_THRESHOLD;
134
181
  }
135
182
  };
@@ -21,7 +21,7 @@ import withAnalyticsEvents from '@atlaskit/analytics-next/withAnalyticsEvents';
21
21
  import { fg } from '@atlaskit/platform-feature-flags';
22
22
  import Layer from '../Layer';
23
23
  var packageName = "@atlaskit/editor-common";
24
- var packageVersion = "0.0.0-development";
24
+ var packageVersion = "111.11.4";
25
25
  var halfFocusRing = 1;
26
26
  var dropOffset = '0, 8';
27
27
  var fadeIn = keyframes({
@@ -65,7 +65,10 @@ export var MenuArrowKeyNavigationProvider = function MenuArrowKeyNavigationProvi
65
65
  }
66
66
  }, [currentSelectedItemIndex, onSelection, incrementIndex, decrementIndex]);
67
67
  useLayoutEffect(function () {
68
- if (disableArrowKeyNavigation) {
68
+ // Backwards compatible behaviour:
69
+ // - `true` disables all key handling (no listeners attached)
70
+ // - a function is evaluated per event inside the handler
71
+ if (disableArrowKeyNavigation === true) {
69
72
  return;
70
73
  }
71
74
 
@@ -75,6 +78,9 @@ export var MenuArrowKeyNavigationProvider = function MenuArrowKeyNavigationProvi
75
78
  */
76
79
  var handleKeyDown = function handleKeyDown(event) {
77
80
  var _wrapperRef$current;
81
+ if (typeof disableArrowKeyNavigation === 'function' && disableArrowKeyNavigation(event)) {
82
+ return;
83
+ }
78
84
  var targetElement = event.target;
79
85
 
80
86
  // Tab key on menu items can be handled in the parent components of dropdown menus with KeydownHandlerContext
@@ -11,6 +11,7 @@ type AIStreamingNoDocChangeAEP = OperationalAEP<ACTION.NO_DOC_CHANGE_FOUND, ACTI
11
11
  command: string;
12
12
  isSameDoc: boolean;
13
13
  isSameDocIgnoreAttrs: boolean;
14
+ traceId: string | undefined;
14
15
  }>;
15
16
  type AIStreamingInvalidCommandAEP = OperationalAEP<ACTION.INVALID_COMMAND_FOUND, ACTION_SUBJECT.AI_STREAMING, ACTION_SUBJECT_ID.EXPERIENCE_APPLICATION, {
16
17
  ancestors?: string[];
@@ -33,6 +33,7 @@ export declare enum TABLE_ACTION {
33
33
  MOVED_COLUMN = "movedColumn",
34
34
  CLONED_ROW = "clonedRow",
35
35
  CLONED_COLUMN = "clonedColumn",
36
+ DRAG_MENU_OPENED = "dragMenuOpened",
36
37
  /**
37
38
  * This is a unique action that's used to track legacy table move behaviour flow of insert+copy+paste. Please use
38
39
  * the MOVED_ROW | MOVED_COLUMN actions if you want to track events which move row/cols in a single step.
@@ -157,6 +158,10 @@ type TableReplaceAEP = TableAEP<TABLE_ACTION.REPLACED, {
157
158
  inputMethod: INPUT_METHOD.KEYBOARD | INPUT_METHOD.CLIPBOARD;
158
159
  } & TotalRowAndColCount, undefined>;
159
160
  type TableAttemptedResizeAEP = UIAEP<TABLE_ACTION.ATTEMPTED_TABLE_WIDTH_CHANGE, ACTION_SUBJECT.TABLE, null, AttemptedResizeInfo, undefined>;
161
+ type TableDragMenuOpenedAEP = TableAEP<TABLE_ACTION.DRAG_MENU_OPENED, {
162
+ direction: 'row' | 'column';
163
+ inputMethod: INPUT_METHOD.KEYBOARD | INPUT_METHOD.MOUSE;
164
+ }, undefined>;
160
165
  type TableCollapsedAEP = TableAEP<TABLE_ACTION.COLLAPSED, TotalRowAndColCount, undefined>;
161
166
  type TableFixedAEP = TableAEP<TABLE_ACTION.FIXED, {
162
167
  reason: string;
@@ -235,5 +240,5 @@ type TableHeightInfoAEP = TableAEP<TABLE_ACTION.TABLE_EDITOR_HEIGHT_INFO, {
235
240
  type TableStickyHeaderEnabledAEP = UIAEP<TABLE_ACTION.STICKY_HEADER_METHOD_TOGGLED, ACTION_SUBJECT.TABLE, ACTION_SUBJECT_ID.TABLE_STICKY_HEADER, {
236
241
  nativeStickyHeaderEnabled: boolean;
237
242
  }, undefined>;
238
- export type TableEventPayload = TableDeleteAEP | TableClearAEP | TableMergeSplitAEP | TableColorAEP | TableToggleHeaderAEP | TableChangeBreakoutAEP | TableCopyAndCutAEP | TableAddRowOrColumnAEP | TableSortColumnAEP | TableDeleteRowOrColumnAEP | TableReplaceAEP | TableAttemptedResizeAEP | TableDistributeColumnsWidthsAEP | TableCollapsedAEP | TableFixedAEP | TableOverflowChangedAEP | TableInitialOverflowCapturedAEP | TableResizedAEP | TableResizePerfSamplingAEP | TableRowOrColumnMovedAEP | TableMovedRowOrColumnAEP | TableClonedRowOrColumnAEP | TableChangedDisplayModeAEP | TableColumnResizedAEP | TableBackgroundColorFixAEP | TableChangedAlignmentAEP | TableWidthInfoAEP | TableHeightInfoAEP | TableStickyHeaderEnabledAEP;
243
+ export type TableEventPayload = TableDeleteAEP | TableClearAEP | TableMergeSplitAEP | TableColorAEP | TableToggleHeaderAEP | TableChangeBreakoutAEP | TableCopyAndCutAEP | TableAddRowOrColumnAEP | TableSortColumnAEP | TableDeleteRowOrColumnAEP | TableReplaceAEP | TableAttemptedResizeAEP | TableDistributeColumnsWidthsAEP | TableCollapsedAEP | TableDragMenuOpenedAEP | TableFixedAEP | TableOverflowChangedAEP | TableInitialOverflowCapturedAEP | TableResizedAEP | TableResizePerfSamplingAEP | TableRowOrColumnMovedAEP | TableMovedRowOrColumnAEP | TableClonedRowOrColumnAEP | TableChangedDisplayModeAEP | TableColumnResizedAEP | TableBackgroundColorFixAEP | TableChangedAlignmentAEP | TableWidthInfoAEP | TableHeightInfoAEP | TableStickyHeaderEnabledAEP;
239
244
  export {};
@@ -19,5 +19,5 @@ interface Props {
19
19
  }
20
20
  declare const MemoizedElementSearchWithAnalytics: React.MemoExoticComponent<React.ForwardRefExoticComponent<Omit<Props & WrappedComponentProps, "intl"> & {
21
21
  forwardedRef?: React.Ref<any>;
22
- } & import("@atlaskit/analytics-next/withAnalyticsContext").WithContextProps & React.RefAttributes<any>>>;
22
+ } & import("@atlaskit/analytics-next").WithContextProps & React.RefAttributes<any>>>;
23
23
  export default MemoizedElementSearchWithAnalytics;
@@ -15,5 +15,5 @@ export type DropdownProps = {
15
15
  onOpenLinkClick?: (event: MouseEvent<HTMLAnchorElement>) => void;
16
16
  testId: string;
17
17
  };
18
- declare const _default: import("react").ForwardRefExoticComponent<DropdownProps & import("@atlaskit/analytics-next/withAnalyticsContext").WithContextProps & import("react").RefAttributes<any>>;
18
+ declare const _default: import("react").ForwardRefExoticComponent<DropdownProps & import("@atlaskit/analytics-next").WithContextProps & import("react").RefAttributes<any>>;
19
19
  export default _default;
@@ -18,4 +18,4 @@ export interface OverlayButtonProps {
18
18
  targetElementPos?: number;
19
19
  testId?: string;
20
20
  }
21
- export declare const OverlayButton: import("react").ForwardRefExoticComponent<OverlayButtonProps & import("@atlaskit/analytics-next/withAnalyticsContext").WithContextProps & import("react").RefAttributes<any>>;
21
+ export declare const OverlayButton: import("react").ForwardRefExoticComponent<OverlayButtonProps & import("@atlaskit/analytics-next").WithContextProps & import("react").RefAttributes<any>>;
@@ -1,2 +1,2 @@
1
1
  import { type ThemeState } from '@atlaskit/tokens';
2
- export declare const headingsSharedStyles: (_typographyTheme?: ThemeState["typography"]) => import("@emotion/react").SerializedStyles;
2
+ export declare const headingsSharedStyles: (_typographyTheme?: ThemeState["typography"]) => import("@emotion/utils").SerializedStyles;
@@ -1,4 +1,4 @@
1
1
  declare const richMediaClassName = "rich-media-item";
2
- declare const mediaSingleSharedStyle: import("@emotion/react").SerializedStyles;
3
- declare const mediaSingleSharedStyleNew: import("@emotion/react").SerializedStyles;
2
+ declare const mediaSingleSharedStyle: import("@emotion/utils").SerializedStyles;
3
+ declare const mediaSingleSharedStyleNew: import("@emotion/utils").SerializedStyles;
4
4
  export { mediaSingleSharedStyle, mediaSingleSharedStyleNew, richMediaClassName };
@@ -1,4 +1,4 @@
1
1
  export declare const ANCHOR_VARIABLE_NAME = "--ed-pm-node-anchor";
2
2
  export declare const isCSSAttrAnchorSupported: import("memoize-one").MemoizedFn<() => boolean>;
3
3
  export declare const isCSSAnchorSupported: import("memoize-one").MemoizedFn<() => boolean | undefined>;
4
- export declare const nativeAnchorStyles: import("@emotion/react").SerializedStyles;
4
+ export declare const nativeAnchorStyles: import("@emotion/utils").SerializedStyles;
@@ -35,6 +35,6 @@ export declare const TableSharedCssClassName: {
35
35
  readonly TABLE_COLUMN_CONTROLS_DECORATIONS: "pm-table-column-controls-decoration";
36
36
  readonly TABLE_RESIZER_CONTAINER: "pm-table-resizer-container";
37
37
  };
38
- declare const tableSharedStyle: () => import("@emotion/react").SerializedStyles;
38
+ declare const tableSharedStyle: () => import("@emotion/utils").SerializedStyles;
39
39
  export declare const calcTableWidth: (layout: TableLayout, containerWidth?: number, addControllerPadding?: boolean) => number | "inherit";
40
40
  export { tableSharedStyle };
@@ -1 +1 @@
1
- export declare const tableCellBackgroundStyleOverride: () => import("@emotion/react").SerializedStyles;
1
+ export declare const tableCellBackgroundStyleOverride: () => import("@emotion/utils").SerializedStyles;
@@ -1,5 +1,6 @@
1
+ import React from 'react';
1
2
  interface WrapProps {
2
3
  children: JSX.Element;
3
4
  }
4
- export default function IntlProviderIfMissingWrapper({ children }: WrapProps): JSX.Element;
5
+ export default function IntlProviderIfMissingWrapper({ children }: WrapProps): React.JSX.Element;
5
6
  export {};
@@ -90,13 +90,13 @@ export interface MediaSingleWrapperProps {
90
90
  * @param root0.isInRenderer
91
91
  * @example
92
92
  */
93
- export declare const MediaSingleDimensionHelper: ({ containerWidth, fullWidthMode, isResized, layout, mediaSingleWidth, width, isExtendedResizeExperienceOn, isNestedNode, isInsideOfInlineExtension, isInRenderer, }: MediaSingleWrapperProps) => import("@emotion/react").SerializedStyles;
93
+ export declare const MediaSingleDimensionHelper: ({ containerWidth, fullWidthMode, isResized, layout, mediaSingleWidth, width, isExtendedResizeExperienceOn, isNestedNode, isInsideOfInlineExtension, isInRenderer, }: MediaSingleWrapperProps) => import("@emotion/utils").SerializedStyles;
94
94
  export interface MediaWrapperProps {
95
95
  hasFallbackContainer?: boolean;
96
96
  height?: number;
97
97
  paddingBottom?: string;
98
98
  }
99
- export declare const mediaWrapperStyle: (props: MediaWrapperProps) => import("@emotion/react").SerializedStyles;
99
+ export declare const mediaWrapperStyle: (props: MediaWrapperProps) => import("@emotion/utils").SerializedStyles;
100
100
  export declare const MediaWrapper: {
101
101
  ({ children, ...rest }: React.HTMLAttributes<HTMLDivElement> & MediaWrapperProps): jsx.JSX.Element;
102
102
  displayName: string;
@@ -1,2 +1,2 @@
1
1
  import { type MediaSingleWrapperProps as MediaSingleDimensionHelperProps } from '../MediaSingle/styled';
2
- export declare const wrapperStyle: (props: MediaSingleDimensionHelperProps) => import("@emotion/react").SerializedStyles;
2
+ export declare const wrapperStyle: (props: MediaSingleDimensionHelperProps) => import("@emotion/utils").SerializedStyles;
@@ -25,7 +25,13 @@ export type ColorPaletteArrowKeyNavigationProps = ColorPaletteArrowKeyNavigation
25
25
  };
26
26
  export type MenuArrowKeyNavigationOptions = {
27
27
  children?: React.ReactNode;
28
- disableArrowKeyNavigation?: boolean;
28
+ /**
29
+ * Disable keyboard handling for this provider.
30
+ *
31
+ * - `true`: disables all key handling (backwards compatible with previous behaviour)
32
+ * - `(event) => boolean`: disables handling for specific events (return `true` to bypass handling)
33
+ */
34
+ disableArrowKeyNavigation?: boolean | ((event: KeyboardEvent) => boolean);
29
35
  disableCloseOnArrowClick?: boolean;
30
36
  keyDownHandlerContext?: KeyDownHandlerContext;
31
37
  type: ArrowKeyNavigationType.MENU;
@@ -60,5 +60,5 @@ declare const ToolbarButton: React.ForwardRefExoticComponent<{
60
60
  testId?: string;
61
61
  title?: React.ReactNode;
62
62
  titlePosition?: PositionType;
63
- } & Pick<ButtonProps, "onBlur" | "onFocus" | "children" | "rel" | "aria-controls" | "aria-label" | "onMouseEnter" | "onMouseLeave"> & React.RefAttributes<HTMLElement>>;
63
+ } & Pick<ButtonProps, "children" | "rel" | "aria-controls" | "aria-label" | "onFocus" | "onBlur" | "onMouseEnter" | "onMouseLeave"> & React.RefAttributes<HTMLElement>>;
64
64
  export default ToolbarButton;
@@ -11,6 +11,7 @@ type AIStreamingNoDocChangeAEP = OperationalAEP<ACTION.NO_DOC_CHANGE_FOUND, ACTI
11
11
  command: string;
12
12
  isSameDoc: boolean;
13
13
  isSameDocIgnoreAttrs: boolean;
14
+ traceId: string | undefined;
14
15
  }>;
15
16
  type AIStreamingInvalidCommandAEP = OperationalAEP<ACTION.INVALID_COMMAND_FOUND, ACTION_SUBJECT.AI_STREAMING, ACTION_SUBJECT_ID.EXPERIENCE_APPLICATION, {
16
17
  ancestors?: string[];
@@ -33,6 +33,7 @@ export declare enum TABLE_ACTION {
33
33
  MOVED_COLUMN = "movedColumn",
34
34
  CLONED_ROW = "clonedRow",
35
35
  CLONED_COLUMN = "clonedColumn",
36
+ DRAG_MENU_OPENED = "dragMenuOpened",
36
37
  /**
37
38
  * This is a unique action that's used to track legacy table move behaviour flow of insert+copy+paste. Please use
38
39
  * the MOVED_ROW | MOVED_COLUMN actions if you want to track events which move row/cols in a single step.
@@ -157,6 +158,10 @@ type TableReplaceAEP = TableAEP<TABLE_ACTION.REPLACED, {
157
158
  inputMethod: INPUT_METHOD.KEYBOARD | INPUT_METHOD.CLIPBOARD;
158
159
  } & TotalRowAndColCount, undefined>;
159
160
  type TableAttemptedResizeAEP = UIAEP<TABLE_ACTION.ATTEMPTED_TABLE_WIDTH_CHANGE, ACTION_SUBJECT.TABLE, null, AttemptedResizeInfo, undefined>;
161
+ type TableDragMenuOpenedAEP = TableAEP<TABLE_ACTION.DRAG_MENU_OPENED, {
162
+ direction: 'row' | 'column';
163
+ inputMethod: INPUT_METHOD.KEYBOARD | INPUT_METHOD.MOUSE;
164
+ }, undefined>;
160
165
  type TableCollapsedAEP = TableAEP<TABLE_ACTION.COLLAPSED, TotalRowAndColCount, undefined>;
161
166
  type TableFixedAEP = TableAEP<TABLE_ACTION.FIXED, {
162
167
  reason: string;
@@ -235,5 +240,5 @@ type TableHeightInfoAEP = TableAEP<TABLE_ACTION.TABLE_EDITOR_HEIGHT_INFO, {
235
240
  type TableStickyHeaderEnabledAEP = UIAEP<TABLE_ACTION.STICKY_HEADER_METHOD_TOGGLED, ACTION_SUBJECT.TABLE, ACTION_SUBJECT_ID.TABLE_STICKY_HEADER, {
236
241
  nativeStickyHeaderEnabled: boolean;
237
242
  }, undefined>;
238
- export type TableEventPayload = TableDeleteAEP | TableClearAEP | TableMergeSplitAEP | TableColorAEP | TableToggleHeaderAEP | TableChangeBreakoutAEP | TableCopyAndCutAEP | TableAddRowOrColumnAEP | TableSortColumnAEP | TableDeleteRowOrColumnAEP | TableReplaceAEP | TableAttemptedResizeAEP | TableDistributeColumnsWidthsAEP | TableCollapsedAEP | TableFixedAEP | TableOverflowChangedAEP | TableInitialOverflowCapturedAEP | TableResizedAEP | TableResizePerfSamplingAEP | TableRowOrColumnMovedAEP | TableMovedRowOrColumnAEP | TableClonedRowOrColumnAEP | TableChangedDisplayModeAEP | TableColumnResizedAEP | TableBackgroundColorFixAEP | TableChangedAlignmentAEP | TableWidthInfoAEP | TableHeightInfoAEP | TableStickyHeaderEnabledAEP;
243
+ export type TableEventPayload = TableDeleteAEP | TableClearAEP | TableMergeSplitAEP | TableColorAEP | TableToggleHeaderAEP | TableChangeBreakoutAEP | TableCopyAndCutAEP | TableAddRowOrColumnAEP | TableSortColumnAEP | TableDeleteRowOrColumnAEP | TableReplaceAEP | TableAttemptedResizeAEP | TableDistributeColumnsWidthsAEP | TableCollapsedAEP | TableDragMenuOpenedAEP | TableFixedAEP | TableOverflowChangedAEP | TableInitialOverflowCapturedAEP | TableResizedAEP | TableResizePerfSamplingAEP | TableRowOrColumnMovedAEP | TableMovedRowOrColumnAEP | TableClonedRowOrColumnAEP | TableChangedDisplayModeAEP | TableColumnResizedAEP | TableBackgroundColorFixAEP | TableChangedAlignmentAEP | TableWidthInfoAEP | TableHeightInfoAEP | TableStickyHeaderEnabledAEP;
239
244
  export {};
@@ -19,5 +19,5 @@ interface Props {
19
19
  }
20
20
  declare const MemoizedElementSearchWithAnalytics: React.MemoExoticComponent<React.ForwardRefExoticComponent<Omit<Props & WrappedComponentProps, "intl"> & {
21
21
  forwardedRef?: React.Ref<any>;
22
- } & import("@atlaskit/analytics-next/withAnalyticsContext").WithContextProps & React.RefAttributes<any>>>;
22
+ } & import("@atlaskit/analytics-next").WithContextProps & React.RefAttributes<any>>>;
23
23
  export default MemoizedElementSearchWithAnalytics;
@@ -15,5 +15,5 @@ export type DropdownProps = {
15
15
  onOpenLinkClick?: (event: MouseEvent<HTMLAnchorElement>) => void;
16
16
  testId: string;
17
17
  };
18
- declare const _default: import("react").ForwardRefExoticComponent<DropdownProps & import("@atlaskit/analytics-next/withAnalyticsContext").WithContextProps & import("react").RefAttributes<any>>;
18
+ declare const _default: import("react").ForwardRefExoticComponent<DropdownProps & import("@atlaskit/analytics-next").WithContextProps & import("react").RefAttributes<any>>;
19
19
  export default _default;
@@ -18,4 +18,4 @@ export interface OverlayButtonProps {
18
18
  targetElementPos?: number;
19
19
  testId?: string;
20
20
  }
21
- export declare const OverlayButton: import("react").ForwardRefExoticComponent<OverlayButtonProps & import("@atlaskit/analytics-next/withAnalyticsContext").WithContextProps & import("react").RefAttributes<any>>;
21
+ export declare const OverlayButton: import("react").ForwardRefExoticComponent<OverlayButtonProps & import("@atlaskit/analytics-next").WithContextProps & import("react").RefAttributes<any>>;
@@ -1,2 +1,2 @@
1
1
  import { type ThemeState } from '@atlaskit/tokens';
2
- export declare const headingsSharedStyles: (_typographyTheme?: ThemeState["typography"]) => import("@emotion/react").SerializedStyles;
2
+ export declare const headingsSharedStyles: (_typographyTheme?: ThemeState["typography"]) => import("@emotion/utils").SerializedStyles;
@@ -1,4 +1,4 @@
1
1
  declare const richMediaClassName = "rich-media-item";
2
- declare const mediaSingleSharedStyle: import("@emotion/react").SerializedStyles;
3
- declare const mediaSingleSharedStyleNew: import("@emotion/react").SerializedStyles;
2
+ declare const mediaSingleSharedStyle: import("@emotion/utils").SerializedStyles;
3
+ declare const mediaSingleSharedStyleNew: import("@emotion/utils").SerializedStyles;
4
4
  export { mediaSingleSharedStyle, mediaSingleSharedStyleNew, richMediaClassName };
@@ -1,4 +1,4 @@
1
1
  export declare const ANCHOR_VARIABLE_NAME = "--ed-pm-node-anchor";
2
2
  export declare const isCSSAttrAnchorSupported: import("memoize-one").MemoizedFn<() => boolean>;
3
3
  export declare const isCSSAnchorSupported: import("memoize-one").MemoizedFn<() => boolean | undefined>;
4
- export declare const nativeAnchorStyles: import("@emotion/react").SerializedStyles;
4
+ export declare const nativeAnchorStyles: import("@emotion/utils").SerializedStyles;
@@ -35,6 +35,6 @@ export declare const TableSharedCssClassName: {
35
35
  readonly TABLE_COLUMN_CONTROLS_DECORATIONS: "pm-table-column-controls-decoration";
36
36
  readonly TABLE_RESIZER_CONTAINER: "pm-table-resizer-container";
37
37
  };
38
- declare const tableSharedStyle: () => import("@emotion/react").SerializedStyles;
38
+ declare const tableSharedStyle: () => import("@emotion/utils").SerializedStyles;
39
39
  export declare const calcTableWidth: (layout: TableLayout, containerWidth?: number, addControllerPadding?: boolean) => number | "inherit";
40
40
  export { tableSharedStyle };
@@ -1 +1 @@
1
- export declare const tableCellBackgroundStyleOverride: () => import("@emotion/react").SerializedStyles;
1
+ export declare const tableCellBackgroundStyleOverride: () => import("@emotion/utils").SerializedStyles;
@@ -1,5 +1,6 @@
1
+ import React from 'react';
1
2
  interface WrapProps {
2
3
  children: JSX.Element;
3
4
  }
4
- export default function IntlProviderIfMissingWrapper({ children }: WrapProps): JSX.Element;
5
+ export default function IntlProviderIfMissingWrapper({ children }: WrapProps): React.JSX.Element;
5
6
  export {};
@@ -90,13 +90,13 @@ export interface MediaSingleWrapperProps {
90
90
  * @param root0.isInRenderer
91
91
  * @example
92
92
  */
93
- export declare const MediaSingleDimensionHelper: ({ containerWidth, fullWidthMode, isResized, layout, mediaSingleWidth, width, isExtendedResizeExperienceOn, isNestedNode, isInsideOfInlineExtension, isInRenderer, }: MediaSingleWrapperProps) => import("@emotion/react").SerializedStyles;
93
+ export declare const MediaSingleDimensionHelper: ({ containerWidth, fullWidthMode, isResized, layout, mediaSingleWidth, width, isExtendedResizeExperienceOn, isNestedNode, isInsideOfInlineExtension, isInRenderer, }: MediaSingleWrapperProps) => import("@emotion/utils").SerializedStyles;
94
94
  export interface MediaWrapperProps {
95
95
  hasFallbackContainer?: boolean;
96
96
  height?: number;
97
97
  paddingBottom?: string;
98
98
  }
99
- export declare const mediaWrapperStyle: (props: MediaWrapperProps) => import("@emotion/react").SerializedStyles;
99
+ export declare const mediaWrapperStyle: (props: MediaWrapperProps) => import("@emotion/utils").SerializedStyles;
100
100
  export declare const MediaWrapper: {
101
101
  ({ children, ...rest }: React.HTMLAttributes<HTMLDivElement> & MediaWrapperProps): jsx.JSX.Element;
102
102
  displayName: string;
@@ -1,2 +1,2 @@
1
1
  import { type MediaSingleWrapperProps as MediaSingleDimensionHelperProps } from '../MediaSingle/styled';
2
- export declare const wrapperStyle: (props: MediaSingleDimensionHelperProps) => import("@emotion/react").SerializedStyles;
2
+ export declare const wrapperStyle: (props: MediaSingleDimensionHelperProps) => import("@emotion/utils").SerializedStyles;
@@ -25,7 +25,13 @@ export type ColorPaletteArrowKeyNavigationProps = ColorPaletteArrowKeyNavigation
25
25
  };
26
26
  export type MenuArrowKeyNavigationOptions = {
27
27
  children?: React.ReactNode;
28
- disableArrowKeyNavigation?: boolean;
28
+ /**
29
+ * Disable keyboard handling for this provider.
30
+ *
31
+ * - `true`: disables all key handling (backwards compatible with previous behaviour)
32
+ * - `(event) => boolean`: disables handling for specific events (return `true` to bypass handling)
33
+ */
34
+ disableArrowKeyNavigation?: boolean | ((event: KeyboardEvent) => boolean);
29
35
  disableCloseOnArrowClick?: boolean;
30
36
  keyDownHandlerContext?: KeyDownHandlerContext;
31
37
  type: ArrowKeyNavigationType.MENU;
@@ -60,5 +60,5 @@ declare const ToolbarButton: React.ForwardRefExoticComponent<{
60
60
  testId?: string;
61
61
  title?: React.ReactNode;
62
62
  titlePosition?: PositionType;
63
- } & Pick<ButtonProps, "onBlur" | "onFocus" | "children" | "rel" | "aria-controls" | "aria-label" | "onMouseEnter" | "onMouseLeave"> & React.RefAttributes<HTMLElement>>;
63
+ } & Pick<ButtonProps, "children" | "rel" | "aria-controls" | "aria-label" | "onFocus" | "onBlur" | "onMouseEnter" | "onMouseLeave"> & React.RefAttributes<HTMLElement>>;
64
64
  export default ToolbarButton;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-common",
3
- "version": "111.11.3",
3
+ "version": "111.11.5",
4
4
  "description": "A package that contains common classes and components for editor and renderer",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -72,7 +72,7 @@
72
72
  "@atlaskit/primitives": "^18.0.0",
73
73
  "@atlaskit/profilecard": "^24.34.0",
74
74
  "@atlaskit/prosemirror-history": "^0.2.0",
75
- "@atlaskit/react-ufo": "^5.0.0",
75
+ "@atlaskit/react-ufo": "^5.1.0",
76
76
  "@atlaskit/section-message": "^8.12.0",
77
77
  "@atlaskit/smart-card": "^43.23.0",
78
78
  "@atlaskit/smart-user-picker": "^8.9.0",
@@ -81,7 +81,7 @@
81
81
  "@atlaskit/task-decision": "^19.2.0",
82
82
  "@atlaskit/textfield": "^8.2.0",
83
83
  "@atlaskit/theme": "^21.0.0",
84
- "@atlaskit/tmp-editor-statsig": "^18.0.0",
84
+ "@atlaskit/tmp-editor-statsig": "^20.0.0",
85
85
  "@atlaskit/tokens": "^11.0.0",
86
86
  "@atlaskit/tooltip": "^20.14.0",
87
87
  "@atlaskit/width-detector": "^5.0.0",
@@ -120,7 +120,7 @@
120
120
  },
121
121
  "devDependencies": {
122
122
  "@atlaskit/media-core": "^37.0.0",
123
- "@atlassian/a11y-jest-testing": "^0.8.0",
123
+ "@atlassian/a11y-jest-testing": "^0.9.0",
124
124
  "@testing-library/dom": "^10.1.0",
125
125
  "@testing-library/jest-dom": "^6.4.5",
126
126
  "@testing-library/react": "^16.3.0",