@seafile/sdoc-editor 0.1.105 → 0.1.106-beta

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.
@@ -26,10 +26,6 @@
26
26
  position: relative;
27
27
  }
28
28
 
29
- .sdoc-editor-container .sdoc-editor-content.readonly {
30
- height: 100%;
31
- }
32
-
33
29
  .sdoc-editor-container .sdoc-absolute-wrapper {
34
30
  position: absolute;
35
31
  left: 0;
@@ -40,7 +36,7 @@
40
36
  width: 100%;
41
37
  }
42
38
 
43
- .sdoc-editor-container .sdoc-article-wrapper {
39
+ .sdoc-editor-container .sdoc-scroll-container {
44
40
  position: absolute;
45
41
  left: 0;
46
42
  right: 0;
@@ -0,0 +1,13 @@
1
+ .sdoc-editor-container .sdoc-editor-content.readonly {
2
+ height: 100%;
3
+ }
4
+
5
+ .sdoc-editor-container.mobile .sdoc-editor-content.readonly .sdoc-article-container {
6
+ padding: 0;
7
+ width: auto;
8
+ }
9
+
10
+ .sdoc-editor-container.mobile .sdoc-editor-content.readonly .article {
11
+ width: 100% !important;
12
+ padding: 1rem;
13
+ }
@@ -1,20 +1,33 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
- import React, { useCallback, useRef, useState } from 'react';
2
+ import classNames from 'classnames';
3
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
4
  import { withTranslation } from 'react-i18next';
5
+ import { Button } from 'reactstrap';
6
+ var getSubmitTip = function getSubmitTip(type, content) {
7
+ if (content) return 'Save';
8
+ return type === 'comment' ? 'Comment' : 'Reply';
9
+ };
4
10
  var CommentEditor = function CommentEditor(_ref) {
5
- var content = _ref.content,
11
+ var type = _ref.type,
12
+ className = _ref.className,
13
+ content = _ref.content,
6
14
  placeholder = _ref.placeholder,
7
15
  insertContent = _ref.insertContent,
8
16
  updateContent = _ref.updateContent,
9
17
  setIsEditing = _ref.setIsEditing,
10
18
  t = _ref.t;
11
- var inputRef = useRef();
12
- var _useState = useState(content || ''),
19
+ var commentRef = useRef();
20
+ var _useState = useState(false),
13
21
  _useState2 = _slicedToArray(_useState, 2),
14
- value = _useState2[0],
15
- setValue = _useState2[1];
16
- var onChange = useCallback(function (event) {
17
- setValue(event.target.value);
22
+ isFocus = _useState2[0],
23
+ setIsFocus = _useState2[1];
24
+
25
+ // onMount
26
+ useEffect(function () {
27
+ if (content) {
28
+ commentRef.current.innerHTML = content;
29
+ }
30
+ // eslint-disable-next-line react-hooks/exhaustive-deps
18
31
  }, []);
19
32
  var updateValue = useCallback(function (value) {
20
33
  if (!value || value.trim() === '') return;
@@ -24,30 +37,53 @@ var CommentEditor = function CommentEditor(_ref) {
24
37
  }
25
38
  updateContent(value);
26
39
  }, [content, insertContent, updateContent]);
27
- var onBlur = useCallback(function () {
40
+ var onSubmit = useCallback(function (event) {
41
+ event && event.stopPropagation();
42
+ var value = commentRef.current.innerHTML;
28
43
  updateValue(value);
29
- setValue('');
30
- }, [updateValue, value]);
44
+ commentRef.current.innerHTML = '';
45
+ }, [updateValue]);
46
+ var onCancel = useCallback(function (event) {
47
+ event.stopPropagation();
48
+ setIsFocus(false);
49
+ commentRef.current.innerHTML = '';
50
+ setIsEditing && setIsEditing(false);
51
+ }, [setIsEditing]);
31
52
  var onKeyDown = useCallback(function (event) {
32
53
  // enter
33
54
  if (event.keyCode === 13) {
34
- inputRef.current.blur();
55
+ event.preventDefault();
56
+ onSubmit();
35
57
  }
36
58
  if (event.keyCode === 27) {
37
- setValue('');
38
- setIsEditing && setIsEditing(false);
59
+ event.preventDefault();
60
+ onCancel();
39
61
  }
40
- }, [setIsEditing]);
62
+ }, [onCancel, onSubmit]);
41
63
  placeholder = t(placeholder);
42
- return /*#__PURE__*/React.createElement("input", {
43
- ref: inputRef,
64
+ var submitTip = useMemo(function () {
65
+ return getSubmitTip(type, content);
66
+ }, [content, type]);
67
+ return /*#__PURE__*/React.createElement("div", {
68
+ className: classNames('comment-editor-wrapper', className)
69
+ }, /*#__PURE__*/React.createElement("div", {
70
+ ref: commentRef,
71
+ contentEditable: "true",
44
72
  className: "comment-editor",
45
- value: value,
46
73
  placeholder: placeholder,
47
- onChange: onChange,
48
74
  onKeyDown: onKeyDown,
49
- onBlur: onBlur
50
- });
75
+ onFocus: function onFocus() {
76
+ return setIsFocus(true);
77
+ }
78
+ }), isFocus && /*#__PURE__*/React.createElement("div", {
79
+ className: "editor-operations"
80
+ }, /*#__PURE__*/React.createElement(Button, {
81
+ className: "mr-2",
82
+ onClick: onCancel
83
+ }, t('Cancel')), /*#__PURE__*/React.createElement(Button, {
84
+ color: "primary",
85
+ onClick: onSubmit
86
+ }, t(submitTip))));
51
87
  };
52
88
  CommentEditor.defaultProps = {
53
89
  placeholder: 'Enter_a_comment'
@@ -1,6 +1,6 @@
1
1
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
- import React, { useCallback, useMemo, useRef, useState } from 'react';
3
+ import React, { useCallback, useMemo, useState } from 'react';
4
4
  import { withTranslation } from 'react-i18next';
5
5
  import { Dropdown, DropdownItem, DropdownMenu, DropdownToggle, UncontrolledTooltip } from 'reactstrap';
6
6
  import dayjs from 'dayjs';
@@ -121,10 +121,11 @@ var CommentItem = function CommentItem(_ref) {
121
121
  onClick: resubmit
122
122
  }, t('Resubmit')))))), /*#__PURE__*/React.createElement("div", {
123
123
  className: "comment-content"
124
- }, isEditing && /*#__PURE__*/React.createElement(CommentEditor, {
124
+ }, !isEditing && /*#__PURE__*/React.createElement(React.Fragment, null, comment.comment)), isEditing && /*#__PURE__*/React.createElement(CommentEditor, {
125
+ className: 'pb-3',
125
126
  content: comment.comment,
126
127
  updateContent: updateContent,
127
128
  setIsEditing: setIsEditing
128
- }), !isEditing && /*#__PURE__*/React.createElement(React.Fragment, null, comment.comment)));
129
+ }));
129
130
  };
