@skbkontur/markdown 2.3.0 → 2.4.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skbkontur/markdown",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -52,8 +52,8 @@
52
52
  "peerDependencies": {
53
53
  "@skbkontur/react-ui": ">=4.5.0",
54
54
  "@skbkontur/react-ui-validations": ">=1.12.0",
55
- "react": ">=17",
56
- "react-dom": ">=17"
55
+ "react": ">=18",
56
+ "react-dom": ">=18"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@skbkontur/react-ui": "^4.14.0",
@@ -72,8 +72,8 @@
72
72
  "@swc/plugin-styled-components": "5.0.0",
73
73
  "@types/jest": "29.5.0",
74
74
  "@types/node": "12.0.0",
75
- "@types/react": "17.0.39",
76
- "@types/react-dom": "17.0.25",
75
+ "@types/react": "18.0.28",
76
+ "@types/react-dom": "18.0.11",
77
77
  "@typescript-eslint/eslint-plugin": "5.57.0",
78
78
  "@typescript-eslint/parser": "5.57.0",
79
79
  "@vitejs/plugin-react-swc": "3.7.2",
@@ -99,8 +99,8 @@
99
99
  "lint-staged": "12.3.4",
100
100
  "postcss-styled-syntax": "0.5.0",
101
101
  "prettier": "2.2.1",
102
- "react": "17",
103
- "react-dom": "17",
102
+ "react": "18.3.1",
103
+ "react-dom": "18.3.1",
104
104
  "storybook": "8.2.8",
105
105
  "stylelint": "15.11.0",
106
106
  "stylelint-config-standard": "34.0.0",
@@ -119,7 +119,6 @@
119
119
  }
120
120
  },
121
121
  "resolutions": {
122
- "@types/react": "16.9.0",
123
- "@types/react-dom": "16.9.0"
122
+ "@types/react": "18.0.28"
124
123
  }
125
124
  }
@@ -1,6 +1,6 @@
1
1
  import { FC, ReactNode } from 'react';
2
2
  import { MarkdownEditorProps } from './MarkdownEditor';
