@atlaskit/editor-plugin-code-block 12.1.4 → 12.1.6

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,19 @@
1
1
  # @atlaskit/editor-plugin-code-block
2
2
 
3
+ ## 12.1.6
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+
9
+ ## 12.1.5
10
+
11
+ ### Patch Changes
12
+
13
+ - [`47e7189edb428`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/47e7189edb428) -
14
+ Refresh code block language picker UI
15
+ - Updated dependencies
16
+
3
17
  ## 12.1.4
4
18
 
5
19
  ### Patch Changes
@@ -70,7 +70,7 @@ var changeLanguage = exports.changeLanguage = function changeLanguage(editorAnal
70
70
  action: _analytics.ACTION.LANGUAGE_SELECTED,
71
71
  actionSubject: _analytics.ACTION_SUBJECT.CODE_BLOCK,
72
72
  attributes: {
73
- language: language
73
+ language: language !== null && language !== void 0 ? language : 'none'
74
74
  },
75
75
  eventType: _analytics.EVENT_TYPE.TRACK
76
76
  })(result);
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.languageListFilter = exports.getToolbarConfig = void 0;
9
9
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+ var _react = _interopRequireDefault(require("react"));
11
12
  var _codeBlock = require("@atlaskit/editor-common/code-block");
12
13
  var _messages = _interopRequireWildcard(require("@atlaskit/editor-common/messages"));
13
14
  var _toolbarFlagCheck = require("@atlaskit/editor-common/toolbar-flag-check");
@@ -20,6 +21,8 @@ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
20
21
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
21
22
  var _editorCommands = require("../editor-commands");
22
23
  var _WrapIcon = require("../ui/icons/WrapIcon");
24
+ var _languagePickerOptions = require("../ui/language-picker-options");
25
+ var _LanguagePicker = require("../ui/LanguagePicker");
23
26
  var _codeBlockCopySelectionPlugin = require("./codeBlockCopySelectionPlugin");
24
27
  var _languageList = require("./language-list");
25
28
  var _pluginKey = require("./plugin-key");
@@ -81,6 +84,34 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig() {
81
84
  options: options,
82
85
  filterOption: languageListFilter
83
86
  };
87
+ var languagePicker;
88
+ if ((0, _expValEquals.expValEquals)('platform_editor_code_block_q4_lovability', 'isEnabled', true) && (0, _platformFeatureFlags.fg)('platform_editor_code_block_add_line_number_button')) {
89
+ var languagePickerOptions = options;
90
+ var groupedOptions = (0, _languagePickerOptions.createGroupedLanguageOptions)({
91
+ formatMessage: formatMessage,
92
+ languages: languagePickerOptions
93
+ });
94
+ var defaultPickerValue = language ? languagePickerOptions.find(function (option) {
95
+ return language === _languagePickerOptions.NONE_LANGUAGE_VALUE ? option.value === _languagePickerOptions.PLAIN_TEXT_LANGUAGE_VALUE : option.value === language || option.alias.includes(language);
96
+ }) : undefined;
97
+ languagePicker = {
98
+ type: 'custom',
99
+ fallback: [],
100
+ render: function render(view) {
101
+ if (!view) {
102
+ return null;
103
+ }
104
+ return /*#__PURE__*/_react.default.createElement(_LanguagePicker.LanguagePicker, {
105
+ api: api,
106
+ defaultValue: defaultPickerValue,
107
+ editorView: view,
108
+ filterOption: languageListFilter,
109
+ formatMessage: formatMessage,
110
+ options: groupedOptions
111
+ });
112
+ }
113
+ };
114
+ }
84
115
  var separator = {
85
116
  type: 'separator'
86
117
  };
@@ -188,7 +219,7 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig() {
188
219
  return (0, _utils.findDomRefAtPos)(pos, view.domAtPos.bind(view));
189
220
  },
190
221
  nodeType: nodeType,
191
- items: [languageSelect].concat((0, _toConsumableArray2.default)(areAnyNewToolbarFlagsEnabled ? [] : [separator]), [codeBlockWrapButton], (0, _toConsumableArray2.default)((0, _expValEquals.expValEquals)('platform_editor_code_block_q4_lovability', 'isEnabled', true) && (0, _platformFeatureFlags.fg)('platform_editor_code_block_add_line_number_button') ? [codeBlockLineNumbersButton] : []), (0, _toConsumableArray2.default)(copyAndDeleteButtonMenuItems)),
222
+ items: [languagePicker !== null && languagePicker !== void 0 ? languagePicker : languageSelect].concat((0, _toConsumableArray2.default)(areAnyNewToolbarFlagsEnabled ? [] : [separator]), [codeBlockWrapButton], (0, _toConsumableArray2.default)((0, _expValEquals.expValEquals)('platform_editor_code_block_q4_lovability', 'isEnabled', true) && (0, _platformFeatureFlags.fg)('platform_editor_code_block_add_line_number_button') ? [codeBlockLineNumbersButton] : []), (0, _toConsumableArray2.default)(copyAndDeleteButtonMenuItems)),
192
223
  scrollable: true
193
224
  };
194
225
  };
