ds-markdown 1.0.4 → 1.0.5-beta.1
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 +36 -0
- package/README.zh.md +36 -0
- package/es/AutoScroll/index.d.ts.map +1 -1
- package/es/AutoScroll/index.js +2 -3
- package/es/AutoScroll/index.js.map +1 -1
- package/es/MarkdownCMD/index.d.ts +1 -0
- package/es/MarkdownCMD/index.d.ts.map +1 -1
- package/es/MarkdownCMD/index.js +27 -3
- package/es/MarkdownCMD/index.js.map +1 -1
- package/es/components/CodeComponent/CodeBlockActions/index.d.ts +2 -2
- package/es/components/CodeComponent/CodeBlockActions/index.d.ts.map +1 -1
- package/es/components/CodeComponent/CodeBlockActions/index.js +5 -2
- package/es/components/CodeComponent/CodeBlockActions/index.js.map +1 -1
- package/es/components/CodeComponent/HighlightCode/index.d.ts +3 -2
- package/es/components/CodeComponent/HighlightCode/index.d.ts.map +1 -1
- package/es/components/CodeComponent/HighlightCode/index.js +8 -4
- package/es/components/CodeComponent/HighlightCode/index.js.map +1 -1
- package/es/components/CodeComponent/index.d.ts +3 -3
- package/es/components/CodeComponent/index.d.ts.map +1 -1
- package/es/components/CodeComponent/index.js +64 -5
- package/es/components/CodeComponent/index.js.map +1 -1
- package/es/components/CopyButton/index.d.ts +2 -2
- package/es/components/CopyButton/index.d.ts.map +1 -1
- package/es/components/CopyButton/index.js +6 -3
- package/es/components/CopyButton/index.js.map +1 -1
- package/es/components/DownloadButton/index.d.ts +2 -2
- package/es/components/DownloadButton/index.d.ts.map +1 -1
- package/es/components/DownloadButton/index.js +61 -50
- package/es/components/DownloadButton/index.js.map +1 -1
- package/es/components/ui/SuccessButton/index.d.ts.map +1 -1
- package/es/components/ui/SuccessButton/index.js +15 -12
- package/es/components/ui/SuccessButton/index.js.map +1 -1
- package/es/context/MarkdownProvider.d.ts.map +1 -1
- package/es/context/MarkdownProvider.js +3 -3
- package/es/context/MarkdownProvider.js.map +1 -1
- package/es/defined/index.d.ts +1 -0
- package/es/defined/index.d.ts.map +1 -1
- package/es/index.css +44 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -93,6 +93,40 @@ function App() {
|
|
|
93
93
|
}
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
+
### Typing Cursor Examples
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
// Show default line cursor
|
|
100
|
+
<DsMarkdown showCursor>
|
|
101
|
+
Your markdown content here...
|
|
102
|
+
</DsMarkdown>
|
|
103
|
+
|
|
104
|
+
// Use built-in cursor styles
|
|
105
|
+
<DsMarkdown showCursor cursor="block">
|
|
106
|
+
Your markdown content...
|
|
107
|
+
</DsMarkdown>
|
|
108
|
+
|
|
109
|
+
<DsMarkdown showCursor cursor="underline">
|
|
110
|
+
Your markdown content...
|
|
111
|
+
</DsMarkdown>
|
|
112
|
+
|
|
113
|
+
<DsMarkdown showCursor cursor="circle">
|
|
114
|
+
Your markdown content...
|
|
115
|
+
</DsMarkdown>
|
|
116
|
+
|
|
117
|
+
// Custom cursor element
|
|
118
|
+
<DsMarkdown showCursor cursor={<span style={{ color: 'red' }}>|</span>}>
|
|
119
|
+
Your markdown content...
|
|
120
|
+
</DsMarkdown>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Available cursor types:**
|
|
124
|
+
- `line` - Vertical line (default)
|
|
125
|
+
- `block` - Filled block
|
|
126
|
+
- `underline` - Horizontal underline
|
|
127
|
+
- `circle` - Circular dot
|
|
128
|
+
- Custom `React.ReactNode` - Any custom React element
|
|
129
|
+
|
|
96
130
|
## Core API Documentation
|
|
97
131
|
|
|
98
132
|
For detailed documentation, please visit: [Full Documentation](https://onshinpei.github.io/ds-markdown/#get-started)
|
|
@@ -111,6 +145,8 @@ import DsMarkdown, { MarkdownCMD } from 'ds-markdown';
|
|
|
111
145
|
| `theme` | `'light'` \| `'dark'` | Theme type | `'light'` |
|
|
112
146
|
| `plugins` | `IMarkdownPlugin[]` | Plugin configuration | `[]` |
|
|
113
147
|
| `math` | `IMarkdownMath` | Mathematical formula configuration | `{ splitSymbol: 'dollar' }` |
|
|
148
|
+
| `showCursor` | `boolean` | Whether to show typing cursor during animation | `false` |
|
|
149
|
+
| `cursor` | `React.ReactNode` \| `'line'` \| `'block'` \| `'underline'` \| `'circle'` | Custom cursor element or built-in cursor type | `'line'` (when `showCursor` is `true`) |
|
|
114
150
|
| `onEnd` | `(data: EndData) => void` | Typing completion callback | - |
|
|
115
151
|
| `onStart` | `(data: StartData) => void` | Typing start callback | - |
|
|
116
152
|
| `onBeforeTypedChar` | `(data: IBeforeTypedChar) => Promise<void>` | Callback before character typing, supports async operations, blocks subsequent typing | - |
|
package/README.zh.md
CHANGED
|
@@ -93,6 +93,40 @@ function App() {
|
|
|
93
93
|
}
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
+
### 打字光标示例
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
// 显示默认竖线光标
|
|
100
|
+
<DsMarkdown showCursor>
|
|
101
|
+
这里是你的 markdown 内容...
|
|
102
|
+
</DsMarkdown>
|
|
103
|
+
|
|
104
|
+
// 使用内置光标样式
|
|
105
|
+
<DsMarkdown showCursor cursor="block">
|
|
106
|
+
你的 markdown 内容...
|
|
107
|
+
</DsMarkdown>
|
|
108
|
+
|
|
109
|
+
<DsMarkdown showCursor cursor="underline">
|
|
110
|
+
你的 markdown 内容...
|
|
111
|
+
</DsMarkdown>
|
|
112
|
+
|
|
113
|
+
<DsMarkdown showCursor cursor="circle">
|
|
114
|
+
你的 markdown 内容...
|
|
115
|
+
</DsMarkdown>
|
|
116
|
+
|
|
117
|
+
// 自定义光标元素
|
|
118
|
+
<DsMarkdown showCursor cursor={<span style={{ color: 'red' }}>|</span>}>
|
|
119
|
+
你的 markdown 内容...
|
|
120
|
+
</DsMarkdown>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**可用的光标类型:**
|
|
124
|
+
- `line` - 竖线(默认)
|
|
125
|
+
- `block` - 实心块
|
|
126
|
+
- `underline` - 下划线
|
|
127
|
+
- `circle` - 圆点
|
|
128
|
+
- 自定义 `React.ReactNode` - 任何自定义的 React 元素
|
|
129
|
+
|
|
96
130
|
## 核心API文档
|
|
97
131
|
|
|
98
132
|
详细文档可查看:[完整文档](https://onshinpei.github.io/ds-markdown/#get-started)
|
|
@@ -111,6 +145,8 @@ import DsMarkdown, { MarkdownCMD } from 'ds-markdown';
|
|
|
111
145
|
| `theme` | `'light'` \| `'dark'` | 主题类型 | `'light'` |
|
|
112
146
|
| `plugins` | `IMarkdownPlugin[]` | 插件配置 | `[]` |
|
|
113
147
|
| `math` | `IMarkdownMath` | 数学公式配置 | `{ splitSymbol: 'dollar' }` |
|
|
148
|
+
| `showCursor` | `boolean` | 打字动画时是否显示光标 | `false` |
|
|
149
|
+
| `cursor` | `React.ReactNode` \| `'line'` \| `'block'` \| `'underline'` \| `'circle'` | 自定义光标元素或内置光标类型 | `'line'` (当 `showCursor` 为 `true` 时) |
|
|
114
150
|
| `onEnd` | `(data: EndData) => void` | 打字结束回调 | - |
|
|
115
151
|
| `onStart` | `(data: StartData) => void` | 打字开始回调 | - |
|
|
116
152
|
| `onBeforeTypedChar` | `(data: IBeforeTypedChar) => Promise<void>` | 字符打字前的回调,支持异步操作,会阻塞之后的打字 | - |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AutoScroll/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,eAAe;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AutoScroll/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,eAAe;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAEzC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
package/es/AutoScroll/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
return _jsx("div", { className: "ds-markdown_auto_scroll", children: props.children });
|
|
2
|
+
const AutoScroll = ({ children }) => {
|
|
3
|
+
return _jsx("div", { className: "ds-markdown_auto_scroll", children: children });
|
|
5
4
|
};
|
|
6
5
|
export default AutoScroll;
|
|
7
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/AutoScroll/index.tsx"],"names":[],"mappings":";AAMA,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/AutoScroll/index.tsx"],"names":[],"mappings":";AAMA,MAAM,UAAU,GAA8B,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC7D,OAAO,cAAK,SAAS,EAAC,yBAAyB,YAAE,QAAQ,GAAO,CAAC;AACnE,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -7,6 +7,7 @@ interface IMarkdownCustom {
|
|
|
7
7
|
plugins?: IMarkdownPlugin[];
|
|
8
8
|
math?: IMarkdownMath;
|
|
9
9
|
isInnerRender?: boolean;
|
|
10
|
+
cursor?: React.ReactNode | string | 'circle' | 'block' | 'underline' | 'line';
|
|
10
11
|
}
|
|
11
12
|
declare const MarkdownCMD: import("react").ForwardRefExoticComponent<MarkdownTyperCMDProps & IMarkdownCustom & import("react").RefAttributes<MarkdownCMDRef>>;
|
|
12
13
|
export default MarkdownCMD;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9G,OAAO,EAAyC,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAOpG,UAAU,eAAe;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9G,OAAO,EAAyC,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAOpG,UAAU,eAAe;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;CAC/E;AA0JD,QAAA,MAAM,WAAW,oIAsCf,CAAC;AAEH,eAAe,WAAW,CAAC"}
|
package/es/MarkdownCMD/index.js
CHANGED
|
@@ -10,7 +10,15 @@ import { MarkdownProvider } from '../context/MarkdownProvider.js';
|
|
|
10
10
|
import { useConfig } from '../context/ConfigProvider/index.js';
|
|
11
11
|
import { replaceMathBracket } from '../utils/remarkMathBracket.js';
|
|
12
12
|
import CodeComponent from '../components/CodeComponent/index.js';
|
|
13
|
-
|
|
13
|
+
// Cursor factory function to create cursor elements
|
|
14
|
+
const createCursor = (className) => () => _jsx("span", { className: className });
|
|
15
|
+
const cursorFactories = {
|
|
16
|
+
circle: createCursor('ds-markdown-cursor-circle'),
|
|
17
|
+
block: createCursor('ds-markdown-cursor-block'),
|
|
18
|
+
underline: createCursor('ds-markdown-cursor-underline'),
|
|
19
|
+
line: createCursor('ds-markdown-cursor-line'),
|
|
20
|
+
};
|
|
21
|
+
const MarkdownCMDInner = forwardRef(({ answerType = 'answer', timerType = 'requestAnimationFrame', cursor, showCursor, ...rest }, ref) => {
|
|
14
22
|
var _a, _b;
|
|
15
23
|
const { state: themeState } = useMarkdownThemeContext();
|
|
16
24
|
const cmdRef = useRef(null);
|
|
@@ -74,16 +82,32 @@ const MarkdownCMDInner = forwardRef(({ answerType = 'answer', timerType = 'reque
|
|
|
74
82
|
}
|
|
75
83
|
return markdownString;
|
|
76
84
|
}, [finalReplaceMathBracket, hasKatexPlugin, mathSplitSymbol]);
|
|
85
|
+
// Handle cursor prop: support string types or ReactNode
|
|
86
|
+
const _cursor = useMemo(() => {
|
|
87
|
+
if (!showCursor) {
|
|
88
|
+
return cursor;
|
|
89
|
+
}
|
|
90
|
+
// If cursor is not provided, use default 'line' style
|
|
91
|
+
if (!cursor) {
|
|
92
|
+
return cursorFactories.line();
|
|
93
|
+
}
|
|
94
|
+
// If cursor is a string type, get from cursorFactories and create new instance
|
|
95
|
+
if (typeof cursor === 'string' && cursor in cursorFactories) {
|
|
96
|
+
return cursorFactories[cursor]();
|
|
97
|
+
}
|
|
98
|
+
// Otherwise, use the provided cursor (ReactNode or string)
|
|
99
|
+
return cursor;
|
|
100
|
+
}, [cursor, showCursor]);
|
|
77
101
|
return (_jsx("div", { className: classNames({
|
|
78
102
|
'ds-markdown': true,
|
|
79
103
|
apple: true,
|
|
80
104
|
'ds-markdown-dark': currentTheme === 'dark',
|
|
81
|
-
}), children: _jsx("div", { className: `ds-markdown-${answerType}`, children: _jsx(MarkdownTyperCMD, { ref: cmdRef, timerType: timerType, customConvertMarkdownString: customConvertMarkdownString, ...rest, reactMarkdownProps: {
|
|
105
|
+
}), children: _jsx("div", { className: `ds-markdown-${answerType}`, children: _jsx(MarkdownTyperCMD, { ref: cmdRef, timerType: timerType, customConvertMarkdownString: customConvertMarkdownString, showCursor: showCursor, cursor: _cursor, ...rest, reactMarkdownProps: {
|
|
82
106
|
remarkPlugins,
|
|
83
107
|
rehypePlugins,
|
|
84
108
|
components: {
|
|
85
109
|
code: CodeComponent,
|
|
86
|
-
table: ({ children
|
|
110
|
+
table: ({ children }) => {
|
|
87
111
|
return (_jsx("div", { className: "markdown-table-wrapper", children: _jsx("table", { className: "ds-markdown-table", children: children }) }));
|
|
88
112
|
},
|
|
89
113
|
...components,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACtF,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAA8C,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,aAAa,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AACvJ,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,aAAa,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,6 @@ interface CodeBlockActionsProps {
|
|
|
3
3
|
codeContent?: string;
|
|
4
4
|
language: string;
|
|
5
5
|
}
|
|
6
|
-
declare const
|
|
7
|
-
export default
|
|
6
|
+
declare const _default: React.NamedExoticComponent<CodeBlockActionsProps>;
|
|
7
|
+
export default _default;
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/CodeComponent/CodeBlockActions/index.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/CodeComponent/CodeBlockActions/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAOpC,UAAU,qBAAqB;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;;AAWD,wBAAsC"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo } from 'react';
|
|
2
3
|
import CopyButton from '../../CopyButton/index.js';
|
|
3
4
|
import DownloadButton from '../../DownloadButton/index.js';
|
|
5
|
+
// Extract style constant to avoid creating new object on each render
|
|
6
|
+
const ACTION_BUTTON_STYLE = { fontSize: 13, padding: '0 4px' };
|
|
4
7
|
const CodeBlockActions = ({ codeContent, language }) => {
|
|
5
|
-
return (_jsxs("div", { className: "md-code-block-header-actions", children: [_jsx(CopyButton, { codeContent: codeContent, style:
|
|
8
|
+
return (_jsxs("div", { className: "md-code-block-header-actions", children: [_jsx(CopyButton, { codeContent: codeContent, style: ACTION_BUTTON_STYLE }), _jsx(DownloadButton, { codeContent: codeContent, language: language, style: ACTION_BUTTON_STYLE })] }));
|
|
6
9
|
};
|
|
7
|
-
export default CodeBlockActions;
|
|
10
|
+
export default memo(CodeBlockActions);
|
|
8
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/CodeComponent/CodeBlockActions/index.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/CodeComponent/CodeBlockActions/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,cAAc,MAAM,sBAAsB,CAAC;AAElD,qEAAqE;AACrE,MAAM,mBAAmB,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAO/D,MAAM,gBAAgB,GAAoC,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;IACtF,OAAO,CACL,eAAK,SAAS,EAAC,8BAA8B,aAC3C,KAAC,UAAU,IAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,mBAAmB,GAAI,EACpE,KAAC,cAAc,IAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,GAAI,IACxF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC,gBAAgB,CAAC,CAAC"}
|
|
@@ -2,7 +2,8 @@ import React from 'react';
|
|
|
2
2
|
interface HighlightCodeProps {
|
|
3
3
|
code: string;
|
|
4
4
|
language: string;
|
|
5
|
+
cursorPlaceholder?: React.ReactElement | null;
|
|
5
6
|
}
|
|
6
|
-
declare const
|
|
7
|
-
export default
|
|
7
|
+
declare const _default: React.NamedExoticComponent<HighlightCodeProps>;
|
|
8
|
+
export default _default;
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/CodeComponent/HighlightCode/index.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/CodeComponent/HighlightCode/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAMpC,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;CAC/C;;AAsBD,wBAAmC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { memo } from 'react';
|
|
2
3
|
import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
|
|
3
|
-
|
|
4
|
-
|
|
4
|
+
// Extract empty style object as constant to avoid creating new object on each render
|
|
5
|
+
const EMPTY_STYLE = {};
|
|
6
|
+
const HighlightCode = ({ code, language, cursorPlaceholder }) => {
|
|
7
|
+
console.log('code', code);
|
|
8
|
+
return (_jsx(SyntaxHighlighter, { useInlineStyles: false, language: language, style: EMPTY_STYLE, CodeTag: ({ children, ...props }) => (_jsxs("code", { ...props, children: [children, cursorPlaceholder && cursorPlaceholder] })), children: code }));
|
|
5
9
|
};
|
|
6
|
-
export default HighlightCode;
|
|
10
|
+
export default memo(HighlightCode);
|
|
7
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/CodeComponent/HighlightCode/index.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/CodeComponent/HighlightCode/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAEtE,qFAAqF;AACrF,MAAM,WAAW,GAAG,EAAE,CAAC;AAQvB,MAAM,aAAa,GAAiC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE;IAC5F,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,CACL,KAAC,iBAAiB,IAChB,eAAe,EAAE,KAAK,EACtB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,CACnC,mBAAU,KAAK,aACZ,QAAQ,EAER,iBAAiB,IAAI,iBAAiB,IAClC,CACR,YAEA,IAAI,GACa,CACrB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC,aAAa,CAAC,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import './index.css';
|
|
3
|
-
declare const
|
|
3
|
+
declare const _default: React.NamedExoticComponent<{
|
|
4
4
|
className: string;
|
|
5
|
-
children:
|
|
5
|
+
children: React.ReactNode;
|
|
6
6
|
}>;
|
|
7
|
-
export default
|
|
7
|
+
export default _default;
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CodeComponent/index.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CodeComponent/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAI7C,OAAO,cAAc,CAAC;;eA2DqB,MAAM;cAAY,KAAK,CAAC,SAAS;;AA6B5E,wBAAmC"}
|
|
@@ -1,11 +1,70 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, { memo, useMemo } from 'react';
|
|
2
3
|
import BlockWrap from './BlockWrap/index.js';
|
|
3
4
|
import HighlightCode from './HighlightCode/index.js';
|
|
4
5
|
import './index.css';
|
|
6
|
+
// Extract regex to avoid recompilation on each render
|
|
7
|
+
const LANGUAGE_REGEX = /language-(\w+)/;
|
|
8
|
+
// Helper function to extract string content from children, filtering out React elements
|
|
9
|
+
const extractStringContent = (children) => {
|
|
10
|
+
if (typeof children === 'string') {
|
|
11
|
+
return children;
|
|
12
|
+
}
|
|
13
|
+
if (typeof children === 'number') {
|
|
14
|
+
return String(children);
|
|
15
|
+
}
|
|
16
|
+
if (Array.isArray(children)) {
|
|
17
|
+
return children
|
|
18
|
+
.map(child => extractStringContent(child))
|
|
19
|
+
.join('');
|
|
20
|
+
}
|
|
21
|
+
// If it's a React element (like cursor), return empty string
|
|
22
|
+
if (React.isValidElement(children)) {
|
|
23
|
+
return '';
|
|
24
|
+
}
|
|
25
|
+
// Fallback to string conversion
|
|
26
|
+
return String(children || '');
|
|
27
|
+
};
|
|
28
|
+
// Helper function to check if element is a cursor placeholder from react-markdown-typer
|
|
29
|
+
const isCursorPlaceholder = (element) => {
|
|
30
|
+
const props = element.props;
|
|
31
|
+
return (props === null || props === void 0 ? void 0 : props['data-cursor-placeholder']) === 'true';
|
|
32
|
+
};
|
|
33
|
+
// Helper function to extract cursor placeholder from children
|
|
34
|
+
const extractCursorPlaceholder = (children) => {
|
|
35
|
+
if (React.isValidElement(children)) {
|
|
36
|
+
// Check if it's a cursor placeholder from react-markdown-typer
|
|
37
|
+
if (isCursorPlaceholder(children)) {
|
|
38
|
+
return children;
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
if (Array.isArray(children)) {
|
|
43
|
+
// Find the first cursor placeholder in the array
|
|
44
|
+
for (const child of children) {
|
|
45
|
+
const cursor = extractCursorPlaceholder(child);
|
|
46
|
+
if (cursor) {
|
|
47
|
+
return cursor;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
};
|
|
5
53
|
const CodeComponent = ({ className, children = '' }) => {
|
|
6
|
-
const match =
|
|
7
|
-
const codeContent =
|
|
8
|
-
|
|
54
|
+
const match = useMemo(() => LANGUAGE_REGEX.exec(className || ''), [className]);
|
|
55
|
+
const codeContent = useMemo(() => extractStringContent(children).replace(/\n$/, ''), [children]);
|
|
56
|
+
const cursorPlaceholder = useMemo(() => extractCursorPlaceholder(children), [children]);
|
|
57
|
+
// For inline code, also filter out React elements (like cursor) to avoid "object Object" issue
|
|
58
|
+
const inlineCodeContent = useMemo(() => {
|
|
59
|
+
if (typeof children === 'string') {
|
|
60
|
+
return children;
|
|
61
|
+
}
|
|
62
|
+
return extractStringContent(children);
|
|
63
|
+
}, [children]);
|
|
64
|
+
if (match) {
|
|
65
|
+
return (_jsx(BlockWrap, { language: match[1], codeContent: codeContent, children: _jsx(HighlightCode, { code: codeContent, language: match[1], cursorPlaceholder: cursorPlaceholder }) }));
|
|
66
|
+
}
|
|
67
|
+
return (_jsxs("code", { className: className, children: [inlineCodeContent, cursorPlaceholder && cursorPlaceholder] }));
|
|
9
68
|
};
|
|
10
|
-
export default CodeComponent;
|
|
69
|
+
export default memo(CodeComponent);
|
|
11
70
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/CodeComponent/index.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/CodeComponent/index.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,OAAO,cAAc,CAAC;AAEtB,sDAAsD;AACtD,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAExC,wFAAwF;AACxF,MAAM,oBAAoB,GAAG,CAAC,QAAyB,EAAU,EAAE;IACjE,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ;aACZ,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;aACzC,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAED,6DAA6D;IAC7D,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,gCAAgC;IAChC,OAAO,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF,wFAAwF;AACxF,MAAM,mBAAmB,GAAG,CAAC,OAA2B,EAAW,EAAE;IACnE,MAAM,KAAK,GAAG,OAAO,CAAC,KAA+C,CAAC;IACtE,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,yBAAyB,CAAC,MAAK,MAAM,CAAC;AACvD,CAAC,CAAC;AAEF,8DAA8D;AAC9D,MAAM,wBAAwB,GAAG,CAAC,QAAyB,EAA6B,EAAE;IACxF,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,+DAA+D;QAC/D,IAAI,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,OAAO,QAA8B,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,iDAAiD;QACjD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,aAAa,GAA+D,CAAC,EAAE,SAAS,EAAE,QAAQ,GAAG,EAAE,EAAE,EAAE,EAAE;IACjH,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjG,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAExF,+FAA+F;IAC/F,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,EAAE;QACrC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CACL,KAAC,SAAS,IAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,YACrD,KAAC,aAAa,IAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,iBAAiB,GAAI,GACpF,CACb,CAAC;IACJ,CAAC;IAED,OAAO,CACL,gBAAM,SAAS,EAAE,SAAS,aACvB,iBAAiB,EACjB,iBAAiB,IAAI,iBAAiB,IAClC,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC,aAAa,CAAC,CAAC"}
|
|
@@ -4,6 +4,6 @@ interface CopyButtonProps {
|
|
|
4
4
|
style?: React.CSSProperties;
|
|
5
5
|
className?: string;
|
|
6
6
|
}
|
|
7
|
-
declare const
|
|
8
|
-
export default
|
|
7
|
+
declare const _default: React.NamedExoticComponent<CopyButtonProps>;
|
|
8
|
+
export default _default;
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CopyButton/index.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CopyButton/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAKjD,UAAU,eAAe;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;;AA4BD,wBAAgC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useCallback } from 'react';
|
|
2
3
|
import { CopyIcon } from '../Icon/index.js';
|
|
3
4
|
import { useConfig } from '../../context/ConfigProvider/index.js';
|
|
4
5
|
import SuccessButton from '../ui/SuccessButton/index.js';
|
|
5
6
|
const CopyButton = ({ codeContent, style, className }) => {
|
|
6
7
|
const { locale } = useConfig();
|
|
7
|
-
const handleCopy = async () => {
|
|
8
|
+
const handleCopy = useCallback(async () => {
|
|
8
9
|
try {
|
|
9
10
|
await navigator.clipboard.writeText(codeContent || '');
|
|
10
11
|
return true;
|
|
@@ -13,12 +14,14 @@ const CopyButton = ({ codeContent, style, className }) => {
|
|
|
13
14
|
// Fallback: use traditional method
|
|
14
15
|
const textArea = document.createElement('textarea');
|
|
15
16
|
textArea.value = codeContent || '';
|
|
17
|
+
document.body.appendChild(textArea);
|
|
16
18
|
textArea.select();
|
|
17
19
|
document.execCommand('copy');
|
|
20
|
+
document.body.removeChild(textArea);
|
|
18
21
|
return true;
|
|
19
22
|
}
|
|
20
|
-
};
|
|
23
|
+
}, [codeContent]);
|
|
21
24
|
return (_jsx(SuccessButton, { onClick: handleCopy, icon: _jsx(CopyIcon, { size: 24 }), executeText: locale.codeBlock.copied || 'copied', style: style, className: className, children: locale.codeBlock.copy || 'copy' }));
|
|
22
25
|
};
|
|
23
|
-
export default CopyButton;
|
|
26
|
+
export default memo(CopyButton);
|
|
24
27
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/CopyButton/index.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/CopyButton/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAQhD,MAAM,UAAU,GAA8B,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE;IAClF,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAE/B,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mCAAmC;YACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACpD,QAAQ,CAAC,KAAK,GAAG,WAAW,IAAI,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,OAAO,CACL,KAAC,aAAa,IAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,EAAE,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,IAAI,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,YACnJ,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,MAAM,GAClB,CACjB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC,UAAU,CAAC,CAAC"}
|
|
@@ -5,6 +5,6 @@ interface DownloadButtonProps {
|
|
|
5
5
|
style?: React.CSSProperties;
|
|
6
6
|
className?: string;
|
|
7
7
|
}
|
|
8
|
-
declare const
|
|
9
|
-
export default
|
|
8
|
+
declare const _default: React.NamedExoticComponent<DownloadButtonProps>;
|
|
9
|
+
export default _default;
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DownloadButton/index.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DownloadButton/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AA0CjD,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;;AAwCD,wBAAoC"}
|
|
@@ -1,61 +1,72 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useCallback } from 'react';
|
|
2
3
|
import { DownloadIcon } from '../Icon/index.js';
|
|
3
4
|
import { useConfig } from '../../context/ConfigProvider/index.js';
|
|
4
5
|
import SuccessButton from '../ui/SuccessButton/index.js';
|
|
6
|
+
// File extension mapping - extracted as constant
|
|
7
|
+
const FILE_EXTENSIONS = {
|
|
8
|
+
javascript: 'js',
|
|
9
|
+
typescript: 'ts',
|
|
10
|
+
jsx: 'jsx',
|
|
11
|
+
tsx: 'tsx',
|
|
12
|
+
python: 'py',
|
|
13
|
+
java: 'java',
|
|
14
|
+
cpp: 'cpp',
|
|
15
|
+
c: 'c',
|
|
16
|
+
csharp: 'cs',
|
|
17
|
+
php: 'php',
|
|
18
|
+
ruby: 'rb',
|
|
19
|
+
go: 'go',
|
|
20
|
+
rust: 'rs',
|
|
21
|
+
swift: 'swift',
|
|
22
|
+
kotlin: 'kt',
|
|
23
|
+
scala: 'scala',
|
|
24
|
+
shell: 'sh',
|
|
25
|
+
bash: 'sh',
|
|
26
|
+
powershell: 'ps1',
|
|
27
|
+
sql: 'sql',
|
|
28
|
+
html: 'html',
|
|
29
|
+
css: 'css',
|
|
30
|
+
scss: 'scss',
|
|
31
|
+
less: 'less',
|
|
32
|
+
json: 'json',
|
|
33
|
+
xml: 'xml',
|
|
34
|
+
yaml: 'yml',
|
|
35
|
+
markdown: 'md',
|
|
36
|
+
dockerfile: 'dockerfile',
|
|
37
|
+
};
|
|
38
|
+
const getFileExtension = (lang) => {
|
|
39
|
+
return FILE_EXTENSIONS[lang.toLowerCase()] || 'txt';
|
|
40
|
+
};
|
|
5
41
|
const DownloadButton = ({ codeContent, language, style, className }) => {
|
|
6
42
|
const { locale } = useConfig();
|
|
7
|
-
|
|
8
|
-
const handleDownload = async () => {
|
|
43
|
+
const handleDownload = useCallback(async () => {
|
|
9
44
|
if (!codeContent)
|
|
10
45
|
return false;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
bash: 'sh',
|
|
35
|
-
powershell: 'ps1',
|
|
36
|
-
sql: 'sql',
|
|
37
|
-
html: 'html',
|
|
38
|
-
css: 'css',
|
|
39
|
-
scss: 'scss',
|
|
40
|
-
less: 'less',
|
|
41
|
-
json: 'json',
|
|
42
|
-
xml: 'xml',
|
|
43
|
-
yaml: 'yml',
|
|
44
|
-
markdown: 'md',
|
|
45
|
-
dockerfile: 'dockerfile',
|
|
46
|
-
};
|
|
47
|
-
return extensions[lang.toLowerCase()] || 'txt';
|
|
48
|
-
};
|
|
49
|
-
const fileName = `code.${getFileExtension(language)}`;
|
|
50
|
-
link.href = url;
|
|
51
|
-
link.download = fileName;
|
|
52
|
-
document.body.appendChild(link);
|
|
53
|
-
link.click();
|
|
54
|
-
document.body.removeChild(link);
|
|
55
|
-
URL.revokeObjectURL(url);
|
|
56
|
-
return true;
|
|
57
|
-
};
|
|
46
|
+
let url = null;
|
|
47
|
+
let link = null;
|
|
48
|
+
try {
|
|
49
|
+
const blob = new Blob([codeContent], { type: 'text/plain;charset=utf-8' });
|
|
50
|
+
url = URL.createObjectURL(blob);
|
|
51
|
+
link = document.createElement('a');
|
|
52
|
+
const fileName = `code.${getFileExtension(language)}`;
|
|
53
|
+
link.href = url;
|
|
54
|
+
link.download = fileName;
|
|
55
|
+
document.body.appendChild(link);
|
|
56
|
+
link.click();
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
// Ensure cleanup always runs
|
|
61
|
+
if (link && document.body.contains(link)) {
|
|
62
|
+
document.body.removeChild(link);
|
|
63
|
+
}
|
|
64
|
+
if (url) {
|
|
65
|
+
URL.revokeObjectURL(url);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}, [codeContent, language]);
|
|
58
69
|
return (_jsx(SuccessButton, { onClick: handleDownload, icon: _jsx(DownloadIcon, { size: 24 }), executeText: locale.codeBlock.downloaded || 'Downloaded', style: style, className: className, children: locale.codeBlock.download || 'Download' }));
|
|
59
70
|
};
|
|
60
|
-
export default DownloadButton;
|
|
71
|
+
export default memo(DownloadButton);
|
|
61
72
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DownloadButton/index.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DownloadButton/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/SuccessButton/index.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/SuccessButton/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAIrC,KAAK,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,CAAC;AAEvD,UAAU,kBAAmB,SAAQ,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;IAC/D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA+C/C,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
3
|
import Button from '../../ui/Button/index.js';
|
|
4
4
|
import { CheckMarkIcon } from '../../Icon/index.js';
|
|
5
5
|
const SuccessButton = (props) => {
|
|
6
6
|
const { onClick, icon, executeText, children, ...rest } = props;
|
|
7
7
|
const [isLoading, setIsLoading] = useState(false);
|
|
8
8
|
const [isSuccess, setIsSuccess] = useState(false);
|
|
9
|
-
const
|
|
10
|
-
const handleClick = async () => {
|
|
9
|
+
const timerRef = useRef(null);
|
|
10
|
+
const handleClick = useCallback(async () => {
|
|
11
11
|
if (isLoading || isSuccess) {
|
|
12
12
|
return;
|
|
13
13
|
}
|
|
@@ -19,11 +19,6 @@ const SuccessButton = (props) => {
|
|
|
19
19
|
const result = await returnValue;
|
|
20
20
|
if (result) {
|
|
21
21
|
setIsSuccess(true);
|
|
22
|
-
setTimeout(() => {
|
|
23
|
-
if (!isUnmounted.current) {
|
|
24
|
-
setIsSuccess(false);
|
|
25
|
-
}
|
|
26
|
-
}, 1000);
|
|
27
22
|
}
|
|
28
23
|
}
|
|
29
24
|
}
|
|
@@ -33,13 +28,21 @@ const SuccessButton = (props) => {
|
|
|
33
28
|
finally {
|
|
34
29
|
setIsLoading(false);
|
|
35
30
|
}
|
|
36
|
-
};
|
|
31
|
+
}, [isLoading, isSuccess, onClick]);
|
|
32
|
+
// Handle success state timeout with proper cleanup
|
|
37
33
|
useEffect(() => {
|
|
38
|
-
|
|
34
|
+
if (isSuccess) {
|
|
35
|
+
timerRef.current = setTimeout(() => {
|
|
36
|
+
setIsSuccess(false);
|
|
37
|
+
}, 1000);
|
|
38
|
+
}
|
|
39
39
|
return () => {
|
|
40
|
-
|
|
40
|
+
if (timerRef.current) {
|
|
41
|
+
clearTimeout(timerRef.current);
|
|
42
|
+
timerRef.current = null;
|
|
43
|
+
}
|
|
41
44
|
};
|
|
42
|
-
}, []);
|
|
45
|
+
}, [isSuccess]);
|
|
43
46
|
return (_jsx(Button, { ...rest, onClick: handleClick, icon: isSuccess ? _jsx(CheckMarkIcon, { size: 24 }) : icon, children: isSuccess ? executeText || children : children }));
|
|
44
47
|
};
|
|
45
48
|
export default SuccessButton;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/ui/SuccessButton/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/ui/SuccessButton/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAW3C,MAAM,aAAa,GAAiC,CAAC,KAAyB,EAAE,EAAE;IAChF,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAChE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAuC,IAAI,CAAC,CAAC;IAEpE,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,yCAAyC;YACzC,MAAM,WAAW,GAAG,OAAO,EAAE,CAAC;YAC9B,IAAI,WAAW,YAAY,OAAO,EAAE,CAAC;gBACnC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;gBACjC,IAAI,MAAM,EAAE,CAAC;oBACX,YAAY,CAAC,IAAI,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpC,mDAAmD;IACnD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBACjC,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QACD,OAAO,GAAG,EAAE;YACV,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC/B,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO,CACL,KAAC,MAAM,OAAK,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,IAAI,YACzF,SAAS,CAAC,CAAC,CAAC,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,GACxC,CACV,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownProvider.d.ts","sourceRoot":"","sources":["../../src/context/MarkdownProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"MarkdownProvider.d.ts","sourceRoot":"","sources":["../../src/context/MarkdownProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAI7D,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;IACtC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAGA,CAAC;AAGF,eAAO,MAAM,kBAAkB,kCAAoC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useContext
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
3
|
const MarkdownContext = createContext({});
|
|
4
4
|
export const MarkdownProvider = ({ value, children }) => {
|
|
5
|
-
|
|
6
|
-
return _jsx(MarkdownContext.Provider, { value:
|
|
5
|
+
// Removed unnecessary useMemo - the value is already memoized by the parent component
|
|
6
|
+
return _jsx(MarkdownContext.Provider, { value: value, children: children });
|
|
7
7
|
};
|
|
8
8
|
// eslint-disable-next-line react-refresh/only-export-components
|
|
9
9
|
export const useMarkdownContext = () => useContext(MarkdownContext);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownProvider.js","sourceRoot":"","sources":["../../src/context/MarkdownProvider.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"MarkdownProvider.js","sourceRoot":"","sources":["../../src/context/MarkdownProvider.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAMzD,MAAM,eAAe,GAAG,aAAa,CAAsB,EAAE,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAGxB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC3B,sFAAsF;IACtF,OAAO,KAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA4B,CAAC;AACvF,CAAC,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC"}
|
package/es/defined/index.d.ts
CHANGED
|
@@ -34,6 +34,7 @@ export interface MarkdownBaseProps extends MarkdownTyperBaseProps {
|
|
|
34
34
|
}
|
|
35
35
|
export interface MarkdownProps extends MarkdownTyperBaseProps, IMarkdownThemeProps {
|
|
36
36
|
children: string | undefined;
|
|
37
|
+
cursor?: React.ReactNode | string | 'circle' | 'block' | 'underline' | 'line';
|
|
37
38
|
}
|
|
38
39
|
/** MarkdownCMD component does not need children */
|
|
39
40
|
export interface MarkdownCMDProps extends MarkdownTyperBaseProps, IMarkdownThemeProps {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/defined/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,OAAO,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAG/F;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/C,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAErC,MAAM,WAAW,mBAAmB;IAClC,YAAY;IACZ,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,kBAAkB;IAClB,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;CACpC;AAED,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAkB,SAAQ,sBAAsB;CAAG;AAEpE,MAAM,WAAW,aAAc,SAAQ,sBAAsB,EAAE,mBAAmB;IAChF,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/defined/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,OAAO,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAG/F;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/C,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAErC,MAAM,WAAW,mBAAmB;IAClC,YAAY;IACZ,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,kBAAkB;IAClB,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;CACpC;AAED,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAkB,SAAQ,sBAAsB;CAAG;AAEpE,MAAM,WAAW,aAAc,SAAQ,sBAAsB,EAAE,mBAAmB;IAChF,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;CAC/E;AAED,mDAAmD;AACnD,MAAM,WAAW,gBAAiB,SAAQ,sBAAsB,EAAE,mBAAmB;IACnF,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;IAE3B,EAAE,CAAC,EAAE,GAAG,CAAC;IACT,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,WAAW,EAAE,SAAS,GAAG,QAAQ,CAAC;IAClC,wCAAwC;IACxC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAChD;AAED,kCAAkC;AAClC,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AAE1C,qCAAqC;AACrC,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACzD,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AACD,MAAM,WAAW,sBAAuB,SAAQ,OAAO,CAAC,aAAa;IACnE;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,UAAU,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;CACnG;AAED,MAAM,WAAW,oBAAqB,SAAQ,YAAY;CAAG"}
|
package/es/index.css
CHANGED
|
@@ -328,3 +328,47 @@ ds-markdown-math {
|
|
|
328
328
|
.ds-button.ds-icon-button .ds-button__icon {
|
|
329
329
|
margin-right: 0;
|
|
330
330
|
}
|
|
331
|
+
@keyframes ds-cursor-blink {
|
|
332
|
+
0%,
|
|
333
|
+
50% {
|
|
334
|
+
opacity: 1;
|
|
335
|
+
}
|
|
336
|
+
51%,
|
|
337
|
+
100% {
|
|
338
|
+
opacity: 0;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
.ds-markdown-cursor,
|
|
342
|
+
.ds-markdown-cursor-line,
|
|
343
|
+
.ds-markdown-cursor-block,
|
|
344
|
+
.ds-markdown-cursor-underline,
|
|
345
|
+
.ds-markdown-cursor-circle {
|
|
346
|
+
display: inline-block;
|
|
347
|
+
margin-left: 2px;
|
|
348
|
+
vertical-align: middle;
|
|
349
|
+
animation: ds-cursor-blink 1s infinite;
|
|
350
|
+
background-color: rgb(var(--ds-rgb-label-1));
|
|
351
|
+
}
|
|
352
|
+
.ds-markdown-cursor,
|
|
353
|
+
.ds-markdown-cursor-line {
|
|
354
|
+
width: 2px;
|
|
355
|
+
height: 1.2em;
|
|
356
|
+
}
|
|
357
|
+
.ds-markdown-cursor-block {
|
|
358
|
+
width: 0.6em;
|
|
359
|
+
height: 1em;
|
|
360
|
+
border-radius: 2px;
|
|
361
|
+
}
|
|
362
|
+
.ds-markdown-cursor-underline {
|
|
363
|
+
width: 0.8em;
|
|
364
|
+
height: 2px;
|
|
365
|
+
margin-bottom: -2px;
|
|
366
|
+
vertical-align: baseline;
|
|
367
|
+
}
|
|
368
|
+
.ds-markdown-cursor-circle {
|
|
369
|
+
width: 0.5em;
|
|
370
|
+
height: 0.5em;
|
|
371
|
+
border-radius: 50%;
|
|
372
|
+
margin-left: 3px;
|
|
373
|
+
margin-right: 1px;
|
|
374
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ds-markdown",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.5-beta.1",
|
|
5
5
|
"main": "./dist/esm/index.js",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
7
7
|
"style": "./dist/style.css",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"classnames": "^2.5.1",
|
|
78
78
|
"katex": "^0.16.22",
|
|
79
79
|
"react-markdown": "^10.1.0",
|
|
80
|
-
"react-markdown-typer": "^1.0.
|
|
80
|
+
"react-markdown-typer": "^1.0.4-beta.1",
|
|
81
81
|
"react-router-dom": "^7.7.1",
|
|
82
82
|
"react-syntax-highlighter": "^15.6.1",
|
|
83
83
|
"rehype-katex": "^7.0.1",
|
|
@@ -156,6 +156,6 @@
|
|
|
156
156
|
"react-markdown"
|
|
157
157
|
],
|
|
158
158
|
"publishConfig": {
|
|
159
|
-
"tag": "
|
|
159
|
+
"tag": "beta"
|
|
160
160
|
}
|
|
161
161
|
}
|