3
- import { HorizontalPaddings, ViewMode, MarkdownApi, HideActionsOptions } from './types';
3
+ import { HideActionsOptions, HorizontalPaddings, MarkdownApi, ViewMode } from './types';
4
4
  export interface MarkdownProps extends MarkdownEditorProps {
5
5
  /** Методы апи для загрузки/скачивания файлов и меншена */
6
6
  api?: MarkdownApi;
@@ -62,6 +62,7 @@ export var Markdown = function (props) {
62
62
  var onSelectEmoji = useEmojiLogic(textareaRef.current).onSelectEmoji;
63
63
  usePasteFromClipboard(textareaRef.current, api === null || api === void 0 ? void 0 : api.fileUploadApi, api === null || api === void 0 ? void 0 : api.fileDownloadApi, fileApiUrl);
64
64
  useListenTextareaScroll(resetMention, textareaRef.current);
65
+ var fullscreenTextareaPadding = useFullscreenHorizontalPadding(fullscreen, viewMode, initialWidth);
65
66
  useLayoutEffect(function () {
66
67
  var _a;
67
68
  var textareaNode = (_a = textareaRef.current) === null || _a === void 0 ? void 0 : _a.node;
@@ -79,14 +80,15 @@ export var Markdown = function (props) {
79
80
  }, [isMobile]);
80
81
  useEffect(function () {
81
82
  var _a;
82
- if (fullscreen && isEditMode) {
83
+ if (fullscreen && isEditMode && textareaRef) {
83
84
  var textareaNode = (_a = textareaRef.current) === null || _a === void 0 ? void 0 : _a.node;
84
- textareaNode.focus();
85
- textareaNode.selectionStart = selectionStart !== null && selectionStart !== void 0 ? selectionStart : 0;
86
- textareaNode.selectionEnd = selectionEnd !== null && selectionEnd !== void 0 ? selectionEnd : 0;
85
+ if (textareaNode) {
86
+ textareaNode.focus();
87
+ textareaNode.selectionStart = selectionStart !== null && selectionStart !== void 0 ? selectionStart : 0;
88
+ textareaNode.selectionEnd = selectionEnd !== null && selectionEnd !== void 0 ? selectionEnd : 0;
89
+ }
87
90
  }
88
- }, [fullscreen, isEditMode, selectionEnd, selectionStart]);
89
- var fullscreenTextareaPadding = useFullscreenHorizontalPadding(fullscreen, viewMode, initialWidth);
91
+ }, [fullscreen, isEditMode, selectionEnd, selectionStart, textareaRef]);
90
92
  var horizontalPaddings = {
91
93
  panelPadding: panelHorizontalPadding,
92
94
  fullscreenPadding: fullscreenTextareaPadding,
@@ -95,7 +97,7 @@ export var Markdown = function (props) {
95
97
  React.createElement(Wrapper, __assign({}, getRootProps()),
96
98
  !(hideActionsOptions === null || hideActionsOptions === void 0 ? void 0 : hideActionsOptions.allActions) && (React.createElement(MarkdownActions, { showShortKeys: showShotKeys, textAreaRef: textareaRef, width: width, viewMode: viewMode, loadingFile: requestStatus === RequestStatus.isFetching, fullscreen: fullscreen, selectionStart: selectionStart, selectionEnd: selectionEnd, horizontalPaddings: horizontalPaddings, hideOptions: hideActionsOptions, hasFilesApi: !!(api === null || api === void 0 ? void 0 : api.fileDownloadApi) && !!(api === null || api === void 0 ? void 0 : api.fileUploadApi), isSplitViewAvailable: isSplitViewAvailable, disableFullscreen: isMobile, onOpenFileDialog: open, onChangeViewMode: handleChangeViewMode, onClickFullscreen: handleClickFullscreen, onSelectEmoji: onSelectEmoji })),
97
99
  isEditMode && error && (api === null || api === void 0 ? void 0 : api.getUsersApi) && (renderFilesValidation === null || renderFilesValidation === void 0 ? void 0 : renderFilesValidation(horizontalPaddings, onResetError)),
98
- fullscreen && viewMode === ViewMode.Split && (React.createElement(SplitViewContainer, null,
100
+ fullscreen && viewMode === ViewMode.Split && !fullscreenTextareaPadding && (React.createElement(SplitViewContainer, null,
99
101
  React.createElement(SplitViewEditContainer, null, renderEditContainer()),
100
102
  React.createElement(SplitViewPreviewContainer, { textareaWidth: textareaProps.width }, renderPreview()))),
101
103
  viewMode === ViewMode.Edit && renderEditContainer(),
@@ -175,6 +177,7 @@ export var Markdown = function (props) {
175
177
  setMention(undefined);
176
178
  }
177
179
  function handleClickFullscreen() {
180
+ setViewMode(function (prevState) { return (prevState !== ViewMode.Split && isSplitViewAvailable ? ViewMode.Split : ViewMode.Edit); });
178
181
  setFullScreen(!fullscreen);
179
182
  }
180
183
  };
@@ -21,10 +21,12 @@ export declare const MarkdownPreview: import("styled-components").StyledComponen
21
21
  } & HorizontalPaddings, never>;
22
22
  export declare const MarkdownActionsWrapper: import("styled-components").StyledComponent<"div", MarkdownTheme, {
23
23
  width?: Nullable<number | string>;
24
- } & HorizontalPaddings, never>;
24
+ } & HorizontalPaddings & {
25
+ fullscreen?: boolean | undefined;
26
+ }, never>;
25
27
  export declare const ButtonsWrapper: import("styled-components").StyledComponent<"div", MarkdownTheme, {
26
- width?: Nullable<number | string>;
27
- } & HorizontalPaddings, never>;
28
+ fullscreen?: boolean | undefined;
29
+ }, never>;
28
30
  export declare const ActionsWrapper: import("styled-components").StyledComponent<"div", MarkdownTheme, {}, never>;
29
31
  export declare const MarkdownButtonWrapper: import("styled-components").StyledComponent<typeof Button, MarkdownTheme, {}, never>;
30
32
  export declare const MarkdownButtonIcon: import("styled-components").StyledComponent<"div", MarkdownTheme, {}, never>;
@@ -21,12 +21,18 @@ var panelStyle = function (_a) {
21
21
  var panelPadding = _a.panelPadding, theme = _a.theme;
22
22
  return css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n padding: 6px ", "px;\n background-color: ", ";\n margin-bottom: 12px;\n"], ["\n padding: 6px ", "px;\n background-color: ", ";\n margin-bottom: 12px;\n"])), panelPadding !== null && panelPadding !== void 0 ? panelPadding : 0, theme.colors.panelBg);
23
23
  };
24
+ function getAllowedCssValue(value) {
25
+ return typeof value === 'number' ? value + 'px' : value;
26
+ }
27
+ function getMarkdownActionsPadding(isPadding, padding) {
28
+ return isPadding ? getAllowedCssValue(padding) : 0;
29
+ }
24
30
  export var Wrapper = styled.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n position: relative;\n\n &:focus-visible {\n outline: 1px solid ", ";\n }\n"], ["\n position: relative;\n\n &:focus-visible {\n outline: 1px solid ", ";\n }\n"])), function (p) { return p.theme.colors.brand; });
25
31
  var scrollbarStyle = css(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n height: ", ";\n overflow-y: auto;\n"], ["\n height: ", ";\n overflow-y: auto;\n"])), FULLSCREEN_HEIGHT);
26
32
  export var FlexCenter = styled.div(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n display: flex;\n justify-content: center;\n"], ["\n display: flex;\n justify-content: center;\n"])));
27
33
  export var SplitViewMaxWidth = styled.div(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n max-width: 1580px;\n width: 100%;\n"], ["\n max-width: 1580px;\n width: 100%;\n"])));
28
- export var SplitViewContainer = styled.div(templateObject_6 || (templateObject_6 = __makeTemplateObject(["\n display: flex;\n gap: 32px;\n\n @media (width >= 1980px) {\n gap: '48px';\n }\n"], ["\n display: flex;\n gap: 32px;\n\n @media (width >= 1980px) {\n gap: '48px';\n }\n"])));
29
- export var SplitViewPreviewContainer = styled.div(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n ", "\n\n width: ", ";\n ", ";\n"], ["\n ", "\n\n width: ", ";\n ", ";\n"])), scrollbarStyle, function (p) { var _a; return (_a = p.textareaWidth) !== null && _a !== void 0 ? _a : undefined; }, function (p) { return !p.textareaWidth && 'flex: 1 0 0'; });
34
+ export var SplitViewContainer = styled.div(templateObject_6 || (templateObject_6 = __makeTemplateObject(["\n display: flex;\n gap: 32px;\n\n @media (width >= 1980px) {\n gap: 48px;\n }\n"], ["\n display: flex;\n gap: 32px;\n\n @media (width >= 1980px) {\n gap: 48px;\n }\n"])));
35
+ export var SplitViewPreviewContainer = styled.div(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n ", ";\n\n width: ", ";\n ", ";\n"], ["\n ", ";\n\n width: ", ";\n ", ";\n"])), scrollbarStyle, function (p) { return (p.textareaWidth ? getAllowedCssValue(p.textareaWidth) : undefined); }, function (p) { return !p.textareaWidth && 'flex: 1 0 0'; });
30
36
  export var SplitViewEditContainer = styled.div(templateObject_8 || (templateObject_8 = __makeTemplateObject(["\n width: 100%;\n min-width: 420px;\n flex: 1 0 0;\n"], ["\n width: 100%;\n min-width: 420px;\n flex: 1 0 0;\n"])));
31
37
  export var Avatar = styled.img.attrs({ alt: '' })(templateObject_9 || (templateObject_9 = __makeTemplateObject(["\n flex-shrink: 0;\n box-sizing: border-box;\n border: 1px solid ", ";\n border-radius: 50%;\n object-fit: cover;\n"], ["\n flex-shrink: 0;\n box-sizing: border-box;\n border: 1px solid ", ";\n border-radius: 50%;\n object-fit: cover;\n"])), function (props) { return props.theme.colors.grayDefault; });
32
38
  export var UserWrapper = styled.div(templateObject_10 || (templateObject_10 = __makeTemplateObject(["\n width: 244px;\n display: flex;\n align-items: center;\n gap: 12px;\n"], ["\n width: 244px;\n display: flex;\n align-items: center;\n gap: 12px;\n"])));
@@ -36,13 +42,13 @@ export var MarkdownPreview = styled.div(templateObject_13 || (templateObject_13
36
42
  var _b;
37
43
  var panelPadding = _a.panelPadding, fullscreenPadding = _a.fullscreenPadding;
38
44
  return (_b = fullscreenPadding !== null && fullscreenPadding !== void 0 ? fullscreenPadding : panelPadding) !== null && _b !== void 0 ? _b : 8;
39
- }, function (p) { return p.width && "width: ".concat(typeof p.width === 'string' ? p.width : "".concat(p.width, "px"), ";"); });
40
- export var MarkdownActionsWrapper = styled.div(templateObject_14 || (templateObject_14 = __makeTemplateObject(["\n padding: ", " ", "px 0;\n margin-bottom: 4px;\n box-sizing: border-box;\n ", "\n ", "\n \n a {\n border: none !important;\n text-decoration: none !important;\n }\n"], ["\n padding: ", " ", "px 0;\n margin-bottom: 4px;\n box-sizing: border-box;\n ", "\n ", "\n \n a {\n border: none !important;\n text-decoration: none !important;\n }\n"])), function (p) { return (p.fullscreenPadding ? '16px' : 0); }, function (p) { var _a; return (_a = p.fullscreenPadding) !== null && _a !== void 0 ? _a : 0; }, function (p) { return p.width && "width: ".concat(typeof p.width === 'string' ? p.width : "".concat(p.width, "px"), ";"); }, function (_a) {
41
- var theme = _a.theme, panelPadding = _a.panelPadding, fullscreenPadding = _a.fullscreenPadding;
42
- if (panelPadding && !fullscreenPadding)
45
+ }, function (p) { return p.width && "width: ".concat(getAllowedCssValue(p.width), ";"); });
46
+ export var MarkdownActionsWrapper = styled.div(templateObject_14 || (templateObject_14 = __makeTemplateObject(["\n padding: ", "\n ", " 0;\n margin-bottom: ", "px;\n box-sizing: border-box;\n ", "\n ", "\n \n a {\n border: none !important;\n text-decoration: none !important;\n }\n"], ["\n padding: ", "\n ", " 0;\n margin-bottom: ", "px;\n box-sizing: border-box;\n ", "\n ", "\n \n a {\n border: none !important;\n text-decoration: none !important;\n }\n"])), function (p) { return getMarkdownActionsPadding(!!p.fullscreenPadding, '16px'); }, function (p) { return getMarkdownActionsPadding(!!p.fullscreenPadding, p.fullscreenPadding); }, function (p) { return (p.fullscreen ? 12 : 4); }, function (p) { return p.width && "width: ".concat(getAllowedCssValue(p.width), ";"); }, function (_a) {
47
+ var theme = _a.theme, panelPadding = _a.panelPadding, fullscreen = _a.fullscreen;
48
+ if (panelPadding && !fullscreen)
43
49
  return panelStyle({ theme: theme, panelPadding: panelPadding });
44
50
  });
45
- export var ButtonsWrapper = styled.div(templateObject_15 || (templateObject_15 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n margin: 0 -7px;\n border-bottom: ", ";\n"], ["\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n margin: 0 -7px;\n border-bottom: ", ";\n"])), function (p) { return (p.fullscreenPadding ? "1px solid ".concat(p.theme.colors.grayDefault) : 'none'); });
51
+ export var ButtonsWrapper = styled.div(templateObject_15 || (templateObject_15 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n margin: 0 -7px;\n border-bottom: ", ";\n"], ["\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n margin: 0 -7px;\n border-bottom: ", ";\n"])), function (p) { return (p.fullscreen ? "1px solid ".concat(p.theme.colors.grayDefault) : 'none'); });
46
52
  export var ActionsWrapper = styled.div(templateObject_16 || (templateObject_16 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n"], ["\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n"])));
47
53
  export var MarkdownButtonWrapper = styled(Button)(templateObject_17 || (templateObject_17 = __makeTemplateObject(["\n button {\n padding: 4px;\n border: none;\n box-sizing: border-box;\n }\n"], ["\n button {\n padding: 4px;\n border: none;\n box-sizing: border-box;\n }\n"])));
48
54
  export var MarkdownButtonIcon = styled.div(templateObject_18 || (templateObject_18 = __makeTemplateObject(["\n height: 24px;\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n"], ["\n height: 24px;\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n"])));
@@ -13,7 +13,7 @@ import { Dropdown, Hint } from '@skbkontur/react-ui';
13
13
  import React from 'react';
14
14
  import { COMMONMARK_HELP_URL } from './constants';
15
15
  import { EmojiDropdown } from './Emoji/EmojiDropdown';
16
- import { ActionsWrapper, ButtonsWrapper, MarkdownDropdown, MarkdownMenuItem, MarkdownActionsWrapper, } from './Markdown.styled';
16
+ import { ActionsWrapper, ButtonsWrapper, MarkdownActionsWrapper, MarkdownDropdown, MarkdownMenuItem, } from './Markdown.styled';
17
17
  import { MarkdownFormatButton } from './MarkdownHelpers/MarkdownFormatButton';
18
18
  import { setMarkdown } from './MarkdownHelpers/markdownHelpers';
19
19
  import { markdownHelpHeaders, markdownHelpLists, markdownHelpOther, markdownHelpText } from './MarkdownHelpItems';
@@ -29,8 +29,8 @@ import { ToolPencil } from '../MarkdownIcons/ToolPencil';
29
29
  export var MarkdownActions = function (_a) {
30
30
  var textAreaRef = _a.textAreaRef, selectionStart = _a.selectionStart, selectionEnd = _a.selectionEnd, loadingFile = _a.loadingFile, onOpenFileDialog = _a.onOpenFileDialog, onClickFullscreen = _a.onClickFullscreen, fullscreen = _a.fullscreen, viewMode = _a.viewMode, onChangeViewMode = _a.onChangeViewMode, horizontalPaddings = _a.horizontalPaddings, hasFilesApi = _a.hasFilesApi, width = _a.width, showShortKeys = _a.showShortKeys, hideOptions = _a.hideOptions, onSelectEmoji = _a.onSelectEmoji, isSplitViewAvailable = _a.isSplitViewAvailable, disableFullscreen = _a.disableFullscreen;
31
31
  var isPreviewMode = viewMode === ViewMode.Preview;
32
- return (React.createElement(MarkdownActionsWrapper, __assign({}, horizontalPaddings, { width: width }),
33
- React.createElement(ButtonsWrapper, __assign({}, horizontalPaddings),
32
+ return (React.createElement(MarkdownActionsWrapper, __assign({}, horizontalPaddings, { width: width, fullscreen: fullscreen }),
33
+ React.createElement(ButtonsWrapper, { fullscreen: fullscreen },
34
34
  React.createElement(ActionsWrapper, null,
35
35
  !(hideOptions === null || hideOptions === void 0 ? void 0 : hideOptions.heading) && (React.createElement(MarkdownDropdown, null,
36
36
  React.createElement(Hint, { text: "\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A", pos: "top left" },
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const EmptyPreview: () => JSX.Element;
@@ -1,4 +1,4 @@
1
- import { useCallback, useEffect, useState } from 'react';
1
+ import { useCallback, useEffect, useLayoutEffect, useState } from 'react';
2
2
  import { setMarkdownPastedHtml } from './markdownHelpers';
3
3
  import { MENTION_WRAPPER_ID_POSTFIX } from '../constants';
4
4
  import { ViewMode } from '../types';
@@ -73,7 +73,7 @@ export var useListenTextareaScroll = function (setMention, textarea) {
73
73
  };
74
74
  export var useFullscreenHorizontalPadding = function (fullscreen, viewMode, textareaWidth) {
75
75
  var _a = useState(), padding = _a[0], setPadding = _a[1];
76
- useEffect(function () {
76
+ useLayoutEffect(function () {
77
77
  if (!fullscreen || !textareaWidth || viewMode === ViewMode.Split) {
78
78
  setPadding(undefined);
79
79
  return;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const AttachLink: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const AttachPaperclip: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const CheckedList: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const Collapse: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const DocIcon: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const EmojiFace: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const EmptyPreviewArrow: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const Expand: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const EyeOpen: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const List: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const NumberedList: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const SplitView: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const Table: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const ToolPencil: () => JSX.Element;
@@ -1,2 +1,3 @@
1
+ /// <reference types="react" />
1
2
  import { MarkdownLinkProps } from '../types';
2
3
  export declare const MarkdownLink: ({ href, children, target }: MarkdownLinkProps) => JSX.Element;