@@ -0,0 +1,12 @@
1
+
2
+ ._h7alglyw{border-inline:none}._179rglyw{border-block-end:none}
3
+ ._mqm2ia51{border-block-start:var(--ds-border-width,1px) solid var(--ds-border,#0b120e24)}
4
+ ._18m915vq{overflow-y:hidden}
5
+ ._1bsb1osq{width:100%}
6
+ ._1bsbuuw1{width:200px}
7
+ ._1bto1l2s{text-overflow:ellipsis}
8
+ ._1reo15vq{overflow-x:hidden}
9
+ ._1xw9glyw button:after{content:none}
10
+ ._ficf1e5h button{text-align:left}
11
+ ._o5721q9c{white-space:nowrap}
12
+ ._vwz478tn{line-height:1.714}
@@ -0,0 +1,127 @@
1
+ /* LanguagePicker.tsx generated by @compiled/babel-plugin v0.39.1 */
2
+ "use strict";
3
+
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.LanguagePicker = void 0;
10
+ require("./LanguagePicker.compiled.css");
11
+ var _runtime = require("@compiled/react/runtime");
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+ var _react = _interopRequireWildcard(require("react"));
14
+ var _new = _interopRequireDefault(require("@atlaskit/button/new"));
15
+ var _messages = require("@atlaskit/editor-common/messages");
16
+ var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
17
+ var _chevronDown = _interopRequireDefault(require("@atlaskit/icon/core/chevron-down"));
18
+ var _compiled = require("@atlaskit/primitives/compiled");
19
+ var _select = require("@atlaskit/select");
20
+ var _editorCommands = require("../editor-commands");
21
+ 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); }
22
+ var pickerOptionStyles = null;
23
+ var styles = {
24
+ divider: "_h7alglyw _179rglyw _mqm2ia51 _1bsb1osq",
25
+ trigger: "_1reo15vq _18m915vq _1bsbuuw1 _1bto1l2s _o5721q9c _ficf1e5h _1xw9glyw"
26
+ };
27
+ var CustomGroup = function CustomGroup(props) {
28
+ var allGroups = props.selectProps.options;
29
+ var isFirstGroup = allGroups.length > 0 && allGroups[0] === props.data;
30
+ return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, !isFirstGroup && /*#__PURE__*/_react.default.createElement(_compiled.Box, {
31
+ as: "hr",
32
+ xcss: styles.divider,
33
+ role: "presentation"
34
+ }), /*#__PURE__*/_react.default.createElement(_select.components.Group, props));
35
+ };
36
+ var CustomOption = function CustomOption(props) {
37
+ return (
38
+ /*#__PURE__*/
39
+ // eslint-disable-next-line react/jsx-props-no-spreading -- react-select custom components must forward all props to the default Option.
40
+ _react.default.createElement(_select.components.Option, props, /*#__PURE__*/_react.default.createElement("span", {
41
+ className: (0, _runtime.ax)(["_vwz478tn"])
42
+ }, props.children))
43
+ );
44
+ };
45
+ var popupSelectComponents = {
46
+ Group: CustomGroup,
47
+ Option: CustomOption
48
+ };
49
+ var menuPopperProps = {
50
+ modifiers: [{
51
+ name: 'offset',
52
+ options: {
53
+ offset: [0, 8]
54
+ }
55
+ }, {
56
+ name: 'preventOverflow',
57
+ enabled: false
58
+ }]
59
+ };
60
+ var LanguagePicker = exports.LanguagePicker = function LanguagePicker(_ref) {
61
+ var _api$analytics, _defaultValue$label;
62
+ var api = _ref.api,
63
+ defaultValue = _ref.defaultValue,
64
+ editorView = _ref.editorView,
65
+ filterOption = _ref.filterOption,
66
+ formatMessage = _ref.formatMessage,
67
+ options = _ref.options;
68
+ var editorAnalyticsAPI = api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions;
69
+ var label = (_defaultValue$label = defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.label) !== null && _defaultValue$label !== void 0 ? _defaultValue$label : formatMessage(_messages.codeBlockButtonMessages.selectLanguage);
70
+ var selectLanguageLabel = formatMessage(_messages.codeBlockButtonMessages.selectLanguage);
71
+ var _useState = (0, _react.useState)(''),
72
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
73
+ inputValue = _useState2[0],
74
+ setInputValue = _useState2[1];
75
+ var searchOptions = (0, _react.useMemo)(function () {
76
+ return options.flatMap(function (group) {
77
+ return group.options;
78
+ });
79
+ }, [options]);
80
+ var hasSearchQuery = inputValue.trim().length > 0;
81
+ var handleChange = (0, _react.useCallback)(function (option) {
82
+ if (!option) {
83
+ return;
84
+ }
85
+ (0, _editorCommands.changeLanguage)(editorAnalyticsAPI)(option.value)(editorView.state, editorView.dispatch);
86
+ }, [editorAnalyticsAPI, editorView]);
87
+ var handleInputChange = (0, _react.useCallback)(function (newInputValue) {
88
+ setInputValue(newInputValue);
89
+ return newInputValue;
90
+ }, []);
91
+ var renderTarget = (0, _react.useCallback)(function (_ref2) {
92
+ var isOpen = _ref2.isOpen,
93
+ ref = _ref2.ref,
94
+ onKeyDown = _ref2.onKeyDown,
95
+ ariaControls = _ref2['aria-controls'];
96
+ return /*#__PURE__*/_react.default.createElement("div", {
97
+ className: (0, _runtime.ax)([styles.trigger])
98
+ }, /*#__PURE__*/_react.default.createElement(_new.default, {
99
+ shouldFitContainer: true,
100
+ onKeyDown: onKeyDown,
101
+ ref: ref,
102
+ iconAfter: _chevronDown.default,
103
+ appearance: "subtle",
104
+ isSelected: isOpen,
105
+ "aria-controls": ariaControls,
106
+ "aria-label": selectLanguageLabel,
107
+ testId: "code-block-language-picker-trigger"
108
+ }, label));
109
+ }, [label, selectLanguageLabel]);
110
+ return /*#__PURE__*/_react.default.createElement(_select.PopupSelect, {
111
+ components: popupSelectComponents,
112
+ filterOption: filterOption,
113
+ inputValue: inputValue,
114
+ label: selectLanguageLabel,
115
+ maxMenuHeight: 300,
116
+ minMenuWidth: 200,
117
+ menuPlacement: "auto",
118
+ onChange: handleChange,
119
+ onInputChange: handleInputChange,
120
+ options: hasSearchQuery ? searchOptions : options,
121
+ popperProps: menuPopperProps,
122
+ searchThreshold: -1,
123
+ target: renderTarget,
124
+ testId: "code-block-language-picker",
125
+ defaultValue: defaultValue
126
+ });
127
+ };
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getDetectLanguageOption = exports.createGroupedLanguageOptions = exports.PLAIN_TEXT_LANGUAGE_VALUE = exports.NONE_LANGUAGE_VALUE = exports.DETECT_LANGUAGE_VALUE = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _messages = require("@atlaskit/editor-common/messages");
10
+ var NONE_LANGUAGE_VALUE = exports.NONE_LANGUAGE_VALUE = 'none';
11
+ var DETECT_LANGUAGE_VALUE = exports.DETECT_LANGUAGE_VALUE = 'autodetect';
12
+ var PLAIN_TEXT_LANGUAGE_VALUE = exports.PLAIN_TEXT_LANGUAGE_VALUE = 'text';
13
+ var getDetectLanguageOption = exports.getDetectLanguageOption = function getDetectLanguageOption(formatMessage) {
14
+ return {
15
+ alias: [DETECT_LANGUAGE_VALUE],
16
+ label: formatMessage(_messages.codeBlockButtonMessages.detectLanguage),
17
+ value: DETECT_LANGUAGE_VALUE
18
+ };
19
+ };
20
+ var createGroupedLanguageOptions = exports.createGroupedLanguageOptions = function createGroupedLanguageOptions(_ref) {
21
+ var formatMessage = _ref.formatMessage,
22
+ languages = _ref.languages,
23
+ _ref$recentlyUsedLang = _ref.recentlyUsedLanguages,
24
+ recentlyUsedLanguages = _ref$recentlyUsedLang === void 0 ? [] : _ref$recentlyUsedLang;
25
+ var allLanguages = languages.filter(function (language) {
26
+ return language.value !== NONE_LANGUAGE_VALUE && language.value !== PLAIN_TEXT_LANGUAGE_VALUE;
27
+ });
28
+ var plainTextOption = languages.find(function (language) {
29
+ return language.value === PLAIN_TEXT_LANGUAGE_VALUE;
30
+ });
31
+ var pinnedOptions = [getDetectLanguageOption(formatMessage)];
32
+ if (plainTextOption) {
33
+ pinnedOptions.push(plainTextOption);
34
+ }
35
+ return [{
36
+ label: '',
37
+ options: pinnedOptions
38
+ }].concat((0, _toConsumableArray2.default)(recentlyUsedLanguages.length > 0 ? [{
39
+ label: formatMessage(_messages.codeBlockButtonMessages.recentlyUsed),
40
+ options: recentlyUsedLanguages
41
+ }] : []), [{
42
+ label: formatMessage(_messages.codeBlockButtonMessages.all),
43
+ options: allLanguages
44
+ }]);
45
+ };
@@ -61,7 +61,7 @@ export const changeLanguage = editorAnalyticsAPI => language => (state, dispatch
61
61
  action: ACTION.LANGUAGE_SELECTED,
62
62
  actionSubject: ACTION_SUBJECT.CODE_BLOCK,
63
63
  attributes: {
64
- language
64
+ language: language !== null && language !== void 0 ? language : 'none'
65
65
  },
66
66
  eventType: EVENT_TYPE.TRACK
67
67
  })(result);
