@king-design/vue 3.8.0-beta.0 → 3.8.0-beta.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 (54) hide show
  1. package/__tests__/__snapshots__/Vue Next Demos.md +74 -74
  2. package/components/bubble/bubble.d.ts +3 -0
  3. package/components/bubble/bubble.vdt.js +6 -2
  4. package/components/bubble/index.spec.js +231 -5
  5. package/components/bubble/styles.js +1 -1
  6. package/components/bubble/useBubbleDisplay.d.ts +1 -0
  7. package/components/bubble/useBubbleDisplay.js +68 -22
  8. package/components/bubbleList/bubbleList.vdt.js +3 -1
  9. package/components/bubbleList/index.spec.js +378 -237
  10. package/components/bubbleList/styles.js +2 -2
  11. package/components/bubbleList/useBubbleList.js +7 -0
  12. package/components/fileCard/fileCard.vdt.js +4 -4
  13. package/components/fileCard/index.spec.js +179 -107
  14. package/components/fileCard/list.d.ts +2 -1
  15. package/components/fileCard/list.vdt.js +7 -5
  16. package/components/fileCard/styles.js +10 -8
  17. package/components/fileCard/useFileCard.d.ts +1 -1
  18. package/components/fileCard/useFileCard.js +6 -35
  19. package/components/media/index.spec.js +774 -585
  20. package/components/media/media.vdt.js +17 -6
  21. package/components/media/mediaAssets.d.ts +2 -0
  22. package/components/media/mediaAssets.js +4 -0
  23. package/components/media/styles.js +5 -3
  24. package/components/media/useMedia.d.ts +6 -2
  25. package/components/media/useMedia.js +28 -6
  26. package/components/sender/index.spec.js +1146 -476
  27. package/components/sender/sender.d.ts +28 -5
  28. package/components/sender/sender.js +17 -6
  29. package/components/sender/sender.vdt.js +121 -49
  30. package/components/sender/styles.js +18 -9
  31. package/components/sender/useAutoResize.js +7 -6
  32. package/components/sender/useSenderDrag.js +12 -3
  33. package/components/sender/useSenderInput.d.ts +3 -0
  34. package/components/sender/useSenderInput.js +20 -3
  35. package/components/sender/useSenderPaste.js +1 -1
  36. package/components/sender/useSenderUpload.js +38 -29
  37. package/components/xmarkdown/index.spec.js +492 -263
  38. package/components/xmarkdown/markdown/streaming.js +41 -8
  39. package/components/xmarkdown/styles.js +2 -2
  40. package/components/xmarkdown/useXMarkdownDisplay.d.ts +1 -0
  41. package/components/xmarkdown/useXMarkdownDisplay.js +69 -24
  42. package/components/xmarkdown/xmarkdown.d.ts +3 -0
  43. package/components/xmarkdown/xmarkdown.vdt.js +6 -2
  44. package/dist/i18n/en-US.js +1 -0
  45. package/dist/i18n/en-US.js.map +1 -1
  46. package/dist/i18n/en-US.min.js +1 -1
  47. package/dist/index.js +795 -512
  48. package/dist/index.js.map +1 -1
  49. package/dist/index.min.js +2 -2
  50. package/i18n/en-US.d.ts +1 -0
  51. package/i18n/en-US.js +1 -0
  52. package/index.d.ts +2 -2
  53. package/index.js +2 -2
  54. package/package.json +1 -1
@@ -3,14 +3,14 @@ import _Symbol from "@babel/runtime-corejs3/core-js/symbol";
3
3
  import _getIteratorMethod from "@babel/runtime-corejs3/core-js/get-iterator-method";
4
4
  import _extends from "@babel/runtime-corejs3/helpers/extends";
5
5
  function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
- function _unsupportedIterableToArray(o, minLen) { var _context12; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context12 = Object.prototype.toString.call(o)).call(_context12, 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); }
6
+ function _unsupportedIterableToArray(o, minLen) { var _context15; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context15 = Object.prototype.toString.call(o)).call(_context15, 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); }
7
7
  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; }
8
8
  import _includesInstanceProperty from "@babel/runtime-corejs3/core-js/instance/includes";
9
9
  import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js/instance/slice";
10
10
  import _startsWithInstanceProperty from "@babel/runtime-corejs3/core-js/instance/starts-with";
11
- import _trimInstanceProperty from "@babel/runtime-corejs3/core-js/instance/trim";
12
11
  import _filterInstanceProperty from "@babel/runtime-corejs3/core-js/instance/filter";
13
12
  import _mapInstanceProperty from "@babel/runtime-corejs3/core-js/instance/map";
13
+ import _trimInstanceProperty from "@babel/runtime-corejs3/core-js/instance/trim";
14
14
  import _endsWithInstanceProperty from "@babel/runtime-corejs3/core-js/instance/ends-with";