130
131
  export default withTranslation('sdoc-editor')(CommentItem);
@@ -1,7 +1,7 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
- import React, { useCallback, useMemo, useRef, useState } from 'react';
2
+ import React, { useCallback, useState } from 'react';
3
3
  import { withTranslation } from 'react-i18next';
4
- import { Dropdown, DropdownItem, DropdownMenu, DropdownToggle, PopoverBody, UncontrolledPopover } from 'reactstrap';
4
+ import { Dropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'reactstrap';
5
5
  import dayjs from 'dayjs';
6
6
  import context from '../../../context';
7
7
  import CommentEditor from './comment-editor';
@@ -86,11 +86,13 @@ var CommentItemReply = function CommentItemReply(_ref) {
86
86
  onClick: onDeleteToggle
87
87
  }, t('Delete')))))), /*#__PURE__*/React.createElement("div", {
88
88
  className: "comment-content"
89
- }, isEditing && /*#__PURE__*/React.createElement(CommentEditor, {
89
+ }, !isEditing && /*#__PURE__*/React.createElement(React.Fragment, null, reply.reply)), isEditing && /*#__PURE__*/React.createElement(CommentEditor, {
90
+ className: 'pb-3',
91
+ type: "reply",
90
92
  content: reply.reply,
91
93
  updateContent: updateContent,
92
94
  setIsEditing: setIsEditing
93
- }), !isEditing && /*#__PURE__*/React.createElement(React.Fragment, null, reply.reply)), isShowDeleteDialog && isActive && /*#__PURE__*/React.createElement(CommentDeleteShadow, {
95
+ }), isShowDeleteDialog && isActive && /*#__PURE__*/React.createElement(CommentDeleteShadow, {
94
96
  type: "reply",
95
97
  deleteConfirm: _deleteReply,
96
98
  setIsShowDeleteModal: setIsShowDeleteDialog
@@ -198,7 +198,11 @@ export default function CommentItemWrapper(_ref) {
198
198
  });
199
199
  case 18:
200
200
  setTimeout(function () {
201
- listRef.current.scrollTop = 10000;
201
+ var options = {
202
+ top: 10000,
203
+ behavior: 'smooth'
204
+ };
205
+ listRef.current.scrollTo(options);
202
206
  }, 0);
203
207
  case 19:
204
208
  case "end":
@@ -352,12 +356,12 @@ export default function CommentItemWrapper(_ref) {
352
356
  key: reply.id,
353
357
  reply: reply
354
358
  });
