@atlaskit/editor-core 219.4.1 → 219.5.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,37 @@
1
1
  # @atlaskit/editor-core
2
2
 
3
+ ## 219.5.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`8db6f0336d199`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/8db6f0336d199) -
8
+ Cleans up experiment platform_editor_toolbar_two_stage_hydration
9
+ - Updated dependencies
10
+
11
+ ## 219.5.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [`5184c3aa86e89`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/5184c3aa86e89) -
16
+ Pin the primary toolbar to the top while in Markdown Mode source or preview view, where the
17
+ floating toolbar would be useless (no PM selection to anchor to). Behind the new
18
+ `platform_editor_toolbar_mode_override` feature gate.
19
+ - `editor-plugin-toolbar`: adds `commands.setContextualFormattingModeOverride` and a
20
+ `contextualFormattingModeOverride` field on shared state. Any plugin can compose the command
21
+ onto its own transaction to push a runtime override.
22
+ - `editor-plugin-markdown-mode`: pushes the override on `setView` and on initial mount; uses the
23
+ current view to short-circuit `useIsToolbarDockedToTop` so the in-toolbar toggle renders in the
24
+ correct slot.
25
+ - `editor-plugin-selection-toolbar`: `PinButton` hides when the override forces `'always-pinned'`
26
+ (the toggle is meaningless in that state).
27
+ - `editor-core` (`FullPage.tsx`, `FullPageToolbarNext.tsx`): the primary-toolbar mount gate
28
+ consults the runtime override so the toolbar still mounts when the override is
29
+ `'always-pinned'`, even if the user's docking preference is `'none'`.
30
+
31
+ ### Patch Changes
32
+
33
+ - Updated dependencies
34
+
3
35
  ## 219.4.1
4
36
 
5
37
  ### Patch Changes