15
15
  /**
16
16
  * 流式渲染
@@ -203,7 +203,7 @@ function recognizeToken(cache) {
203
203
  cache.token = 'list';
204
204
  return;
205
205
  }
206
- if (_startsWithInstanceProperty(_context6 = cache.pending).call(_context6, '|')) {
206
+ if (_startsWithInstanceProperty(_context6 = cache.pending).call(_context6, '|') && !isInTableContext(cache.completeMarkdown)) {
207
207
  cache.token = 'table';
208
208
  return;
209
209
  }
@@ -308,13 +308,46 @@ function isTableIncomplete(markdown) {
308
308
  if (lines.length <= 1) return true;
309
309
  var header = lines[0],
310
310
  separator = lines[1];
311
- if (!/^\|.*\|$/.test(_trimInstanceProperty(header).call(header))) return false;
311
+ if (!isTableRow(header)) return false;
312
312
  var columns = _filterInstanceProperty(_context9 = _mapInstanceProperty(_context10 = _trimInstanceProperty(separator).call(separator).split('|')).call(_context10, function (column) {
313
313
  return _trimInstanceProperty(column).call(column);
314
314
  })).call(_context9, Boolean);
315
+ return isTableSeparatorColumns(columns, true);
316
+ }
317
+ /**
318
+ * 判断当前 pending 是否是在已有表格后继续追加新行。
319
+ * 这种场景直接进入 stable 渲染,让 markdown-it 增量填充各列,避免整行原样压在 tail 中。
320
+ */
321
+ function isInTableContext(completeMarkdown) {
322
+ var _context12, _context13;
323
+ var lines = completeMarkdown.split('\n');
324
+ var block = [];
325
+ var end = lines.length - 1;
326
+ while (end >= 0 && !_trimInstanceProperty(_context11 = lines[end]).call(_context11)) {
327
+ var _context11;
328
+ end--;
329
+ }
330
+ for (var i = end; i >= 0; i--) {
331
+ var line = lines[i];
332
+ if (!_trimInstanceProperty(line).call(line)) break;
333
+ block.unshift(line);
334
+ }
335
+ if (block.length < 2) return false;
336
+ var header = block[0],
337
+ separator = block[1];
338
+ if (!isTableRow(header)) return false;
339
+ var columns = _filterInstanceProperty(_context12 = _mapInstanceProperty(_context13 = _trimInstanceProperty(separator).call(separator).split('|')).call(_context13, function (column) {
340
+ return _trimInstanceProperty(column).call(column);
341
+ })).call(_context12, Boolean);
342
+ return isTableSeparatorColumns(columns, false);
343
+ }
344
+ function isTableRow(line) {
345
+ return /^\|.*\|$/.test(_trimInstanceProperty(line).call(line));
346
+ }
347
+ function isTableSeparatorColumns(columns, allowTrailingColon) {
315
348
  var separatorRegex = /^:?-+:?$/;
316
- return columns.every(function (column, index) {
317
- return index === columns.length - 1 ? column === ':' || separatorRegex.test(column) : separatorRegex.test(column);
349
+ return columns.length > 0 && columns.every(function (column, index) {
350
+ return allowTrailingColon && index === columns.length - 1 ? column === ':' || separatorRegex.test(column) : separatorRegex.test(column);
318
351
  });
319
352
  }
320
353
  /**
@@ -388,11 +421,11 @@ function findOpenMathBlock(source) {
388
421
  * 提取未闭合代码围栏的语言标记
389
422
  */
390
423
  function extractLanguageFromFence(tailText) {
391
- var _context11;
424
+ var _context14;
392
425
  var firstLineEnd = tailText.indexOf('\n');
393
426
  var firstLine = firstLineEnd === -1 ? tailText : _sliceInstanceProperty(tailText).call(tailText, 0, firstLineEnd);
394
427
  var match = firstLine.match(/^ {0,3}`{3,}(\S*)/);
395
- return match && match[1] ? _trimInstanceProperty(_context11 = match[1]).call(_context11).toLowerCase() : undefined;
428
+ return match && match[1] ? _trimInstanceProperty(_context14 = match[1]).call(_context14).toLowerCase() : undefined;
396
429
  }
397
430
  /**
398
431
  * 渲染未闭合的代码围栏
@@ -1,6 +1,6 @@
1
1
  import { css } from '@emotion/css';
2
2
  import { theme, setDefault } from '../../styles/theme';
3
- import { deepDefaults } from '../../styles/utils';
3
+ import { deepDefaults, setAlpha } from '../../styles/utils';
4
4
  import '../../styles/global';
5
5
  import { cache } from '../utils';
6
6
  var defaults = {
@@ -46,5 +46,5 @@ setDefault(function () {
46
46
  makeStyles == null || makeStyles.clearCache();
47
47
  });
48
48
  export var makeStyles = cache(function makeStyles(k) {
49
- return /*#__PURE__*/css("display:block;color:", xmarkdown.color, ";line-height:1.7;font-size:14px;min-width:0;max-width:100%;width:100%;box-sizing:border-box;.", k, "-xmarkdown-loading,.", k, "-xmarkdown-empty{display:inline-flex;align-items:center;gap:8px;color:", xmarkdown.mutedColor, ";min-height:24px;}.", k, "-xmarkdown-loading-dots{display:inline-flex;align-items:center;gap:4px;margin-right:4px;}.", k, "-xmarkdown-loading-dot{width:", xmarkdown.loadingDotSize, ";height:", xmarkdown.loadingDotSize, ";border-radius:50%;background:", xmarkdown.loadingDotColor, ";display:inline-block;animation:", k, "-xmarkdown-loading-bounce 1s ease-in-out infinite;opacity:0.45;}.", k, "-xmarkdown-loading-dot:nth-of-type(2){animation-delay:0.14s;}.", k, "-xmarkdown-loading-dot:nth-of-type(3){animation-delay:0.28s;}@keyframes ", k, "-xmarkdown-loading-bounce{0%,80%,100%{transform:translateY(0) scale(0.9);opacity:0.45;}40%{transform:translateY(-4px) scale(1);opacity:1;}}.", k, "-xmarkdown-content{color:inherit;min-width:0;max-width:100%;overflow-wrap:anywhere;word-break:break-word;}.", k, "-xmarkdown-content p{font-size:12px;}.", k, "-xmarkdown-stable,.", k, "-xmarkdown-tail{display:contents;}.", k, "-xmarkdown-stable>:first-child{margin-top:0;}.", k, "-xmarkdown-stable>:last-child,.", k, "-xmarkdown-tail>:last-child{margin-bottom:0;}.", k, "-xmarkdown-content [data-kpc-xmarkdown-tail=\"true\"]{display:inline;white-space:pre-wrap;word-break:break-word;}.", k, "-xmarkdown-stable>p,.", k, "-xmarkdown-stable>ul,.", k, "-xmarkdown-stable>ol,.", k, "-xmarkdown-stable>blockquote,.", k, "-xmarkdown-stable>pre,.", k, "-xmarkdown-stable>table,.", k, "-xmarkdown-stable>hr,.", k, "-xmarkdown-stable>h1,.", k, "-xmarkdown-stable>h2,.", k, "-xmarkdown-stable>h3,.", k, "-xmarkdown-stable>h4,.", k, "-xmarkdown-stable>h5,.", k, "-xmarkdown-stable>h6{margin:0 0 12px;}.", k, "-xmarkdown-content blockquote>:first-child{margin-top:0;}.", k, "-xmarkdown-content blockquote>:last-child{margin-bottom:0;}.", k, "-xmarkdown-content ul,.", k, "-xmarkdown-content ol{padding-left:20px;}.", k, "-xmarkdown-content li{margin:6px 0;}.", k, "-xmarkdown-content li>p{margin:6px 0;}.", k, "-xmarkdown-content li>p:first-child{margin-top:0;}.", k, "-xmarkdown-content li>p:last-child{margin-bottom:0;}.", k, "-xmarkdown-content h1,.", k, "-xmarkdown-content h2,.", k, "-xmarkdown-content h3,.", k, "-xmarkdown-content h4,.", k, "-xmarkdown-content h5,.", k, "-xmarkdown-content h6{color:", xmarkdown.headingColor, ";font-weight:600;line-height:1.35;}.", k, "-xmarkdown-content h1{font-size:24px;}.", k, "-xmarkdown-content h2{font-size:20px;}.", k, "-xmarkdown-content h3{font-size:18px;}.", k, "-xmarkdown-content h4,.", k, "-xmarkdown-content h5,.", k, "-xmarkdown-content h6{font-size:16px;}.", k, "-xmarkdown-content a{color:", theme.color.primary, ";text-decoration:none;}.", k, "-xmarkdown-content a:hover{text-decoration:underline;}.", k, "-xmarkdown-content img{display:block;max-width:100%;height:auto;border-radius:8px;}.", k, "-xmarkdown-content hr{border:0;border-top:1px solid ", xmarkdown.hrColor, ";}.", k, "-xmarkdown-inline-code{display:inline-block;padding:0 6px;border-radius:6px;font-size:12px;line-height:1.7;vertical-align:baseline;background:", xmarkdown.inlineCodeBg, ";color:", xmarkdown.inlineCodeColor, ";border:1px solid ", xmarkdown.inlineCodeBorder, ";}.", k, "-xmarkdown-content pre{margin:0;overflow:auto;}.", k, "-xmarkdown-code-block,.", k, "-xmarkdown-mermaid-block{margin:0 0 12px;min-width:0;max-width:100%;overflow:hidden;border:1px solid ", xmarkdown.codeBlockBorder, ";border-radius:18px;background:", xmarkdown.codeBlockBg, ";box-sizing:border-box;}.", k, "-xmarkdown-code-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:8px 12px;border-bottom:1px solid ", xmarkdown.codeBlockBorder, ";background:", xmarkdown.codeToolbarBg, ";color:", xmarkdown.codeToolbarColor, ";}.", k, "-xmarkdown-code-language{min-width:0;font-size:13px;font-weight:700;letter-spacing:0.02em;text-transform:uppercase;color:inherit;flex:1 1 auto;}.", k, "-xmarkdown-code-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end;max-width:100%;margin-left:auto;}.", k, "-xmarkdown-toolbar-toggle-group,.", k, "-xmarkdown-toolbar-action-group{display:flex;align-items:center;gap:4px;flex-wrap:wrap;max-width:100%;}.", k, "-xmarkdown-toolbar-toggle-group{margin-right:2px;}.", k, "-xmarkdown-toolbar-toggle{border:0;padding:0 6px;background:transparent;color:", xmarkdown.mutedColor, ";font-size:12px;line-height:20px;cursor:pointer;transition:color ", theme.transition.small, ";}.", k, "-xmarkdown-toolbar-toggle[data-kpc-selected=\"true\"]{color:", xmarkdown.codeToolbarColor, ";font-weight:600;}.", k, "-xmarkdown-toolbar-toggle:hover{color:", xmarkdown.codeToolbarColor, ";}.", k, "-xmarkdown-toolbar-icon-button{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:0;background:transparent;color:", xmarkdown.codeActionColor, ";cursor:pointer;transition:color ", theme.transition.small, ",background ", theme.transition.small, ";}.", k, "-xmarkdown-toolbar-icon-button:hover:not(:disabled){background:", xmarkdown.codeActionHoverBg, ";color:", theme.color.primary, ";}.", k, "-xmarkdown-toolbar-icon-button:disabled{opacity:0.4;cursor:not-allowed;background:transparent;color:", xmarkdown.codeActionColor, ";}.", k, "-xmarkdown-toolbar-icon{font-size:14px;line-height:1;}.", k, "-xmarkdown-code-body,.", k, "-xmarkdown-mermaid-body{min-width:0;max-width:100%;overflow:auto;background:", xmarkdown.codeBlockBg, ";}.", k, "-xmarkdown-code-block pre,.", k, "-xmarkdown-mermaid-source{padding:0px;background:transparent;color:", xmarkdown.codeTextColor, ";}.", k, "-xmarkdown-code-block pre,.", k, "-xmarkdown-mermaid-source{font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;font-size:12px;line-height:1.7;}.", k, "-xmarkdown-code-block pre code,.", k, "-xmarkdown-mermaid-source code{display:block;min-width:fit-content;color:inherit;white-space:pre;word-break:normal;overflow-wrap:normal;padding:12px;}.", k, "-xmarkdown-code-block .hljs,.", k, "-xmarkdown-mermaid-source .hljs{background:transparent;color:", xmarkdown.codeTextColor, ";border:0;}.", k, "-xmarkdown-code-block .hljs-comment,.", k, "-xmarkdown-code-block .hljs-quote,.", k, "-xmarkdown-mermaid-source .hljs-comment,.", k, "-xmarkdown-mermaid-source .hljs-quote{color:", xmarkdown.codeCommentColor, ";}.", k, "-xmarkdown-code-block .hljs-keyword,.", k, "-xmarkdown-code-block .hljs-selector-tag,.", k, "-xmarkdown-code-block .hljs-literal,.", k, "-xmarkdown-code-block .hljs-link,.", k, "-xmarkdown-mermaid-source .hljs-keyword,.", k, "-xmarkdown-mermaid-source .hljs-selector-tag,.", k, "-xmarkdown-mermaid-source .hljs-literal,.", k, "-xmarkdown-mermaid-source .hljs-link{color:", xmarkdown.codeKeywordColor, ";}.", k, "-xmarkdown-code-block .hljs-string,.", k, "-xmarkdown-code-block .hljs-title,.", k, "-xmarkdown-code-block .hljs-type,.", k, "-xmarkdown-code-block .hljs-attribute,.", k, "-xmarkdown-code-block .hljs-symbol,.", k, "-xmarkdown-code-block .hljs-bullet,.", k, "-xmarkdown-code-block .hljs-addition,.", k, "-xmarkdown-mermaid-source .hljs-string,.", k, "-xmarkdown-mermaid-source .hljs-title,.", k, "-xmarkdown-mermaid-source .hljs-type,.", k, "-xmarkdown-mermaid-source .hljs-attribute,.", k, "-xmarkdown-mermaid-source .hljs-symbol,.", k, "-xmarkdown-mermaid-source .hljs-bullet,.", k, "-xmarkdown-mermaid-source .hljs-addition{color:", xmarkdown.codeStringColor, ";}.", k, "-xmarkdown-code-block .hljs-number,.", k, "-xmarkdown-code-block .hljs-built_in,.", k, "-xmarkdown-code-block .hljs-builtin-name,.", k, "-xmarkdown-code-block .hljs-variable,.", k, "-xmarkdown-code-block .hljs-template-variable,.", k, "-xmarkdown-code-block .hljs-params,.", k, "-xmarkdown-mermaid-source .hljs-number,.", k, "-xmarkdown-mermaid-source .hljs-built_in,.", k, "-xmarkdown-mermaid-source .hljs-builtin-name,.", k, "-xmarkdown-mermaid-source .hljs-variable,.", k, "-xmarkdown-mermaid-source .hljs-template-variable,.", k, "-xmarkdown-mermaid-source .hljs-params{color:", xmarkdown.codeNumberColor, ";}.", k, "-xmarkdown-code-block .hljs-function,.", k, "-xmarkdown-code-block .hljs-title.function_,.", k, "-xmarkdown-code-block .hljs-title.class_,.", k, "-xmarkdown-code-block .hljs-property,.", k, "-xmarkdown-mermaid-source .hljs-function,.", k, "-xmarkdown-mermaid-source .hljs-title.function_,.", k, "-xmarkdown-mermaid-source .hljs-title.class_,.", k, "-xmarkdown-mermaid-source .hljs-property{color:", xmarkdown.codeFunctionColor, ";}.", k, "-xmarkdown-code-block .hljs-deletion,.", k, "-xmarkdown-mermaid-source .hljs-deletion{color:", xmarkdown.mermaidErrorColor, ";}.", k, "-xmarkdown-mermaid-block{background:", xmarkdown.mermaidBg, ";}.", k, "-xmarkdown-mermaid-block .", k, "-xmarkdown-code-toolbar{border-bottom-color:", xmarkdown.borderColor, ";background:", xmarkdown.codeToolbarBg, ";color:", xmarkdown.codeToolbarColor, ";}.", k, "-xmarkdown-mermaid-canvas{position:relative;min-height:0;min-width:0;max-width:100%;padding:8px;box-sizing:border-box;overflow:hidden;background:", xmarkdown.mermaidCanvasBg, ";}.", k, "-xmarkdown-mermaid-viewport{overflow:auto;min-height:120px;min-width:0;max-width:100%;width:100%;box-sizing:border-box;max-height:480px;border-radius:12px;background:linear-gradient(180deg, rgba(255, 255, 255, 0.94) 0%, rgba(247, 249, 252, 0.96) 100%);cursor:default;user-select:none;scrollbar-width:thin;scrollbar-color:", xmarkdown.scrollbarThumb, " transparent;}.", k, "-xmarkdown-mermaid-viewport[data-kpc-can-drag=\"true\"]{cursor:grab;}.", k, "-xmarkdown-mermaid-viewport[data-kpc-dragging=\"true\"]{cursor:grabbing;}.", k, "-xmarkdown-mermaid-viewport::-webkit-scrollbar{width:10px;height:10px;}.", k, "-xmarkdown-mermaid-viewport::-webkit-scrollbar-track{background:transparent;}.", k, "-xmarkdown-mermaid-viewport::-webkit-scrollbar-thumb{background:", xmarkdown.scrollbarThumb, ";border:2px solid transparent;border-radius:999px;background-clip:padding-box;}.", k, "-xmarkdown-mermaid-viewport::-webkit-scrollbar-thumb:hover{background:", xmarkdown.scrollbarThumbHover, ";background-clip:padding-box;}.", k, "-xmarkdown-mermaid-viewport::-webkit-scrollbar-corner{background:transparent;}.", k, "-xmarkdown-mermaid-stage{display:flex;justify-content:center;align-items:center;min-width:100%;min-height:120px;padding:8px;box-sizing:border-box;}.", k, "-xmarkdown-mermaid-stage svg{display:block;margin:0 auto;transition:width ", theme.transition.small, ",height ", theme.transition.small, ";will-change:width,height;}.", k, "-xmarkdown-mermaid-source{display:none;margin:0;background:", xmarkdown.codeBlockBg, ";}.", k, "-xmarkdown-mermaid-block[data-kpc-view=\"source\"] .", k, "-xmarkdown-mermaid-source{display:block;}.", k, "-xmarkdown-mermaid-block[data-kpc-view=\"source\"] .", k, "-xmarkdown-mermaid-canvas{display:none;}.", k, "-xmarkdown-mermaid-error{padding:14px 16px;border-radius:8px;background:", xmarkdown.mermaidErrorBg, ";color:", xmarkdown.mermaidErrorColor, ";white-space:pre-wrap;}.", k, "-xmarkdown-content blockquote{padding:12px 16px;border-left:4px solid ", xmarkdown.blockquoteBorder, ";border-radius:0 10px 10px 0;background:", xmarkdown.blockquoteBg, ";color:", xmarkdown.mutedColor, ";}.", k, "-xmarkdown-table-wrap>table{width:max-content;min-width:100%;font-size:12px;border-collapse:collapse;border:1px solid ", xmarkdown.borderColor, ";border-radius:10px;}.", k, "-xmarkdown-table-wrap{max-width:100%;overflow-x:auto;overflow-y:hidden;margin:0 0 12px;}.", k, "-xmarkdown-table-wrap>table{margin:0;}.", k, "-xmarkdown-table-wrap>table>thead{background:", xmarkdown.tableHeadBg, ";}.", k, "-xmarkdown-table-wrap>table th,.", k, "-xmarkdown-table-wrap>table td{padding:10px 12px;border:1px solid ", xmarkdown.borderColor, ";text-align:left;vertical-align:top;}");
49
+ return /*#__PURE__*/css("display:block;color:", xmarkdown.color, ";line-height:1.7;font-size:14px;min-width:0;max-width:100%;width:100%;box-sizing:border-box;.", k, "-xmarkdown-loading,.", k, "-xmarkdown-empty{display:inline-flex;align-items:center;gap:8px;color:", xmarkdown.mutedColor, ";min-height:24px;}.", k, "-xmarkdown-loading-dots{display:inline-flex;align-items:center;gap:4px;margin-right:4px;}.", k, "-xmarkdown-loading-dot{width:", xmarkdown.loadingDotSize, ";height:", xmarkdown.loadingDotSize, ";border-radius:50%;background:", xmarkdown.loadingDotColor, ";display:inline-block;animation:", k, "-xmarkdown-loading-bounce 1s ease-in-out infinite;opacity:0.45;}.", k, "-xmarkdown-loading-dot:nth-of-type(2){animation-delay:0.14s;}.", k, "-xmarkdown-loading-dot:nth-of-type(3){animation-delay:0.28s;}@keyframes ", k, "-xmarkdown-loading-bounce{0%,80%,100%{transform:translateY(0) scale(0.9);opacity:0.45;}40%{transform:translateY(-4px) scale(1);opacity:1;}}.", k, "-xmarkdown-content{color:inherit;min-width:0;max-width:100%;overflow-wrap:anywhere;word-break:break-word;}.", k, "-xmarkdown-content p{font-size:12px;}.", k, "-xmarkdown-stable,.", k, "-xmarkdown-tail{display:contents;}.", k, "-xmarkdown-content .", k, "-xmarkdown-typing-suffix{display:inline-flex;align-items:center;gap:4px;width:26px;height:6px;margin-top:8px;line-height:0;}.", k, "-xmarkdown-content .", k, "-xmarkdown-typing-suffix span{width:6px;height:6px;border-radius:50%;background:radial-gradient(circle at center, #F8F9FA 0%, #D0D5D9 100%);animation:", k, "-xmarkdown-typing-suffix-pulse 1.2s ease-in-out infinite;}.", k, "-xmarkdown-content .", k, "-xmarkdown-typing-suffix span:nth-child(2){animation-delay:0.16s;}.", k, "-xmarkdown-content .", k, "-xmarkdown-typing-suffix span:nth-child(3){animation-delay:0.32s;}@keyframes ", k, "-xmarkdown-typing-suffix-pulse{0%,80%,100%{background:radial-gradient(circle at center, #F8F9FA 0%, #D0D5D9 100%);transform:translateY(0);}40%{background:radial-gradient(circle at center, ", setAlpha(theme.color.primary, 0.45), " 0%, ", theme.color.primary, " 100%);transform:translateY(-1px);}}.", k, "-xmarkdown-stable>:first-child{margin-top:0;}.", k, "-xmarkdown-stable>:last-child,.", k, "-xmarkdown-tail>:last-child{margin-bottom:0;}.", k, "-xmarkdown-content [data-kpc-xmarkdown-tail=\"true\"]{display:inline;white-space:pre-wrap;word-break:break-word;}.", k, "-xmarkdown-stable>p,.", k, "-xmarkdown-stable>ul,.", k, "-xmarkdown-stable>ol,.", k, "-xmarkdown-stable>blockquote,.", k, "-xmarkdown-stable>pre,.", k, "-xmarkdown-stable>table,.", k, "-xmarkdown-stable>hr,.", k, "-xmarkdown-stable>h1,.", k, "-xmarkdown-stable>h2,.", k, "-xmarkdown-stable>h3,.", k, "-xmarkdown-stable>h4,.", k, "-xmarkdown-stable>h5,.", k, "-xmarkdown-stable>h6{margin:0 0 12px;}.", k, "-xmarkdown-content blockquote>:first-child{margin-top:0;}.", k, "-xmarkdown-content blockquote>:last-child{margin-bottom:0;}.", k, "-xmarkdown-content ul,.", k, "-xmarkdown-content ol{padding-left:20px;}.", k, "-xmarkdown-content li{margin:6px 0;}.", k, "-xmarkdown-content li>p{margin:6px 0;}.", k, "-xmarkdown-content li>p:first-child{margin-top:0;}.", k, "-xmarkdown-content li>p:last-child{margin-bottom:0;}.", k, "-xmarkdown-content h1,.", k, "-xmarkdown-content h2,.", k, "-xmarkdown-content h3,.", k, "-xmarkdown-content h4,.", k, "-xmarkdown-content h5,.", k, "-xmarkdown-content h6{color:", xmarkdown.headingColor, ";font-weight:600;line-height:1.35;}.", k, "-xmarkdown-content h1{font-size:24px;}.", k, "-xmarkdown-content h2{font-size:20px;}.", k, "-xmarkdown-content h3{font-size:18px;}.", k, "-xmarkdown-content h4,.", k, "-xmarkdown-content h5,.", k, "-xmarkdown-content h6{font-size:16px;}.", k, "-xmarkdown-content a{color:", theme.color.primary, ";text-decoration:none;}.", k, "-xmarkdown-content a:hover{text-decoration:underline;}.", k, "-xmarkdown-content img{display:block;max-width:100%;height:auto;border-radius:8px;}.", k, "-xmarkdown-content hr{border:0;border-top:1px solid ", xmarkdown.hrColor, ";}.", k, "-xmarkdown-inline-code{display:inline-block;padding:0 6px;border-radius:6px;font-size:12px;line-height:1.7;vertical-align:baseline;background:", xmarkdown.inlineCodeBg, ";color:", xmarkdown.inlineCodeColor, ";border:1px solid ", xmarkdown.inlineCodeBorder, ";}.", k, "-xmarkdown-content pre{margin:0;overflow:auto;}.", k, "-xmarkdown-code-block,.", k, "-xmarkdown-mermaid-block{margin:0 0 12px;min-width:0;max-width:100%;overflow:hidden;border:1px solid ", xmarkdown.codeBlockBorder, ";border-radius:18px;background:", xmarkdown.codeBlockBg, ";box-sizing:border-box;}.", k, "-xmarkdown-stable:not(:empty)+.", k, "-xmarkdown-tail>.", k, "-xmarkdown-code-block:first-child,.", k, "-xmarkdown-stable:not(:empty)+.", k, "-xmarkdown-tail>.", k, "-xmarkdown-mermaid-block:first-child{margin-top:12px;}.", k, "-xmarkdown-code-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:8px 12px;border-bottom:1px solid ", xmarkdown.codeBlockBorder, ";background:", xmarkdown.codeToolbarBg, ";color:", xmarkdown.codeToolbarColor, ";}.", k, "-xmarkdown-code-language{min-width:0;font-size:13px;font-weight:700;letter-spacing:0.02em;text-transform:uppercase;color:inherit;flex:1 1 auto;}.", k, "-xmarkdown-code-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end;max-width:100%;margin-left:auto;}.", k, "-xmarkdown-toolbar-toggle-group,.", k, "-xmarkdown-toolbar-action-group{display:flex;align-items:center;gap:4px;flex-wrap:wrap;max-width:100%;}.", k, "-xmarkdown-toolbar-toggle-group{margin-right:2px;}.", k, "-xmarkdown-toolbar-toggle{border:0;padding:0 6px;background:transparent;color:", xmarkdown.mutedColor, ";font-size:12px;line-height:20px;cursor:pointer;transition:color ", theme.transition.small, ";}.", k, "-xmarkdown-toolbar-toggle[data-kpc-selected=\"true\"]{color:", xmarkdown.codeToolbarColor, ";font-weight:600;}.", k, "-xmarkdown-toolbar-toggle:hover{color:", xmarkdown.codeToolbarColor, ";}.", k, "-xmarkdown-toolbar-icon-button{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:0;background:transparent;color:", xmarkdown.codeActionColor, ";cursor:pointer;transition:color ", theme.transition.small, ",background ", theme.transition.small, ";}.", k, "-xmarkdown-toolbar-icon-button:hover:not(:disabled){background:", xmarkdown.codeActionHoverBg, ";color:", theme.color.primary, ";}.", k, "-xmarkdown-toolbar-icon-button:disabled{opacity:0.4;cursor:not-allowed;background:transparent;color:", xmarkdown.codeActionColor, ";}.", k, "-xmarkdown-toolbar-icon{font-size:14px;line-height:1;}.", k, "-xmarkdown-code-body,.", k, "-xmarkdown-mermaid-body{min-width:0;max-width:100%;overflow:auto;background:", xmarkdown.codeBlockBg, ";}.", k, "-xmarkdown-code-block pre,.", k, "-xmarkdown-mermaid-source{padding:0px;background:transparent;color:", xmarkdown.codeTextColor, ";}.", k, "-xmarkdown-code-block pre,.", k, "-xmarkdown-mermaid-source{font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;font-size:12px;line-height:1.7;}.", k, "-xmarkdown-code-block pre code,.", k, "-xmarkdown-mermaid-source code{display:block;min-width:fit-content;color:inherit;white-space:pre;word-break:normal;overflow-wrap:normal;padding:12px;}.", k, "-xmarkdown-code-block .hljs,.", k, "-xmarkdown-mermaid-source .hljs{background:transparent;color:", xmarkdown.codeTextColor, ";border:0;}.", k, "-xmarkdown-code-block .hljs-comment,.", k, "-xmarkdown-code-block .hljs-quote,.", k, "-xmarkdown-mermaid-source .hljs-comment,.", k, "-xmarkdown-mermaid-source .hljs-quote{color:", xmarkdown.codeCommentColor, ";}.", k, "-xmarkdown-code-block .hljs-keyword,.", k, "-xmarkdown-code-block .hljs-selector-tag,.", k, "-xmarkdown-code-block .hljs-literal,.", k, "-xmarkdown-code-block .hljs-link,.", k, "-xmarkdown-mermaid-source .hljs-keyword,.", k, "-xmarkdown-mermaid-source .hljs-selector-tag,.", k, "-xmarkdown-mermaid-source .hljs-literal,.", k, "-xmarkdown-mermaid-source .hljs-link{color:", xmarkdown.codeKeywordColor, ";}.", k, "-xmarkdown-code-block .hljs-string,.", k, "-xmarkdown-code-block .hljs-title,.", k, "-xmarkdown-code-block .hljs-type,.", k, "-xmarkdown-code-block .hljs-attribute,.", k, "-xmarkdown-code-block .hljs-symbol,.", k, "-xmarkdown-code-block .hljs-bullet,.", k, "-xmarkdown-code-block .hljs-addition,.", k, "-xmarkdown-mermaid-source .hljs-string,.", k, "-xmarkdown-mermaid-source .hljs-title,.", k, "-xmarkdown-mermaid-source .hljs-type,.", k, "-xmarkdown-mermaid-source .hljs-attribute,.", k, "-xmarkdown-mermaid-source .hljs-symbol,.", k, "-xmarkdown-mermaid-source .hljs-bullet,.", k, "-xmarkdown-mermaid-source .hljs-addition{color:", xmarkdown.codeStringColor, ";}.", k, "-xmarkdown-code-block .hljs-number,.", k, "-xmarkdown-code-block .hljs-built_in,.", k, "-xmarkdown-code-block .hljs-builtin-name,.", k, "-xmarkdown-code-block .hljs-variable,.", k, "-xmarkdown-code-block .hljs-template-variable,.", k, "-xmarkdown-code-block .hljs-params,.", k, "-xmarkdown-mermaid-source .hljs-number,.", k, "-xmarkdown-mermaid-source .hljs-built_in,.", k, "-xmarkdown-mermaid-source .hljs-builtin-name,.", k, "-xmarkdown-mermaid-source .hljs-variable,.", k, "-xmarkdown-mermaid-source .hljs-template-variable,.", k, "-xmarkdown-mermaid-source .hljs-params{color:", xmarkdown.codeNumberColor, ";}.", k, "-xmarkdown-code-block .hljs-function,.", k, "-xmarkdown-code-block .hljs-title.function_,.", k, "-xmarkdown-code-block .hljs-title.class_,.", k, "-xmarkdown-code-block .hljs-property,.", k, "-xmarkdown-mermaid-source .hljs-function,.", k, "-xmarkdown-mermaid-source .hljs-title.function_,.", k, "-xmarkdown-mermaid-source .hljs-title.class_,.", k, "-xmarkdown-mermaid-source .hljs-property{color:", xmarkdown.codeFunctionColor, ";}.", k, "-xmarkdown-code-block .hljs-deletion,.", k, "-xmarkdown-mermaid-source .hljs-deletion{color:", xmarkdown.mermaidErrorColor, ";}.", k, "-xmarkdown-mermaid-block{background:", xmarkdown.mermaidBg, ";}.", k, "-xmarkdown-mermaid-block .", k, "-xmarkdown-code-toolbar{border-bottom-color:", xmarkdown.borderColor, ";background:", xmarkdown.codeToolbarBg, ";color:", xmarkdown.codeToolbarColor, ";}.", k, "-xmarkdown-mermaid-canvas{position:relative;min-height:0;min-width:0;max-width:100%;padding:8px;box-sizing:border-box;overflow:hidden;background:", xmarkdown.mermaidCanvasBg, ";}.", k, "-xmarkdown-mermaid-viewport{overflow:auto;min-height:120px;min-width:0;max-width:100%;width:100%;box-sizing:border-box;max-height:480px;border-radius:12px;background:linear-gradient(180deg, rgba(255, 255, 255, 0.94) 0%, rgba(247, 249, 252, 0.96) 100%);cursor:default;user-select:none;scrollbar-width:thin;scrollbar-color:", xmarkdown.scrollbarThumb, " transparent;}.", k, "-xmarkdown-mermaid-viewport[data-kpc-can-drag=\"true\"]{cursor:grab;}.", k, "-xmarkdown-mermaid-viewport[data-kpc-dragging=\"true\"]{cursor:grabbing;}.", k, "-xmarkdown-mermaid-viewport::-webkit-scrollbar{width:10px;height:10px;}.", k, "-xmarkdown-mermaid-viewport::-webkit-scrollbar-track{background:transparent;}.", k, "-xmarkdown-mermaid-viewport::-webkit-scrollbar-thumb{background:", xmarkdown.scrollbarThumb, ";border:2px solid transparent;border-radius:999px;background-clip:padding-box;}.", k, "-xmarkdown-mermaid-viewport::-webkit-scrollbar-thumb:hover{background:", xmarkdown.scrollbarThumbHover, ";background-clip:padding-box;}.", k, "-xmarkdown-mermaid-viewport::-webkit-scrollbar-corner{background:transparent;}.", k, "-xmarkdown-mermaid-stage{display:flex;justify-content:center;align-items:center;min-width:100%;min-height:120px;padding:8px;box-sizing:border-box;}.", k, "-xmarkdown-mermaid-stage svg{display:block;margin:0 auto;transition:width ", theme.transition.small, ",height ", theme.transition.small, ";will-change:width,height;}.", k, "-xmarkdown-mermaid-source{display:none;margin:0;background:", xmarkdown.codeBlockBg, ";}.", k, "-xmarkdown-mermaid-block[data-kpc-view=\"source\"] .", k, "-xmarkdown-mermaid-source{display:block;}.", k, "-xmarkdown-mermaid-block[data-kpc-view=\"source\"] .", k, "-xmarkdown-mermaid-canvas{display:none;}.", k, "-xmarkdown-mermaid-error{padding:14px 16px;border-radius:8px;background:", xmarkdown.mermaidErrorBg, ";color:", xmarkdown.mermaidErrorColor, ";white-space:pre-wrap;}.", k, "-xmarkdown-content blockquote{padding:12px 16px;border-left:4px solid ", xmarkdown.blockquoteBorder, ";border-radius:0 10px 10px 0;background:", xmarkdown.blockquoteBg, ";color:", xmarkdown.mutedColor, ";}.", k, "-xmarkdown-table-wrap>table{width:max-content;min-width:100%;font-size:12px;border-collapse:collapse;border:1px solid ", xmarkdown.borderColor, ";border-radius:10px;}.", k, "-xmarkdown-table-wrap{max-width:100%;overflow-x:auto;overflow-y:hidden;margin:0 0 12px;}.", k, "-xmarkdown-table-wrap>table{margin:0;}.", k, "-xmarkdown-table-wrap>table>thead{background:", xmarkdown.tableHeadBg, ";}.", k, "-xmarkdown-table-wrap>table th,.", k, "-xmarkdown-table-wrap>table td{padding:10px 12px;border:1px solid ", xmarkdown.borderColor, ";text-align:left;vertical-align:top;}");
50
50
  });
@@ -23,4 +23,5 @@ export declare function useXMarkdownDisplay(getPrefixCls: () => string): {
23
23
  getRenderedBlockData: (id: string) => XMarkdownRenderedBlock | undefined;
24
24
  getRenderedNodes: () => any;
25
25
  isTypingActive: () => boolean;
26
+ shouldShowTypingSuffix: () => boolean;
26
27
  };
@@ -24,6 +24,7 @@ export function useXMarkdownDisplay(getPrefixCls) {
24
24
  var previousContent = instance.get('content');
25
25
  var previousLoading = !!instance.get('loading');
26
26
  var previousStreaming = !!instance.get('streaming');
27
+ var typingTargetKey = '';
27
28
  // Markdown 渲染缓存
28
29
  var lastStableMarkdownSource = '';
29
30
  var lastStableMarkdownBlocks = [];
@@ -130,12 +131,16 @@ export function useXMarkdownDisplay(getPrefixCls) {
130
131
  if (typing && typeof typing === 'object') {
131
132
  return {
132
133
  interval: Math.max(typing.interval || 24, 16),
133
- step: Math.max(typing.step || 2, 1)
134
+ step: Math.max(typing.step || 2, 1),
135
+ keepPrefix: typing.keepPrefix !== false,
136
+ resumeFrom: typing.resumeFrom
134
137
  };
135
138
  }
136
139
  return {
137
140
  interval: 24,
138
- step: 2
141
+ step: 2,
142
+ keepPrefix: true,
143
+ resumeFrom: undefined
139
144
  };
140
145
  }
141
146
  /**
@@ -209,19 +214,50 @@ export function useXMarkdownDisplay(getPrefixCls) {
209
214
  function getDisplayedContent() {
210
215
  return instance.get('$displayContent') || '';
211
216
  }
217
+ function getSafeContentPrefix(content, prefix) {
218
+ if (!prefix) return '';
219
+ if (_startsWithInstanceProperty(content).call(content, prefix)) return prefix;
220
+ var i = 0;
221
+ while (i < prefix.length && i < content.length && prefix[i] === content[i]) {
222
+ i++;
223
+ }
224
+ return _sliceInstanceProperty(prefix).call(prefix, 0, i);
225
+ }
226
+ function getResumePrefix(content) {
227
+ var _getTypingOptions = getTypingOptions(),
228
+ resumeFrom = _getTypingOptions.resumeFrom;
229
+ if (resumeFrom === undefined || resumeFrom === null) return '';
230
+ if (resumeFrom === 'content') return content;
231
+ if (typeof resumeFrom === 'number') return _sliceInstanceProperty(content).call(content, 0, Math.max(0, resumeFrom));
232
+ return getSafeContentPrefix(content, String(resumeFrom));
233
+ }
234
+ function getTypingTargetKey(content) {
235
+ var _getTypingOptions2 = getTypingOptions(),
236
+ keepPrefix = _getTypingOptions2.keepPrefix,
237
+ resumeFrom = _getTypingOptions2.resumeFrom;
238
+ return (keepPrefix ? '1' : '0') + "\0" + String(resumeFrom) + "\0" + content;
239
+ }
240
+ function syncTypingStart(content) {
241
+ var targetKey = getTypingTargetKey(content);
242
+ if (targetKey === typingTargetKey) return;
243
+ typingTargetKey = targetKey;
244
+ var sharedPrefix = getSharedPrefix(content);
245
+ if (sharedPrefix !== getDisplayedContent()) {
246
+ resetTypingComplete();
247
+ setDisplayContent(sharedPrefix);
248
+ }
249
+ }
212
250
  /**
213
251
  * 获取共享前缀
214
252
  */
215
253
  function getSharedPrefix(content) {
216
254
  var displayedContent = getDisplayedContent();
217
- if (!displayedContent || _startsWithInstanceProperty(content).call(content, displayedContent)) {
255
+ if (!displayedContent) return getResumePrefix(content);
256
+ if (!getTypingOptions().keepPrefix) return '';
257
+ if (_startsWithInstanceProperty(content).call(content, displayedContent)) {
218
258
  return displayedContent;
219
259
  }
220
- var i = 0;
221
- while (i < displayedContent.length && i < content.length && displayedContent[i] === content[i]) {
222
- i++;
223
- }
224
- return _sliceInstanceProperty(displayedContent).call(displayedContent, 0, i);
260
+ return getSafeContentPrefix(content, displayedContent);
225
261
  }
226
262
  /**
227
263
  * 立即渲染 Markdown
@@ -352,8 +388,8 @@ export function useXMarkdownDisplay(getPrefixCls) {
352
388
  runTyping();
353
389
  return;
354
390
  }
355
- var _getTypingOptions = getTypingOptions(),
356
- interval = _getTypingOptions.interval;
391
+ var _getTypingOptions3 = getTypingOptions(),
392
+ interval = _getTypingOptions3.interval;
357
393
  setTypingActive(true);
358
394
  typingTimer = window.setTimeout(function () {
359
395
  typingTimer = null;
@@ -371,6 +407,7 @@ export function useXMarkdownDisplay(getPrefixCls) {
371
407
  if (instance.get('loading')) {
372
408
  stopTyping();
373
409
  resetTypingComplete();
410
+ typingTargetKey = '';
374
411
  if (!setDisplayContent('')) {
375
412
  syncRenderedMarkdown();
376
413
  }
@@ -379,6 +416,7 @@ export function useXMarkdownDisplay(getPrefixCls) {
379
416
  // 无内容或禁用打字
380
417
  if (!instance.get('typing') || !nextValue) {
381
418
  stopTyping();
419
+ typingTargetKey = '';
382
420
  if (!setDisplayContent(nextValue)) {
383
421
  syncRenderedMarkdown();
384
422
  }
@@ -388,15 +426,11 @@ export function useXMarkdownDisplay(getPrefixCls) {
388
426
  return;
389
427
  }
390
428
  // 内容变化检测
391
- var sharedPrefix = getSharedPrefix(nextValue);
392
- if (sharedPrefix !== getDisplayedContent()) {
393
- resetTypingComplete();
394
- setDisplayContent(sharedPrefix);
395
- }
429
+ syncTypingStart(nextValue);
396
430
  var currentValue = getDisplayedContent();
397
- var _getTypingOptions2 = getTypingOptions(),
398
- interval = _getTypingOptions2.interval,
399
- step = _getTypingOptions2.step;
431
+ var _getTypingOptions4 = getTypingOptions(),
432
+ interval = _getTypingOptions4.interval,
433
+ step = _getTypingOptions4.step;
400
434
  // 逐步显示内容
401
435
  if (currentValue !== nextValue) {
402
436
  var nextLength = Math.min(currentValue.length + step, nextValue.length);
@@ -430,6 +464,7 @@ export function useXMarkdownDisplay(getPrefixCls) {
430
464
  if (instance.get('loading')) {
431
465
  stopTyping();
432
466
  resetTypingComplete();
467
+ typingTargetKey = '';
433
468
  if (!setDisplayContent('')) {
434
469
  syncRenderedMarkdown();
435
470
  }
@@ -442,6 +477,7 @@ export function useXMarkdownDisplay(getPrefixCls) {
442
477
  // 空内容或禁用打字效果,直接显示
443
478
  if (!nextValue || !typing) {
444
479
  stopTyping();
480
+ typingTargetKey = '';
445
481
  if (!setDisplayContent(nextValue)) {
446
482
  syncRenderedMarkdown();
447
483
  }
@@ -451,12 +487,11 @@ export function useXMarkdownDisplay(getPrefixCls) {
451
487
  return;
452
488
  }
453
489
  // 内容变化检测
454
- var sharedPrefix = getSharedPrefix(nextValue);
490
+ var previousDisplayContent = getDisplayedContent();
491
+ syncTypingStart(nextValue);
455
492
  // 内容发生"非追加"变化时
456
- if (sharedPrefix !== getDisplayedContent()) {
493
+ if (getDisplayedContent() !== previousDisplayContent) {
457
494
  stopTyping();
458
- resetTypingComplete();
459
- setDisplayContent(sharedPrefix);
460
495
  }
461
496
  // 已完成
462
497
  if (getDisplayedContent() === nextValue) {
@@ -475,8 +510,10 @@ export function useXMarkdownDisplay(getPrefixCls) {
475
510
  */
476
511
  function bootstrap() {
477
512
  var content = instance.get('content');
513
+ var nextValue = content === undefined || content === null ? '' : String(content);
478
514
  setTypingActive(false);
479
- setDisplayContent(!instance.get('loading') && !instance.get('typing') && content !== undefined && content !== null ? String(content) : '');
515
+ var initialDisplayContent = !instance.get('loading') && nextValue ? instance.get('typing') ? getResumePrefix(nextValue) : nextValue : '';
516
+ setDisplayContent(initialDisplayContent);
480
517
  // 监听核心属性变化
481
518
  ['content', 'loading', 'streaming', 'typing'].forEach(function (key) {
482
519
  instance.watch(key, function () {
@@ -538,6 +575,13 @@ export function useXMarkdownDisplay(getPrefixCls) {
538
575
  function isTypingActive() {
539
576
  return !!instance.get('$typingActive');
540
577
  }
578
+ function shouldShowTypingSuffix() {
579
+ var typing = instance.get('typing');
580
+ if (!typing) return false;
581
+ if (typeof typing === 'boolean') return false;
582
+ if (typing.suffix !== true) return false;
583
+ return !instance.get('loading') && (isTypingActive() || !!instance.get('streaming'));
584
+ }
541
585
  return {
542
586
  onMounted: function onMounted() {
543
587
  mounted = true;
@@ -564,6 +608,7 @@ export function useXMarkdownDisplay(getPrefixCls) {
564
608
  getRenderedBlockData: getRenderedBlockData,
565
609
  getRenderedNodes: getRenderedNodes,
566
610
  // 状态查询
567
- isTypingActive: isTypingActive
611
+ isTypingActive: isTypingActive,
612
+ shouldShowTypingSuffix: shouldShowTypingSuffix
568
613
  };
569
614
  }
@@ -5,6 +5,9 @@ import type { XMarkdownCodeBlockRenderers, XMarkdownFormulaDelimiter, XMarkdownP
5
5
  export interface XMarkdownTyping {
6
6
  interval?: number;
7
7
  step?: number;
8
+ suffix?: boolean;
9
+ keepPrefix?: boolean;
10
+ resumeFrom?: string | number | 'content';
8
11
  }
9
12
  export interface XMarkdownProps {
10
13
  content?: string | number;
@@ -3,6 +3,9 @@ import { createVNode as _$cv, className as _$cn, createElementVNode as _$ce } fr
3
3
  import { isInvalid, noop } from 'intact-shared';
4
4
  import { getRestProps, isEmptyString } from '../utils';
5
5
  import { makeStyles } from './styles';
6
+ var _$tmp0 = {
7
+ 'aria-hidden': 'true'
8
+ };
6
9
  export default function ($props, $blocks, $__proto__) {
7
10
  var _classNameObj;
8
11
  $blocks || ($blocks = {});
@@ -16,7 +19,8 @@ export default function ($props, $blocks, $__proto__) {
16
19
  contentRef = _this$contentModel.contentRef;
17
20
  var _this$display = this.display,
18
21
  shouldShowLoadingShell = _this$display.shouldShowLoadingShell,
19
- shouldShowEmpty = _this$display.shouldShowEmpty;
22
+ shouldShowEmpty = _this$display.shouldShowEmpty,
23
+ shouldShowTypingSuffix = _this$display.shouldShowTypingSuffix;
20
24
  var stableNodes = this.display.getRenderedStableNodes();
21
25
  var tailNodes = this.display.getRenderedTailNodes();
22
26
  var showLoadingShell = shouldShowLoadingShell();
@@ -38,6 +42,6 @@ export default function ($props, $blocks, $__proto__) {
38
42
  'className': _$cn(classNameObj)
39
43
  }, getRestProps(this), {
40
44
  'ref': rootRef
41
- }), showLoadingShell ? hasLoadingSlot ? loadingSlot : _$ce(2, 'div', _$ce(2, 'div', [_$ce(2, 'div', null, 1, _$cn(k + "-xmarkdown-loading-dot")), _$ce(2, 'div', null, 1, _$cn(k + "-xmarkdown-loading-dot")), _$ce(2, 'div', null, 1, _$cn(k + "-xmarkdown-loading-dot"))], 4, _$cn(k + "-xmarkdown-loading-dots")), 2, _$cn(k + "-xmarkdown-loading")) : showEmpty ? hasEmptySlot ? _$ce(2, 'div', emptySlot, 0, _$cn(k + "-xmarkdown-empty")) : undefined : _$ce(2, 'div', [_$ce(2, 'div', stableNodes, 0, _$cn(k + "-xmarkdown-stable")), _$ce(2, 'div', tailNodes, 0, _$cn(k + "-xmarkdown-tail"))], 4, _$cn(k + "-xmarkdown-content"), null, null, contentRef));
45
+ }), showLoadingShell ? hasLoadingSlot ? loadingSlot : _$ce(2, 'div', _$ce(2, 'div', [_$ce(2, 'div', null, 1, _$cn(k + "-xmarkdown-loading-dot")), _$ce(2, 'div', null, 1, _$cn(k + "-xmarkdown-loading-dot")), _$ce(2, 'div', null, 1, _$cn(k + "-xmarkdown-loading-dot"))], 4, _$cn(k + "-xmarkdown-loading-dots")), 2, _$cn(k + "-xmarkdown-loading")) : showEmpty ? hasEmptySlot ? _$ce(2, 'div', emptySlot, 0, _$cn(k + "-xmarkdown-empty")) : undefined : _$ce(2, 'div', [_$ce(2, 'div', [_$ce(2, 'div', stableNodes, 0, _$cn(k + "-xmarkdown-stable")), _$ce(2, 'div', tailNodes, 0, _$cn(k + "-xmarkdown-tail"))], 4, _$cn(k + "-xmarkdown-body")), shouldShowTypingSuffix() ? _$ce(2, 'div', [_$ce(2, 'span'), _$ce(2, 'span'), _$ce(2, 'span')], 4, _$cn(k + "-xmarkdown-typing-suffix"), _$tmp0) : undefined], 0, _$cn(k + "-xmarkdown-content"), null, null, contentRef));
42
46
  }
43
47
  ;
@@ -1388,6 +1388,7 @@ var i18n = {
1388
1388
  '查看文件夹': 'View Folder',
1389
1389
  '查看文件': 'View File',
1390
1390
  '上传图片': 'Upload Image',
1391
+ '参考内容': 'Reference',
1391
1392
  '上传文件夹': 'Upload Folder',
1392
1393
  '超出文件数量最大限制:{limit}': 'Exceed the maximum limit of the number of files: {limit}',
1393
1394
  '"{name}" 超出文件最大限制:{maxSize}kb': '"{name}" exceeds the maximum size of file: {maxSize}kb',