355
- })), isActive && /*#__PURE__*/React.createElement("div", {
356
- className: "comment-editor-wrapper mt-4"
357
- }, /*#__PURE__*/React.createElement(CommentEditor, {
359
+ })), isActive && /*#__PURE__*/React.createElement(CommentEditor, {
360
+ className: "mt-4",
361
+ type: "reply",
358
362
  placeholder: tip,
359
363
  insertContent: insertContent
360
- })), isShowDeleteDialog && isActive && /*#__PURE__*/React.createElement(CommentDeleteShadow, {
364
+ }), isShowDeleteDialog && isActive && /*#__PURE__*/React.createElement(CommentDeleteShadow, {
361
365
  type: 'comment',
362
366
  deleteConfirm: _deleteComment,
363
367
  setIsShowDeleteModal: setIsShowDeleteDialog
@@ -63,6 +63,8 @@
63
63
  padding-bottom: 10px;
64
64
  margin-top: 10px;
65
65
  margin-left: 30px;
66
+ width: 222px;
67
+ word-break: break-all;
66
68
  }
67
69
 
68
70
  .sdoc-comment-list-container .comment-header .comment-author__avatar {
@@ -158,18 +160,23 @@
158
160
 
159
161
  .sdoc-comment-list-container .comment-editor-wrapper {
160
162
  display: flex;
161
- align-items: center;
163
+ flex-direction: column;
162
164
  justify-content: center;
163
165
  padding: 0 16px;
166
+ cursor: text;
164
167
  }
165
168
 
166
169
  .sdoc-comment-list-container .comment-editor-wrapper .comment-editor {
167
- height: 40px;
168
- width: 248px;
170
+ margin-bottom: 10px;
171
+ min-height: 40px;
172
+ max-height: 120px;
173
+ min-width: 240px;
174
+ overflow: auto;
169
175
  background: #fff;
170
176
  border: 1px solid rgba(0, 0, 0, .12);
171
177
  border-radius: 4px;
172
178
  padding: 8px;
179
+ word-break: break-all;
173
180
  }
174
181
 
175
182
  .sdoc-comment-list-container .comment-editor-wrapper .comment-editor:focus-visible {
@@ -107,11 +107,10 @@ var CommentList = function CommentList(_ref) {
107
107
  return /*#__PURE__*/React.createElement(CommentItemWrapper, props);
108
108
  })), comments.length === 0 && /*#__PURE__*/React.createElement("div", {
109
109
  className: "comment-ui-container active"
110
- }, /*#__PURE__*/React.createElement("div", {
111
- className: "comment-editor-wrapper"
112
110
  }, /*#__PURE__*/React.createElement(CommentEditor, {
111
+ type: "comment",
113
112
  insertContent: insertContent,
114
113
  selectionElement: selectionElement
115
- }))));
114
+ })));
116
115
  };
117
116
  export default CommentList;
@@ -1,5 +1,5 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
- import React, { useCallback, useEffect, useMemo, useRef, useState, forwardRef, useImperativeHandle } from 'react';
2
+ import React, { useCallback, useEffect, useMemo, useRef, useState, forwardRef, useImperativeHandle, Fragment } from 'react';
3
3
  import { Editable, ReactEditor, Slate } from '@seafile/slate-react';
