@atlaskit/renderer 107.2.0 → 107.3.0

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 (58) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/analytics/enums.js +61 -1
  3. package/dist/cjs/react/index.js +10 -1
  4. package/dist/cjs/react/nodes/codeBlock/codeBlock.js +18 -6
  5. package/dist/cjs/react/nodes/codeBlock/components/codeBlockButtonContainer.js +67 -0
  6. package/dist/cjs/react/nodes/codeBlock/components/codeBlockContainer.js +15 -8
  7. package/dist/cjs/react/nodes/codeBlock/components/codeBlockCopyButton.js +71 -0
  8. package/dist/cjs/react/nodes/codeBlock/components/codeBlockWrapButton.js +76 -0
  9. package/dist/cjs/react/nodes/codeBlock/windowedCodeBlock.js +13 -2
  10. package/dist/cjs/react/nodes/media.js +18 -1
  11. package/dist/cjs/react/nodes/mediaInline.js +19 -4
  12. package/dist/cjs/ui/Renderer/index.js +5 -1
  13. package/dist/cjs/ui/Renderer/style.js +2 -2
  14. package/dist/cjs/version.json +1 -1
  15. package/dist/es2019/analytics/enums.js +55 -1
  16. package/dist/es2019/react/index.js +7 -1
  17. package/dist/es2019/react/nodes/codeBlock/codeBlock.js +10 -3
  18. package/dist/es2019/react/nodes/codeBlock/components/codeBlockButtonContainer.js +59 -0
  19. package/dist/es2019/react/nodes/codeBlock/components/codeBlockContainer.js +25 -8
  20. package/dist/es2019/react/nodes/codeBlock/components/codeBlockCopyButton.js +52 -0
  21. package/dist/es2019/react/nodes/codeBlock/components/codeBlockWrapButton.js +67 -0
  22. package/dist/es2019/react/nodes/codeBlock/windowedCodeBlock.js +9 -4
  23. package/dist/es2019/react/nodes/media.js +18 -1
  24. package/dist/es2019/react/nodes/mediaInline.js +19 -4
  25. package/dist/es2019/ui/Renderer/index.js +5 -1
  26. package/dist/es2019/ui/Renderer/style.js +9 -11
  27. package/dist/es2019/version.json +1 -1
  28. package/dist/esm/analytics/enums.js +55 -1
  29. package/dist/esm/react/index.js +10 -1
  30. package/dist/esm/react/nodes/codeBlock/codeBlock.js +15 -3
  31. package/dist/esm/react/nodes/codeBlock/components/codeBlockButtonContainer.js +58 -0
  32. package/dist/esm/react/nodes/codeBlock/components/codeBlockContainer.js +15 -9
  33. package/dist/esm/react/nodes/codeBlock/components/codeBlockCopyButton.js +59 -0
  34. package/dist/esm/react/nodes/codeBlock/components/codeBlockWrapButton.js +67 -0
  35. package/dist/esm/react/nodes/codeBlock/windowedCodeBlock.js +14 -4
  36. package/dist/esm/react/nodes/media.js +18 -1
  37. package/dist/esm/react/nodes/mediaInline.js +19 -4
  38. package/dist/esm/ui/Renderer/index.js +5 -1
  39. package/dist/esm/ui/Renderer/style.js +2 -2
  40. package/dist/esm/version.json +1 -1
  41. package/dist/types/analytics/enums.d.ts +51 -0
  42. package/dist/types/analytics/events.d.ts +5 -1
  43. package/dist/types/react/index.d.ts +2 -0
  44. package/dist/types/react/nodes/codeBlock/codeBlock.d.ts +1 -0
  45. package/dist/types/react/nodes/codeBlock/components/codeBlockButtonContainer.d.ts +12 -0
  46. package/dist/types/react/nodes/codeBlock/components/codeBlockContainer.d.ts +5 -7
  47. package/dist/types/react/nodes/codeBlock/components/codeBlockWrapButton.d.ts +11 -0
  48. package/dist/types/react/nodes/codeBlock/windowedCodeBlock.d.ts +1 -1
  49. package/dist/types/react/nodes/media.d.ts +3 -2
  50. package/dist/types/react/nodes/mediaInline.d.ts +6 -0
  51. package/dist/types/react/types.d.ts +1 -0
  52. package/dist/types/ui/renderer-props.d.ts +1 -0
  53. package/package.json +11 -11
  54. package/report.api.md +19 -2
  55. package/dist/cjs/react/nodes/codeBlockCopyButton.js +0 -64
  56. package/dist/es2019/react/nodes/codeBlockCopyButton.js +0 -86
  57. package/dist/esm/react/nodes/codeBlockCopyButton.js +0 -54
  58. /package/dist/types/react/nodes/{codeBlockCopyButton.d.ts → codeBlock/components/codeBlockCopyButton.d.ts} +0 -0
@@ -640,17 +640,6 @@ export const rendererStyles = wrapperProps => theme => {
640
640
  &:first-child {
641
641
  margin-top: 0;
642
642
  }
643
-
644
- &:hover button.copy-to-clipboard,
645
- .copy-to-clipboard:focus {
646
- opacity: 1;
647
- position: absolute;
648
- height: 32px;
649
- width: 32px;
650
- right: 6px;
651
- top: 4px;
652
- padding: 2px;
653
- }
654
643
  }
