@atlaskit/editor-plugin-base 2.0.12 → 2.1.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 +20 -0
- package/dist/cjs/basePlugin.js +70 -23
- package/dist/cjs/pm-plugins/frozen-editor.js +1 -4
- package/dist/cjs/pm-plugins/scroll-gutter/plugin.js +22 -239
- package/dist/es2019/basePlugin.js +68 -15
- package/dist/es2019/pm-plugins/frozen-editor.js +1 -4
- package/dist/es2019/pm-plugins/scroll-gutter/plugin.js +19 -224
- package/dist/esm/basePlugin.js +69 -23
- package/dist/esm/pm-plugins/frozen-editor.js +1 -4
- package/dist/esm/pm-plugins/scroll-gutter/plugin.js +21 -238
- package/dist/types/basePlugin.d.ts +3 -1
- package/dist/types/basePluginType.d.ts +11 -0
- package/dist/types/pm-plugins/scroll-gutter/plugin.d.ts +4 -0
- package/dist/types-ts4.5/basePlugin.d.ts +3 -1
- package/dist/types-ts4.5/basePluginType.d.ts +11 -0
- package/dist/types-ts4.5/pm-plugins/scroll-gutter/plugin.d.ts +4 -0
- package/package.json +4 -9
- package/tsconfig.app.json +0 -3
- package/dist/cjs/pm-plugins/scroll-gutter/plugin-next.js +0 -75
- package/dist/es2019/pm-plugins/scroll-gutter/plugin-next.js +0 -65
- package/dist/esm/pm-plugins/scroll-gutter/plugin-next.js +0 -69
- package/dist/types/pm-plugins/scroll-gutter/plugin-next.d.ts +0 -24
- package/dist/types-ts4.5/pm-plugins/scroll-gutter/plugin-next.d.ts +0 -24
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-base
|
|
2
2
|
|
|
3
|
+
## 2.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies
|
|
8
|
+
|
|
9
|
+
## 2.1.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#97984](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/97984)
|
|
14
|
+
[`8ffeab9aaf1ab`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/8ffeab9aaf1ab) -
|
|
15
|
+
[ux] [ED-23573] Added new actions (resolveMarks and registerMarks) to basePlugin. Callbacks added
|
|
16
|
+
to mentions, card, emoji and base plugins to handle conversion to inline code. Deprecated code
|
|
17
|
+
removed from editor-common.
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- Updated dependencies
|
|
22
|
+
|
|
3
23
|
## 2.0.12
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/dist/cjs/basePlugin.js
CHANGED
|
@@ -5,12 +5,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
|
+
exports.resolveCallbacks = resolveCallbacks;
|
|
8
9
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
10
|
var _adfSchema = require("@atlaskit/adf-schema");
|
|
10
11
|
var _keymaps = require("@atlaskit/editor-common/keymaps");
|
|
11
12
|
var _commands = require("@atlaskit/editor-prosemirror/commands");
|
|
12
13
|
var _history = require("@atlaskit/editor-prosemirror/history");
|
|
13
|
-
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
14
14
|
var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
|
|
15
15
|
var _setKeyboardHeight = require("./editor-commands/set-keyboard-height");
|
|
16
16
|
var _disableSpellChecking = _interopRequireDefault(require("./pm-plugins/disable-spell-checking"));
|
|
@@ -20,16 +20,66 @@ var _inlineCursorTarget = _interopRequireDefault(require("./pm-plugins/inline-cu
|
|
|
20
20
|
var _lazyNodeViewDecoration = require("./pm-plugins/lazy-node-view-decoration");
|
|
21
21
|
var _newlinePreserveMarks = _interopRequireDefault(require("./pm-plugins/newline-preserve-marks"));
|
|
22
22
|
var _plugin = _interopRequireDefault(require("./pm-plugins/scroll-gutter/plugin"));
|
|
23
|
-
var _pluginNext = _interopRequireDefault(require("./pm-plugins/scroll-gutter/plugin-next"));
|
|
24
23
|
var _getKeyboardHeight = require("./pm-plugins/scroll-gutter/util/get-keyboard-height");
|
|
25
24
|
var _inputTrackingConfig = require("./pm-plugins/utils/inputTrackingConfig");
|
|
26
25
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
27
26
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
27
|
+
function resolveCallbacks(from, to, tr, callbacks) {
|
|
28
|
+
var doc = tr.doc;
|
|
29
|
+
doc.nodesBetween(from, to, function (node, pos) {
|
|
30
|
+
callbacks.forEach(function (cb) {
|
|
31
|
+
return cb({
|
|
32
|
+
tr: tr,
|
|
33
|
+
node: node,
|
|
34
|
+
pos: pos,
|
|
35
|
+
from: from,
|
|
36
|
+
to: to
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
var SMART_TO_ASCII = {
|
|
42
|
+
'…': '...',
|
|
43
|
+
'→': '->',
|
|
44
|
+
'←': '<-',
|
|
45
|
+
'–': '--',
|
|
46
|
+
'“': '"',
|
|
47
|
+
'”': '"',
|
|
48
|
+
'‘': "'",
|
|
49
|
+
'’': "'"
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// eslint-disable-next-line require-unicode-regexp
|
|
53
|
+
var FIND_SMART_CHAR = new RegExp("[".concat(Object.keys(SMART_TO_ASCII).join(''), "]"), 'g');
|
|
28
54
|
var basePlugin = function basePlugin(_ref) {
|
|
29
|
-
var _api$featureFlags;
|
|
55
|
+
var _api$featureFlags, _api$base;
|
|
30
56
|
var options = _ref.config,
|
|
31
57
|
api = _ref.api;
|
|
32
58
|
var featureFlags = (api === null || api === void 0 || (_api$featureFlags = api.featureFlags) === null || _api$featureFlags === void 0 ? void 0 : _api$featureFlags.sharedState.currentState()) || {};
|
|
59
|
+
var callbacks = [];
|
|
60
|
+
api === null || api === void 0 || (_api$base = api.base) === null || _api$base === void 0 || _api$base.actions.registerMarks(function (_ref2) {
|
|
61
|
+
var tr = _ref2.tr,
|
|
62
|
+
node = _ref2.node,
|
|
63
|
+
pos = _ref2.pos,
|
|
64
|
+
from = _ref2.from,
|
|
65
|
+
to = _ref2.to;
|
|
66
|
+
var doc = tr.doc;
|
|
67
|
+
var schema = doc.type.schema;
|
|
68
|
+
var textNodeType = schema.nodes.text;
|
|
69
|
+
if (node.type === textNodeType && node.text) {
|
|
70
|
+
// Find a valid start and end position because the text may be partially selected.
|
|
71
|
+
var startPositionInSelection = Math.max(pos, from);
|
|
72
|
+
var endPositionInSelection = Math.min(pos + node.nodeSize, to);
|
|
73
|
+
var textForReplacing = doc.textBetween(startPositionInSelection, endPositionInSelection);
|
|
74
|
+
var newText = textForReplacing.replace(FIND_SMART_CHAR, function (match) {
|
|
75
|
+
var _SMART_TO_ASCII$match;
|
|
76
|
+
return (_SMART_TO_ASCII$match = SMART_TO_ASCII[match]) !== null && _SMART_TO_ASCII$match !== void 0 ? _SMART_TO_ASCII$match : match;
|
|
77
|
+
});
|
|
78
|
+
var currentStartPos = tr.mapping.map(startPositionInSelection);
|
|
79
|
+
var currentEndPos = tr.mapping.map(endPositionInSelection);
|
|
80
|
+
tr.replaceWith(currentStartPos, currentEndPos, schema.text(newText, node.marks));
|
|
81
|
+
}
|
|
82
|
+
});
|
|
33
83
|
return {
|
|
34
84
|
name: 'base',
|
|
35
85
|
getSharedState: function getSharedState(editorState) {
|
|
@@ -38,13 +88,19 @@ var basePlugin = function basePlugin(_ref) {
|
|
|
38
88
|
};
|
|
39
89
|
},
|
|
40
90
|
actions: {
|
|
41
|
-
setKeyboardHeight: _setKeyboardHeight.setKeyboardHeight
|
|
91
|
+
setKeyboardHeight: _setKeyboardHeight.setKeyboardHeight,
|
|
92
|
+
resolveMarks: function resolveMarks(from, to, tr) {
|
|
93
|
+
return resolveCallbacks(from, to, tr, callbacks);
|
|
94
|
+
},
|
|
95
|
+
registerMarks: function registerMarks(callback) {
|
|
96
|
+
callbacks.push(callback);
|
|
97
|
+
}
|
|
42
98
|
},
|
|
43
99
|
pmPlugins: function pmPlugins() {
|
|
44
100
|
var plugins = [{
|
|
45
101
|
name: 'filterStepsPlugin',
|
|
46
|
-
plugin: function plugin(
|
|
47
|
-
var dispatchAnalyticsEvent =
|
|
102
|
+
plugin: function plugin(_ref3) {
|
|
103
|
+
var dispatchAnalyticsEvent = _ref3.dispatchAnalyticsEvent;
|
|
48
104
|
return (0, _filterSteps.default)(dispatchAnalyticsEvent);
|
|
49
105
|
}
|
|
50
106
|
}];
|
|
@@ -81,8 +137,8 @@ var basePlugin = function basePlugin(_ref) {
|
|
|
81
137
|
plugin: _newlinePreserveMarks.default
|
|
82
138
|
}, {
|
|
83
139
|
name: 'frozenEditor',
|
|
84
|
-
plugin: function plugin(
|
|
85
|
-
var dispatchAnalyticsEvent =
|
|
140
|
+
plugin: function plugin(_ref4) {
|
|
141
|
+
var dispatchAnalyticsEvent = _ref4.dispatchAnalyticsEvent;
|
|
86
142
|
return (0, _frozenEditor.default)(api === null || api === void 0 ? void 0 : api.contextIdentifier)(dispatchAnalyticsEvent, _inputTrackingConfig.inputTracking, undefined);
|
|
87
143
|
}
|
|
88
144
|
}, {
|
|
@@ -106,21 +162,12 @@ var basePlugin = function basePlugin(_ref) {
|
|
|
106
162
|
}
|
|
107
163
|
});
|
|
108
164
|
if (options && options.allowScrollGutter) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
});
|
|
116
|
-
} else {
|
|
117
|
-
plugins.push({
|
|
118
|
-
name: 'scrollGutterPlugin',
|
|
119
|
-
plugin: function plugin() {
|
|
120
|
-
return (0, _plugin.default)(options.allowScrollGutter);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
}
|
|
165
|
+
plugins.push({
|
|
166
|
+
name: 'scrollGutterPlugin',
|
|
167
|
+
plugin: function plugin() {
|
|
168
|
+
return (0, _plugin.default)(options.allowScrollGutter);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
124
171
|
}
|
|
125
172
|
plugins.push({
|
|
126
173
|
name: 'disableSpellcheckingPlugin',
|
|
@@ -26,10 +26,7 @@ var DEFAULT_TRACK_SEVERITY_ENABLED = false;
|
|
|
26
26
|
var DEFAULT_TRACK_SEVERITY_THRESHOLD_NORMAL = exports.DEFAULT_TRACK_SEVERITY_THRESHOLD_NORMAL = 100;
|
|
27
27
|
var DEFAULT_TRACK_SEVERITY_THRESHOLD_DEGRADED = exports.DEFAULT_TRACK_SEVERITY_THRESHOLD_DEGRADED = 500;
|
|
28
28
|
var dispatchLongTaskEvent = function dispatchLongTaskEvent(contextIdentifierPlugin) {
|
|
29
|
-
return function (dispatchAnalyticsEvent, view, time, getNodeCount, interactionType, severity
|
|
30
|
-
// Ignored via go/ees005
|
|
31
|
-
// eslint-disable-next-line @typescript-eslint/max-params
|
|
32
|
-
) {
|
|
29
|
+
return function (dispatchAnalyticsEvent, view, time, getNodeCount, interactionType, severity) {
|
|
33
30
|
var _contextIdentifierPlu;
|
|
34
31
|
var state = view.state;
|
|
35
32
|
var nodesCount = getNodeCount(state);
|
|
@@ -5,162 +5,33 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
|
|
8
|
-
var _utils = require("@atlaskit/editor-common/utils");
|
|
9
8
|
var _pluginKey = require("./plugin-key");
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
13
|
-
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
14
|
-
var MIN_TAP_SIZE_IN_PX = 40;
|
|
15
|
-
function supportsIntersectionObserver() {
|
|
16
|
-
if (typeof window !== 'undefined' && 'IntersectionObserver' in window && 'IntersectionObserverEntry' in window && 'intersectionRatio' in
|
|
17
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
-
window.IntersectionObserverEntry.prototype) {
|
|
19
|
-
return true;
|
|
20
|
-
}
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
function listenForGutterVisibilityChanges(scrollElement, gutterIsVisible) {
|
|
24
|
-
if (supportsIntersectionObserver()) {
|
|
25
|
-
var observer = new IntersectionObserver(function (entries, _) {
|
|
26
|
-
entries.forEach(function (entry) {
|
|
27
|
-
gutterIsVisible(entry.intersectionRatio > 0);
|
|
28
|
-
});
|
|
29
|
-
}, {
|
|
30
|
-
root: scrollElement,
|
|
31
|
-
rootMargin: '0px',
|
|
32
|
-
threshold: 0
|
|
33
|
-
});
|
|
34
|
-
return observer;
|
|
35
|
-
}
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
9
|
+
var GUTTER_SIZE_IN_PX = 120;
|
|
10
|
+
var GUTTER_SELECTOR_NAME = 'editor-scroll-gutter';
|
|
38
11
|
|
|
39
12
|
/**
|
|
40
13
|
* Create a gutter element that can be added or removed from the DOM.
|
|
41
14
|
*/
|
|
42
|
-
function createGutter(gutterSize) {
|
|
15
|
+
function createGutter(gutterSize, parent) {
|
|
43
16
|
var gutter = document.createElement('div');
|
|
44
17
|
gutter.style.paddingBottom = "".concat(gutterSize, "px");
|
|
45
|
-
gutter.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
var observer;
|
|
50
|
-
var isVisible = false;
|
|
51
|
-
return {
|
|
52
|
-
addGutter: function addGutter(parent) {
|
|
53
|
-
if (parent) {
|
|
54
|
-
var _parent$deref;
|
|
55
|
-
currentParent = parent;
|
|
56
|
-
(_parent$deref = parent.deref()) === null || _parent$deref === void 0 || _parent$deref.appendChild(gutter);
|
|
57
|
-
mounted = true;
|
|
58
|
-
if (observer) {
|
|
59
|
-
observer.observe(gutter);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
removeGutter: function removeGutter() {
|
|
64
|
-
var _currentParent;
|
|
65
|
-
var parentRef = (_currentParent = currentParent) === null || _currentParent === void 0 ? void 0 : _currentParent.deref();
|
|
66
|
-
if (parentRef && mounted) {
|
|
67
|
-
mounted = false;
|
|
68
|
-
parentRef.removeChild(gutter);
|
|
69
|
-
if (observer) {
|
|
70
|
-
observer.unobserve(gutter);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
element: function element() {
|
|
75
|
-
return gutter;
|
|
76
|
-
},
|
|
77
|
-
isMounted: function isMounted() {
|
|
78
|
-
return mounted;
|
|
79
|
-
},
|
|
80
|
-
visible: function visible() {
|
|
81
|
-
// If we know whether it's visible we can avoid expensive calculations
|
|
82
|
-
if (observer) {
|
|
83
|
-
return isVisible;
|
|
84
|
-
}
|
|
85
|
-
// Fallback for legacy browsers assumes it's visible (if mounted)
|
|
86
|
-
return mounted;
|
|
87
|
-
},
|
|
88
|
-
observe: function observe(scrollElement) {
|
|
89
|
-
if (!initialized) {
|
|
90
|
-
initialized = true;
|
|
91
|
-
observer = listenForGutterVisibilityChanges(scrollElement, function (visible) {
|
|
92
|
-
return isVisible = visible;
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
},
|
|
96
|
-
destroy: function destroy() {
|
|
97
|
-
if (observer) {
|
|
98
|
-
observer.disconnect();
|
|
99
|
-
}
|
|
100
|
-
observer = undefined;
|
|
101
|
-
this.removeGutter();
|
|
102
|
-
initialized = mounted = false;
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Get caret top position given the current selection,
|
|
109
|
-
* use start container position as fallback
|
|
110
|
-
*/
|
|
111
|
-
function getCaretTopPosition() {
|
|
112
|
-
var windowSelection = window.getSelection();
|
|
113
|
-
if (windowSelection && windowSelection.rangeCount > 0) {
|
|
114
|
-
var range = windowSelection.getRangeAt(0);
|
|
115
|
-
if (range) {
|
|
116
|
-
var clientRects = range.getClientRects();
|
|
117
|
-
// Return client rects
|
|
118
|
-
if (clientRects && clientRects.length > 0) {
|
|
119
|
-
return clientRects[0].top;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Return container top
|
|
123
|
-
// Ignored via go/ees005
|
|
124
|
-
// eslint-disable-next-line @atlaskit/editor/no-as-casting
|
|
125
|
-
var container = range.startContainer;
|
|
126
|
-
if (container && container.getBoundingClientRect) {
|
|
127
|
-
return container.getBoundingClientRect().top;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
function scrollToGutterElement(scrollContainer, gutterElement, gutterSize) {
|
|
134
|
-
var viewportHeight = scrollContainer.offsetHeight;
|
|
135
|
-
var viewportOffsetY = scrollContainer.getBoundingClientRect().top;
|
|
136
|
-
var caretTopPosition = getCaretTopPosition();
|
|
137
|
-
if (!caretTopPosition) {
|
|
138
|
-
return false;
|
|
18
|
+
gutter.setAttribute('data-vc', 'scroll-gutter');
|
|
19
|
+
gutter.id = GUTTER_SELECTOR_NAME;
|
|
20
|
+
if (parent) {
|
|
21
|
+
parent.appendChild(gutter);
|
|
139
22
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Clamp the scroll position to above the scroll gutter element.
|
|
147
|
-
gutterElement.scrollIntoView(false);
|
|
148
|
-
|
|
149
|
-
// Mark scrolling as handled so that other plugin's don't override our position.
|
|
150
|
-
return true;
|
|
23
|
+
return function () {
|
|
24
|
+
return parent === null || parent === void 0 ? void 0 : parent.removeChild(gutter);
|
|
25
|
+
};
|
|
151
26
|
}
|
|
152
27
|
var _default = exports.default = function _default() {
|
|
153
28
|
var pluginOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
154
29
|
var getScrollElement = pluginOptions.getScrollElement,
|
|
155
|
-
allowCustomScrollHandler = pluginOptions.allowCustomScrollHandler,
|
|
156
30
|
_pluginOptions$gutter = pluginOptions.gutterSize,
|
|
157
|
-
gutterSize = _pluginOptions$gutter === void 0 ?
|
|
31
|
+
gutterSize = _pluginOptions$gutter === void 0 ? GUTTER_SIZE_IN_PX : _pluginOptions$gutter;
|
|
158
32
|
if (!getScrollElement) {
|
|
159
33
|
return undefined;
|
|
160
34
|
}
|
|
161
|
-
var gutter = createGutter(gutterSize);
|
|
162
|
-
var scrollElement = null; // | undefined;
|
|
163
|
-
|
|
164
35
|
return new _safePlugin.SafePlugin({
|
|
165
36
|
key: _pluginKey.scrollGutterPluginKey,
|
|
166
37
|
state: {
|
|
@@ -178,113 +49,25 @@ var _default = exports.default = function _default() {
|
|
|
178
49
|
// Determines the distance (in pixels) between the cursor and the end of the visible viewport at which point,
|
|
179
50
|
// when scrolling the cursor into view, scrolling takes place.
|
|
180
51
|
// Defaults to 0: https://prosemirror.net/docs/ref/#view.EditorProps.scrollThreshold
|
|
181
|
-
scrollThreshold: gutterSize
|
|
52
|
+
scrollThreshold: gutterSize,
|
|
182
53
|
// Determines the extra space (in pixels) that is left above or below the cursor when it is scrolled into view.
|
|
183
54
|
// Defaults to 5: https://prosemirror.net/docs/ref/#view.EditorProps.scrollMargin
|
|
184
|
-
scrollMargin: gutterSize
|
|
185
|
-
// Called when the view, after updating its state, tries to scroll the selection into view
|
|
186
|
-
// https://prosemirror.net/docs/ref/#view.EditorProps.handleScrollToSelection
|
|
187
|
-
handleScrollToSelection: function handleScrollToSelection() {
|
|
188
|
-
if (allowCustomScrollHandler === false) {
|
|
189
|
-
return false;
|
|
190
|
-
}
|
|
191
|
-
if (!gutter.isMounted() || !gutter.visible() || !scrollElement) {
|
|
192
|
-
// Avoid scrolling until applicable
|
|
193
|
-
return false;
|
|
194
|
-
}
|
|
195
|
-
return scrollToGutterElement(scrollElement, gutter.element(), gutterSize);
|
|
196
|
-
}
|
|
55
|
+
scrollMargin: gutterSize
|
|
197
56
|
},
|
|
198
57
|
view: function view(_view) {
|
|
58
|
+
var _editorElement;
|
|
199
59
|
// Store references to avoid lookups on successive checks.
|
|
200
|
-
scrollElement = getScrollElement(_view);
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
var
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
var contentElementHeight = 0;
|
|
207
|
-
var addAndObserveGutter = function addAndObserveGutter() {
|
|
208
|
-
if (!gutter.isMounted()) {
|
|
209
|
-
// Ignored via go/ees005
|
|
210
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
211
|
-
gutter.observe(scrollElement);
|
|
212
|
-
gutter.addGutter(editorParentElement ? new WeakRef(editorParentElement) : null);
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
var toggleGutter = function toggleGutter(contentSize, threshold) {
|
|
216
|
-
if (pluginOptions.persistScrollGutter) {
|
|
217
|
-
if (!(0, _utils.isEmptyDocument)(_view.state.doc)) {
|
|
218
|
-
addAndObserveGutter();
|
|
219
|
-
} else {
|
|
220
|
-
gutter.removeGutter();
|
|
221
|
-
}
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// Add or remove the gutter based on whether the content is about to exceed the viewport height.
|
|
226
|
-
// We do this to ensure there is sufficient white space below the last content node in order to
|
|
227
|
-
// see any UI control elements which may sit beneath it.
|
|
228
|
-
if (contentSize >= threshold) {
|
|
229
|
-
addAndObserveGutter();
|
|
230
|
-
} else {
|
|
231
|
-
if (gutter.isMounted()) {
|
|
232
|
-
gutter.removeGutter();
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
};
|
|
236
|
-
var observerCallback = function observerCallback(entries) {
|
|
237
|
-
var _iterator = _createForOfIteratorHelper(entries),
|
|
238
|
-
_step;
|
|
239
|
-
try {
|
|
240
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
241
|
-
var entry = _step.value;
|
|
242
|
-
var elementHeight = Math.round(entry.contentRect.height);
|
|
243
|
-
if (entry.target === scrollElement) {
|
|
244
|
-
var _getKeyboardHeight;
|
|
245
|
-
var keyboardHeight = (_getKeyboardHeight = (0, _getKeyboardHeight2.getKeyboardHeight)(_view === null || _view === void 0 ? void 0 : _view.state)) !== null && _getKeyboardHeight !== void 0 ? _getKeyboardHeight : 0;
|
|
246
|
-
viewportElementHeight = elementHeight - keyboardHeight;
|
|
247
|
-
} else if (entry.target === editorParentElement) {
|
|
248
|
-
contentElementHeight = elementHeight - (gutter.isMounted() ? gutterSize : 0);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
} catch (err) {
|
|
252
|
-
_iterator.e(err);
|
|
253
|
-
} finally {
|
|
254
|
-
_iterator.f();
|
|
255
|
-
}
|
|
256
|
-
toggleGutter(contentElementHeight, viewportElementHeight);
|
|
257
|
-
};
|
|
258
|
-
|
|
259
|
-
// Subscribe to updates of the height of the viewport and content elements
|
|
260
|
-
// We toggle the value when it is set here or when PM updates to ensure we're using
|
|
261
|
-
// the latest.
|
|
262
|
-
var resizeObserver = new ResizeObserver(observerCallback);
|
|
263
|
-
if (scrollElement && editorParentElement) {
|
|
264
|
-
resizeObserver.observe(scrollElement);
|
|
265
|
-
resizeObserver.observe(editorParentElement);
|
|
60
|
+
var scrollElement = getScrollElement(_view);
|
|
61
|
+
var editorElement = _view.dom instanceof HTMLElement ? _view.dom : null;
|
|
62
|
+
var editorParentElement = (_editorElement = editorElement) === null || _editorElement === void 0 ? void 0 : _editorElement.parentElement;
|
|
63
|
+
var cleanup = function cleanup() {};
|
|
64
|
+
if (editorParentElement && scrollElement) {
|
|
65
|
+
cleanup = createGutter(gutterSize, editorParentElement);
|
|
266
66
|
}
|
|
267
67
|
return {
|
|
268
68
|
destroy: function destroy() {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
scrollElement = editorParentElement = editorElement = null;
|
|
272
|
-
resizeObserver.disconnect();
|
|
273
|
-
},
|
|
274
|
-
/**
|
|
275
|
-
* Toggle the Scroll Gutter Element
|
|
276
|
-
*/
|
|
277
|
-
update: function update(view, prevState) {
|
|
278
|
-
if (!scrollElement || !editorParentElement) {
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
var state = view.state;
|
|
282
|
-
if (prevState.selection === state.selection) {
|
|
283
|
-
// No need to recheck if the selected node hasn't changed.
|
|
284
|
-
return;
|
|
285
|
-
}
|
|
286
|
-
var gutterThresholdHeight = viewportElementHeight - gutterSize;
|
|
287
|
-
toggleGutter(contentElementHeight, gutterThresholdHeight);
|
|
69
|
+
cleanup();
|
|
70
|
+
editorParentElement = editorElement = null;
|
|
288
71
|
}
|
|
289
72
|
};
|
|
290
73
|
}
|
|
@@ -2,7 +2,6 @@ import { doc, paragraph, text } from '@atlaskit/adf-schema';
|
|
|
2
2
|
import { keymap } from '@atlaskit/editor-common/keymaps';
|
|
3
3
|
import { baseKeymap } from '@atlaskit/editor-prosemirror/commands';
|
|
4
4
|
import { history } from '@atlaskit/editor-prosemirror/history';
|
|
5
|
-
import { fg } from '@atlaskit/platform-feature-flags';
|
|
6
5
|
import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
|
|
7
6
|
import { setKeyboardHeight } from './editor-commands/set-keyboard-height';
|
|
8
7
|
import disableSpellcheckingPlugin from './pm-plugins/disable-spell-checking';
|
|
@@ -12,15 +11,72 @@ import inlineCursorTargetPlugin from './pm-plugins/inline-cursor-target';
|
|
|
12
11
|
import { createLazyNodeViewDecorationPlugin } from './pm-plugins/lazy-node-view-decoration';
|
|
13
12
|
import newlinePreserveMarksPlugin from './pm-plugins/newline-preserve-marks';
|
|
14
13
|
import scrollGutter from './pm-plugins/scroll-gutter/plugin';
|
|
15
|
-
import scrollGutterNext from './pm-plugins/scroll-gutter/plugin-next';
|
|
16
14
|
import { getKeyboardHeight } from './pm-plugins/scroll-gutter/util/get-keyboard-height';
|
|
17
15
|
import { inputTracking } from './pm-plugins/utils/inputTrackingConfig';
|
|
16
|
+
export function resolveCallbacks(from, to, tr, callbacks) {
|
|
17
|
+
const {
|
|
18
|
+
doc
|
|
19
|
+
} = tr;
|
|
20
|
+
doc.nodesBetween(from, to, (node, pos) => {
|
|
21
|
+
callbacks.forEach(cb => cb({
|
|
22
|
+
tr,
|
|
23
|
+
node,
|
|
24
|
+
pos,
|
|
25
|
+
from,
|
|
26
|
+
to
|
|
27
|
+
}));
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const SMART_TO_ASCII = {
|
|
31
|
+
'…': '...',
|
|
32
|
+
'→': '->',
|
|
33
|
+
'←': '<-',
|
|
34
|
+
'–': '--',
|
|
35
|
+
'“': '"',
|
|
36
|
+
'”': '"',
|
|
37
|
+
'‘': "'",
|
|
38
|
+
'’': "'"
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// eslint-disable-next-line require-unicode-regexp
|
|
42
|
+
const FIND_SMART_CHAR = new RegExp(`[${Object.keys(SMART_TO_ASCII).join('')}]`, 'g');
|
|
18
43
|
const basePlugin = ({
|
|
19
44
|
config: options,
|
|
20
45
|
api
|
|
21
46
|
}) => {
|
|
22
|
-
var _api$featureFlags;
|
|
47
|
+
var _api$featureFlags, _api$base;
|
|
23
48
|
const featureFlags = (api === null || api === void 0 ? void 0 : (_api$featureFlags = api.featureFlags) === null || _api$featureFlags === void 0 ? void 0 : _api$featureFlags.sharedState.currentState()) || {};
|
|
49
|
+
const callbacks = [];
|
|
50
|
+
api === null || api === void 0 ? void 0 : (_api$base = api.base) === null || _api$base === void 0 ? void 0 : _api$base.actions.registerMarks(({
|
|
51
|
+
tr,
|
|
52
|
+
node,
|
|
53
|
+
pos,
|
|
54
|
+
from,
|
|
55
|
+
to
|
|
56
|
+
}) => {
|
|
57
|
+
const {
|
|
58
|
+
doc
|
|
59
|
+
} = tr;
|
|
60
|
+
const {
|
|
61
|
+
schema
|
|
62
|
+
} = doc.type;
|
|
63
|
+
const {
|
|
64
|
+
text: textNodeType
|
|
65
|
+
} = schema.nodes;
|
|
66
|
+
if (node.type === textNodeType && node.text) {
|
|
67
|
+
// Find a valid start and end position because the text may be partially selected.
|
|
68
|
+
const startPositionInSelection = Math.max(pos, from);
|
|
69
|
+
const endPositionInSelection = Math.min(pos + node.nodeSize, to);
|
|
70
|
+
const textForReplacing = doc.textBetween(startPositionInSelection, endPositionInSelection);
|
|
71
|
+
const newText = textForReplacing.replace(FIND_SMART_CHAR, match => {
|
|
72
|
+
var _SMART_TO_ASCII$match;
|
|
73
|
+
return (_SMART_TO_ASCII$match = SMART_TO_ASCII[match]) !== null && _SMART_TO_ASCII$match !== void 0 ? _SMART_TO_ASCII$match : match;
|
|
74
|
+
});
|
|
75
|
+
const currentStartPos = tr.mapping.map(startPositionInSelection);
|
|
76
|
+
const currentEndPos = tr.mapping.map(endPositionInSelection);
|
|
77
|
+
tr.replaceWith(currentStartPos, currentEndPos, schema.text(newText, node.marks));
|
|
78
|
+
}
|
|
79
|
+
});
|
|
24
80
|
return {
|
|
25
81
|
name: 'base',
|
|
26
82
|
getSharedState(editorState) {
|
|
@@ -29,7 +85,11 @@ const basePlugin = ({
|
|
|
29
85
|
};
|
|
30
86
|
},
|
|
31
87
|
actions: {
|
|
32
|
-
setKeyboardHeight
|
|
88
|
+
setKeyboardHeight,
|
|
89
|
+
resolveMarks: (from, to, tr) => resolveCallbacks(from, to, tr, callbacks),
|
|
90
|
+
registerMarks: callback => {
|
|
91
|
+
callbacks.push(callback);
|
|
92
|
+
}
|
|
33
93
|
},
|
|
34
94
|
pmPlugins() {
|
|
35
95
|
const plugins = [{
|
|
@@ -86,17 +146,10 @@ const basePlugin = ({
|
|
|
86
146
|
})
|
|
87
147
|
});
|
|
88
148
|
if (options && options.allowScrollGutter) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
});
|
|
94
|
-
} else {
|
|
95
|
-
plugins.push({
|
|
96
|
-
name: 'scrollGutterPlugin',
|
|
97
|
-
plugin: () => scrollGutter(options.allowScrollGutter)
|
|
98
|
-
});
|
|
99
|
-
}
|
|
149
|
+
plugins.push({
|
|
150
|
+
name: 'scrollGutterPlugin',
|
|
151
|
+
plugin: () => scrollGutter(options.allowScrollGutter)
|
|
152
|
+
});
|
|
100
153
|
}
|
|
101
154
|
plugins.push({
|
|
102
155
|
name: 'disableSpellcheckingPlugin',
|
|
@@ -15,10 +15,7 @@ export const DEGRADED_SEVERITY_THRESHOLD = 3000;
|
|
|
15
15
|
const DEFAULT_TRACK_SEVERITY_ENABLED = false;
|
|
16
16
|
export const DEFAULT_TRACK_SEVERITY_THRESHOLD_NORMAL = 100;
|
|
17
17
|
export const DEFAULT_TRACK_SEVERITY_THRESHOLD_DEGRADED = 500;
|
|
18
|
-
const dispatchLongTaskEvent = contextIdentifierPlugin => (dispatchAnalyticsEvent, view, time, getNodeCount, interactionType, severity
|
|
19
|
-
// Ignored via go/ees005
|
|
20
|
-
// eslint-disable-next-line @typescript-eslint/max-params
|
|
21
|
-
) => {
|
|
18
|
+
const dispatchLongTaskEvent = contextIdentifierPlugin => (dispatchAnalyticsEvent, view, time, getNodeCount, interactionType, severity) => {
|
|
22
19
|
var _contextIdentifierPlu, _contextIdentifierPlu2;
|
|
23
20
|
const {
|
|
24
21
|
state
|