4
4
  import defaultEditor, { renderLeaf, renderElement, Toolbar, ContextToolbar } from './extension';
5
5
  import { focusEditor, getAboveBlockNode, getNextNode, getPrevNode, isSelectionAtBlockEnd, isSelectionAtBlockStart } from './extension/core';
@@ -17,6 +17,7 @@ import { usePipDecorate } from './decorates';
17
17
  import { getCursorPosition, getDomHeight, getDomMarginTop } from './utils/dom-utils';
18
18
  import EventBus from './utils/event-bus';
19
19
  import { ColorProvider } from './hooks/use-color-context';
20
+ import ArticleContainer from './layout/article-container';
20
21
  import './assets/css/layout.css';
21
22
  import './assets/css/sdoc-editor-plugins.css';
22
23
  import './assets/css/dropdown-menu.css';
@@ -42,7 +43,6 @@ var SDocEditor = forwardRef(function (_ref, ref) {
42
43
  var _useCursors = useCursors(editor),
43
44
  cursors = _useCursors.cursors;
44
45
  var scrollRef = useRef(null);
45
- var articleRef = useRef(null);
46
46
  var decorate = usePipDecorate(editor);
47
47
 
48
48
  // init eventHandler
@@ -73,8 +73,6 @@ var SDocEditor = forwardRef(function (_ref, ref) {
73
73
  // useMount: focus editor
74
74
  useEffect(function () {
75
75
  var timer = setTimeout(function () {
76
- // real width
77
- editor.width = articleRef.current.children[0].clientWidth;
78
76
  focusEditor(editor);
79
77
  }, 300);
80
78
  return function () {
@@ -185,32 +183,10 @@ var SDocEditor = forwardRef(function (_ref, ref) {
185
183
 
186
184
  // eslint-disable-next-line react-hooks/exhaustive-deps
187
185
  }, []);
188
- var _useState3 = useState({}),
186
+ var _useState3 = useState(0),
189
187
  _useState4 = _slicedToArray(_useState3, 2),
190
- containerStyle = _useState4[0],
191
- setContainerStyle = _useState4[1];
192
- var handleWindowResize = useCallback(function () {
193
- var rect = scrollRef.current.getBoundingClientRect();
194
- var articleRect = articleRef.current.getBoundingClientRect();
195
- if ((rect.width - articleRect.width) / 2 < 280) {
196
- setContainerStyle({
197
- marginLeft: '280px'
198
- });
199
- } else {
200
- setContainerStyle({});
201
- }
202
- }, []);
203
- useEffect(function () {
204
- handleWindowResize();
205
- window.addEventListener('resize', handleWindowResize);
206
- return function () {
207
- window.removeEventListener('resize', handleWindowResize);
208
- };
209
- }, [handleWindowResize]);
210
- var _useState5 = useState(0),
211
- _useState6 = _slicedToArray(_useState5, 2),
212
- scrollLeft = _useState6[0],
213
- setScrollLeft = _useState6[1];
188
+ scrollLeft = _useState4[0],
189
+ setScrollLeft = _useState4[1];
214
190
  var onWrapperScroll = useCallback(function (event) {
215
191
  var scrollLeft = event.target.scrollLeft;
216
192
  setScrollLeft(scrollLeft);
@@ -231,11 +207,8 @@ var SDocEditor = forwardRef(function (_ref, ref) {
231
207
  className: "sdoc-absolute-wrapper"
232
208
  }, /*#__PURE__*/React.createElement("div", {
233
209
  ref: scrollRef,
234
- className: "sdoc-article-wrapper",
210
+ className: "sdoc-scroll-container",
235
211
  onScroll: onWrapperScroll
236
- }, /*#__PURE__*/React.createElement("div", {
237
- className: "sdoc-article-container",
238
- style: containerStyle
239
212
  }, /*#__PURE__*/React.createElement(ScrollContext.Provider, {
240
213
  value: {
241
214
  scrollRef: scrollRef
@@ -244,10 +217,9 @@ var SDocEditor = forwardRef(function (_ref, ref) {
244
217
  editor: editor,
245
218
  value: slateValue,
246
219
  onChange: onChange
247
- }, /*#__PURE__*/React.createElement(ContextToolbar, null), /*#__PURE__*/React.createElement(CommentContextProvider, null, /*#__PURE__*/React.createElement("div", {
248
- className: "article",
249
- ref: articleRef
250
- }, /*#__PURE__*/React.createElement(SetNodeToDecorations, null), /*#__PURE__*/React.createElement(Editable, {
220
+ }, /*#__PURE__*/React.createElement(ArticleContainer, {
221
+ editor: editor
222
+ }, /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(ContextToolbar, null), /*#__PURE__*/React.createElement(SetNodeToDecorations, null), /*#__PURE__*/React.createElement(Editable, {
251
223
  cursors: cursors,
252
224
  renderElement: renderElement,
253
225
  renderLeaf: renderLeaf,
@@ -255,6 +227,6 @@ var SDocEditor = forwardRef(function (_ref, ref) {
255
227
  onMouseDown: onMouseDown,
256
228
  decorate: decorate,
257
229
  onCut: eventProxy.onCut
258
- })), /*#__PURE__*/React.createElement(CommentWrapper, null)))))))))));
230
+ })), /*#__PURE__*/React.createElement(CommentContextProvider, null, /*#__PURE__*/React.createElement(CommentWrapper, null)))))))))));
259
231
  });