655
644
 
656
645
  ${getLightWeightCodeBlockStylesForRootRendererStyleSheet()}
@@ -667,6 +656,15 @@ export const rendererStyles = wrapperProps => theme => {
667
656
  margin-left: 0;
668
657
  }
669
658
  }
659
+
660
+ & .MediaGroup,
661
+ & .code-block {
662
+ margin-top: ${blockNodesVerticalMargin};
663
+
664
+ &:first-child {
665
+ margin-top: 0;
666
+ }
667
+ }
670
668
  }
671
669
 
672
670
  & li {
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/renderer",
3
- "version": "107.2.0",
3
+ "version": "107.3.0",
4
4
  "sideEffects": false
5
5
  }
@@ -1 +1,55 @@
1
- export {};
1
+ export var EVENT_TYPE;
2
+ (function (EVENT_TYPE) {
3
+ EVENT_TYPE["OPERATIONAL"] = "operational";
4
+ EVENT_TYPE["SCREEN"] = "screen";
5
+ EVENT_TYPE["TRACK"] = "track";
6
+ EVENT_TYPE["UI"] = "ui";
7
+ })(EVENT_TYPE || (EVENT_TYPE = {}));
8
+ export var ACTION;
9
+ (function (ACTION) {
10
+ ACTION["STARTED"] = "started";
11
+ ACTION["RENDERED"] = "rendered";
12
+ ACTION["RE_RENDERED"] = "reRendered";
13
+ ACTION["RENDERER_TTI"] = "tti";
14
+ ACTION["CRASHED"] = "unhandledErrorCaught";
15
+ ACTION["INVALID_PROSEMIRROR_DOCUMENT"] = "invalidProsemirrorDocument";
16
+ ACTION["SELECT_ALL_CAUGHT"] = "selectAllCaught";
17
+ ACTION["SELECT_ALL_ESCAPED"] = "selectAllEscaped";
18
+ ACTION["CLICKED"] = "clicked";
19
+ ACTION["VIEWED"] = "viewed";
20
+ ACTION["VISITED"] = "visited";
21
+ ACTION["SORT_COLUMN"] = "sortedColumn";
22
+ ACTION["SORT_COLUMN_NOT_ALLOWED"] = "sortColumnNotAllowed";
23
+ ACTION["TOGGLE_EXPAND"] = "toggleExpand";
24
+ ACTION["INSERTED"] = "inserted";
25
+ ACTION["OPENED"] = "opened";
26
+ ACTION["CLOSED"] = "closed";
27
+ ACTION["DELETED"] = "deleted";
28
+ ACTION["EDITED"] = "edited";
29
+ ACTION["RESOLVED"] = "resolved";
30
+ ACTION["CREATE_NOT_ALLOWED"] = "createNotAllowed";
31
+ ACTION["UNSUPPORTED_CONTENT_LEVELS_TRACKING_SUCCEEDED"] = "unsupportedContentLevelsTrackingSucceeded";
32
+ ACTION["UNSUPPORTED_CONTENT_LEVELS_TRACKING_ERRORED"] = "unsupportedContentLevelsTrackingErrored";
33
+ ACTION["MEDIA_LINK_TRANSFORMED"] = "mediaLinkTransformed";
34
+ })(ACTION || (ACTION = {}));
35
+ export var ACTION_SUBJECT;
36
+ (function (ACTION_SUBJECT) {
37
+ ACTION_SUBJECT["RENDERER"] = "renderer";
38
+ ACTION_SUBJECT["BUTTON"] = "button";
39
+ ACTION_SUBJECT["ANCHOR_LINK"] = "anchorLink";
40
+ ACTION_SUBJECT["TABLE"] = "table";
41
+ ACTION_SUBJECT["EXPAND"] = "expand";
42
+ ACTION_SUBJECT["NESTED_EXPAND"] = "nestedExpand";
43
+ ACTION_SUBJECT["MEDIA_SINGLE"] = "mediaSingle";
44
+ ACTION_SUBJECT["LINK"] = "link";
45
+ ACTION_SUBJECT["ANNOTATION"] = "annotation";
46
+ ACTION_SUBJECT["MEDIA"] = "media";
47
+ })(ACTION_SUBJECT || (ACTION_SUBJECT = {}));
48
+ export var ACTION_SUBJECT_ID;
49
+ (function (ACTION_SUBJECT_ID) {
50
+ ACTION_SUBJECT_ID["HEADING_ANCHOR_LINK"] = "headingAnchorLink";
51
+ ACTION_SUBJECT_ID["LINK"] = "link";
52
+ ACTION_SUBJECT_ID["INLINE_COMMENT"] = "inlineComment";
53
+ ACTION_SUBJECT_ID["CODEBLOCK_COPY"] = "codeBlockCopy";
54
+ ACTION_SUBJECT_ID["CODEBLOCK_WRAP"] = "codeBlockWrap";
55
+ })(ACTION_SUBJECT_ID || (ACTION_SUBJECT_ID = {}));
@@ -46,6 +46,7 @@ var ReactSerializer = /*#__PURE__*/function () {
46
46
  _defineProperty(this, "headingIds", []);
47
47
  _defineProperty(this, "expandHeadingIds", []);
48
48
  _defineProperty(this, "allowCopyToClipboard", false);
49
+ _defineProperty(this, "allowWrapCodeBlock", false);
49
50
  _defineProperty(this, "allowPlaceholderText", true);
50
51
  _defineProperty(this, "allowCustomPanels", false);
51
52
  _defineProperty(this, "startPos", 1);
@@ -151,6 +152,7 @@ var ReactSerializer = /*#__PURE__*/function () {
151
152
  this.disableActions = init.disableActions;
152
153
  this.allowHeadingAnchorLinks = init.allowHeadingAnchorLinks;
153
154
  this.allowCopyToClipboard = init.allowCopyToClipboard;
155
+ this.allowWrapCodeBlock = init.allowWrapCodeBlock;
154
156
  this.allowPlaceholderText = init.allowPlaceholderText;
155
157
  this.allowCustomPanels = init.allowCustomPanels;
156
158
  this.allowColumnSorting = init.allowColumnSorting;
@@ -379,15 +381,21 @@ var ReactSerializer = /*#__PURE__*/function () {
379
381
  var _this6 = this,
380
382
  _this$media;
381
383
  var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
382
- var link = node.type.schema.marks.link;
384
+ var _node$type$schema$mar = node.type.schema.marks,
385
+ link = _node$type$schema$mar.link,
386
+ border = _node$type$schema$mar.border;
383
387
  var isLinkMark = function isLinkMark(mark) {
384
388
  return mark.type === link;
385
389
  };
390
+ var isBorderMark = function isBorderMark(mark) {
391
+ return mark.type === border;
392
+ };
386
393
  return _objectSpread(_objectSpread({}, this.getProps(node)), {}, {
387
394
  marks: node.marks.filter(function (m) {
388
395
  return !isLinkMark(m) || _this6.allowMediaLinking === true;
389
396
  }),
390
397
  isLinkMark: isLinkMark,
398
+ isBorderMark: isBorderMark,
391
399
  allowAltTextOnImages: this.allowAltTextOnImages,
392
400
  featureFlags: this.media && this.media.featureFlags,
393
401
  shouldOpenMediaViewer: this.shouldOpenMediaViewer,
@@ -496,6 +504,7 @@ var ReactSerializer = /*#__PURE__*/function () {
496
504
  content: node.content ? node.content.toJSON() : undefined,
497
505
  allowHeadingAnchorLinks: this.allowHeadingAnchorLinks,
498
506
  allowCopyToClipboard: this.allowCopyToClipboard,
507
+ allowWrapCodeBlock: this.allowWrapCodeBlock,
499
508
  allowPlaceholderText: this.allowPlaceholderText,
500
509
  rendererAppearance: this.appearance,
501
510
  fireAnalyticsEvent: this.fireAnalyticsEvent,
@@ -1,4 +1,6 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
1
2
  /** @jsx jsx */
3
+ import { useState } from 'react';
2
4
  import { jsx } from '@emotion/react';
3
5
  import { injectIntl } from 'react-intl-next';
4
6
  import { CodeBlockSharedCssClassName } from '@atlaskit/editor-common/styles';
@@ -10,18 +12,28 @@ function CodeBlock(props) {
10
12
  language = props.language,
11
13
  _props$allowCopyToCli = props.allowCopyToClipboard,
12
14
  allowCopyToClipboard = _props$allowCopyToCli === void 0 ? false : _props$allowCopyToCli,
15
+ _props$allowWrapCodeB = props.allowWrapCodeBlock,
16
+ allowWrapCodeBlock = _props$allowWrapCodeB === void 0 ? false : _props$allowWrapCodeB,
13
17
  codeBidiWarningTooltipEnabled = props.codeBidiWarningTooltipEnabled;
14
18
  var codeBidiWarningLabel = props.intl.formatMessage(codeBidiWarningMessages.label);
15
19
  var className = [CodeBlockSharedCssClassName.CODEBLOCK_CONTAINER, props.className].join(' ');
20
+ var _useState = useState(false),
21
+ _useState2 = _slicedToArray(_useState, 2),
22
+ wrapLongLines = _useState2[0],
23
+ setWrapLongLines = _useState2[1];
16
24
  return jsx(CodeBlockContainer, {
17
- text: text,
25
+ allowCopyToClipboard: allowCopyToClipboard,
26
+ allowWrapCodeBlock: allowWrapCodeBlock,
18
27
  className: className,
19
- allowCopyToClipboard: allowCopyToClipboard
28
+ setWrapLongLines: setWrapLongLines,
29
+ text: text,
30
+ wrapLongLines: wrapLongLines
20
31
  }, jsx(AkCodeBlock, {
21
32
  language: language,
22
33
  text: text,
23
34
  codeBidiWarningLabel: codeBidiWarningLabel,
24
- codeBidiWarningTooltipEnabled: codeBidiWarningTooltipEnabled
35
+ codeBidiWarningTooltipEnabled: codeBidiWarningTooltipEnabled,
36
+ shouldWrapLongLines: allowWrapCodeBlock && wrapLongLines
25
37
  }));
26
38
  }
27
39
  export default injectIntl(CodeBlock);
@@ -0,0 +1,58 @@
1
+ /** @jsx jsx */
2
+ import { jsx, css } from '@emotion/react';
3
+ import CopyButton from './codeBlockCopyButton';
4
+ import CodeWrapButton from './codeBlockWrapButton';
5
+ import { N0, N20, N30, N700 } from '@atlaskit/theme/colors';
6
+ var codeBlockButtonsWrapper = css({
7
+ position: 'sticky',
8
+ top: '0px'
9
+ });
10
+ var codeBlockButtonsStyle = css({
11
+ display: 'flex',
12
+ justifyContent: 'flex-end',
13
+ position: 'absolute',
14
+ height: '0',
15
+ width: '100%',
16
+ right: '6px',
17
+ top: '4px',
18
+ padding: '2px',
19
+ button: {
20
+ height: '32px',
21
+ width: '32px',
22
+ border: "2px solid ".concat("var(--ds-border-inverse, ".concat(N0, ")")),
23
+ borderRadius: '4px',
24
+ marginLeft: '4px',
25
+ padding: '2px',
26
+ background: "".concat("var(--ds-background-neutral-subtle, ".concat(N20, ")")),
27
+ color: "var(--ds-icon, rgb(66, 82, 110))",
28
+ '&:hover': {
29
+ borderWidth: '2px',
30
+ backgroundColor: "".concat("var(--ds-background-neutral-hovered, ".concat(N30, ")")),
31
+ height: '32px',
32
+ width: '32px'
33
+ },
34
+ '&.clicked': {
35
+ backgroundColor: "".concat("var(--ds-background-neutral-bold-pressed, ".concat(N700, ")")),
36
+ borderRadius: '4px',
37
+ color: "".concat("var(--ds-icon-inverse, ".concat(N0, ")"), " !important")
38
+ }
39
+ }
40
+ });
41
+ var CodeBlockButtonContainer = function CodeBlockButtonContainer(_ref) {
42
+ var allowCopyToClipboard = _ref.allowCopyToClipboard,
43
+ allowWrapCodeBlock = _ref.allowWrapCodeBlock,
44
+ setWrapLongLines = _ref.setWrapLongLines,
45
+ text = _ref.text,
46
+ wrapLongLines = _ref.wrapLongLines;
47
+ return jsx("div", {
48
+ css: codeBlockButtonsWrapper
49
+ }, jsx("div", {
50
+ css: codeBlockButtonsStyle
51
+ }, allowWrapCodeBlock && jsx(CodeWrapButton, {
52
+ setWrapLongLines: setWrapLongLines,
53
+ wrapLongLines: wrapLongLines
54
+ }), allowCopyToClipboard && jsx(CopyButton, {
55
+ content: text
56
+ })));
57
+ };
58
+ export default CodeBlockButtonContainer;
@@ -1,16 +1,15 @@
1
1
  import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
2
2
  var _templateObject;
3
3
  /** @jsx jsx */
4
-
5
4
  import { jsx, css } from '@emotion/react';
6
5
  import { overflowShadow, relativeFontSizeToBase16 } from '@atlaskit/editor-shared-styles';
7
6
  import { N20, DN50 } from '@atlaskit/theme/colors';
8
7
  import { themed } from '@atlaskit/theme/components';
9
8
  import { fontSize, gridSize } from '@atlaskit/theme/constants';
10
9
  import { CodeBlockSharedCssClassName } from '@atlaskit/editor-common/styles';
11
- import CopyButton from '../../codeBlockCopyButton';
10
+ import CodeBlockButtonContainer from './codeBlockButtonContainer';
12
11
  var codeBlockStyleOverrides = function codeBlockStyleOverrides(props) {
13
- return css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n tab-size: 4;\n background-color: ", ";\n\n ", " {\n font-size: ", ";\n line-height: 1.5rem;\n background-image: ", ";\n background-attachment: local, local, local, local, scroll, scroll, scroll,\n scroll;\n background-position: 0 0, 0 0, 100% 0, 100% 0, 100% 0, 100% 0, 0 0, 0 0;\n }\n "])), themed({
12
+ return css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n tab-size: 4;\n background-color: ", ";\n\n &:hover {\n button {\n opacity: 1;\n }\n }\n\n button {\n opacity: 0;\n transition: opacity 0.2s ease 0s;\n }\n\n ", " {\n font-size: ", ";\n line-height: 1.5rem;\n background-image: ", ";\n background-attachment: local, local, local, local, scroll, scroll, scroll,\n scroll;\n background-position: 0 0, 0 0, 100% 0, 100% 0, 100% 0, 100% 0, 0 0, 0 0;\n }\n "])), themed({
14
13
  light: "var(--ds-surface-raised, ".concat(N20, ")"),
15
14
  dark: "var(--ds-surface-raised, ".concat(DN50, ")")
16
15
  })(props), CodeBlockSharedCssClassName.DS_CODEBLOCK, relativeFontSizeToBase16(fontSize()), overflowShadow({
@@ -22,15 +21,22 @@ var codeBlockStyleOverrides = function codeBlockStyleOverrides(props) {
22
21
  }));
23
22
  };
24
23
  var CodeBlockContainer = function CodeBlockContainer(_ref) {
25
- var text = _ref.text,
24
+ var allowCopyToClipboard = _ref.allowCopyToClipboard,
25
+ allowWrapCodeBlock = _ref.allowWrapCodeBlock,
26
+ children = _ref.children,
26
27
  className = _ref.className,
27
- allowCopyToClipboard = _ref.allowCopyToClipboard,
28
- children = _ref.children;
28
+ setWrapLongLines = _ref.setWrapLongLines,
29
+ text = _ref.text,
30
+ wrapLongLines = _ref.wrapLongLines;
29
31
  return jsx("div", {
30
32
  className: className,
31
33
  css: codeBlockStyleOverrides
32
- }, allowCopyToClipboard ? jsx(CopyButton, {
33
- content: text
34
- }) : null, children);
34
+ }, jsx(CodeBlockButtonContainer, {
35
+ allowCopyToClipboard: allowCopyToClipboard,
36
+ allowWrapCodeBlock: allowWrapCodeBlock,
37
+ setWrapLongLines: setWrapLongLines,
38
+ text: text,
39
+ wrapLongLines: wrapLongLines
40
+ }), children);
35
41
  };
36
42
  export default CodeBlockContainer;
@@ -0,0 +1,59 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ /** @jsx jsx */
3
+ import { jsx } from '@emotion/react';
4
+ import React, { useState } from 'react';
5
+ import { injectIntl } from 'react-intl-next';
6
+ import Tooltip from '@atlaskit/tooltip';
7
+ import Button from '@atlaskit/button/custom-theme-button';
8
+ import CopyIcon from '@atlaskit/icon/glyph/copy';
9
+ import { copyTextToClipboard } from '../../../utils/clipboard';
10
+ import { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
11
+ import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE } from '../../../../analytics/enums';
12
+ import AnalyticsContext from '../../../../analytics/analyticsContext';
13
+ var CopyButton = function CopyButton(_ref) {
14
+ var content = _ref.content,
15
+ intl = _ref.intl;
16
+ var _useState = useState(intl.formatMessage(codeBlockButtonMessages.copyCodeToClipboard)),
17
+ _useState2 = _slicedToArray(_useState, 2),
18
+ tooltip = _useState2[0],
19
+ setTooltip = _useState2[1];
20
+ var _useState3 = useState('copy-to-clipboard'),
21
+ _useState4 = _slicedToArray(_useState3, 2),
22
+ className = _useState4[0],
23
+ setClassName = _useState4[1];
24
+ var onMouseLeave = function onMouseLeave() {
25
+ setTooltip(intl.formatMessage(codeBlockButtonMessages.copyCodeToClipboard));
26
+ setClassName('copy-to-clipboard');
27
+ };
28
+ return jsx(AnalyticsContext.Consumer, null, function (_ref2) {
29
+ var fireAnalyticsEvent = _ref2.fireAnalyticsEvent;
30
+ return jsx("span", null, jsx(Tooltip, {
31
+ content: tooltip,
32
+ hideTooltipOnClick: false,
33
+ position: "top"
34
+ }, jsx("div", {
35
+ onMouseLeave: onMouseLeave
36
+ }, jsx(Button, {
37
+ appearance: "subtle",
38
+ "aria-haspopup": true,
39
+ "aria-label": tooltip,
40
+ className: className,
41
+ iconBefore: jsx(CopyIcon, {
42
+ label: tooltip
43
+ }),
44
+ onClick: function onClick() {
45
+ fireAnalyticsEvent({
46
+ action: ACTION.CLICKED,
47
+ actionSubject: ACTION_SUBJECT.BUTTON,
48
+ actionSubjectId: ACTION_SUBJECT_ID.CODEBLOCK_COPY,
49
+ eventType: EVENT_TYPE.UI
50
+ });
51
+ copyTextToClipboard(content);
52
+ setTooltip(intl.formatMessage(codeBlockButtonMessages.copiedCodeToClipboard));
53
+ setClassName('copy-to-clipboard clicked');
54
+ },
55
+ spacing: "compact"
56
+ }))));
57
+ });
58
+ };
59
+ export default injectIntl(CopyButton);
@@ -0,0 +1,67 @@
1
+ /** @jsx jsx */
2
+ import { jsx } from '@emotion/react';
3
+ import React from 'react';
4
+ import { injectIntl } from 'react-intl-next';
5
+ import Tooltip from '@atlaskit/tooltip';
6
+ import Button from '@atlaskit/button/custom-theme-button';
7
+ import Icon from '@atlaskit/icon';
8
+ import { codeBlockButtonMessages } from '@atlaskit/editor-common/messages';
9
+ import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE } from '../../../../analytics/enums';
10
+ import AnalyticsContext from '../../../../analytics/analyticsContext';
11
+ var WrapIcon = function WrapIcon() {
12
+ return jsx("svg", {
13
+ width: "24",
14
+ height: "24",
15
+ fill: "none",
16
+ viewBox: "0 0 24 24"
17
+ }, jsx("g", {
18
+ fill: "currentColor",
19
+ clipPath: "url(#clip0_654_431)"
20
+ }, jsx("rect", {
21
+ width: "24",
22
+ height: "24",
23
+ fillOpacity: "0.01"
24
+ }), jsx("path", {
25
+ d: "M20 4h-1v16h1V4ZM3 8a1 1 0 0 1 1-1h9.5a4.5 4.5 0 1 1 0 9h-2.086l.293.293a1 1 0 0 1-1.414 1.414l-2-2a1 1 0 0 1 0-1.414l2-2a1 1 0 0 1 1.414 1.414l-.293.293H13.5a2.5 2.5 0 0 0 0-5H4a1 1 0 0 1-1-1Z",
26
+ clipRule: "evenodd",
27
+ fillRule: "evenodd"
28
+ })));
29
+ };
30
+ var CodeBlockWrapButton = function CodeBlockWrapButton(_ref) {
31
+ var setWrapLongLines = _ref.setWrapLongLines,
32
+ wrapLongLines = _ref.wrapLongLines,
33
+ intl = _ref.intl;
34
+ var wrapMessage = intl.formatMessage(wrapLongLines ? codeBlockButtonMessages.unwrapCode : codeBlockButtonMessages.wrapCode);
35
+ return jsx(AnalyticsContext.Consumer, null, function (_ref2) {
36
+ var fireAnalyticsEvent = _ref2.fireAnalyticsEvent;
37
+ return jsx("span", null, jsx(Tooltip, {
38
+ content: wrapMessage,
39
+ hideTooltipOnClick: false,
40
+ position: "top"
41
+ }, jsx(Button, {
42
+ appearance: "subtle",
43
+ "aria-haspopup": true,
44
+ "aria-label": wrapMessage,
45
+ className: "wrap-code ".concat(wrapLongLines ? 'clicked' : ''),
46
+ iconBefore: jsx(Icon, {
47
+ glyph: WrapIcon,
48
+ label: ""
49
+ }),
50
+ isSelected: wrapLongLines,
51
+ onClick: function onClick() {
52
+ fireAnalyticsEvent({
53
+ action: ACTION.CLICKED,
54
+ actionSubject: ACTION_SUBJECT.BUTTON,
55
+ actionSubjectId: ACTION_SUBJECT_ID.CODEBLOCK_WRAP,
56
+ attributes: {
57
+ wrapped: !wrapLongLines
58
+ },
59
+ eventType: EVENT_TYPE.UI
60
+ });
61
+ setWrapLongLines(!wrapLongLines);
62
+ },
63
+ spacing: "compact"
64
+ })));
65
+ });
66
+ };
67
+ export default injectIntl(CodeBlockWrapButton);
@@ -1,8 +1,8 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
1
2
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
3
  import _regeneratorRuntime from "@babel/runtime/regenerator";
3
4
  /** @jsx jsx */
4
- import { Fragment, memo } from 'react';
5
- import { lazy, Suspense } from 'react';
5
+ import { Fragment, lazy, memo, Suspense, useState } from 'react';
6
6
  import { jsx } from '@emotion/react';
7
7
  import { CodeBlockSharedCssClassName } from '@atlaskit/editor-common/styles';
8
8
  import { useInViewport } from '../../hooks/use-in-viewport';
@@ -34,6 +34,8 @@ var WindowedCodeBlock = function WindowedCodeBlock(_ref2) {
34
34
  var text = _ref2.text,
35
35
  language = _ref2.language,
36
36
  allowCopyToClipboard = _ref2.allowCopyToClipboard,
37
+ _ref2$allowWrapCodeBl = _ref2.allowWrapCodeBlock,
38
+ allowWrapCodeBlock = _ref2$allowWrapCodeBl === void 0 ? false : _ref2$allowWrapCodeBl,
37
39
  codeBidiWarningTooltipEnabled = _ref2.codeBidiWarningTooltipEnabled,
38
40
  rootClassName = _ref2.className;
39
41
  var _useBidiWarnings = useBidiWarnings({
@@ -50,17 +52,25 @@ var WindowedCodeBlock = function WindowedCodeBlock(_ref2) {
50
52
  codeBidiWarningTooltipEnabled: codeBidiWarningTooltipEnabled,
51
53
  className: rootClassName
52
54
  });
55
+ var _useState = useState(false),
56
+ _useState2 = _slicedToArray(_useState, 2),
57
+ wrapLongLines = _useState2[0],
58
+ setWrapLongLines = _useState2[1];
53
59
  return isInViewport ? jsx(Fragment, null, jsx(Suspense, {
54
60
  fallback: memoizedLightWeightCodeBlock
55
61
  }, jsx(CodeBlockContainer, {
62
+ allowCopyToClipboard: allowCopyToClipboard,
63
+ allowWrapCodeBlock: allowWrapCodeBlock,
56
64
  className: className,
65
+ setWrapLongLines: setWrapLongLines,
57
66
  text: text,
58
- allowCopyToClipboard: allowCopyToClipboard
67
+ wrapLongLines: wrapLongLines
59
68
  }, jsx(LazyAkCodeBlock, {
60
69
  language: language,
61
70
  text: text,
62
71
  codeBidiWarningLabel: warningLabel,
63
- codeBidiWarningTooltipEnabled: codeBidiWarningTooltipEnabled
72
+ codeBidiWarningTooltipEnabled: codeBidiWarningTooltipEnabled,
73
+ shouldWrapLongLines: allowWrapCodeBlock && wrapLongLines
64
74
  })))) : memoizedLightWeightCodeBlock;
65
75
  };
66
76
  export default WindowedCodeBlock;
@@ -15,6 +15,7 @@ import { jsx } from '@emotion/react';
15
15
  import { WithProviders } from '@atlaskit/editor-common/provider-factory';
16
16
  import { mediaLinkStyle } from '@atlaskit/editor-common/ui';
17
17
  import { MediaCard } from '../../ui/MediaCard';
18
+ import { hexToEditorBorderPaletteColor } from '@atlaskit/editor-palette';
18
19
  import { getEventHandler } from '../../utils';
19
20
  import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
20
21
  import { MODE, PLATFORM } from '../../analytics/events';
@@ -29,6 +30,7 @@ var Media = /*#__PURE__*/function (_PureComponent) {
29
30
  }
30
31
  _this = _super.call.apply(_super, [this].concat(args));
31
32
  _defineProperty(_assertThisInitialized(_this), "renderCard", function () {
33
+ var _borderMark$attrs$col, _borderMark$attrs$siz;
32
34
  var providers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
33
35
  var mediaProvider = providers.mediaProvider,
34
36
  contextIdentifierProvider = providers.contextIdentifierProvider;
@@ -39,6 +41,9 @@ var Media = /*#__PURE__*/function (_PureComponent) {
39
41
  allowMediaViewer = _this$props.shouldOpenMediaViewer,
40
42
  enableDownloadButton = _this$props.enableDownloadButton,
41
43
  ssr = _this$props.ssr;
44
+ var borderMark = _this.props.marks.find(_this.props.isBorderMark);
45
+ var borderColor = (_borderMark$attrs$col = borderMark === null || borderMark === void 0 ? void 0 : borderMark.attrs.color) !== null && _borderMark$attrs$col !== void 0 ? _borderMark$attrs$col : '';
46
+ var borderWidth = (_borderMark$attrs$siz = borderMark === null || borderMark === void 0 ? void 0 : borderMark.attrs.size) !== null && _borderMark$attrs$siz !== void 0 ? _borderMark$attrs$siz : 0;
42
47
  var linkMark = _this.props.marks.find(_this.props.isLinkMark);
43
48
  var linkHref = linkMark === null || linkMark === void 0 ? void 0 : linkMark.attrs.href;
44
49
  var eventHandlers = linkHref ? undefined : _this.props.eventHandlers;
@@ -54,13 +59,25 @@ var Media = /*#__PURE__*/function (_PureComponent) {
54
59
  shouldEnableDownloadButton: enableDownloadButton,
55
60
  ssr: ssr
56
61
  }));
62
+ var paletteColorValue = hexToEditorBorderPaletteColor(borderColor) || borderColor;
63
+ var mediaComponentWithBorder = borderMark ? jsx("div", {
64
+ "data-mark-type": "border",
65
+ "data-color": borderColor,
66
+ "data-size": borderWidth,
67
+ style: {
68
+ borderColor: paletteColorValue,
69
+ borderWidth: "".concat(borderWidth, "px"),
70
+ borderStyle: 'solid',
71
+ borderRadius: "".concat(borderWidth * 2, "px")
72
+ }
73
+ }, mediaComponent) : mediaComponent;
57
74
  return linkHref ? jsx("a", {
58
75
  href: linkHref,
59
76
  rel: "noreferrer noopener",
60
77
  onClick: _this.handleMediaLinkClick,
61
78
  "data-block-link": linkHref,
62
79
  css: mediaLinkStyle
63
- }, mediaComponent) : mediaComponent;
80
+ }, mediaComponentWithBorder) : mediaComponentWithBorder;
64
81
  });