@@ -1,3 +1,4 @@
1
+ import React from 'react';
1
2
  import { areCodeBlockLineNumbersVisible, isCodeBlockWordWrapEnabled } from '@atlaskit/editor-common/code-block';
2
3
  import commonMessages, { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
3
4
  import { areToolbarFlagsEnabled } from '@atlaskit/editor-common/toolbar-flag-check';
@@ -10,13 +11,15 @@ import { fg } from '@atlaskit/platform-feature-flags';
10
11
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
11
12
  import { changeLanguage, copyContentToClipboardWithAnalytics, removeCodeBlockWithAnalytics, resetCopiedState, toggleLineNumbersForCodeBlockNode, toggleWordWrapStateForCodeBlockNode } from '../editor-commands';
12
13
  import { WrapIcon } from '../ui/icons/WrapIcon';
14
+ import { createGroupedLanguageOptions, NONE_LANGUAGE_VALUE, PLAIN_TEXT_LANGUAGE_VALUE } from '../ui/language-picker-options';
15
+ import { LanguagePicker } from '../ui/LanguagePicker';
13
16
  import { provideVisualFeedbackForCopyButton, removeVisualFeedbackForCopyButton } from './codeBlockCopySelectionPlugin';
14
17
  import { createLanguageList, DEFAULT_LANGUAGES, getLanguageIdentifier } from './language-list';
15
18
  import { pluginKey } from './plugin-key';
16
19
  export const getToolbarConfig = (allowCopyToClipboard = false, api, overrideLanguageName = undefined) => (state, {
17
20
  formatMessage
18
21
  }) => {
19
- var _api$editorViewMode, _api$editorViewMode$s, _api$decorations$acti, _api$decorations, _api$analytics, _codeBlockState$pos, _node$attrs;
22
+ var _api$editorViewMode, _api$editorViewMode$s, _api$decorations$acti, _api$decorations, _api$analytics, _codeBlockState$pos, _node$attrs, _languagePicker;
20
23
  const isViewMode = (api === null || api === void 0 ? void 0 : (_api$editorViewMode = api.editorViewMode) === null || _api$editorViewMode === void 0 ? void 0 : (_api$editorViewMode$s = _api$editorViewMode.sharedState.currentState()) === null || _api$editorViewMode$s === void 0 ? void 0 : _api$editorViewMode$s.mode) === 'view';
21
24
  const {
22
25
  hoverDecoration
@@ -57,6 +60,32 @@ export const getToolbarConfig = (allowCopyToClipboard = false, api, overrideLang
57
60
  options,
58
61
  filterOption: languageListFilter
59
62
  };
63
+ let languagePicker;
64
+ if (expValEquals('platform_editor_code_block_q4_lovability', 'isEnabled', true) && fg('platform_editor_code_block_add_line_number_button')) {
65
+ const languagePickerOptions = options;
66
+ const groupedOptions = createGroupedLanguageOptions({
67
+ formatMessage,
68
+ languages: languagePickerOptions
69
+ });
70
+ const defaultPickerValue = language ? languagePickerOptions.find(option => language === NONE_LANGUAGE_VALUE ? option.value === PLAIN_TEXT_LANGUAGE_VALUE : option.value === language || option.alias.includes(language)) : undefined;
71
+ languagePicker = {
72
+ type: 'custom',
73
+ fallback: [],
74
+ render: view => {
75
+ if (!view) {
76
+ return null;
77
+ }
78
+ return /*#__PURE__*/React.createElement(LanguagePicker, {
79
+ api: api,
80
+ defaultValue: defaultPickerValue,
81
+ editorView: view,
82
+ filterOption: languageListFilter,
83
+ formatMessage: formatMessage,
84
+ options: groupedOptions
85
+ });
86
+ }
87
+ };
88
+ }
60
89
  const separator = {
61
90
  type: 'separator'
62
91
  };
@@ -162,7 +191,7 @@ export const getToolbarConfig = (allowCopyToClipboard = false, api, overrideLang
162
191
  // eslint-disable-next-line @atlaskit/editor/no-as-casting
163
192
  getDomRef: view => findDomRefAtPos(pos, view.domAtPos.bind(view)),
164
193
  nodeType,
165
- items: [languageSelect, ...(areAnyNewToolbarFlagsEnabled ? [] : [separator]), codeBlockWrapButton, ...(expValEquals('platform_editor_code_block_q4_lovability', 'isEnabled', true) && fg('platform_editor_code_block_add_line_number_button') ? [codeBlockLineNumbersButton] : []), ...copyAndDeleteButtonMenuItems],
194
+ items: [(_languagePicker = languagePicker) !== null && _languagePicker !== void 0 ? _languagePicker : languageSelect, ...(areAnyNewToolbarFlagsEnabled ? [] : [separator]), codeBlockWrapButton, ...(expValEquals('platform_editor_code_block_q4_lovability', 'isEnabled', true) && fg('platform_editor_code_block_add_line_number_button') ? [codeBlockLineNumbersButton] : []), ...copyAndDeleteButtonMenuItems],
166
195
  scrollable: true
167
196
  };
168
197
  };
@@ -0,0 +1,12 @@
1
+
2
+ ._h7alglyw{border-inline:none}._179rglyw{border-block-end:none}
3
+ ._mqm2ia51{border-block-start:var(--ds-border-width,1px) solid var(--ds-border,#0b120e24)}
4
+ ._18m915vq{overflow-y:hidden}
5
+ ._1bsb1osq{width:100%}
6
+ ._1bsbuuw1{width:200px}
7
+ ._1bto1l2s{text-overflow:ellipsis}
8
+ ._1reo15vq{overflow-x:hidden}
9
+ ._1xw9glyw button:after{content:none}
10
+ ._ficf1e5h button{text-align:left}
11
+ ._o5721q9c{white-space:nowrap}
12
+ ._vwz478tn{line-height:1.714}
@@ -0,0 +1,110 @@
1
+ /* LanguagePicker.tsx generated by @compiled/babel-plugin v0.39.1 */
2
+ import "./LanguagePicker.compiled.css";
3
+ import { ax, ix } from "@compiled/react/runtime";
4
+ import React, { Fragment, useCallback, useMemo, useState } from 'react';
5
+ import Button from '@atlaskit/button/new';
6
+ import { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
7
+ import { akEditorLineHeight } from '@atlaskit/editor-shared-styles';
8
+ import ChevronDownIcon from '@atlaskit/icon/core/chevron-down';
9
+ import { Box } from '@atlaskit/primitives/compiled';
10
+ import { PopupSelect, components } from '@atlaskit/select';
11
+ import { changeLanguage } from '../editor-commands';
12
+ const pickerOptionStyles = null;
13
+ const styles = {
14
+ divider: "_h7alglyw _179rglyw _mqm2ia51 _1bsb1osq",
15
+ trigger: "_1reo15vq _18m915vq _1bsbuuw1 _1bto1l2s _o5721q9c _ficf1e5h _1xw9glyw"
16
+ };
17
+ const CustomGroup = props => {
18
+ const allGroups = props.selectProps.options;
19
+ const isFirstGroup = allGroups.length > 0 && allGroups[0] === props.data;
20
+ return /*#__PURE__*/React.createElement(Fragment, null, !isFirstGroup && /*#__PURE__*/React.createElement(Box, {
21
+ as: "hr",
22
+ xcss: styles.divider,
23
+ role: "presentation"
24
+ }), /*#__PURE__*/React.createElement(components.Group, props));
25
+ };
26
+ const CustomOption = props => {
27
+ return (
28
+ /*#__PURE__*/
29
+ // eslint-disable-next-line react/jsx-props-no-spreading -- react-select custom components must forward all props to the default Option.
30
+ React.createElement(components.Option, props, /*#__PURE__*/React.createElement("span", {
31
+ className: ax(["_vwz478tn"])
32
+ }, props.children))
33
+ );
34
+ };
35
+ const popupSelectComponents = {
36
+ Group: CustomGroup,
37
+ Option: CustomOption
38
+ };
39
+ const menuPopperProps = {
40
+ modifiers: [{
41
+ name: 'offset',
42
+ options: {
43
+ offset: [0, 8]
44
+ }
45
+ }, {
46
+ name: 'preventOverflow',
47
+ enabled: false
48
+ }]
49
+ };
50
+ export const LanguagePicker = ({
51
+ api,
52
+ defaultValue,
53
+ editorView,
54
+ filterOption,
55
+ formatMessage,
56
+ options
57
+ }) => {
58
+ var _api$analytics, _defaultValue$label;
59
+ const editorAnalyticsAPI = api === null || api === void 0 ? void 0 : (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions;
60
+ const label = (_defaultValue$label = defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.label) !== null && _defaultValue$label !== void 0 ? _defaultValue$label : formatMessage(codeBlockButtonMessages.selectLanguage);
61
+ const selectLanguageLabel = formatMessage(codeBlockButtonMessages.selectLanguage);
62
+ const [inputValue, setInputValue] = useState('');
63
+ const searchOptions = useMemo(() => options.flatMap(group => group.options), [options]);
64
+ const hasSearchQuery = inputValue.trim().length > 0;
65
+ const handleChange = useCallback(option => {
66
+ if (!option) {
67
+ return;
68
+ }
69
+ changeLanguage(editorAnalyticsAPI)(option.value)(editorView.state, editorView.dispatch);
70
+ }, [editorAnalyticsAPI, editorView]);
71
+ const handleInputChange = useCallback(newInputValue => {
72
+ setInputValue(newInputValue);
73
+ return newInputValue;
74
+ }, []);
75
+ const renderTarget = useCallback(({
76
+ isOpen,
77
+ ref,
78
+ onKeyDown,
79
+ 'aria-controls': ariaControls
80
+ }) => /*#__PURE__*/React.createElement("div", {
81
+ className: ax([styles.trigger])
82
+ }, /*#__PURE__*/React.createElement(Button, {
83
+ shouldFitContainer: true,
84
+ onKeyDown: onKeyDown,
85
+ ref: ref,
86
+ iconAfter: ChevronDownIcon,
87
+ appearance: "subtle",
88
+ isSelected: isOpen,
89
+ "aria-controls": ariaControls,
90
+ "aria-label": selectLanguageLabel,
91
+ testId: "code-block-language-picker-trigger"
92
+ }, label)), [label, selectLanguageLabel]);
93
+ return /*#__PURE__*/React.createElement(PopupSelect, {
94
+ components: popupSelectComponents,
95
+ filterOption: filterOption,
96
+ inputValue: inputValue,
97
+ label: selectLanguageLabel,
98
+ maxMenuHeight: 300,
99
+ minMenuWidth: 200,
100
+ menuPlacement: "auto",
101
+ onChange: handleChange,
102
+ onInputChange: handleInputChange,
103
+ options: hasSearchQuery ? searchOptions : options,
104
+ popperProps: menuPopperProps,
105
+ searchThreshold: -1,
106
+ target: renderTarget,
107
+ testId: "code-block-language-picker",
108
+ defaultValue: defaultValue
109
+ });
110
+ };
@@ -0,0 +1,31 @@
1
+ import { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
2
+ export const NONE_LANGUAGE_VALUE = 'none';
3
+ export const DETECT_LANGUAGE_VALUE = 'autodetect';
4
+ export const PLAIN_TEXT_LANGUAGE_VALUE = 'text';
5
+ export const getDetectLanguageOption = formatMessage => ({
6
+ alias: [DETECT_LANGUAGE_VALUE],
7
+ label: formatMessage(codeBlockButtonMessages.detectLanguage),
8
+ value: DETECT_LANGUAGE_VALUE
9
+ });
10
+ export const createGroupedLanguageOptions = ({
11
+ formatMessage,
12
+ languages,
13
+ recentlyUsedLanguages = []
14
+ }) => {
15
+ const allLanguages = languages.filter(language => language.value !== NONE_LANGUAGE_VALUE && language.value !== PLAIN_TEXT_LANGUAGE_VALUE);
16
+ const plainTextOption = languages.find(language => language.value === PLAIN_TEXT_LANGUAGE_VALUE);
17
+ const pinnedOptions = [getDetectLanguageOption(formatMessage)];
18
+ if (plainTextOption) {
19
+ pinnedOptions.push(plainTextOption);
20
+ }
21
+ return [{
22
+ label: '',
23
+ options: pinnedOptions
24
+ }, ...(recentlyUsedLanguages.length > 0 ? [{
25
+ label: formatMessage(codeBlockButtonMessages.recentlyUsed),
26
+ options: recentlyUsedLanguages
27
+ }] : []), {
28
+ label: formatMessage(codeBlockButtonMessages.all),
29
+ options: allLanguages
30
+ }];
31
+ };
@@ -59,7 +59,7 @@ export var changeLanguage = function changeLanguage(editorAnalyticsAPI) {
59
59
  action: ACTION.LANGUAGE_SELECTED,
60
60
  actionSubject: ACTION_SUBJECT.CODE_BLOCK,
61
61
  attributes: {
62
- language: language
62
+ language: language !== null && language !== void 0 ? language : 'none'
63
63
  },
64
64
  eventType: EVENT_TYPE.TRACK
65
65
  })(result);
@@ -2,6 +2,7 @@ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  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; }
4
4
  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) { _defineProperty(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; }
5
+ import React from 'react';
5
6
  import { areCodeBlockLineNumbersVisible, isCodeBlockWordWrapEnabled } from '@atlaskit/editor-common/code-block';
6
7
  import commonMessages, { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
7
8
  import { areToolbarFlagsEnabled } from '@atlaskit/editor-common/toolbar-flag-check';
@@ -14,6 +15,8 @@ import { fg } from '@atlaskit/platform-feature-flags';
14
15
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
15
16
  import { changeLanguage, copyContentToClipboardWithAnalytics, removeCodeBlockWithAnalytics, resetCopiedState, toggleLineNumbersForCodeBlockNode, toggleWordWrapStateForCodeBlockNode } from '../editor-commands';
16
17
  import { WrapIcon } from '../ui/icons/WrapIcon';
18
+ import { createGroupedLanguageOptions, NONE_LANGUAGE_VALUE, PLAIN_TEXT_LANGUAGE_VALUE } from '../ui/language-picker-options';
19
+ import { LanguagePicker } from '../ui/LanguagePicker';
17
20
  import { provideVisualFeedbackForCopyButton, removeVisualFeedbackForCopyButton } from './codeBlockCopySelectionPlugin';
18
21
  import { createLanguageList, DEFAULT_LANGUAGES, getLanguageIdentifier } from './language-list';
19
22
  import { pluginKey } from './plugin-key';
@@ -72,6 +75,34 @@ export var getToolbarConfig = function getToolbarConfig() {
72
75
  options: options,
73
76
  filterOption: languageListFilter
74
77
  };
78
+ var languagePicker;
79
+ if (expValEquals('platform_editor_code_block_q4_lovability', 'isEnabled', true) && fg('platform_editor_code_block_add_line_number_button')) {
80
+ var languagePickerOptions = options;
81
+ var groupedOptions = createGroupedLanguageOptions({
82
+ formatMessage: formatMessage,
83
+ languages: languagePickerOptions
84
+ });
85
+ var defaultPickerValue = language ? languagePickerOptions.find(function (option) {
86
+ return language === NONE_LANGUAGE_VALUE ? option.value === PLAIN_TEXT_LANGUAGE_VALUE : option.value === language || option.alias.includes(language);
87
+ }) : undefined;
88
+ languagePicker = {
89
+ type: 'custom',
90
+ fallback: [],
91
+ render: function render(view) {
92
+ if (!view) {
93
+ return null;
94
+ }
95
+ return /*#__PURE__*/React.createElement(LanguagePicker, {
96
+ api: api,
97
+ defaultValue: defaultPickerValue,
98
+ editorView: view,
99
+ filterOption: languageListFilter,
100
+ formatMessage: formatMessage,
101
+ options: groupedOptions
102
+ });
103
+ }
104
+ };
105
+ }
75
106
  var separator = {
76
107
  type: 'separator'
77
108
  };
@@ -179,7 +210,7 @@ export var getToolbarConfig = function getToolbarConfig() {
179
210
  return findDomRefAtPos(pos, view.domAtPos.bind(view));
180
211
  },
181
212
  nodeType: nodeType,
182
- items: [languageSelect].concat(_toConsumableArray(areAnyNewToolbarFlagsEnabled ? [] : [separator]), [codeBlockWrapButton], _toConsumableArray(expValEquals('platform_editor_code_block_q4_lovability', 'isEnabled', true) && fg('platform_editor_code_block_add_line_number_button') ? [codeBlockLineNumbersButton] : []), _toConsumableArray(copyAndDeleteButtonMenuItems)),
213
+ items: [languagePicker !== null && languagePicker !== void 0 ? languagePicker : languageSelect].concat(_toConsumableArray(areAnyNewToolbarFlagsEnabled ? [] : [separator]), [codeBlockWrapButton], _toConsumableArray(expValEquals('platform_editor_code_block_q4_lovability', 'isEnabled', true) && fg('platform_editor_code_block_add_line_number_button') ? [codeBlockLineNumbersButton] : []), _toConsumableArray(copyAndDeleteButtonMenuItems)),
183
214
  scrollable: true
184
215
  };
185
216
  };
@@ -0,0 +1,12 @@
1
+
2
+ ._h7alglyw{border-inline:none}._179rglyw{border-block-end:none}
3
+ ._mqm2ia51{border-block-start:var(--ds-border-width,1px) solid var(--ds-border,#0b120e24)}
4
+ ._18m915vq{overflow-y:hidden}
5
+ ._1bsb1osq{width:100%}
6
+ ._1bsbuuw1{width:200px}
7
+ ._1bto1l2s{text-overflow:ellipsis}
8
+ ._1reo15vq{overflow-x:hidden}
9
+ ._1xw9glyw button:after{content:none}
10
+ ._ficf1e5h button{text-align:left}
11
+ ._o5721q9c{white-space:nowrap}
12
+ ._vwz478tn{line-height:1.714}
@@ -0,0 +1,118 @@
1
+ /* LanguagePicker.tsx generated by @compiled/babel-plugin v0.39.1 */
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ import "./LanguagePicker.compiled.css";
4
+ import { ax, ix } from "@compiled/react/runtime";
5
+ import React, { Fragment, useCallback, useMemo, useState } from 'react';
6
+ import Button from '@atlaskit/button/new';
7
+ import { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
8
+ import { akEditorLineHeight } from '@atlaskit/editor-shared-styles';
9
+ import ChevronDownIcon from '@atlaskit/icon/core/chevron-down';
10
+ import { Box } from '@atlaskit/primitives/compiled';
11
+ import { PopupSelect, components } from '@atlaskit/select';
12
+ import { changeLanguage } from '../editor-commands';
13
+ var pickerOptionStyles = null;
14
+ var styles = {
15
+ divider: "_h7alglyw _179rglyw _mqm2ia51 _1bsb1osq",
16
+ trigger: "_1reo15vq _18m915vq _1bsbuuw1 _1bto1l2s _o5721q9c _ficf1e5h _1xw9glyw"
17
+ };
18
+ var CustomGroup = function CustomGroup(props) {
19
+ var allGroups = props.selectProps.options;
20
+ var isFirstGroup = allGroups.length > 0 && allGroups[0] === props.data;
21
+ return /*#__PURE__*/React.createElement(Fragment, null, !isFirstGroup && /*#__PURE__*/React.createElement(Box, {
22
+ as: "hr",
23
+ xcss: styles.divider,
24
+ role: "presentation"
25
+ }), /*#__PURE__*/React.createElement(components.Group, props));
26
+ };
27
+ var CustomOption = function CustomOption(props) {
28
+ return (
29
+ /*#__PURE__*/
30
+ // eslint-disable-next-line react/jsx-props-no-spreading -- react-select custom components must forward all props to the default Option.
31
+ React.createElement(components.Option, props, /*#__PURE__*/React.createElement("span", {
32
+ className: ax(["_vwz478tn"])
33
+ }, props.children))
34
+ );
35
+ };
36
+ var popupSelectComponents = {
37
+ Group: CustomGroup,
38
+ Option: CustomOption
39
+ };
40
+ var menuPopperProps = {
41
+ modifiers: [{
42
+ name: 'offset',
43
+ options: {
44
+ offset: [0, 8]
45
+ }
46
+ }, {
47
+ name: 'preventOverflow',
48
+ enabled: false
49
+ }]
50
+ };
51
+ export var LanguagePicker = function LanguagePicker(_ref) {
52
+ var _api$analytics, _defaultValue$label;
53
+ var api = _ref.api,
54
+ defaultValue = _ref.defaultValue,
55
+ editorView = _ref.editorView,
56
+ filterOption = _ref.filterOption,
57
+ formatMessage = _ref.formatMessage,
58
+ options = _ref.options;
59
+ var editorAnalyticsAPI = api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions;
60
+ var label = (_defaultValue$label = defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.label) !== null && _defaultValue$label !== void 0 ? _defaultValue$label : formatMessage(codeBlockButtonMessages.selectLanguage);
61
+ var selectLanguageLabel = formatMessage(codeBlockButtonMessages.selectLanguage);
62
+ var _useState = useState(''),
63
+ _useState2 = _slicedToArray(_useState, 2),
64
+ inputValue = _useState2[0],
65
+ setInputValue = _useState2[1];
66
+ var searchOptions = useMemo(function () {
67
+ return options.flatMap(function (group) {
68
+ return group.options;
69
+ });
70
+ }, [options]);
71
+ var hasSearchQuery = inputValue.trim().length > 0;
72
+ var handleChange = useCallback(function (option) {
73
+ if (!option) {
74
+ return;
75
+ }
76
+ changeLanguage(editorAnalyticsAPI)(option.value)(editorView.state, editorView.dispatch);
77
+ }, [editorAnalyticsAPI, editorView]);
78
+ var handleInputChange = useCallback(function (newInputValue) {
79
+ setInputValue(newInputValue);
80
+ return newInputValue;
81
+ }, []);
82
+ var renderTarget = useCallback(function (_ref2) {
83
+ var isOpen = _ref2.isOpen,
84
+ ref = _ref2.ref,
85
+ onKeyDown = _ref2.onKeyDown,
86
+ ariaControls = _ref2['aria-controls'];
87
+ return /*#__PURE__*/React.createElement("div", {
88
+ className: ax([styles.trigger])
89
+ }, /*#__PURE__*/React.createElement(Button, {
90
+ shouldFitContainer: true,
91
+ onKeyDown: onKeyDown,
92
+ ref: ref,
93
+ iconAfter: ChevronDownIcon,
94
+ appearance: "subtle",
95
+ isSelected: isOpen,
96
+ "aria-controls": ariaControls,
97
+ "aria-label": selectLanguageLabel,
98
+ testId: "code-block-language-picker-trigger"
99
+ }, label));
100
+ }, [label, selectLanguageLabel]);
101
+ return /*#__PURE__*/React.createElement(PopupSelect, {
102
+ components: popupSelectComponents,
103
+ filterOption: filterOption,
104
+ inputValue: inputValue,
105
+ label: selectLanguageLabel,
106
+ maxMenuHeight: 300,
107
+ minMenuWidth: 200,
108
+ menuPlacement: "auto",
109
+ onChange: handleChange,
110
+ onInputChange: handleInputChange,
111
+ options: hasSearchQuery ? searchOptions : options,
112
+ popperProps: menuPopperProps,
113
+ searchThreshold: -1,
114
+ target: renderTarget,
115
+ testId: "code-block-language-picker",
116
+ defaultValue: defaultValue
117
+ });
118
+ };
@@ -0,0 +1,38 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
3
+ export var NONE_LANGUAGE_VALUE = 'none';
4
+ export var DETECT_LANGUAGE_VALUE = 'autodetect';
5
+ export var PLAIN_TEXT_LANGUAGE_VALUE = 'text';
6
+ export var getDetectLanguageOption = function getDetectLanguageOption(formatMessage) {
7
+ return {
8
+ alias: [DETECT_LANGUAGE_VALUE],
9
+ label: formatMessage(codeBlockButtonMessages.detectLanguage),
10
+ value: DETECT_LANGUAGE_VALUE
11
+ };
12
+ };
13
+ export var createGroupedLanguageOptions = function createGroupedLanguageOptions(_ref) {
14
+ var formatMessage = _ref.formatMessage,
15
+ languages = _ref.languages,
16
+ _ref$recentlyUsedLang = _ref.recentlyUsedLanguages,
17
+ recentlyUsedLanguages = _ref$recentlyUsedLang === void 0 ? [] : _ref$recentlyUsedLang;
18
+ var allLanguages = languages.filter(function (language) {
19
+ return language.value !== NONE_LANGUAGE_VALUE && language.value !== PLAIN_TEXT_LANGUAGE_VALUE;
20
+ });
21
+ var plainTextOption = languages.find(function (language) {
22
+ return language.value === PLAIN_TEXT_LANGUAGE_VALUE;
23
+ });
24
+ var pinnedOptions = [getDetectLanguageOption(formatMessage)];
25
+ if (plainTextOption) {
26
+ pinnedOptions.push(plainTextOption);
27
+ }
28
+ return [{
29
+ label: '',
30
+ options: pinnedOptions
31
+ }].concat(_toConsumableArray(recentlyUsedLanguages.length > 0 ? [{
32
+ label: formatMessage(codeBlockButtonMessages.recentlyUsed),
33
+ options: recentlyUsedLanguages
34
+ }] : []), [{
35
+ label: formatMessage(codeBlockButtonMessages.all),
36
+ options: allLanguages
37
+ }]);
38
+ };
@@ -4,7 +4,7 @@ import type { Command, EditorCommand } from '@atlaskit/editor-common/types';
4
4
  import type { EditorState, Transaction } from '@atlaskit/editor-prosemirror/state';
5
5
  export declare const removeCodeBlockWithAnalytics: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
6
6
  export declare const removeCodeBlock: Command;
7
- export declare const changeLanguage: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (language: string) => Command;
7
+ export declare const changeLanguage: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (language: string | null) => Command;
8
8
  export declare const copyContentToClipboardWithAnalytics: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
9
9
  export declare const copyContentToClipboard: Command;
10
10
  export declare const resetCopiedState: Command;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @jsxRuntime classic
3
+ * @jsx jsx
4
+ */
5
+ import React from 'react';
6
+ import type { IntlShape } from 'react-intl';
7
+ import type { ExtractInjectionAPI, SelectOption } from '@atlaskit/editor-common/types';
8
+ import type { EditorView } from '@atlaskit/editor-prosemirror/view';
9
+ import type { CodeBlockPlugin } from '../index';
10
+ import type { LanguagePickerOption, LanguagePickerOptionGroup } from './language-picker-options';
11
+ type LanguagePickerProps = {
12
+ api: ExtractInjectionAPI<CodeBlockPlugin> | undefined;
13
+ defaultValue?: LanguagePickerOption;
14
+ editorView: EditorView;
15
+ filterOption: (option: SelectOption<LanguagePickerOption>, rawInput: string) => boolean;
16
+ formatMessage: IntlShape['formatMessage'];
17
+ options: LanguagePickerOptionGroup[];
18
+ };
19
+ export declare const LanguagePicker: ({ api, defaultValue, editorView, filterOption, formatMessage, options, }: LanguagePickerProps) => React.JSX.Element;
20
+ export {};
@@ -0,0 +1,19 @@
1
+ import type { IntlShape } from 'react-intl';
2
+ import type { GroupType } from '@atlaskit/select';
3
+ export declare const NONE_LANGUAGE_VALUE = "none";
4
+ export declare const DETECT_LANGUAGE_VALUE = "autodetect";
5
+ export declare const PLAIN_TEXT_LANGUAGE_VALUE = "text";
6
+ export type LanguagePickerOption = {
7
+ alias: readonly string[];
8
+ label: string;
9
+ value: string;
10
+ };
11
+ export type LanguagePickerOptionGroup = GroupType<LanguagePickerOption>;
12
+ type CreateGroupedLanguageOptionsProps = {
13
+ formatMessage: IntlShape['formatMessage'];
14
+ languages: LanguagePickerOption[];
15
+ recentlyUsedLanguages?: LanguagePickerOption[];
16
+ };
17
+ export declare const getDetectLanguageOption: (formatMessage: IntlShape["formatMessage"]) => LanguagePickerOption;
18
+ export declare const createGroupedLanguageOptions: ({ formatMessage, languages, recentlyUsedLanguages, }: CreateGroupedLanguageOptionsProps) => LanguagePickerOptionGroup[];
19
+ export {};
@@ -4,7 +4,7 @@ import type { Command, EditorCommand } from '@atlaskit/editor-common/types';
4
4
  import type { EditorState, Transaction } from '@atlaskit/editor-prosemirror/state';
5
5
  export declare const removeCodeBlockWithAnalytics: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
6
6
  export declare const removeCodeBlock: Command;
7
- export declare const changeLanguage: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (language: string) => Command;
7
+ export declare const changeLanguage: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (language: string | null) => Command;
8
8
  export declare const copyContentToClipboardWithAnalytics: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
9
9
  export declare const copyContentToClipboard: Command;
10
10
  export declare const resetCopiedState: Command;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @jsxRuntime classic
3
+ * @jsx jsx
4
+ */
5
+ import React from 'react';
6
+ import type { IntlShape } from 'react-intl';
7
+ import type { ExtractInjectionAPI, SelectOption } from '@atlaskit/editor-common/types';
8
+ import type { EditorView } from '@atlaskit/editor-prosemirror/view';
9
+ import type { CodeBlockPlugin } from '../index';
10
+ import type { LanguagePickerOption, LanguagePickerOptionGroup } from './language-picker-options';
11
+ type LanguagePickerProps = {
12
+ api: ExtractInjectionAPI<CodeBlockPlugin> | undefined;
13
+ defaultValue?: LanguagePickerOption;
14
+ editorView: EditorView;
15
+ filterOption: (option: SelectOption<LanguagePickerOption>, rawInput: string) => boolean;
16
+ formatMessage: IntlShape['formatMessage'];
17
+ options: LanguagePickerOptionGroup[];
18
+ };
19
+ export declare const LanguagePicker: ({ api, defaultValue, editorView, filterOption, formatMessage, options, }: LanguagePickerProps) => React.JSX.Element;
20
+ export {};
@@ -0,0 +1,19 @@
1
+ import type { IntlShape } from 'react-intl';
2
+ import type { GroupType } from '@atlaskit/select';
3
+ export declare const NONE_LANGUAGE_VALUE = "none";
4
+ export declare const DETECT_LANGUAGE_VALUE = "autodetect";
5
+ export declare const PLAIN_TEXT_LANGUAGE_VALUE = "text";
6
+ export type LanguagePickerOption = {
7
+ alias: readonly string[];
8
+ label: string;
9
+ value: string;
10
+ };
11
+ export type LanguagePickerOptionGroup = GroupType<LanguagePickerOption>;
12
+ type CreateGroupedLanguageOptionsProps = {
13
+ formatMessage: IntlShape['formatMessage'];
14
+ languages: LanguagePickerOption[];
15
+ recentlyUsedLanguages?: LanguagePickerOption[];
16
+ };
17
+ export declare const getDetectLanguageOption: (formatMessage: IntlShape["formatMessage"]) => LanguagePickerOption;
18
+ export declare const createGroupedLanguageOptions: ({ formatMessage, languages, recentlyUsedLanguages, }: CreateGroupedLanguageOptionsProps) => LanguagePickerOptionGroup[];
19
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-code-block",
3
- "version": "12.1.4",
3
+ "version": "12.1.6",
4
4
  "description": "Code block plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -27,8 +27,10 @@
27
27
  "sideEffects": false,
28
28
  "atlaskit:src": "src/index.ts",
29
29
  "dependencies": {
30
- "@atlaskit/adf-schema": "^52.13.0",
30
+ "@atlaskit/adf-schema": "^52.14.0",
31
+ "@atlaskit/button": "^23.11.0",
31
32
  "@atlaskit/code": "^17.5.0",
33
+ "@atlaskit/css": "^0.19.0",
32
34
  "@atlaskit/editor-plugin-analytics": "^10.1.0",
33
35
  "@atlaskit/editor-plugin-block-menu": "^9.2.0",
34
36
  "@atlaskit/editor-plugin-composition": "^9.1.0",
@@ -39,15 +41,20 @@
39
41
  "@atlaskit/editor-plugin-selection": "^10.1.0",
40
42
  "@atlaskit/editor-plugin-toolbar": "^7.3.0",
41
43
  "@atlaskit/editor-prosemirror": "^7.3.0",
42
- "@atlaskit/editor-toolbar": "^1.6.0",
43
- "@atlaskit/icon": "^35.0.0",
44
+ "@atlaskit/editor-shared-styles": "^3.11.0",
45
+ "@atlaskit/editor-toolbar": "^1.7.0",
46
+ "@atlaskit/icon": "^35.1.0",
44
47
  "@atlaskit/platform-feature-flags": "^1.1.0",
48
+ "@atlaskit/primitives": "^19.0.0",
45
49
  "@atlaskit/prosemirror-input-rules": "^3.7.0",
46
- "@atlaskit/tmp-editor-statsig": "^82.0.0",
47
- "@babel/runtime": "^7.0.0"
50
+ "@atlaskit/select": "^21.12.0",
51
+ "@atlaskit/tmp-editor-statsig": "^83.0.0",
52
+ "@atlaskit/tokens": "^13.0.0",
53
+ "@babel/runtime": "^7.0.0",
54
+ "@compiled/react": "^0.20.0"
48
55
  },
49
56
  "peerDependencies": {
50
- "@atlaskit/editor-common": "^114.36.0",
57
+ "@atlaskit/editor-common": "^114.46.0",
51
58
  "react": "^18.2.0",
52
59
  "react-intl": "^5.25.1 || ^6.0.0 || ^7.0.0"
53
60
  },
@@ -104,6 +111,7 @@
104
111
  }
105
112
  },
106
113
  "devDependencies": {
114
+ "react": "^18.2.0",
107
115
  "react-intl": "^6.6.2"
108
116
  }
109
117
  }