260
232
  export default SDocEditor;
@@ -0,0 +1,49 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React, { useEffect, useRef, useState } from 'react';
3
+ import { useScrollContext } from '../hooks/use-scroll-context';
4
+ export default function ArticleContainer(_ref) {
5
+ var editor = _ref.editor,
6
+ readOnly = _ref.readOnly,
7
+ children = _ref.children;
8
+ var articleRef = useRef(null);
9
+ useEffect(function () {
10
+ editor.width = articleRef.current.children[0].clientWidth;
11
+ // eslint-disable-next-line react-hooks/exhaustive-deps
12
+ }, []);
13
+ var scrollRef = useScrollContext();
14
+ var _useState = useState({}),
15
+ _useState2 = _slicedToArray(_useState, 2),
16
+ containerStyle = _useState2[0],
17
+ setContainerStyle = _useState2[1];
18
+ useEffect(function () {
19
+ if (readOnly) return;
20
+ var handleWindowResize = function handleWindowResize() {
21
+ var rect = scrollRef.current.getBoundingClientRect();
22
+ var articleRect = articleRef.current.getBoundingClientRect();
23
+ if ((rect.width - articleRect.width) / 2 < 280) {
24
+ setContainerStyle({
25
+ marginLeft: '280px'
26
+ });
27
+ } else {
28
+ setContainerStyle({});
29
+ }
30
+ };
31
+ window.addEventListener('resize', handleWindowResize);
32
+ return function () {
33
+ window.removeEventListener('resize', handleWindowResize);
34
+ };
35
+ }, [readOnly, scrollRef]);
36
+ return /*#__PURE__*/React.createElement("div", {
37
+ className: "sdoc-article-container",
38
+ style: containerStyle
39
+ }, React.Children.count(children) === 1 && /*#__PURE__*/React.createElement("div", {
40
+ className: "article",
41
+ ref: articleRef
42
+ }, children), React.Children.count(children) === 2 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
43
+ className: "article",
44
+ ref: articleRef
45
+ }, children[0]), children[1]));
46
+ }
47
+ ArticleContainer.defaultProps = {
48
+ readOnly: false
49
+ };
@@ -1,36 +1,31 @@
1
- import React, { useRef, useEffect } from 'react';
1
+ import React, { Fragment, useRef } from 'react';
2
2
  import { Editable, Slate } from '@seafile/slate-react';
3
3
  import defaultEditor, { renderLeaf as _renderLeaf, renderElement as _renderElement } from '../extension';
4
4
  import withNodeId from '../node-id';
5
5
  import { ScrollContext } from '../hooks/use-scroll-context';
6
- import { generateDefaultDocContent } from '../../utils';
6
+ import { generateDefaultDocContent, isMobile } from '../../utils';
7
7
  import { SetNodeToDecorations } from '../highlight-decorate/setNodeToDecorations';