65
82
  _defineProperty(_assertThisInitialized(_this), "handleMediaLinkClick", function (event) {
66
83
  var _this$props2 = _this.props,
@@ -9,7 +9,8 @@ import { WithProviders } from '@atlaskit/editor-common/provider-factory';
9
9
  import { getClipboardAttrs } from '../../ui/MediaCard';
10
10
  import { createIntl, injectIntl } from 'react-intl-next';
11
11
  export var RenderMediaInline = function RenderMediaInline(props) {
12
- var mediaProvider = props.mediaProvider;
12
+ var mediaProvider = props.mediaProvider,
13
+ rendererAppearance = props.rendererAppearance;
13
14
  var _useState = useState(),
14
15
  _useState2 = _slicedToArray(_useState, 2),
15
16
  viewMediaClientConfigState = _useState2[0],
@@ -55,9 +56,20 @@ export var RenderMediaInline = function RenderMediaInline(props) {
55
56
  isSelected: false
56
57
  });
57
58
  }
59
+ var handleMediaInlineClick = function handleMediaInlineClick(result) {
60
+ var _props$eventHandlers, _props$eventHandlers$;
61
+ if ((_props$eventHandlers = props.eventHandlers) !== null && _props$eventHandlers !== void 0 && (_props$eventHandlers$ = _props$eventHandlers.media) !== null && _props$eventHandlers$ !== void 0 && _props$eventHandlers$.onClick) {
62
+ var _props$eventHandlers2, _props$eventHandlers3;
63
+ (_props$eventHandlers2 = props.eventHandlers) === null || _props$eventHandlers2 === void 0 ? void 0 : (_props$eventHandlers3 = _props$eventHandlers2.media) === null || _props$eventHandlers3 === void 0 ? void 0 : _props$eventHandlers3.onClick(result);
64
+ }
65
+ };
66
+ var shouldOpenMediaViewer = rendererAppearance !== 'mobile';
67
+ var shouldDisplayToolTip = rendererAppearance !== 'mobile';
58
68
  return /*#__PURE__*/React.createElement(MediaInlineCard, {
59
69
  identifier: props.identifier,
60
- shouldOpenMediaViewer: true,
70
+ onClick: handleMediaInlineClick,
71
+ shouldOpenMediaViewer: shouldOpenMediaViewer,
72
+ shouldDisplayToolTip: shouldDisplayToolTip,
61
73
  mediaClientConfig: viewMediaClientConfigState
62
74
  });
63
75
  };