@@ -80,14 +80,20 @@ var FullPageEditor = exports.FullPageEditor = function FullPageEditor(props) {
80
80
  var scrollContentContainerRef = (0, _react.useRef)(null);
81
81
  var showKeyline = useShowKeyline(scrollContentContainerRef);
82
82
  var editorAPI = props.editorAPI;
83
- var state = (0, _hooks.useSharedPluginStateWithSelector)(editorAPI, ['primaryToolbar', 'interaction', 'editorViewMode'], function (states) {
84
- var _states$primaryToolba, _states$interactionSt, _states$editorViewMod;
83
+ var state = (0, _hooks.useSharedPluginStateWithSelector)(editorAPI, ['primaryToolbar', 'interaction', 'editorViewMode', 'toolbar'], function (states) {
84
+ var _states$primaryToolba, _states$interactionSt, _states$editorViewMod, _states$toolbarState;
85
85
  return {
86
86
  primaryToolbarComponents: (_states$primaryToolba = states.primaryToolbarState) === null || _states$primaryToolba === void 0 ? void 0 : _states$primaryToolba.components,
87
87
  interactionState: (_states$interactionSt = states.interactionState) === null || _states$interactionSt === void 0 ? void 0 : _states$interactionSt.interactionState,
88
- editorViewMode: (_states$editorViewMod = states.editorViewModeState) === null || _states$editorViewMod === void 0 ? void 0 : _states$editorViewMod.mode
88
+ editorViewMode: (_states$editorViewMod = states.editorViewModeState) === null || _states$editorViewMod === void 0 ? void 0 : _states$editorViewMod.mode,
89
+ contextualFormattingModeOverride: (_states$toolbarState = states.toolbarState) === null || _states$toolbarState === void 0 ? void 0 : _states$toolbarState.contextualFormattingModeOverride
89
90
  };
90
91
  });
92
+ // Markdown Mode forces `'always-pinned'` while in source / preview view
93
+ // (no PM selection to anchor a floating toolbar to). The user's docking
94
+ // pref alone is not enough to decide whether to mount the primary toolbar
95
+ // in that case — the override has to short-circuit the hide gate below.
96
+ var forcePrimaryToolbarPinned = state.contextualFormattingModeOverride === 'always-pinned' && (0, _platformFeatureFlags.fg)('platform_editor_toolbar_mode_override');
91
97
  var interactionState = state.interactionState;
92
98
  var primaryToolbarState = (0, _getPrimaryToolbarComponents.getPrimaryToolbarComponents)(editorAPI, state.primaryToolbarComponents);
93
99
  var hasHadInteraction = interactionState !== 'hasNotHadInteraction';
@@ -130,14 +136,14 @@ var FullPageEditor = exports.FullPageEditor = function FullPageEditor(props) {
130
136
  })) {
131
137
  if ((0, _platformFeatureFlags.fg)('platform_editor_use_preferences_plugin')) {
132
138
  // need to check if the toolbarDockingPosition is set to 'none' or 'top'
133
- if (toolbarDockingPosition === 'none') {
139
+ if (toolbarDockingPosition === 'none' && !forcePrimaryToolbarPinned) {
134
140
  primaryToolbarComponents = [];
135
141
  if (!hasCustomComponents(customPrimaryToolbarComponents)) {
136
142
  isEditorToolbarHidden = true;
137
143
  }
138
144
  }
139
145
  } else {
140
- if (toolbarDocking === 'none') {
146
+ if (toolbarDocking === 'none' && !forcePrimaryToolbarPinned) {
141
147
  primaryToolbarComponents = [];
142
148
  if (!hasCustomComponents(customPrimaryToolbarComponents)) {
143
149
  isEditorToolbarHidden = true;
@@ -13,8 +13,10 @@ var _react = _interopRequireWildcard(require("react"));
13
13
  var _reactIntl = require("react-intl");
14
14
  var _contextPanel = require("@atlaskit/editor-common/context-panel");
15
15
  var _coreUtils = require("@atlaskit/editor-common/core-utils");
16
+ var _hooks = require("@atlaskit/editor-common/hooks");
16
17
  var _toolbar = require("@atlaskit/editor-common/toolbar");
17
18
  var _uiMenu = require("@atlaskit/editor-common/ui-menu");
19
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
18
20
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
19
21
  var _toolbar2 = require("../../../utils/toolbar");
20
22
  var _ExcludeFromHydration = _interopRequireDefault(require("../../ExcludeFromHydration"));
@@ -59,17 +61,6 @@ var SecondChildWrapper = function SecondChildWrapper(_ref3) {
59
61
  className: (0, _runtime.ax)([styles.secondChildWrapperOneLine])
60
62
  }, children);
61
63
  };
62
-
63
- /**
64
- * Placeholder component that reserves the toolbar's space during hydration
65
- * to prevent layout shift when the actual toolbar renders.
66
- */
67
- var ToolbarPlaceholder = function ToolbarPlaceholder() {
68
- return /*#__PURE__*/_react.default.createElement("div", {
69
- "data-testid": "ak-editor-main-toolbar-placeholder",
70
- className: (0, _runtime.ax)([styles.toolbarPlaceholder])
71
- });
72
- };
73
64
  var shouldShowToolbarContainer = function shouldShowToolbarContainer(toolbar, customPrimaryToolbarComponents) {
74
65
  return !!toolbar || !!customPrimaryToolbarComponents;
75
66
  };
@@ -84,7 +75,12 @@ var FullPageToolbarNext = exports.FullPageToolbarNext = function FullPageToolbar
84
75
  customPrimaryToolbarComponents = _ref4.customPrimaryToolbarComponents,
85
76
  disabled = _ref4.disabled;
86
77
  var components = editorAPI === null || editorAPI === void 0 || (_editorAPI$toolbar = editorAPI.toolbar) === null || _editorAPI$toolbar === void 0 ? void 0 : _editorAPI$toolbar.actions.getComponents();
87
- var contextualFormattingEnabled = editorAPI === null || editorAPI === void 0 || (_editorAPI$toolbar2 = editorAPI.toolbar) === null || _editorAPI$toolbar2 === void 0 ? void 0 : _editorAPI$toolbar2.actions.contextualFormattingMode();
78
+ var runtimeOverride = (0, _hooks.useSharedPluginStateWithSelector)(editorAPI, ['toolbar'], function (states) {
79
+ var _states$toolbarState;
80
+ return (_states$toolbarState = states.toolbarState) === null || _states$toolbarState === void 0 ? void 0 : _states$toolbarState.contextualFormattingModeOverride;
81
+ });
82
+ var effectiveRuntimeOverride = runtimeOverride !== undefined && (0, _platformFeatureFlags.fg)('platform_editor_toolbar_mode_override') ? runtimeOverride : undefined;
83
+ var contextualFormattingEnabled = effectiveRuntimeOverride !== null && effectiveRuntimeOverride !== void 0 ? effectiveRuntimeOverride : editorAPI === null || editorAPI === void 0 || (_editorAPI$toolbar2 = editorAPI.toolbar) === null || _editorAPI$toolbar2 === void 0 ? void 0 : _editorAPI$toolbar2.actions.contextualFormattingMode();
88
84
  var intl = (0, _reactIntl.useIntl)();
89
85
  var toolbar = components === null || components === void 0 ? void 0 : components.find(function (component) {
90
86
  return component.key === _toolbar.TOOLBARS.PRIMARY_TOOLBAR;
@@ -118,41 +114,9 @@ var FullPageToolbarNext = exports.FullPageToolbarNext = function FullPageToolbar
118
114
  if (!shouldShowToolbarContainer(toolbar, customPrimaryToolbarComponents)) {
119
115
  return /*#__PURE__*/_react.default.createElement(ToolbarPortal, null, null);
120
116
  }
121
- if ((0, _expValEquals.expValEquals)('platform_editor_toolbar_two_stage_hydration', 'isEnabled', true)) {
122
- return /*#__PURE__*/_react.default.createElement(_contextPanel.ContextPanelConsumer, null, function (_ref6) {
123
- var ContextPanelWidth = _ref6.width;
124
- return /*#__PURE__*/_react.default.createElement(_uiMenu.ToolbarArrowKeyNavigationProvider, {
125
- editorView: editorView,
126
- childComponentSelector: "[data-testid='ak-editor-main-toolbar']",
127
- isShortcutToFocusToolbar: isShortcutToFocusToolbar,
128
- handleEscape: handleEscape,
129
- intl: intl
130
- }, /*#__PURE__*/_react.default.createElement(ToolbarPortal, null, /*#__PURE__*/_react.default.createElement(MainToolbarWrapper, {
131
- testId: "ak-editor-main-toolbar",
132
- showKeyline: showKeyline || ContextPanelWidth > 0
133
- }, beforeIcon && /*#__PURE__*/_react.default.createElement("div", {
134
- className: (0, _runtime.ax)([styles.mainToolbarIconBefore, styles.mainToolbarIconBeforeNew])
135
- }, beforeIcon), /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(FirstChildWrapper, null, /*#__PURE__*/_react.default.createElement(_ExcludeFromHydration.default, null, primaryToolbarDockingConfigEnabled && components && (0, _toolbar2.isToolbar)(toolbar) && editorView && !(0, _coreUtils.isSSR)() && /*#__PURE__*/_react.default.createElement(_Toolbar.ToolbarNext, {
136
- toolbar: toolbar,
137
- components: components,
138
- editorView: editorView,
139
- editorAPI: editorAPI,
140
- popupsMountPoint: mountPoint,
141
- editorAppearance: "full-page",
142
- isDisabled: disabled
143
- }))), /*#__PURE__*/_react.default.createElement(SecondChildWrapper, null, /*#__PURE__*/_react.default.createElement("div", {
144
- className: (0, _runtime.ax)([styles.customToolbarWrapperStyle])
145
- }, !!customPrimaryToolbarComponents && 'before' in customPrimaryToolbarComponents && /*#__PURE__*/_react.default.createElement("div", {
146
- "data-testid": 'before-primary-toolbar-components-plugin',
147
- className: (0, _runtime.ax)([styles.beforePrimaryToolbarComponents])
148
- }, customPrimaryToolbarComponents.before), !!customPrimaryToolbarComponents && 'after' in customPrimaryToolbarComponents ? customPrimaryToolbarComponents.after : customPrimaryToolbarComponents)), /*#__PURE__*/_react.default.createElement(_ToolbarPortal.ToolbarPortalMountPoint, null)))));
149
- });
150
- }
151
- return /*#__PURE__*/_react.default.createElement(_contextPanel.ContextPanelConsumer, null, function (_ref7) {
152
- var ContextPanelWidth = _ref7.width;
153
- return /*#__PURE__*/_react.default.createElement(_ExcludeFromHydration.default, {
154
- fallback: /*#__PURE__*/_react.default.createElement(ToolbarPlaceholder, null)
155
- }, /*#__PURE__*/_react.default.createElement(_uiMenu.ToolbarArrowKeyNavigationProvider, {
117
+ return /*#__PURE__*/_react.default.createElement(_contextPanel.ContextPanelConsumer, null, function (_ref6) {
118
+ var ContextPanelWidth = _ref6.width;
119
+ return /*#__PURE__*/_react.default.createElement(_uiMenu.ToolbarArrowKeyNavigationProvider, {
156
120
  editorView: editorView,
157
121
  childComponentSelector: "[data-testid='ak-editor-main-toolbar']",
158
122
  isShortcutToFocusToolbar: isShortcutToFocusToolbar,
@@ -163,7 +127,7 @@ var FullPageToolbarNext = exports.FullPageToolbarNext = function FullPageToolbar
163
127
  showKeyline: showKeyline || ContextPanelWidth > 0
164
128
  }, beforeIcon && /*#__PURE__*/_react.default.createElement("div", {
165
129
  className: (0, _runtime.ax)([styles.mainToolbarIconBefore, styles.mainToolbarIconBeforeNew])
166
- }, beforeIcon), /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(FirstChildWrapper, null, primaryToolbarDockingConfigEnabled && components && (0, _toolbar2.isToolbar)(toolbar) && editorView && !(0, _coreUtils.isSSR)() && /*#__PURE__*/_react.default.createElement(_Toolbar.ToolbarNext, {
130
+ }, beforeIcon), /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(FirstChildWrapper, null, /*#__PURE__*/_react.default.createElement(_ExcludeFromHydration.default, null, primaryToolbarDockingConfigEnabled && components && (0, _toolbar2.isToolbar)(toolbar) && editorView && !(0, _coreUtils.isSSR)() && /*#__PURE__*/_react.default.createElement(_Toolbar.ToolbarNext, {
167
131
  toolbar: toolbar,
168
132
  components: components,
169
133
  editorView: editorView,
@@ -171,11 +135,11 @@ var FullPageToolbarNext = exports.FullPageToolbarNext = function FullPageToolbar
171
135
  popupsMountPoint: mountPoint,
172
136
  editorAppearance: "full-page",
173
137
  isDisabled: disabled
174
- })), /*#__PURE__*/_react.default.createElement(SecondChildWrapper, null, /*#__PURE__*/_react.default.createElement("div", {
138
+ }))), /*#__PURE__*/_react.default.createElement(SecondChildWrapper, null, /*#__PURE__*/_react.default.createElement("div", {
175
139
  className: (0, _runtime.ax)([styles.customToolbarWrapperStyle])
176
140
  }, !!customPrimaryToolbarComponents && 'before' in customPrimaryToolbarComponents && /*#__PURE__*/_react.default.createElement("div", {
177
141
  "data-testid": 'before-primary-toolbar-components-plugin',
178
142
  className: (0, _runtime.ax)([styles.beforePrimaryToolbarComponents])
179
- }, customPrimaryToolbarComponents.before), !!customPrimaryToolbarComponents && 'after' in customPrimaryToolbarComponents ? customPrimaryToolbarComponents.after : customPrimaryToolbarComponents)), /*#__PURE__*/_react.default.createElement(_ToolbarPortal.ToolbarPortalMountPoint, null))))));
143
+ }, customPrimaryToolbarComponents.before), !!customPrimaryToolbarComponents && 'after' in customPrimaryToolbarComponents ? customPrimaryToolbarComponents.after : customPrimaryToolbarComponents)), /*#__PURE__*/_react.default.createElement(_ToolbarPortal.ToolbarPortalMountPoint, null)))));
180
144
  });
181
145
  };