8
8
  import { usePipDecorate } from '../decorates';
9
+ import ArticleContainer from '../layout/article-container';
9
10
  import '../assets/css/layout.css';
10
11
  import '../assets/css/sdoc-editor-plugins.css';
11
12
  import '../assets/css/dropdown-menu.css';
13
+ import '../assets/css/simple-viewer.css';
12
14
  var SDocViewer = function SDocViewer(_ref) {
13
15
  var document = _ref.document,
14
16
  customRenderLeaf = _ref.renderLeaf,
15
17
  customRenderElement = _ref.renderElement;
16
18
  var editor = withNodeId(defaultEditor);
17
19
  var slateValue = (document || generateDefaultDocContent()).children;
18
- var articleRef = useRef(null);
19
20
  var scrollRef = useRef(null);
20
21
  var decorate = usePipDecorate(editor);
21
- useEffect(function () {
22
- editor.width = articleRef.current.children[0].clientWidth;
23
- // eslint-disable-next-line react-hooks/exhaustive-deps
24
- }, []);
25
22
  return /*#__PURE__*/React.createElement("div", {
26
- className: "sdoc-editor-container"
23
+ className: "sdoc-editor-container ".concat(isMobile ? 'mobile' : '')
27
24
  }, /*#__PURE__*/React.createElement("div", {
28
25
  className: "sdoc-editor-content readonly"
29
26
  }, /*#__PURE__*/React.createElement("div", {
30
27
  ref: scrollRef,
31
- className: "sdoc-article-wrapper"
32
- }, /*#__PURE__*/React.createElement("div", {
33
- className: "sdoc-article-container"
28
+ className: "sdoc-scroll-container"
34
29
  }, /*#__PURE__*/React.createElement(ScrollContext.Provider, {
35
30
  value: {
36
31
  scrollRef: scrollRef
@@ -38,10 +33,10 @@ var SDocViewer = function SDocViewer(_ref) {
38
33
  }, /*#__PURE__*/React.createElement(Slate, {
39
34
  editor: editor,
40
35
  value: slateValue
41
- }, /*#__PURE__*/React.createElement("div", {
42
- className: "article",
43
- ref: articleRef
44
- }, /*#__PURE__*/React.createElement(SetNodeToDecorations, null), /*#__PURE__*/React.createElement(Editable, {
36
+ }, /*#__PURE__*/React.createElement(ArticleContainer, {
37
+ editor: editor,
38
+ readOnly: true
39
+ }, /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(SetNodeToDecorations, null), /*#__PURE__*/React.createElement(Editable, {
45
40
  readOnly: true,
46
41
  placeholder: "",
47
42
  renderElement: function renderElement(props) {
@@ -44,4 +44,5 @@ export var isMac = function isMac() {
44
44
  var platform = navigator.platform;
45
45
  return platform === 'Mac68K' || platform === 'MacPPC' || platform === 'Macintosh' || platform === 'MacIntel';
46
46
  };
47
+ export var isMobile = typeof window !== 'undefined' && (window.innerWidth < 768 || navigator.userAgent.toLowerCase().match(/(ipod|ipad|iphone|android|coolpad|mmp|smartphone|midp|wap|xoom|symbian|j2me|blackberry|wince)/i) != null);
47
48
  export { DateUtils, LocalStorage };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "0.1.105",
3
+ "version": "0.1.106beta",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",
@@ -94,6 +94,8 @@
94
94
  "Publish": "Publish",
95
95
  "This_file_has_a_draft": "This file has a draft.",
96
96
  "Delete": "Delete",
97
+ "Reply": "Reply",
98
+ "Comment": "Comment",
97
99
  "Comments": "Comments",
98
100
  "All_comments": "All comments",
99
101
  "Resolved_comments": "Resolved comments",
@@ -94,6 +94,8 @@
94
94
  "Publish": "发布",
95
95
  "This_file_has_a_draft": "这个文件有一个草稿.",
96
96
  "Delete": "删除",
97
+ "Reply": "回复",
98
+ "Comment": "评论",
97
99
  "Comments": "评论",
98
100
  "All_comments": "所有评论",
99
101
  "Resolved_comments": "已解决评论",