x-star-editor 0.0.2

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 (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +40 -0
  3. package/dist/XStarEditor/index.d.ts +12 -0
  4. package/dist/XStarEditor/index.js +114 -0
  5. package/dist/XStarEditor/index.module.css +19 -0
  6. package/dist/XStarMdEditor/index.d.ts +31 -0
  7. package/dist/XStarMdEditor/index.js +263 -0
  8. package/dist/XStarMdEditor/index.module.css +13 -0
  9. package/dist/XStarMdViewer/index.d.ts +18 -0
  10. package/dist/XStarMdViewer/index.js +33 -0
  11. package/dist/XStarMdViewer/index.module.css +10 -0
  12. package/dist/components/FileInput.d.ts +15 -0
  13. package/dist/components/FileInput.js +107 -0
  14. package/dist/components/FileInput.module.css +81 -0
  15. package/dist/components/Toolbar.d.ts +22 -0
  16. package/dist/components/Toolbar.js +294 -0
  17. package/dist/components/Toolbar.module.css +116 -0
  18. package/dist/components/icons/bold.svg +1 -0
  19. package/dist/components/icons/code-library.svg +1 -0
  20. package/dist/components/icons/code.svg +1 -0
  21. package/dist/components/icons/image.svg +1 -0
  22. package/dist/components/icons/italic.svg +1 -0
  23. package/dist/components/icons/link.svg +1 -0
  24. package/dist/components/icons/strikethrough.svg +1 -0
  25. package/dist/index.d.ts +9 -0
  26. package/dist/index.js +5 -0
  27. package/dist/styles/fonts/KaTeX_AMS-Regular.ttf +0 -0
  28. package/dist/styles/fonts/KaTeX_AMS-Regular.woff +0 -0
  29. package/dist/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  30. package/dist/styles/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  31. package/dist/styles/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  32. package/dist/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  33. package/dist/styles/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  34. package/dist/styles/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  35. package/dist/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  36. package/dist/styles/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  37. package/dist/styles/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  38. package/dist/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  39. package/dist/styles/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  40. package/dist/styles/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  41. package/dist/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  42. package/dist/styles/fonts/KaTeX_Main-Bold.ttf +0 -0
  43. package/dist/styles/fonts/KaTeX_Main-Bold.woff +0 -0
  44. package/dist/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  45. package/dist/styles/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  46. package/dist/styles/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  47. package/dist/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  48. package/dist/styles/fonts/KaTeX_Main-Italic.ttf +0 -0
  49. package/dist/styles/fonts/KaTeX_Main-Italic.woff +0 -0
  50. package/dist/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  51. package/dist/styles/fonts/KaTeX_Main-Regular.ttf +0 -0
  52. package/dist/styles/fonts/KaTeX_Main-Regular.woff +0 -0
  53. package/dist/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  54. package/dist/styles/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  55. package/dist/styles/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  56. package/dist/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  57. package/dist/styles/fonts/KaTeX_Math-Italic.ttf +0 -0
  58. package/dist/styles/fonts/KaTeX_Math-Italic.woff +0 -0
  59. package/dist/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  60. package/dist/styles/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  61. package/dist/styles/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  62. package/dist/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  63. package/dist/styles/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  64. package/dist/styles/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  65. package/dist/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  66. package/dist/styles/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  67. package/dist/styles/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  68. package/dist/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  69. package/dist/styles/fonts/KaTeX_Script-Regular.ttf +0 -0
  70. package/dist/styles/fonts/KaTeX_Script-Regular.woff +0 -0
  71. package/dist/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  72. package/dist/styles/fonts/KaTeX_Size1-Regular.ttf +0 -0
  73. package/dist/styles/fonts/KaTeX_Size1-Regular.woff +0 -0
  74. package/dist/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  75. package/dist/styles/fonts/KaTeX_Size2-Regular.ttf +0 -0
  76. package/dist/styles/fonts/KaTeX_Size2-Regular.woff +0 -0
  77. package/dist/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  78. package/dist/styles/fonts/KaTeX_Size3-Regular.ttf +0 -0
  79. package/dist/styles/fonts/KaTeX_Size3-Regular.woff +0 -0
  80. package/dist/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  81. package/dist/styles/fonts/KaTeX_Size4-Regular.ttf +0 -0
  82. package/dist/styles/fonts/KaTeX_Size4-Regular.woff +0 -0
  83. package/dist/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  84. package/dist/styles/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  85. package/dist/styles/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  86. package/dist/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  87. package/dist/styles/katex.css +1120 -0
  88. package/dist/styles/markdown.css +129 -0
  89. package/dist/styles/prism.css +182 -0
  90. package/dist/utils/container.d.ts +45 -0
  91. package/dist/utils/container.js +366 -0
  92. package/dist/utils/handler.d.ts +44 -0
  93. package/dist/utils/handler.js +227 -0
  94. package/dist/utils/history.d.ts +59 -0
  95. package/dist/utils/history.js +305 -0
  96. package/dist/utils/jsx-runtime.d.ts +7 -0
  97. package/dist/utils/markdown.d.ts +38 -0
  98. package/dist/utils/markdown.js +292 -0
  99. package/dist/utils/module-css.d.ts +3 -0
  100. package/package.json +88 -0
@@ -0,0 +1,107 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
4
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
5
+ function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ import classNames from 'classnames/bind';
8
+ import React, { useState } from 'react';
9
+ import styles from "./FileInput.module.css";
10
+ var cx = classNames.bind(styles);
11
+ var FileInput = function FileInput(_ref) {
12
+ var _file$name;
13
+ var onCancel = _ref.onCancel,
14
+ onOk = _ref.onOk;
15
+ var _useState = useState('file'),
16
+ _useState2 = _slicedToArray(_useState, 2),
17
+ type = _useState2[0],
18
+ setType = _useState2[1];
19
+ var _useState3 = useState(),
20
+ _useState4 = _slicedToArray(_useState3, 2),
21
+ file = _useState4[0],
22
+ setFile = _useState4[1];
23
+ var _useState5 = useState(''),
24
+ _useState6 = _slicedToArray(_useState5, 2),
25
+ url = _useState6[0],
26
+ setUrl = _useState6[1];
27
+ var _useState7 = useState(''),
28
+ _useState8 = _slicedToArray(_useState7, 2),
29
+ description = _useState8[0],
30
+ setDescription = _useState8[1];
31
+ return /*#__PURE__*/React.createElement("div", {
32
+ className: cx('container')
33
+ }, /*#__PURE__*/React.createElement("div", {
34
+ className: cx('tabs')
35
+ }, /*#__PURE__*/React.createElement("div", {
36
+ className: cx('tab', {
37
+ active: type === 'file'
38
+ }),
39
+ onClick: function onClick() {
40
+ return setType('file');
41
+ }
42
+ }, "\u6587\u4EF6"), /*#__PURE__*/React.createElement("div", {
43
+ className: cx('tab', {
44
+ active: type === 'url'
45
+ }),
46
+ onClick: function onClick() {
47
+ return setType('url');
48
+ }
49
+ }, "\u7F51\u5740")), type === 'file' ? /*#__PURE__*/React.createElement("label", {
50
+ className: cx('field')
51
+ }, "\u6587\u4EF6", /*#__PURE__*/React.createElement("div", {
52
+ className: cx('file-container')
53
+ }, /*#__PURE__*/React.createElement("input", {
54
+ className: cx('hidden'),
55
+ type: "file",
56
+ onChange: function onChange(e) {
57
+ var _e$target$files;
58
+ return setFile((_e$target$files = e.target.files) === null || _e$target$files === void 0 ? void 0 : _e$target$files[0]);
59
+ }
60
+ }), /*#__PURE__*/React.createElement("input", {
61
+ className: cx('input', 'file-input'),
62
+ readOnly: true,
63
+ value: (_file$name = file === null || file === void 0 ? void 0 : file.name) !== null && _file$name !== void 0 ? _file$name : ''
64
+ }), /*#__PURE__*/React.createElement("button", {
65
+ className: cx('button', 'file-button'),
66
+ type: "button"
67
+ }, "\u9009\u62E9\u6587\u4EF6"))) : /*#__PURE__*/React.createElement("label", {
68
+ className: cx('field')
69
+ }, "\u7F51\u5740", /*#__PURE__*/React.createElement("input", {
70
+ className: cx('input'),
71
+ onChange: function onChange(e) {
72
+ return setUrl(e.target.value);
73
+ }
74
+ })), /*#__PURE__*/React.createElement("label", {
75
+ className: cx('field')
76
+ }, "\u63CF\u8FF0", /*#__PURE__*/React.createElement("input", {
77
+ className: cx('input'),
78
+ onChange: function onChange(e) {
79
+ return setDescription(e.target.value);
80
+ }
81
+ })), /*#__PURE__*/React.createElement("div", {
82
+ className: cx('buttons')
83
+ }, /*#__PURE__*/React.createElement("button", {
84
+ className: cx('button', 'primary'),
85
+ type: "button",
86
+ onClick: function onClick() {
87
+ if (type === 'file' && file) {
88
+ onOk({
89
+ type: type,
90
+ file: file,
91
+ description: description
92
+ });
93
+ } else if (type === 'url' && url) {
94
+ onOk({
95
+ type: type,
96
+ url: url,
97
+ description: description
98
+ });
99
+ }
100
+ }
101
+ }, "\u786E\u5B9A"), /*#__PURE__*/React.createElement("button", {
102
+ className: cx('button'),
103
+ type: "button",
104
+ onClick: onCancel
105
+ }, "\u53D6\u6D88")));
106
+ };
107
+ export default FileInput;
@@ -0,0 +1,81 @@
1
+ .container {
2
+ margin: 0.5em 1em 1em 1em;
3
+ }
4
+
5
+ .tabs {
6
+ display: flex;
7
+ }
8
+
9
+ .tab {
10
+ padding: 0.4em 1em;
11
+ border-bottom: 1px solid #f5771280;
12
+ cursor: pointer;
13
+ user-select: none;
14
+ }
15
+
16
+ .tab.active {
17
+ color: #f57712;
18
+ border-bottom: 2px solid #f57712;
19
+ }
20
+
21
+ .field {
22
+ margin: 0.8em;
23
+ display: flex;
24
+ flex-direction: column;
25
+ gap: 0.2em;
26
+ font-size: 0.9em;
27
+ }
28
+
29
+ .file-container {
30
+ position: relative;
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: space-between;
34
+ }
35
+
36
+ .hidden {
37
+ position: absolute;
38
+ inset: 0;
39
+ opacity: 0;
40
+ }
41
+
42
+ .input {
43
+ width: 20em;
44
+ padding: 0.4em;
45
+ border: 1px solid #d0d0d0;
46
+ border-radius: 0.2em;
47
+ outline: none;
48
+ }
49
+
50
+ .input:focus {
51
+ border: 1px solid #f57712;
52
+ }
53
+
54
+ .input.file-input {
55
+ width: 14em;
56
+ }
57
+
58
+ .buttons {
59
+ display: flex;
60
+ flex-direction: row-reverse;
61
+ gap: 0.4em;
62
+ }
63
+
64
+ .button {
65
+ padding: 0.4em 1em;
66
+ background-color: #f0f0f0;
67
+ border: 1px solid #d0d0d0;
68
+ border-radius: 0.2em;
69
+ cursor: pointer;
70
+ user-select: none;
71
+ }
72
+
73
+ .button.primary {
74
+ color: #ffffff;
75
+ background-color: #f57712;
76
+ border: none;
77
+ }
78
+
79
+ .button.file-button {
80
+ padding: 0.3em 0.4em;
81
+ }
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import type { Executor } from '../utils/handler';
3
+ export interface ToolbarItem {
4
+ children: React.ReactNode;
5
+ tooltip?: React.ReactNode;
6
+ popoverRender?: (exec: Executor, close: () => void) => React.ReactNode;
7
+ onClick?: (exec: Executor) => void;
8
+ }
9
+ export declare const getDefaultToolbarItemMap: (onInsertFile?: ((file: File, options: {
10
+ description: string;
11
+ image: boolean;
12
+ }) => void) | undefined) => Partial<Record<string, ToolbarItem>>;
13
+ export declare const getDefaultToolbarItems: () => (string | ToolbarItem)[][];
14
+ interface ToolbarProps {
15
+ className?: string;
16
+ style?: React.CSSProperties;
17
+ itemMap: Partial<Record<string, ToolbarItem>>;
18
+ items: (string | ToolbarItem)[][];
19
+ exec: Executor;
20
+ }
21
+ declare const Toolbar: ({ className, style, itemMap, items, exec }: ToolbarProps) => React.JSX.Element;
22
+ export default Toolbar;
@@ -0,0 +1,294 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
4
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
5
+ function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ import classNames from 'classnames/bind';
8
+ import React, { useEffect, useRef, useState } from 'react';
9
+ import { toggleHandler } from "../utils/handler";
10
+ import FileInput from "./FileInput";
11
+ import styles from "./Toolbar.module.css";
12
+ var cx = classNames.bind(styles);
13
+ var Button = function Button(_ref) {
14
+ var toolbarRef = _ref.toolbarRef,
15
+ children = _ref.children,
16
+ tooltip = _ref.tooltip,
17
+ popoverRender = _ref.popoverRender,
18
+ _onClick = _ref.onClick;
19
+ var _useState = useState(false),
20
+ _useState2 = _slicedToArray(_useState, 2),
21
+ tooltipOpen = _useState2[0],
22
+ setTooltipOpen = _useState2[1];
23
+ var _useState3 = useState(false),
24
+ _useState4 = _slicedToArray(_useState3, 2),
25
+ popoverOpen = _useState4[0],
26
+ setPopoverOpen = _useState4[1];
27
+ var popover = popoverRender === null || popoverRender === void 0 ? void 0 : popoverRender(function () {
28
+ return setPopoverOpen(false);
29
+ });
30
+ var popoverMount = !!popover && popoverOpen;
31
+ var tooltipMount = !popoverMount && !!tooltip && tooltipOpen;
32
+ var popoverRef = useRef(null);
33
+ useEffect(function () {
34
+ if (popoverMount) {
35
+ if (toolbarRef.current && popoverRef.current) {
36
+ var left = toolbarRef.current.getBoundingClientRect().right - popoverRef.current.getBoundingClientRect().right;
37
+ popoverRef.current.style.left = "".concat(left < 0 ? left : 0, "px");
38
+ popoverRef.current.style.opacity = '1';
39
+ }
40
+ var listener = function listener(e) {
41
+ var _popoverRef$current;
42
+ if (!(e.target instanceof Node) || !((_popoverRef$current = popoverRef.current) !== null && _popoverRef$current !== void 0 && _popoverRef$current.contains(e.target))) {
43
+ setPopoverOpen(false);
44
+ }
45
+ };
46
+ document.addEventListener('click', listener, {
47
+ capture: true,
48
+ passive: true
49
+ });
50
+ return function () {
51
+ return document.removeEventListener('click', listener, {
52
+ capture: true
53
+ });
54
+ };
55
+ }
56
+ }, [popoverMount]);
57
+ return /*#__PURE__*/React.createElement("div", {
58
+ className: cx('button-container')
59
+ }, /*#__PURE__*/React.createElement("div", {
60
+ className: cx('button', {
61
+ 'button-hover': tooltipOpen || popoverMount
62
+ }),
63
+ onClick: function onClick() {
64
+ setPopoverOpen(true);
65
+ _onClick === null || _onClick === void 0 ? void 0 : _onClick();
66
+ },
67
+ onMouseDown: function onMouseDown(e) {
68
+ return e.preventDefault();
69
+ },
70
+ onMouseEnter: function onMouseEnter() {
71
+ return setTooltipOpen(true);
72
+ },
73
+ onMouseLeave: function onMouseLeave() {
74
+ return setTooltipOpen(false);
75
+ }
76
+ }, children, tooltipMount && /*#__PURE__*/React.createElement("div", {
77
+ className: cx('tooltip')
78
+ }, tooltip)), popoverMount && /*#__PURE__*/React.createElement("div", {
79
+ ref: popoverRef,
80
+ className: cx('popover')
81
+ }, popover));
82
+ };
83
+ export var getDefaultToolbarItemMap = function getDefaultToolbarItemMap(onInsertFile) {
84
+ return {
85
+ heading: {
86
+ children: 'H',
87
+ tooltip: '标题',
88
+ popoverRender: function popoverRender(exec, close) {
89
+ var optionRender = function optionRender(depth, fontSize) {
90
+ return /*#__PURE__*/React.createElement("div", {
91
+ className: cx('option'),
92
+ style: {
93
+ fontSize: fontSize
94
+ },
95
+ onClick: function onClick() {
96
+ exec(toggleHandler({
97
+ type: 'heading',
98
+ depth: depth
99
+ }));
100
+ close();
101
+ }
102
+ }, "\u6807\u9898 ", depth);
103
+ };
104
+ return /*#__PURE__*/React.createElement(React.Fragment, null, optionRender(1, '1.6em'), optionRender(2, '1.3em'), optionRender(3, '1.2em'), optionRender(4, '1.1em'), optionRender(5, '1.0em'), optionRender(6, '0.9em'));
105
+ }
106
+ },
107
+ thematicBreak: {
108
+ children: '—',
109
+ tooltip: '分隔线',
110
+ onClick: function onClick(exec) {
111
+ return exec(toggleHandler({
112
+ type: 'thematicBreak'
113
+ }));
114
+ }
115
+ },
116
+ blockquote: {
117
+ children: '『』',
118
+ tooltip: '引用',
119
+ onClick: function onClick(exec) {
120
+ return exec(toggleHandler({
121
+ type: 'blockquote'
122
+ }));
123
+ }
124
+ },
125
+ code: {
126
+ children: /*#__PURE__*/React.createElement("div", {
127
+ className: cx('icon', 'code-library')
128
+ }),
129
+ tooltip: '代码块',
130
+ onClick: function onClick(exec) {
131
+ return exec(toggleHandler({
132
+ type: 'code'
133
+ }));
134
+ }
135
+ },
136
+ emphasis: {
137
+ children: /*#__PURE__*/React.createElement("div", {
138
+ className: cx('icon', 'italic')
139
+ }),
140
+ tooltip: '斜体',
141
+ onClick: function onClick(exec) {
142
+ return exec(toggleHandler({
143
+ type: 'emphasis'
144
+ }));
145
+ }
146
+ },
147
+ strong: {
148
+ children: /*#__PURE__*/React.createElement("div", {
149
+ className: cx('icon', 'bold')
150
+ }),
151
+ tooltip: '粗体',
152
+ onClick: function onClick(exec) {
153
+ return exec(toggleHandler({
154
+ type: 'strong'
155
+ }));
156
+ }
157
+ },
158
+ inlineCode: {
159
+ children: /*#__PURE__*/React.createElement("div", {
160
+ className: cx('icon', 'code')
161
+ }),
162
+ tooltip: '行内代码',
163
+ onClick: function onClick(exec) {
164
+ return exec(toggleHandler({
165
+ type: 'inlineCode'
166
+ }));
167
+ }
168
+ },
169
+ link: {
170
+ children: /*#__PURE__*/React.createElement("div", {
171
+ className: cx('icon', 'link')
172
+ }),
173
+ tooltip: '链接',
174
+ popoverRender: function popoverRender(exec, close) {
175
+ return /*#__PURE__*/React.createElement(FileInput, {
176
+ onCancel: close,
177
+ onOk: function onOk(data) {
178
+ if (data.type === 'file') {
179
+ onInsertFile === null || onInsertFile === void 0 ? void 0 : onInsertFile(data.file, {
180
+ description: data.description,
181
+ image: false
182
+ });
183
+ } else {
184
+ exec(toggleHandler({
185
+ type: 'link',
186
+ url: data.url,
187
+ description: data.description
188
+ }));
189
+ }
190
+ close();
191
+ }
192
+ });
193
+ }
194
+ },
195
+ image: {
196
+ children: /*#__PURE__*/React.createElement("div", {
197
+ className: cx('icon', 'image')
198
+ }),
199
+ tooltip: '图片',
200
+ popoverRender: function popoverRender(exec, close) {
201
+ return /*#__PURE__*/React.createElement(FileInput, {
202
+ onCancel: close,
203
+ onOk: function onOk(data) {
204
+ if (data.type === 'file') {
205
+ onInsertFile === null || onInsertFile === void 0 ? void 0 : onInsertFile(data.file, {
206
+ description: data.description,
207
+ image: true
208
+ });
209
+ } else {
210
+ exec(toggleHandler({
211
+ type: 'image',
212
+ url: data.url,
213
+ description: data.description
214
+ }));
215
+ }
216
+ close();
217
+ }
218
+ });
219
+ }
220
+ },
221
+ delete: {
222
+ children: /*#__PURE__*/React.createElement("div", {
223
+ className: cx('icon', 'strikethrough')
224
+ }),
225
+ tooltip: '删除线',
226
+ onClick: function onClick(exec) {
227
+ return exec(toggleHandler({
228
+ type: 'delete'
229
+ }));
230
+ }
231
+ },
232
+ math: {
233
+ children: 'π',
234
+ tooltip: '公式块',
235
+ onClick: function onClick(exec) {
236
+ return exec(toggleHandler({
237
+ type: 'math'
238
+ }));
239
+ }
240
+ },
241
+ inlineMath: {
242
+ children: '𝑥',
243
+ tooltip: '行内公式',
244
+ onClick: function onClick(exec) {
245
+ return exec(toggleHandler({
246
+ type: 'inlineMath'
247
+ }));
248
+ }
249
+ }
250
+ };
251
+ };
252
+ export var getDefaultToolbarItems = function getDefaultToolbarItems() {
253
+ return [['heading', 'strong', 'emphasis', 'delete'], ['thematicBreak', 'blockquote'], ['link', 'image'], ['inlineCode', 'code', 'inlineMath', 'math']];
254
+ };
255
+ var Toolbar = function Toolbar(_ref2) {
256
+ var className = _ref2.className,
257
+ style = _ref2.style,
258
+ itemMap = _ref2.itemMap,
259
+ items = _ref2.items,
260
+ exec = _ref2.exec;
261
+ var toolbarRef = useRef(null);
262
+ return /*#__PURE__*/React.createElement("div", {
263
+ ref: toolbarRef,
264
+ className: cx('toolbar', className),
265
+ style: style
266
+ }, items.map(function (group, index) {
267
+ return /*#__PURE__*/React.createElement(React.Fragment, {
268
+ key: index
269
+ }, !!index && /*#__PURE__*/React.createElement("div", {
270
+ className: cx('divider')
271
+ }), group.map(function (item, index) {
272
+ var toolbarItem = typeof item === 'string' ? itemMap[item] : item;
273
+ if (!toolbarItem) {
274
+ return undefined;
275
+ }
276
+ var children = toolbarItem.children,
277
+ tooltip = toolbarItem.tooltip,
278
+ _popoverRender = toolbarItem.popoverRender,
279
+ _onClick2 = toolbarItem.onClick;
280
+ return /*#__PURE__*/React.createElement(Button, {
281
+ key: index,
282
+ toolbarRef: toolbarRef,
283
+ tooltip: tooltip,
284
+ popoverRender: function popoverRender(close) {
285
+ return _popoverRender === null || _popoverRender === void 0 ? void 0 : _popoverRender(exec, close);
286
+ },
287
+ onClick: function onClick() {
288
+ return _onClick2 === null || _onClick2 === void 0 ? void 0 : _onClick2(exec);
289
+ }
290
+ }, children);
291
+ }));
292
+ }));
293
+ };
294
+ export default Toolbar;
@@ -0,0 +1,116 @@
1
+ .button-container {
2
+ position: relative;
3
+ }
4
+
5
+ .button {
6
+ width: 2em;
7
+ height: 2em;
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ font-family: Consolas;
12
+ border: 1px solid transparent;
13
+ cursor: pointer;
14
+ user-select: none;
15
+ }
16
+
17
+ .button-hover {
18
+ background-color: #f8f8f8;
19
+ border: 1px solid #f5771280;
20
+ border-radius: 0.2em;
21
+ }
22
+
23
+ .tooltip {
24
+ position: absolute;
25
+ top: 3em;
26
+ width: max-content;
27
+ padding: 0.4em;
28
+ font-size: 0.8em;
29
+ color: #f8f8f8;
30
+ background-color: #022679;
31
+ border-radius: 0.2em;
32
+ z-index: 2;
33
+ }
34
+
35
+ .tooltip::before {
36
+ content: '';
37
+ position: absolute;
38
+ top: -0.3em;
39
+ left: 50%;
40
+ border-top: 0.6em solid #022679;
41
+ border-right: 0.6em solid transparent;
42
+ transform-origin: 0 0;
43
+ transform: rotate(45deg);
44
+ }
45
+
46
+ .popover {
47
+ position: absolute;
48
+ width: max-content;
49
+ background-color: #f8f8f8;
50
+ border: 1px solid #f5771280;
51
+ border-radius: 0.2em;
52
+ box-shadow: 0 2px 4px #00000020;
53
+ opacity: 0;
54
+ z-index: 1;
55
+ }
56
+
57
+ .option {
58
+ padding: 4px 8px;
59
+ cursor: pointer;
60
+ user-select: none;
61
+ }
62
+
63
+ .option:hover {
64
+ background-color: #f0f0f0;
65
+ }
66
+
67
+ .icon {
68
+ width: 45%;
69
+ height: 45%;
70
+ background-size: contain;
71
+ }
72
+
73
+ .icon.code-library {
74
+ background-image: url(icons/code-library.svg);
75
+ }
76
+
77
+ .icon.italic {
78
+ background-image: url(icons/italic.svg);
79
+ }
80
+
81
+ .icon.bold {
82
+ background-image: url(icons/bold.svg);
83
+ }
84
+
85
+ .icon.code {
86
+ background-image: url(icons/code.svg);
87
+ }
88
+
89
+ .icon.link {
90
+ background-image: url(icons/link.svg);
91
+ }
92
+
93
+ .icon.image {
94
+ background-image: url(icons/image.svg);
95
+ }
96
+
97
+ .icon.strikethrough {
98
+ background-image: url(icons/strikethrough.svg);
99
+ }
100
+
101
+ .toolbar {
102
+ margin: 0 -1px;
103
+ padding: 0.2em;
104
+ display: flex;
105
+ flex-wrap: wrap;
106
+ gap: 0.2em;
107
+ background-color: #f5771210;
108
+ border: 1px solid #f5771220;
109
+ border-top-left-radius: 0.2em;
110
+ border-top-right-radius: 0.2em;
111
+ }
112
+
113
+ .divider {
114
+ margin: 0.4em;
115
+ border: 1px solid #f5771280;
116
+ }
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1681626310611" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8363" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M697.8 481.4c33.6-35 54.2-82.3 54.2-134.3v-10.2C752 229.3 663.9 142 555.3 142H259.4c-15.1 0-27.4 12.3-27.4 27.4v679.1c0 16.3 13.2 29.5 29.5 29.5h318.7c117 0 211.8-94.2 211.8-210.5v-11c0-73-37.4-137.3-94.2-175.1zM328 238h224.7c57.1 0 103.3 44.4 103.3 99.3v9.5c0 54.8-46.3 99.3-103.3 99.3H328V238z m366.6 429.4c0 62.9-51.7 113.9-115.5 113.9H328V542.7h251.1c63.8 0 115.5 51 115.5 113.9v10.8z" p-id="8364"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1681627986714" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9340" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M516 673c0 4.4 3.4 8 7.5 8h185c4.1 0 7.5-3.6 7.5-8v-48c0-4.4-3.4-8-7.5-8h-185c-4.1 0-7.5 3.6-7.5 8v48zM321.1 679.1l192-161c3.8-3.2 3.8-9.1 0-12.3l-192-160.9c-5.2-4.4-13.1-0.7-13.1 6.1v62.7c0 2.4 1 4.6 2.9 6.1L420.7 512l-109.8 92.2c-1.8 1.5-2.9 3.8-2.9 6.1V673c0 6.8 7.9 10.5 13.1 6.1z" p-id="9341"></path><path d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32z m-40 728H184V184h656v656z" p-id="9342"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1681626580538" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8641" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M438.4 849.1l222.7-646.7c0.2-0.5 0.3-1.1 0.4-1.6L438.4 849.1z" opacity=".224" p-id="8642"></path><path d="M661.2 168.7h-67.5c-3.4 0-6.5 2.2-7.6 5.4L354.7 846c-0.3 0.8-0.4 1.7-0.4 2.6 0 4.4 3.6 8 8 8h67.8c3.4 0 6.5-2.2 7.6-5.4l0.7-2.1 223.1-648.3 7.4-21.4c0.3-0.8 0.4-1.7 0.4-2.6-0.1-4.5-3.6-8.1-8.1-8.1zM954.6 502.1c-0.8-1-1.7-1.9-2.7-2.7l-219-171.3c-3.5-2.7-8.5-2.1-11.2 1.4-1.1 1.4-1.7 3.1-1.7 4.9v81.3c0 2.5 1.1 4.8 3.1 6.3l115 90-115 90c-1.9 1.5-3.1 3.8-3.1 6.3v81.3c0 4.4 3.6 8 8 8 1.8 0 3.5-0.6 4.9-1.7l219-171.3c6.9-5.4 8.2-15.5 2.7-22.5zM291.1 328.1l-219 171.3c-1 0.8-1.9 1.7-2.7 2.7-5.4 7-4.2 17 2.7 22.5l219 171.3c1.4 1.1 3.1 1.7 4.9 1.7 4.4 0 8-3.6 8-8v-81.3c0-2.5-1.1-4.8-3.1-6.3l-115-90 115-90c1.9-1.5 3.1-3.8 3.1-6.3v-81.3c0-1.8-0.6-3.5-1.7-4.9-2.7-3.5-7.7-4.1-11.2-1.4z" p-id="8643"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1681626730905" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8920" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32z m-40 632H136v-39.9l138.5-164.3 150.1 178L658.1 489 888 761.6V792z m0-129.8L664.2 396.8c-3.2-3.8-9-3.8-12.2 0L424.6 666.4l-144-170.7c-3.2-3.8-9-3.8-12.2 0L136 652.7V232h752v430.2z" p-id="8921"></path><path d="M304 456c48.6 0 88-39.4 88-88s-39.4-88-88-88-88 39.4-88 88 39.4 88 88 88z m0-116c15.5 0 28 12.5 28 28s-12.5 28-28 28-28-12.5-28-28 12.5-28 28-28z" p-id="8922"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1681626574917" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8502" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M798 160H366c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h181.2l-156 544H229c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h432c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8H474.4l156-544H798c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8z" p-id="8503"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1681626738114" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9060" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M574 665.4c-3.1-3.1-8.2-3.1-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8c-3.1-3.1-8.2-3.1-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zM832.6 191.4c-84.6-84.6-221.5-84.6-306 0L410.3 307.6c-3.1 3.1-3.1 8.2 0 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6c-3.1 3.1-3.1 8.2 0 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1z" p-id="9061"></path><path d="M610.1 372.3c-3.1-3.1-8.2-3.1-11.3 0L372.3 598.7c-3.1 3.1-3.1 8.2 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z" p-id="9062"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1681626588137" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8781" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M952 474H569.9c-10-2-20.5-4-31.6-6-15.9-2.9-22.2-4.1-30.8-5.8-51.3-10-82.2-20-106.8-34.2-35.1-20.5-52.2-48.3-52.2-85.1 0-37 15.2-67.7 44-89 28.4-21 68.8-32.1 116.8-32.1 54.8 0 97.1 14.4 125.8 42.8 14.6 14.4 25.3 32.1 31.8 52.6 1.3 4.1 2.8 10 4.3 17.8 0.9 4.8 5.2 8.2 9.9 8.2h72.8c5.6 0 10.1-4.6 10.1-10.1v-1c-0.7-6.8-1.3-12.1-2-16-7.3-43.5-28-81.7-59.7-110.3-44.4-40.5-109.7-61.8-188.7-61.8-72.3 0-137.4 18.1-183.3 50.9-25.6 18.4-45.4 41.2-58.6 67.7-13.5 27.1-20.3 58.4-20.3 92.9 0 29.5 5.7 54.5 17.3 76.5 8.3 15.7 19.6 29.5 34.1 42H72c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h433.2c2.1 0.4 3.9 0.8 5.9 1.2 30.9 6.2 49.5 10.4 66.6 15.2 23 6.5 40.6 13.3 55.2 21.5 35.8 20.2 53.3 49.2 53.3 89 0 35.3-15.5 66.8-43.6 88.8-30.5 23.9-75.6 36.4-130.5 36.4-43.7 0-80.7-8.5-110.2-25-29.1-16.3-49.1-39.8-59.7-69.5-0.8-2.2-1.7-5.2-2.7-9-1.2-4.4-5.3-7.5-9.7-7.5h-79.7c-5.6 0-10.1 4.6-10.1 10.1v1c0.2 2.3 0.4 4.2 0.6 5.7 6.5 48.8 30.3 88.8 70.7 118.8 47.1 34.8 113.4 53.2 191.8 53.2 84.2 0 154.8-19.8 204.2-57.3 25-18.9 44.2-42.2 57.1-69 13-27.1 19.7-57.9 19.7-91.5 0-31.8-5.8-58.4-17.8-81.4-5.8-11.2-13.1-21.5-21.8-30.8H952c4.4 0 8-3.6 8-8v-60c0-4.3-3.6-7.9-8-7.9z" p-id="8782"></path></svg>
@@ -0,0 +1,9 @@
1
+ export { default as XStarEditor } from './XStarEditor';
2
+ export type { XStarMDProps } from './XStarEditor';
3
+ export { default as XStarMdEditor } from './XStarMdEditor';
4
+ export type { XStarMdEditorHandle, XStarMdEditorPlugin, XStarMdEditorProps, } from './XStarMdEditor';
5
+ export { default as XStarMdViewer } from './XStarMdViewer';
6
+ export type { XStarMdViewerHandle, XStarMdViewerPlugin, XStarMdViewerProps, } from './XStarMdViewer';
7
+ export { createSelection, getRange } from './utils/container';
8
+ export { deleteHandler, insertHandler, redoHandler, selectHandler, setHandler, toggleHandler, undoHandler, } from './utils/handler';
9
+ export type { Handler } from './utils/handler';
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { default as XStarEditor } from "./XStarEditor";
2
+ export { default as XStarMdEditor } from "./XStarMdEditor";
3
+ export { default as XStarMdViewer } from "./XStarMdViewer";
4
+ export { createSelection, getRange } from "./utils/container";
5
+ export { deleteHandler, insertHandler, redoHandler, selectHandler, setHandler, toggleHandler, undoHandler } from "./utils/handler";