@skbkontur/markdown 2.0.0 → 2.2.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/README.md +27 -26
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/package.json +7 -5
- package/src/Markdown/Emoji/Emoji.logic.d.ts +15 -0
- package/src/Markdown/Emoji/Emoji.logic.js +12 -0
- package/src/Markdown/Emoji/Emoji.styled.d.ts +5 -0
- package/src/Markdown/Emoji/Emoji.styled.js +28 -0
- package/src/Markdown/Emoji/EmojiDropdown.d.ts +9 -0
- package/src/Markdown/Emoji/EmojiDropdown.js +23 -0
- package/src/Markdown/Emoji/helpers.d.ts +1 -0
- package/src/Markdown/Emoji/helpers.js +4 -0
- package/src/Markdown/Markdown.creevey.js +28 -21
- package/src/Markdown/Markdown.d.ts +5 -5
- package/src/Markdown/Markdown.js +8 -2
- package/src/Markdown/Markdown.styled.js +1 -1
- package/src/Markdown/MarkdownActions.d.ts +4 -2
- package/src/Markdown/MarkdownActions.js +24 -7
- package/src/Markdown/MarkdownMention.js +1 -1
- package/src/Markdown/types.d.ts +2 -0
- package/src/MarkdownIcons/EmojiFace.d.ts +1 -0
- package/src/MarkdownIcons/EmojiFace.js +11 -0
- package/src/styles/theme.d.ts +1 -0
- package/src/styles/theme.js +18 -1
- package/src/styles/types.d.ts +3 -1
package/README.md
CHANGED
|
@@ -15,48 +15,49 @@
|
|
|
15
15
|
### [Примеры использования](https://stackblitz.com/edit/skbkontur-markdown?file=src%2FApp.tsx)
|
|
16
16
|
|
|
17
17
|
### Markdown
|
|
18
|
+
|
|
18
19
|
#### Props
|
|
19
20
|
|
|
20
|
-
| prop | type
|
|
21
|
-
|
|
22
|
-
| api? | MarkdownApi
|
|
23
|
-
| fileApiUrl? | string
|
|
24
|
-
| profileUrl? | string
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
21
|
+
| prop | type | default | description |
|
|
22
|
+
| ----------------------- | ------------------------------------------------------------------------- | --------- | ----------------------------------------------------------------------------------- |
|
|
23
|
+
| api? | MarkdownApi | undefined | Методы апи для загрузки/скачивания файлов и меншена |
|
|
24
|
+
| fileApiUrl? | string | undefined | Url апи для файлов |
|
|
25
|
+
| profileUrl? | string | undefined | Url для профиля сотрудника |
|
|
26
|
+
| markdownViewer? | (value: string) => ReactNode | undefined | Превьювер мардауна, по умолчанию используется MarkdownViewer |
|
|
27
|
+
| panelHorizontalPadding? | number | undefined | Padding markdownActions (кнопки помощи форматирования текста), включает режим panel |
|
|
28
|
+
| renderFilesValidation? | (horizontalPadding: HorizontalPaddings, onReset: () => void) => ReactNode | undefined | Render валидации файла, если она нужна, максимальный размер файла = 10mb |
|
|
29
|
+
| hideActionsOptions | object (HideActionsOptions) | undefined | Скрыть отдельные кнопки на панели действий |
|
|
29
30
|
|
|
30
31
|
#### MarkdownApi
|
|
31
32
|
|
|
32
|
-
| prop | type
|
|
33
|
-
|
|
34
|
-
| fileDownloadApi? |(id: string) => Promise<File
|
|
35
|
-
| fileUploadApi? |(file: File) => Promise<RefItem
|
|
36
|
-
| getUsersApi? |(query: string) => Promise<User[]
|
|
33
|
+
| prop | type | default | description |
|
|
34
|
+
| ---------------- | ---------------------------------- | --------- | ---------------------------------------- |
|
|
35
|
+
| fileDownloadApi? | (id: string) => Promise<File> | undefined | Метод для загрузки файла |
|
|
36
|
+
| fileUploadApi? | (file: File) => Promise<RefItem> | undefined | Метод для скачивания файла |
|
|
37
|
+
| getUsersApi? | (query: string) => Promise<User[]> | undefined | Метод для получения списка пользователей |
|
|
37
38
|
|
|
38
39
|
#### HorizontalPaddings
|
|
39
40
|
|
|
40
|
-
| prop | type
|
|
41
|
-
|
|
41
|
+
| prop | type | default |
|
|
42
|
+
| ------------------ | ------ | --------- |
|
|
42
43
|
| fullscreenPadding? | number | undefined |
|
|
43
|
-
| panelPadding? | nmber
|
|
44
|
+
| panelPadding? | nmber | undefined |
|
|
44
45
|
|
|
45
46
|
#### MarkdownTheme
|
|
46
47
|
|
|
47
|
-
| prop
|
|
48
|
-
|
|
|
49
|
-
| colors
|
|
50
|
-
| elementsFontSize
|
|
51
|
-
| elementsLineHeight
|
|
52
|
-
| themeMode
|
|
53
|
-
| droppablePlaceholderBgImage |string| Значение background-image для DroppablePlaceholder, если нужна пунктирная обводка в состоянии onDrag |
|
|
54
|
-
| reactUiTheme
|
|
48
|
+
| prop | type | description |
|
|
49
|
+
| --------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------ |
|
|
50
|
+
| colors | ColorScheme | Цветовая схема |
|
|
51
|
+
| elementsFontSize | string | font-size переменных темы react-ui: tabFontSize, btnFontSizeSmall, hintFontSize, checkboxBoxSize, menuItemFontSize |
|
|
52
|
+
| elementsLineHeight | string | line-height переменных темы react-ui: tabLineHeight |
|
|
53
|
+
| themeMode | string | Темный/светлый режим темы |
|
|
54
|
+
| droppablePlaceholderBgImage | string | Значение background-image для DroppablePlaceholder, если нужна пунктирная обводка в состоянии onDrag |
|
|
55
|
+
| reactUiTheme | string | Тема react-ui |
|
|
55
56
|
|
|
56
57
|
#### ColorScheme
|
|
57
58
|
|
|
58
59
|
| prop | type | description |
|
|
59
|
-
|
|
60
|
+
| -------------- | ------ | ---------------------------------------------------------------------- |
|
|
60
61
|
| brand | string | Цвет сервиса |
|
|
61
62
|
| disabledButton | string | Цвет текста кнопки для переменной btnDisabledTextColor |
|
|
62
63
|
| grayDefault | string | Основной серый цвет, используется в кнопках, чекбоксах, иконках и т.д. |
|
package/index.d.ts
CHANGED
|
@@ -2,6 +2,6 @@ export { Markdown, MarkdownProps } from './src/Markdown/Markdown';
|
|
|
2
2
|
export { MarkdownCombination } from './src/MarkdownCombination/MarkdownCombination';
|
|
3
3
|
export { markdownHelpItems, markdownHelpFiles, markdownHelpLists, markdownHelpOther, } from './src/Markdown/MarkdownHelpItems';
|
|
4
4
|
export { MarkdownViewer } from './src/MarkdownViewer/MarkdownViewer';
|
|
5
|
-
export { MarkdownApi, RefItem, User, Token, HorizontalPaddings, ViewMode } from '././src/Markdown/types';
|
|
5
|
+
export { MarkdownApi, RefItem, User, Token, HorizontalPaddings, ViewMode, HideActionsOptions, } from '././src/Markdown/types';
|
|
6
6
|
export { ThemeMode, ColorScheme } from './src/styles/types';
|
|
7
7
|
export { MarkdownTheme, MarkdownThemeProvider, MarkdownThemeConsumer, MarkdownThemeContext } from './src/styles/theme';
|
package/index.js
CHANGED
|
@@ -2,5 +2,5 @@ export { Markdown } from './src/Markdown/Markdown';
|
|
|
2
2
|
export { MarkdownCombination } from './src/MarkdownCombination/MarkdownCombination';
|
|
3
3
|
export { markdownHelpItems, markdownHelpFiles, markdownHelpLists, markdownHelpOther, } from './src/Markdown/MarkdownHelpItems';
|
|
4
4
|
export { MarkdownViewer } from './src/MarkdownViewer/MarkdownViewer';
|
|
5
|
-
export { ViewMode } from '././src/Markdown/types';
|
|
5
|
+
export { ViewMode, } from '././src/Markdown/types';
|
|
6
6
|
export { MarkdownThemeProvider, MarkdownThemeConsumer, MarkdownThemeContext } from './src/styles/theme';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skbkontur/markdown",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"registry": "https://registry.npmjs.org/",
|
|
6
6
|
"access": "public"
|
|
@@ -10,9 +10,12 @@
|
|
|
10
10
|
"license": "UNLICENSED",
|
|
11
11
|
"author": "tsypilov",
|
|
12
12
|
"dependencies": {
|
|
13
|
+
"@emoji-mart/data": "1.2.1",
|
|
14
|
+
"@emoji-mart/react": "1.1.1",
|
|
13
15
|
"@types/styled-components": "5.1.26",
|
|
14
16
|
"@types/turndown": "^5.0.1",
|
|
15
17
|
"@types/uuid": "^9.0.1",
|
|
18
|
+
"emoji-mart": "5.6.0",
|
|
16
19
|
"react-dropzone": "^14.2.3",
|
|
17
20
|
"react-foco": "^1.3.1",
|
|
18
21
|
"react-markdown": "^8.0.7",
|
|
@@ -94,14 +97,13 @@
|
|
|
94
97
|
"jest-teamcity-reporter": "0.9.0",
|
|
95
98
|
"lerna": "5.0.0",
|
|
96
99
|
"lint-staged": "12.3.4",
|
|
100
|
+
"postcss-styled-syntax": "0.5.0",
|
|
97
101
|
"prettier": "2.2.1",
|
|
98
102
|
"react": "17",
|
|
99
103
|
"react-dom": "17",
|
|
100
104
|
"storybook": "8.2.8",
|
|
101
|
-
"stylelint": "
|
|
102
|
-
"stylelint-config-standard": "
|
|
103
|
-
"stylelint-config-styled-components": "^0.1.1",
|
|
104
|
-
"stylelint-processor-styled-components": "^1.10.0",
|
|
105
|
+
"stylelint": "15.11.0",
|
|
106
|
+
"stylelint-config-standard": "34.0.0",
|
|
105
107
|
"typescript": "4.9.4",
|
|
106
108
|
"vite": "5.4.11"
|
|
107
109
|
},
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Textarea } from '@skbkontur/react-ui';
|
|
2
|
+
import { Nullable } from '../types';
|
|
3
|
+
/** FIXME: разобраться как достать тип EmojiData из либы emoji-mart */
|
|
4
|
+
export interface EmojiData {
|
|
5
|
+
emoticons: string[];
|
|
6
|
+
id: string;
|
|
7
|
+
keywords: string[];
|
|
8
|
+
name: string;
|
|
9
|
+
native: string;
|
|
10
|
+
shortcodes: string;
|
|
11
|
+
unified: string;
|
|
12
|
+
}
|
|
13
|
+
export declare const useEmojiLogic: (textarea: Nullable<Textarea>) => {
|
|
14
|
+
onSelectEmoji: (emoji: EmojiData) => void;
|
|
15
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { setMarkdownPastedHtml } from '../MarkdownHelpers/markdownHelpers';
|
|
2
|
+
export var useEmojiLogic = function (textarea) {
|
|
3
|
+
var onSelectEmoji = function (emoji) {
|
|
4
|
+
if (textarea) {
|
|
5
|
+
var textareaNode = textarea.node;
|
|
6
|
+
setMarkdownPastedHtml(emoji.native, textareaNode);
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
return {
|
|
10
|
+
onSelectEmoji: onSelectEmoji,
|
|
11
|
+
};
|
|
12
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Все доступные переменные для кастомизации стилей можно посмотреть здесь:
|
|
3
|
+
* https://github.com/missive/emoji-mart/blob/main/packages/emoji-mart-website/example-custom-styles.html
|
|
4
|
+
*/
|
|
5
|
+
export declare const EmojiPickerWrapper: import("styled-components").StyledComponent<"div", import("../../..").MarkdownTheme, {}, never>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
|
|
2
|
+
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
3
|
+
return cooked;
|
|
4
|
+
};
|
|
5
|
+
import { getColor } from './helpers';
|
|
6
|
+
import styled from '../../styles/styled-components';
|
|
7
|
+
/**
|
|
8
|
+
* Все доступные переменные для кастомизации стилей можно посмотреть здесь:
|
|
9
|
+
* https://github.com/missive/emoji-mart/blob/main/packages/emoji-mart-website/example-custom-styles.html
|
|
10
|
+
*/
|
|
11
|
+
/* stylelint-disable function-name-case */
|
|
12
|
+
export var EmojiPickerWrapper = styled.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n em-emoji-picker {\n --font-family: inherit;\n --shadow: unset;\n --rgb-accent: ", ";\n --color-border: ", ";\n --rgb-background: ", ";\n --rgb-input: ", ";\n --rgb-color: ", ";\n\n max-height: 300px;\n }\n"], ["\n em-emoji-picker {\n --font-family: inherit;\n --shadow: unset;\n --rgb-accent: ", ";\n --color-border: ", ";\n --rgb-background: ", ";\n --rgb-input: ", ";\n --rgb-color: ", ";\n\n max-height: 300px;\n }\n"])), function (_a) {
|
|
13
|
+
var theme = _a.theme;
|
|
14
|
+
return getColor(theme.colors.brand);
|
|
15
|
+
}, function (_a) {
|
|
16
|
+
var theme = _a.theme;
|
|
17
|
+
return getColor(theme.colors.grayDefault);
|
|
18
|
+
}, function (_a) {
|
|
19
|
+
var theme = _a.theme;
|
|
20
|
+
return getColor(theme.colors.emojiPickerBackgroundRGBColor);
|
|
21
|
+
}, function (_a) {
|
|
22
|
+
var theme = _a.theme;
|
|
23
|
+
return getColor(theme.colors.emojiPickerBackgroundRGBColor);
|
|
24
|
+
}, function (_a) {
|
|
25
|
+
var theme = _a.theme;
|
|
26
|
+
return getColor(theme.colors.text);
|
|
27
|
+
});
|
|
28
|
+
var templateObject_1;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import data from '@emoji-mart/data';
|
|
2
|
+
import EmojiPicker from '@emoji-mart/react';
|
|
3
|
+
import { DropdownMenu } from '@skbkontur/react-ui';
|
|
4
|
+
import React, { useRef } from 'react';
|
|
5
|
+
import { EmojiPickerWrapper } from './Emoji.styled';
|
|
6
|
+
import { EmojiFace } from '../../MarkdownIcons/EmojiFace';
|
|
7
|
+
import { DEFAULT_MARKDOWN_THEME, MarkdownThemeConsumer } from '../../styles/theme';
|
|
8
|
+
import { MarkdownFormatButton } from '../MarkdownHelpers/MarkdownFormatButton';
|
|
9
|
+
export var EmojiDropdown = function (_a) {
|
|
10
|
+
var isPreviewMode = _a.isPreviewMode, showShortKey = _a.showShortKey, onSelect = _a.onSelect;
|
|
11
|
+
var dropdownMenuRef = useRef(null);
|
|
12
|
+
return (React.createElement(MarkdownThemeConsumer, null, function (theme) {
|
|
13
|
+
var currentTheme = theme !== null && theme !== void 0 ? theme : DEFAULT_MARKDOWN_THEME;
|
|
14
|
+
return (React.createElement(DropdownMenu, { ref: dropdownMenuRef, caption: React.createElement(MarkdownFormatButton, { showShortKey: showShortKey, hintText: "Emoji", disabled: isPreviewMode, icon: React.createElement(EmojiFace, null), text: "Emoji" }) },
|
|
15
|
+
React.createElement(EmojiPickerWrapper, null,
|
|
16
|
+
React.createElement(EmojiPicker, { data: data, locale: "ru", theme: currentTheme.themeMode, skinTonePosition: "none", previewPosition: "none", onEmojiSelect: handleSelectEmoji }))));
|
|
17
|
+
}));
|
|
18
|
+
function handleSelectEmoji(data) {
|
|
19
|
+
var _a;
|
|
20
|
+
onSelect(data);
|
|
21
|
+
(_a = dropdownMenuRef.current) === null || _a === void 0 ? void 0 : _a.close();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getColor: (color: string) => string;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var RGB_KEY = 'rgb';
|
|
2
|
+
var regExp = /\((.*)\)/;
|
|
3
|
+
var rgbDefaultWhite = '255, 255, 255';
|
|
4
|
+
export var getColor = function (color) { var _a, _b; return color.startsWith(RGB_KEY) ? (_b = (_a = color.match(regExp)) === null || _a === void 0 ? void 0 : _a.pop()) !== null && _b !== void 0 ? _b : rgbDefaultWhite : "from ".concat(color, " r g b / 1"); };
|
|
@@ -73,38 +73,38 @@ kind('Markdown', function () {
|
|
|
73
73
|
var setStoryParameters = _a.setStoryParameters;
|
|
74
74
|
setStoryParameters({ skip: !!process.env.STORYBOOK_TEAMCITY_VERSION });
|
|
75
75
|
test('markdownTests', function () {
|
|
76
|
-
var _a, _b, _c, _d, _e;
|
|
76
|
+
var _a, _b, _c, _d, _e, _f;
|
|
77
77
|
return __awaiter(this, void 0, void 0, function () {
|
|
78
|
-
var textarea, buttons, openedDropdown, newButtons, h1FromButton, h1FromKeyboard, boldFromButton, boldFromKeyboard;
|
|
79
|
-
return __generator(this, function (
|
|
80
|
-
switch (
|
|
78
|
+
var textarea, buttons, openedDropdown, newButtons, h1FromButton, h1FromKeyboard, boldFromButton, boldFromKeyboard, openedEmojiPicker;
|
|
79
|
+
return __generator(this, function (_g) {
|
|
80
|
+
switch (_g.label) {
|
|
81
81
|
case 0: return [4 /*yield*/, this.browser.findElement({ tagName: 'textarea' })];
|
|
82
82
|
case 1:
|
|
83
|
-
textarea =
|
|
83
|
+
textarea = _g.sent();
|
|
84
84
|
return [4 /*yield*/, this.browser.findElements({ css: 'button[class*="react-ui"]' })];
|
|
85
85
|
case 2:
|
|
86
|
-
buttons =
|
|
86
|
+
buttons = _g.sent();
|
|
87
87
|
return [4 /*yield*/, this.browser.actions().click(textarea).perform()];
|
|
88
88
|
case 3:
|
|
89
|
-
|
|
89
|
+
_g.sent();
|
|
90
90
|
return [4 /*yield*/, this.browser.actions().sendKeys('Заголовок').keyDown(this.keys.CONTROL).sendKeys('a').perform()];
|
|
91
91
|
case 4:
|
|
92
|
-
|
|
92
|
+
_g.sent();
|
|
93
93
|
return [4 /*yield*/, this.browser.actions().click(buttons[0]).perform()];
|
|
94
94
|
case 5:
|
|
95
|
-
|
|
95
|
+
_g.sent();
|
|
96
96
|
return [4 /*yield*/, ((_a = this.captureElement) === null || _a === void 0 ? void 0 : _a.takeScreenshot())];
|
|
97
97
|
case 6:
|
|
98
|
-
openedDropdown =
|
|
98
|
+
openedDropdown = _g.sent();
|
|
99
99
|
return [4 /*yield*/, this.browser.findElements({ css: 'button[class*="react-ui"]' })];
|
|
100
100
|
case 7:
|
|
101
|
-
newButtons =
|
|
101
|
+
newButtons = _g.sent();
|
|
102
102
|
return [4 /*yield*/, this.browser.actions().click(newButtons[1]).perform()];
|
|
103
103
|
case 8:
|
|
104
|
-
|
|
104
|
+
_g.sent();
|
|
105
105
|
return [4 /*yield*/, ((_b = this.captureElement) === null || _b === void 0 ? void 0 : _b.takeScreenshot())];
|
|
106
106
|
case 9:
|
|
107
|
-
h1FromButton =
|
|
107
|
+
h1FromButton = _g.sent();
|
|
108
108
|
return [4 /*yield*/, this.browser
|
|
109
109
|
.actions()
|
|
110
110
|
.keyDown(this.keys.CONTROL)
|
|
@@ -117,10 +117,10 @@ kind('Markdown', function () {
|
|
|
117
117
|
.sendKeys('1')
|
|
118
118
|
.perform()];
|
|
119
119
|
case 10:
|
|
120
|
-
|
|
120
|
+
_g.sent();
|
|
121
121
|
return [4 /*yield*/, ((_c = this.captureElement) === null || _c === void 0 ? void 0 : _c.takeScreenshot())];
|
|
122
122
|
case 11:
|
|
123
|
-
h1FromKeyboard =
|
|
123
|
+
h1FromKeyboard = _g.sent();
|
|
124
124
|
return [4 /*yield*/, this.browser
|
|
125
125
|
.actions()
|
|
126
126
|
.keyDown(this.keys.CONTROL)
|
|
@@ -131,10 +131,10 @@ kind('Markdown', function () {
|
|
|
131
131
|
.click(buttons[1])
|
|
132
132
|
.perform()];
|
|
133
133
|
case 12:
|
|
134
|
-
|
|
134
|
+
_g.sent();
|
|
135
135
|
return [4 /*yield*/, ((_d = this.captureElement) === null || _d === void 0 ? void 0 : _d.takeScreenshot())];
|
|
136
136
|
case 13:
|
|
137
|
-
boldFromButton =
|
|
137
|
+
boldFromButton = _g.sent();
|
|
138
138
|
return [4 /*yield*/, this.browser
|
|
139
139
|
.actions()
|
|
140
140
|
.keyDown(this.keys.CONTROL)
|
|
@@ -147,19 +147,26 @@ kind('Markdown', function () {
|
|
|
147
147
|
.sendKeys('b')
|
|
148
148
|
.perform()];
|
|
149
149
|
case 14:
|
|
150
|
-
|
|
150
|
+
_g.sent();
|
|
151
151
|
return [4 /*yield*/, ((_e = this.captureElement) === null || _e === void 0 ? void 0 : _e.takeScreenshot())];
|
|
152
152
|
case 15:
|
|
153
|
-
boldFromKeyboard =
|
|
153
|
+
boldFromKeyboard = _g.sent();
|
|
154
|
+
return [4 /*yield*/, this.browser.actions().click(buttons[12]).perform()];
|
|
155
|
+
case 16:
|
|
156
|
+
_g.sent();
|
|
157
|
+
return [4 /*yield*/, ((_f = this.captureElement) === null || _f === void 0 ? void 0 : _f.takeScreenshot())];
|
|
158
|
+
case 17:
|
|
159
|
+
openedEmojiPicker = _g.sent();
|
|
154
160
|
return [4 /*yield*/, this.expect({
|
|
155
161
|
openedDropdown: openedDropdown,
|
|
156
162
|
h1FromButton: h1FromButton,
|
|
157
163
|
h1FromKeyboard: h1FromKeyboard,
|
|
158
164
|
boldFromButton: boldFromButton,
|
|
159
165
|
boldFromKeyboard: boldFromKeyboard,
|
|
166
|
+
openedEmojiPicker: openedEmojiPicker,
|
|
160
167
|
}).to.matchImages()];
|
|
161
|
-
case
|
|
162
|
-
|
|
168
|
+
case 18:
|
|
169
|
+
_g.sent();
|
|
163
170
|
return [2 /*return*/];
|
|
164
171
|
}
|
|
165
172
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FC, ReactNode } from 'react';
|
|
2
2
|
import { MarkdownEditorProps } from './MarkdownEditor';
|
|
3
|
-
import { HorizontalPaddings, MarkdownApi } from './types';
|
|
3
|
+
import { HorizontalPaddings, ViewMode, MarkdownApi, HideActionsOptions } from './types';
|
|
4
4
|
export interface MarkdownProps extends MarkdownEditorProps {
|
|
5
5
|
/** Методы апи для загрузки/скачивания файлов и меншена */
|
|
6
6
|
api?: MarkdownApi;
|
|
@@ -8,12 +8,12 @@ export interface MarkdownProps extends MarkdownEditorProps {
|
|
|
8
8
|
borderless?: boolean;
|
|
9
9
|
/** Url апи для файлов */
|
|
10
10
|
fileApiUrl?: string;
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
/** Скрыть панель действий (кнопки помощи форматирования текста) */
|
|
14
|
-
hideMarkdownActions?: boolean;
|
|
11
|
+
/** Скрывать выборочно опции */
|
|
12
|
+
hideActionsOptions?: HideActionsOptions;
|
|
15
13
|
/** Превьювер мардауна, по умолчанию используется MarkdownViewer */
|
|
16
14
|
markdownViewer?: (value: string) => ReactNode;
|
|
15
|
+
/** Колбек, срабатывает на изменение режима редактирования или просмотра */
|
|
16
|
+
onChangeViewMode?: (mode: ViewMode) => void;
|
|
17
17
|
/** Padding markdownActions (кнопки помощи форматирования текста), включает режим panel */
|
|
18
18
|
panelHorizontalPadding?: number;
|
|
19
19
|
/** Url для профиля сотрудника */
|
package/src/Markdown/Markdown.js
CHANGED
|
@@ -25,6 +25,7 @@ import { HideBodyVerticalScroll } from '@skbkontur/react-ui/internal/HideBodyVer
|
|
|
25
25
|
import React, { useEffect, useLayoutEffect, useRef, useState, } from 'react';
|
|
26
26
|
import Foco from 'react-foco/lib';
|
|
27
27
|
import { MENTION_WRAPPER_ID_POSTFIX } from './constants';
|
|
28
|
+
import { useEmojiLogic } from './Emoji/Emoji.logic';
|
|
28
29
|
import { useFileLogic } from './Files/Files.logic';
|
|
29
30
|
import { DroppablePlaceholder, getMarkdownReactUiTheme, MarkdownEditorBlock, MarkdownPreview, MentionWrapper, Wrapper, } from './Markdown.styled';
|
|
30
31
|
import { MarkdownActions } from './MarkdownActions';
|
|
@@ -41,7 +42,7 @@ import { ThemeProvider } from '../styles/styled-components';
|
|
|
41
42
|
import { DEFAULT_MARKDOWN_THEME, MarkdownThemeConsumer } from '../styles/theme';
|
|
42
43
|
export var Markdown = function (props) {
|
|
43
44
|
var _a;
|
|
44
|
-
var panelHorizontalPadding = props.panelHorizontalPadding,
|
|
45
|
+
var panelHorizontalPadding = props.panelHorizontalPadding, onClick = props.onClick, onChange = props.onChange, onSelect = props.onSelect, markdownViewer = props.markdownViewer, renderFilesValidation = props.renderFilesValidation, fileApiUrl = props.fileApiUrl, profileUrl = props.profileUrl, api = props.api, borderless = props.borderless, _b = props.showShotKeys, showShotKeys = _b === void 0 ? true : _b, hideActionsOptions = props.hideActionsOptions, onChangeViewMode = props.onChangeViewMode, textareaProps = __rest(props, ["panelHorizontalPadding", "onClick", "onChange", "onSelect", "markdownViewer", "renderFilesValidation", "fileApiUrl", "profileUrl", "api", "borderless", "showShotKeys", "hideActionsOptions", "onChangeViewMode"]);
|
|
45
46
|
var textareaRef = useRef(null);
|
|
46
47
|
var _c = useState(), mention = _c[0], setMention = _c[1];
|
|
47
48
|
var _d = useState(ViewMode.Edit), viewMode = _d[0], setViewMode = _d[1];
|
|
@@ -53,6 +54,7 @@ export var Markdown = function (props) {
|
|
|
53
54
|
var isEditMode = viewMode === ViewMode.Edit;
|
|
54
55
|
var width = fullscreen ? "100%" : textareaProps === null || textareaProps === void 0 ? void 0 : textareaProps.width;
|
|
55
56
|
var _j = useFileLogic(api === null || api === void 0 ? void 0 : api.fileUploadApi, api === null || api === void 0 ? void 0 : api.fileDownloadApi, fileApiUrl, textareaRef.current, selectionStart, !isEditMode), getRootProps = _j.getRootProps, isDragActive = _j.isDragActive, requestStatus = _j.requestStatus, open = _j.open, error = _j.error, onResetError = _j.onResetError;
|
|
57
|
+
var onSelectEmoji = useEmojiLogic(textareaRef.current).onSelectEmoji;
|
|
56
58
|
usePasteFromClipboard(textareaRef.current, api === null || api === void 0 ? void 0 : api.fileUploadApi, api === null || api === void 0 ? void 0 : api.fileDownloadApi, fileApiUrl);
|
|
57
59
|
useListenTextareaScroll(resetMention, textareaRef.current);
|
|
58
60
|
useLayoutEffect(function () {
|
|
@@ -76,7 +78,7 @@ export var Markdown = function (props) {
|
|
|
76
78
|
};
|
|
77
79
|
var content = (React.createElement(Foco, { component: "div", onClickOutside: resetStates },
|
|
78
80
|
React.createElement(Wrapper, __assign({}, getRootProps()),
|
|
79
|
-
!
|
|
81
|
+
!(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), onOpenFileDialog: open, onChangeViewMode: handleChangeViewMode, onClickFullscreen: handleClickFullscreen, onSelectEmoji: onSelectEmoji })),
|
|
80
82
|
isEditMode && error && (api === null || api === void 0 ? void 0 : api.getUsersApi) && (renderFilesValidation === null || renderFilesValidation === void 0 ? void 0 : renderFilesValidation(horizontalPaddings, onResetError)),
|
|
81
83
|
isEditMode && renderEditContainer(),
|
|
82
84
|
isDragActive && isEditMode && React.createElement(DroppablePlaceholder, __assign({}, horizontalPaddings))),
|
|
@@ -108,6 +110,10 @@ export var Markdown = function (props) {
|
|
|
108
110
|
return (React.createElement(MarkdownMention, { value: getMentionValue(mention), getUsersApi: api.getUsersApi, y: position.y, x: position.x, onUserSelect: handleSelectUser }));
|
|
109
111
|
}
|
|
110
112
|
}
|
|
113
|
+
function handleChangeViewMode(mode) {
|
|
114
|
+
setViewMode(mode);
|
|
115
|
+
onChangeViewMode === null || onChangeViewMode === void 0 ? void 0 : onChangeViewMode(mode);
|
|
116
|
+
}
|
|
111
117
|
function handleSelectUser(login, name) {
|
|
112
118
|
if (textareaRef.current && mention) {
|
|
113
119
|
var htmlTextArea = textareaRef.current;
|
|
@@ -81,7 +81,7 @@ export var getMarkdownReactUiTheme = function (theme, reactUiTheme, panelHorizon
|
|
|
81
81
|
menuItemFontSize: elementsFontSize,
|
|
82
82
|
menuItemPaddingY: '4px',
|
|
83
83
|
menuItemPaddingX: '28px',
|
|
84
|
-
})), { tabColorHover: 'transparent', tabColorFocus: 'transparent', tabBorderWidth: '0', selectBorderWidth: '0', btnDefaultBg: 'transparent', btnDefaultActiveBorderColor: 'transparent', btnDisabledBg: 'transparent', btnDisabledBorderColor: 'transparent', btnDisabledTextColor: colors.disabledButton, btnDefaultHoverBg: themeMode === 'light' ? reactUiTheme === null || reactUiTheme === void 0 ? void 0 : reactUiTheme.btnDefaultHoverBg : reactUiTheme === null || reactUiTheme === void 0 ? void 0 : reactUiTheme.btnDisabledBg, btnFontSizeSmall: elementsFontSize, checkboxBg: 'transparent', checkboxHoverBg: 'transparent', checkboxCheckedBg: 'transparent', checkboxShadow: "0 0 0 1px ".concat(colors.grayDefault), checkboxShadowHover: "0 0 0 1px ".concat(colors.grayDefault), checkboxCheckedHoverShadow: "0 0 0 1px ".concat(colors.grayDefault), checkboxCheckedShadow: "0 0 0 1px ".concat(colors.grayDefault), checkboxCheckedActiveShadow: "0 0 0 1px ".concat(colors.grayDefault), checkboxShadowActive: "0 0 0 1px ".concat(colors.grayDefault), checkboxCheckedColor: colors.grayDefault, hintFontSize: elementsFontSize, hintColor:
|
|
84
|
+
})), { tabColorHover: 'transparent', tabColorFocus: 'transparent', tabBorderWidth: '0', selectBorderWidth: '0', btnDefaultBg: 'transparent', btnDefaultActiveBorderColor: 'transparent', btnDisabledBg: 'transparent', btnDisabledBorderColor: 'transparent', btnDisabledTextColor: colors.disabledButton, btnDefaultHoverBg: themeMode === 'light' ? reactUiTheme === null || reactUiTheme === void 0 ? void 0 : reactUiTheme.btnDefaultHoverBg : reactUiTheme === null || reactUiTheme === void 0 ? void 0 : reactUiTheme.btnDisabledBg, btnFontSizeSmall: elementsFontSize, checkboxBg: 'transparent', checkboxHoverBg: 'transparent', checkboxCheckedBg: 'transparent', checkboxShadow: "0 0 0 1px ".concat(colors.grayDefault), checkboxShadowHover: "0 0 0 1px ".concat(colors.grayDefault), checkboxCheckedHoverShadow: "0 0 0 1px ".concat(colors.grayDefault), checkboxCheckedShadow: "0 0 0 1px ".concat(colors.grayDefault), checkboxCheckedActiveShadow: "0 0 0 1px ".concat(colors.grayDefault), checkboxShadowActive: "0 0 0 1px ".concat(colors.grayDefault), checkboxCheckedColor: colors.grayDefault, hintFontSize: elementsFontSize, hintColor: colors.textInverse, selectPaddingXSmall: '8px', selectLineHeightSmall: '24px', dropdownBorderWidth: '0' }), (panelHorizontalPadding &&
|
|
85
85
|
extendThemeConfigWithSized({
|
|
86
86
|
textareaPaddingX: "".concat(panelHorizontalPadding, "px"),
|
|
87
87
|
}))), (borderless && borderlessTextareaVariables)), (fullScreenTextareaPadding &&
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { Textarea } from '@skbkontur/react-ui';
|
|
2
2
|
import { FC, RefObject } from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { EmojiData } from './Emoji/Emoji.logic';
|
|
4
|
+
import { HideActionsOptions, HorizontalPaddings, Nullable, ViewMode } from './types';
|
|
4
5
|
interface Props {
|
|
5
6
|
horizontalPaddings: HorizontalPaddings;
|
|
6
7
|
onChangeViewMode: (viewMode: ViewMode) => void;
|
|
7
8
|
onClickFullscreen: () => void;
|
|
8
9
|
onOpenFileDialog: () => void;
|
|
10
|
+
onSelectEmoji: (emoji: EmojiData) => void;
|
|
9
11
|
showShortKeys: boolean;
|
|
10
12
|
textAreaRef: RefObject<Textarea>;
|
|
11
13
|
viewMode: ViewMode;
|
|
12
14
|
fullscreen?: boolean;
|
|
13
15
|
hasFilesApi?: boolean;
|
|
14
|
-
|
|
16
|
+
hideOptions?: HideActionsOptions;
|
|
15
17
|
loadingFile?: boolean;
|
|
16
18
|
selectionEnd?: Nullable<number>;
|
|
17
19
|
selectionStart?: Nullable<number>;
|
|
@@ -12,6 +12,7 @@ var __assign = (this && this.__assign) || function () {
|
|
|
12
12
|
import { Dropdown } from '@skbkontur/react-ui';
|
|
13
13
|
import React from 'react';
|
|
14
14
|
import { COMMONMARK_HELP_URL } from './constants';
|
|
15
|
+
import { EmojiDropdown } from './Emoji/EmojiDropdown';
|
|
15
16
|
import { ActionsWrapper, ButtonsWrapper, MarkdownDropdown, MarkdownMenuItem, MarkdownActionsWrapper, } from './Markdown.styled';
|
|
16
17
|
import { MarkdownFormatButton } from './MarkdownHelpers/MarkdownFormatButton';
|
|
17
18
|
import { setMarkdown } from './MarkdownHelpers/markdownHelpers';
|
|
@@ -25,18 +26,31 @@ import { Expand } from '../MarkdownIcons/Expand';
|
|
|
25
26
|
import { EyeOpen } from '../MarkdownIcons/EyeOpen';
|
|
26
27
|
import { ToolPencil } from '../MarkdownIcons/ToolPencil';
|
|
27
28
|
export var MarkdownActions = function (_a) {
|
|
28
|
-
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,
|
|
29
|
+
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;
|
|
29
30
|
var isPreviewMode = viewMode === ViewMode.Preview;
|
|
30
31
|
return (React.createElement(MarkdownActionsWrapper, __assign({}, horizontalPaddings, { width: width }),
|
|
31
32
|
React.createElement(ButtonsWrapper, __assign({}, horizontalPaddings),
|
|
32
33
|
React.createElement(ActionsWrapper, null,
|
|
33
|
-
|
|
34
|
-
React.createElement(Dropdown, { disablePortal: true, disabled: isPreviewMode, menuWidth:
|
|
34
|
+
!(hideOptions === null || hideOptions === void 0 ? void 0 : hideOptions.heading) && (React.createElement(MarkdownDropdown, null,
|
|
35
|
+
React.createElement(Dropdown, { disablePortal: true, disabled: isPreviewMode, menuWidth: 300, caption: "\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A" }, markdownHelpHeaders.map(function (helper, idx) { return (React.createElement(MarkdownMenuItem, { key: idx, onClick: function (event) { return handleMarkdownItemClick(event, helper.format); } },
|
|
35
36
|
React.createElement(MarkdownCombination, { showShortKey: showShortKeys, format: helper.format, text: helper.node }))); })))),
|
|
36
|
-
markdownHelpText.map(function (helper, idx) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
markdownHelpText.map(function (helper, idx) {
|
|
38
|
+
if (isHiddenOptions(helper.format))
|
|
39
|
+
return null;
|
|
40
|
+
return (React.createElement(MarkdownFormatButton, { key: idx, showShortKey: showShortKeys, disabled: isPreviewMode, format: helper.format, hintText: helper.node, icon: helper.icon, text: helper.text, onClick: function (event) { return handleMarkdownItemClick(event, helper.format); } }));
|
|
41
|
+
}),
|
|
42
|
+
markdownHelpLists.map(function (helper, idx) {
|
|
43
|
+
if (isHiddenOptions(helper.format))
|
|
44
|
+
return null;
|
|
45
|
+
return (React.createElement(MarkdownFormatButton, { key: idx, showShortKey: showShortKeys, disabled: isPreviewMode, format: helper.format, hintText: helper.node, icon: helper.icon, text: helper.text, onClick: function (event) { return handleMarkdownItemClick(event, helper.format); } }));
|
|
46
|
+
}),
|
|
47
|
+
markdownHelpOther.map(function (helper, idx) {
|
|
48
|
+
if (isHiddenOptions(helper.format))
|
|
49
|
+
return null;
|
|
50
|
+
return (React.createElement(MarkdownFormatButton, { key: idx, showShortKey: showShortKeys, disabled: isPreviewMode, format: helper.format, hintText: helper.node, icon: helper.icon, text: helper.text, onClick: function (event) { return handleMarkdownItemClick(event, helper.format); } }));
|
|
51
|
+
}),
|
|
52
|
+
hasFilesApi && !(hideOptions === null || hideOptions === void 0 ? void 0 : hideOptions.file) && (React.createElement(MarkdownFormatButton, { hintText: "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u0444\u0430\u0439\u043B", showShortKey: showShortKeys, disabled: isPreviewMode, isLoading: loadingFile, icon: React.createElement(AttachPaperclip, null), text: "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u0444\u0430\u0439\u043B", onClick: onOpenFileDialog })),
|
|
53
|
+
!(hideOptions === null || hideOptions === void 0 ? void 0 : hideOptions.emoji) && (React.createElement(EmojiDropdown, { showShortKey: showShortKeys, isPreviewMode: isPreviewMode, onSelect: onSelectEmoji })),
|
|
40
54
|
React.createElement(MarkdownFormatButton, { hintText: "\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u044F Markdown", icon: React.createElement(DocIcon, null), text: "\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u044F Markdown", href: COMMONMARK_HELP_URL })),
|
|
41
55
|
React.createElement(ActionsWrapper, null,
|
|
42
56
|
renderViewModeButton(),
|
|
@@ -65,4 +79,7 @@ export var MarkdownActions = function (_a) {
|
|
|
65
79
|
}
|
|
66
80
|
}
|
|
67
81
|
}
|
|
82
|
+
function isHiddenOptions(format) {
|
|
83
|
+
return hideOptions === null || hideOptions === void 0 ? void 0 : hideOptions[format];
|
|
84
|
+
}
|
|
68
85
|
};
|
|
@@ -79,7 +79,7 @@ export var MarkdownMention = function (_a) {
|
|
|
79
79
|
if (!(users === null || users === void 0 ? void 0 : users.length))
|
|
80
80
|
return null;
|
|
81
81
|
return createPortal(React.createElement(ZIndex, { priority: "Toast", style: getMarkdownMentionStyle(x, y) },
|
|
82
|
-
React.createElement(Menu, { ref: menuRef, preventWindowScroll: true, hasShadow: true, maxHeight: 300, width:
|
|
82
|
+
React.createElement(Menu, { ref: menuRef, preventWindowScroll: true, hasShadow: true, maxHeight: 300, width: 320 }, users === null || users === void 0 ? void 0 : users.map(function (user) { return (React.createElement(MentionMenuItem, { key: user.id, onClick: function () { var _a; return onUserSelect((_a = user === null || user === void 0 ? void 0 : user.login) !== null && _a !== void 0 ? _a : '', user.name); } },
|
|
83
83
|
React.createElement(UserWrapper, null,
|
|
84
84
|
React.createElement(Avatar, { height: 48, width: 48, src: getAvatarUrl(user.sid) }),
|
|
85
85
|
React.createElement("div", null,
|
package/src/Markdown/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { THEME_2022 } from '@skbkontur/react-ui';
|
|
2
|
+
import { MarkdownFormat } from './MarkdownFormat';
|
|
2
3
|
export declare enum ViewMode {
|
|
3
4
|
Preview = "Preview",
|
|
4
5
|
Edit = "Edit"
|
|
@@ -37,3 +38,4 @@ export interface TestCase<V, E> {
|
|
|
37
38
|
values: V;
|
|
38
39
|
}
|
|
39
40
|
export type ReactUIThemeType = Partial<typeof THEME_2022>;
|
|
41
|
+
export type HideActionsOptions = Partial<Record<MarkdownFormat | 'heading' | 'emoji' | 'allActions', boolean>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const EmojiFace: () => JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export var EmojiFace = function () { return (React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", fill: "none" },
|
|
3
|
+
React.createElement("g", { clipPath: "url(#a)" },
|
|
4
|
+
React.createElement("g", { stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", clipPath: "url(#b)" },
|
|
5
|
+
React.createElement("path", { d: "M2 8a6 6 0 1 1 12 0M14 8A6 6 0 1 1 2 8M5.667 6v.667M10.333 6v.667" }),
|
|
6
|
+
React.createElement("path", { d: "M10.333 9.792s-.876.875-2.334.875-2.333-.875-2.333-.875" }))),
|
|
7
|
+
React.createElement("defs", null,
|
|
8
|
+
React.createElement("clipPath", { id: "a" },
|
|
9
|
+
React.createElement("path", { fill: "#fff", d: "M0 0h16v16H0z" })),
|
|
10
|
+
React.createElement("clipPath", { id: "b" },
|
|
11
|
+
React.createElement("path", { fill: "#fff", d: "M0 0h16v16H0z" }))))); };
|
package/src/styles/theme.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export interface MarkdownTheme {
|
|
|
10
10
|
reactUiTheme?: typeof THEME_2022;
|
|
11
11
|
}
|
|
12
12
|
export declare const DEFAULT_MARKDOWN_THEME: MarkdownTheme;
|
|
13
|
+
export declare const DEFAULT_MARKDOWN_DARK_THEME: MarkdownTheme;
|
|
13
14
|
export declare const MarkdownThemeContext: import("react").Context<MarkdownTheme>;
|
|
14
15
|
export declare const MarkdownThemeProvider: import("react").Provider<MarkdownTheme>;
|
|
15
16
|
export declare const MarkdownThemeConsumer: import("react").Consumer<MarkdownTheme>;
|
package/src/styles/theme.js
CHANGED
|
@@ -1,17 +1,34 @@
|
|
|
1
1
|
import { createContext } from 'react';
|
|
2
2
|
export var DEFAULT_MARKDOWN_THEME = {
|
|
3
3
|
colors: {
|
|
4
|
-
|
|
4
|
+
text: '#222',
|
|
5
5
|
brand: '#e76f57',
|
|
6
6
|
grayDefault: '#858585',
|
|
7
7
|
disabledButton: '#adadad',
|
|
8
8
|
panelBg: '#d6d6d6',
|
|
9
9
|
link: '#51adff',
|
|
10
|
+
textInverse: '#fff',
|
|
11
|
+
emojiPickerBackgroundRGBColor: 'rgb(255,255,255, 0)',
|
|
10
12
|
},
|
|
11
13
|
elementsFontSize: '16px',
|
|
12
14
|
elementsLineHeight: '24px',
|
|
13
15
|
themeMode: 'light',
|
|
14
16
|
};
|
|
17
|
+
export var DEFAULT_MARKDOWN_DARK_THEME = {
|
|
18
|
+
colors: {
|
|
19
|
+
text: '#fff',
|
|
20
|
+
brand: '#e76f57',
|
|
21
|
+
grayDefault: '#858585',
|
|
22
|
+
disabledButton: '#adadad',
|
|
23
|
+
panelBg: '#d6d6d6',
|
|
24
|
+
link: '#51adff',
|
|
25
|
+
textInverse: '#222',
|
|
26
|
+
emojiPickerBackgroundRGBColor: 'rgb(0,0,0,0)',
|
|
27
|
+
},
|
|
28
|
+
elementsFontSize: '16px',
|
|
29
|
+
elementsLineHeight: '24px',
|
|
30
|
+
themeMode: 'dark',
|
|
31
|
+
};
|
|
15
32
|
export var MarkdownThemeContext = createContext(DEFAULT_MARKDOWN_THEME);
|
|
16
33
|
export var MarkdownThemeProvider = MarkdownThemeContext.Provider;
|
|
17
34
|
export var MarkdownThemeConsumer = MarkdownThemeContext.Consumer;
|
package/src/styles/types.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export interface ColorScheme {
|
|
2
2
|
brand: string;
|
|
3
3
|
disabledButton: string;
|
|
4
|
+
emojiPickerBackgroundRGBColor: string;
|
|
4
5
|
grayDefault: string;
|
|
5
6
|
link: string;
|
|
6
7
|
panelBg: string;
|
|
7
|
-
|
|
8
|
+
text: string;
|
|
9
|
+
textInverse: string;
|
|
8
10
|
}
|
|
9
11
|
export type ThemeMode = 'dark' | 'light';
|