@@ -65,7 +77,8 @@ var MediaInline = function MediaInline(props) {
65
77
  var collection = props.collection,
66
78
  id = props.id,
67
79
  providers = props.providers,
68
- intl = props.intl;
80
+ intl = props.intl,
81
+ rendererAppearance = props.rendererAppearance;
69
82
  var identifier = {
70
83
  id: id,
71
84
  mediaItemType: 'file',
@@ -91,7 +104,9 @@ var MediaInline = function MediaInline(props) {
91
104
  }
92
105
  return /*#__PURE__*/React.createElement(RenderMediaInline, {
93
106
  identifier: identifier,
94
- mediaProvider: mediaProvider
107
+ mediaProvider: mediaProvider,
108
+ eventHandlers: props.eventHandlers,
109
+ rendererAppearance: rendererAppearance
95
110
  });
96
111
  }
97
112
  }));
@@ -45,7 +45,7 @@ import { RenderTracking } from '../../react/utils/performance/RenderTracking';
45
45
  export var NORMAL_SEVERITY_THRESHOLD = 2000;
46
46
  export var DEGRADED_SEVERITY_THRESHOLD = 3000;
47
47
  var packageName = "@atlaskit/renderer";
48
- var packageVersion = "107.2.0";
48
+ var packageVersion = "107.3.0";
49
49
  export var Renderer = /*#__PURE__*/function (_PureComponent) {
50
50
  _inherits(Renderer, _PureComponent);
51
51
  var _super = _createSuper(Renderer);
@@ -257,6 +257,7 @@ export var Renderer = /*#__PURE__*/function (_PureComponent) {
257
257
  emojiResourceConfig: props.emojiResourceConfig,
258
258
  smartLinks: props.smartLinks,
259
259
  allowCopyToClipboard: props.allowCopyToClipboard,
260
+ allowWrapCodeBlock: props.allowWrapCodeBlock,
260
261
  allowCustomPanels: props.allowCustomPanels,
261
262
  allowAnnotations: props.allowAnnotations,
262
263
  allowSelectAllTrap: props.allowSelectAllTrap,
@@ -284,6 +285,7 @@ export var Renderer = /*#__PURE__*/function (_PureComponent) {
284
285
  allowPlaceholderText = _this$props.allowPlaceholderText,
285
286
  allowColumnSorting = _this$props.allowColumnSorting,
286
287
  allowCopyToClipboard = _this$props.allowCopyToClipboard,
288
+ allowWrapCodeBlock = _this$props.allowWrapCodeBlock,
287
289
  allowCustomPanels = _this$props.allowCustomPanels;
288
290
  var allowNestedHeaderLinks = isNestedHeaderLinksEnabled(allowHeadingAnchorLinks);
289
291
  /**
@@ -356,6 +358,7 @@ export var Renderer = /*#__PURE__*/function (_PureComponent) {
356
358
  allowNestedHeaderLinks: allowNestedHeaderLinks,
357
359
  allowColumnSorting: allowColumnSorting,
358
360
  allowCopyToClipboard: allowCopyToClipboard,
361
+ allowWrapCodeBlock: allowWrapCodeBlock,
359
362
  allowCustomPanels: allowCustomPanels,
360
363
  allowPlaceholderText: allowPlaceholderText,
361
364
  innerRef: this.editorRef,
@@ -386,6 +389,7 @@ export var Renderer = /*#__PURE__*/function (_PureComponent) {
386
389
  return jsx(RendererWrapper, {
387
390
  appearance: appearance,
388
391
  allowCopyToClipboard: allowCopyToClipboard,
392
+ allowWrapCodeBlock: allowWrapCodeBlock,
389
393
  allowPlaceholderText: allowPlaceholderText,
390
394
  allowColumnSorting: allowColumnSorting,
391
395
  allowNestedHeaderLinks: allowNestedHeaderLinks,