@touchvue/chat 1.0.0-beta.55 → 1.0.0-beta.57

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 (125) hide show
  1. package/es/index.mjs.map +1 -1
  2. package/es/node_modules/.pnpm/{dompurify@3.4.3 → dompurify@3.4.11}/node_modules/dompurify/dist/purify.es.mjs +939 -226
  3. package/es/node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.mjs.map +1 -0
  4. package/es/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/index.mjs +109 -105
  5. package/es/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/index.mjs.map +1 -0
  6. package/es/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/lib/re.mjs +34 -30
  7. package/es/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/lib/re.mjs.map +1 -0
  8. package/es/node_modules/.pnpm/{markdown-it-deflist@3.0.0 → markdown-it-deflist@3.0.1}/node_modules/markdown-it-deflist/index.mjs +2 -1
  9. package/es/node_modules/.pnpm/markdown-it-deflist@3.0.1/node_modules/markdown-it-deflist/index.mjs.map +1 -0
  10. package/es/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/index.mjs +1 -1
  11. package/es/package.json.mjs +1 -1
  12. package/es/packages/components/touchchat/component/AiRobot/face.vue2.mjs.map +1 -1
  13. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs +1 -1
  14. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
  15. package/es/packages/components/touchchat/component/AiRobot/meterialPrepare.vue2.mjs.map +1 -1
  16. package/es/packages/components/touchchat/component/AiRobot/start.vue2.mjs.map +1 -1
  17. package/es/packages/components/touchchat/component/CardView.vue2.mjs.map +1 -1
  18. package/es/packages/components/touchchat/component/ImageFile.vue2.mjs.map +1 -1
  19. package/es/packages/components/touchchat/component/ImageView.vue2.mjs.map +1 -1
  20. package/es/packages/components/touchchat/component/LinkView.vue2.mjs.map +1 -1
  21. package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs.map +1 -1
  22. package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
  23. package/es/packages/components/touchchat/component/Screenshot.vue2.mjs.map +1 -1
  24. package/es/packages/components/touchchat/component/ThoughtChain.vue2.mjs.map +1 -1
  25. package/es/packages/components/touchchat/component/UploadView.vue2.mjs +2 -2
  26. package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
  27. package/es/packages/components/touchchat/component/UploadView_api.vue2.mjs.map +1 -1
  28. package/es/packages/components/touchchat/index.mjs.map +1 -1
  29. package/es/packages/components/touchchat/src/AiChat/Chat/TouchChat.mjs.map +1 -1
  30. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +7 -39
  31. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
  32. package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs +1 -1
  33. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +26 -16
  34. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -1
  35. package/es/packages/components/touchchat/src/AiChat/Chat/useScroll.mjs.map +1 -1
  36. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +16 -4
  37. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
  38. package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
  39. package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
  40. package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
  41. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +139 -81
  42. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
  43. package/es/packages/components/touchchat/src/index.vue2.mjs +11 -1
  44. package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
  45. package/es/packages/components/touchchat/src/types/a2a.mjs.map +1 -1
  46. package/es/packages/components/touchchat/utils/a2aService.mjs +204 -104
  47. package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
  48. package/es/packages/components/touchchat/utils/chatRobot.mjs.map +1 -1
  49. package/es/packages/components/touchchat/utils/deepCloneDom.mjs.map +1 -1
  50. package/es/packages/components/touchchat/utils/hight-it.mjs.map +1 -1
  51. package/es/packages/components/touchchat/utils/markdown.mjs +23 -6
  52. package/es/packages/components/touchchat/utils/markdown.mjs.map +1 -1
  53. package/es/packages/components/touchchat/utils/socket.mjs.map +1 -1
  54. package/es/packages/components/touchchat/utils/tools.mjs +4 -4
  55. package/es/packages/components/touchchat/utils/tools.mjs.map +1 -1
  56. package/es/packages/components/touchchat/utils/uuid.mjs.map +1 -1
  57. package/es/packages/utils/config.mjs.map +1 -1
  58. package/es/packages/utils/types.mjs.map +1 -1
  59. package/lib/index.js.map +1 -1
  60. package/lib/node_modules/.pnpm/{dompurify@3.4.3 → dompurify@3.4.11}/node_modules/dompurify/dist/purify.es.js +939 -226
  61. package/lib/node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.js.map +1 -0
  62. package/lib/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/index.js +109 -105
  63. package/lib/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/index.js.map +1 -0
  64. package/lib/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/lib/re.js +34 -30
  65. package/lib/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/lib/re.js.map +1 -0
  66. package/lib/node_modules/.pnpm/{markdown-it-deflist@3.0.0 → markdown-it-deflist@3.0.1}/node_modules/markdown-it-deflist/index.js +2 -1
  67. package/lib/node_modules/.pnpm/markdown-it-deflist@3.0.1/node_modules/markdown-it-deflist/index.js.map +1 -0
  68. package/lib/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/index.js +1 -1
  69. package/lib/package.json.js +1 -1
  70. package/lib/packages/components/touchchat/component/AiRobot/face.vue2.js.map +1 -1
  71. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +1 -1
  72. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
  73. package/lib/packages/components/touchchat/component/AiRobot/meterialPrepare.vue2.js.map +1 -1
  74. package/lib/packages/components/touchchat/component/AiRobot/start.vue2.js.map +1 -1
  75. package/lib/packages/components/touchchat/component/CardView.vue2.js.map +1 -1
  76. package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
  77. package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
  78. package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
  79. package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
  80. package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
  81. package/lib/packages/components/touchchat/component/Screenshot.vue2.js.map +1 -1
  82. package/lib/packages/components/touchchat/component/ThoughtChain.vue2.js.map +1 -1
  83. package/lib/packages/components/touchchat/component/UploadView.vue2.js +2 -2
  84. package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
  85. package/lib/packages/components/touchchat/component/UploadView_api.vue2.js.map +1 -1
  86. package/lib/packages/components/touchchat/index.js.map +1 -1
  87. package/lib/packages/components/touchchat/src/AiChat/Chat/TouchChat.js.map +1 -1
  88. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +6 -38
  89. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
  90. package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js +1 -1
  91. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +26 -16
  92. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -1
  93. package/lib/packages/components/touchchat/src/AiChat/Chat/useScroll.js.map +1 -1
  94. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +15 -3
  95. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
  96. package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
  97. package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
  98. package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
  99. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +139 -81
  100. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
  101. package/lib/packages/components/touchchat/src/index.vue2.js +11 -1
  102. package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
  103. package/lib/packages/components/touchchat/src/types/a2a.js.map +1 -1
  104. package/lib/packages/components/touchchat/utils/a2aService.js +204 -104
  105. package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
  106. package/lib/packages/components/touchchat/utils/chatRobot.js.map +1 -1
  107. package/lib/packages/components/touchchat/utils/deepCloneDom.js.map +1 -1
  108. package/lib/packages/components/touchchat/utils/hight-it.js.map +1 -1
  109. package/lib/packages/components/touchchat/utils/markdown.js +23 -6
  110. package/lib/packages/components/touchchat/utils/markdown.js.map +1 -1
  111. package/lib/packages/components/touchchat/utils/socket.js.map +1 -1
  112. package/lib/packages/components/touchchat/utils/tools.js +4 -4
  113. package/lib/packages/components/touchchat/utils/tools.js.map +1 -1
  114. package/lib/packages/components/touchchat/utils/uuid.js.map +1 -1
  115. package/lib/packages/utils/config.js.map +1 -1
  116. package/lib/packages/utils/types.js.map +1 -1
  117. package/package.json +1 -1
  118. package/es/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.mjs.map +0 -1
  119. package/es/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/index.mjs.map +0 -1
  120. package/es/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/lib/re.mjs.map +0 -1
  121. package/es/node_modules/.pnpm/markdown-it-deflist@3.0.0/node_modules/markdown-it-deflist/index.mjs.map +0 -1
  122. package/lib/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.js.map +0 -1
  123. package/lib/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/index.js.map +0 -1
  124. package/lib/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/lib/re.js.map +0 -1
  125. package/lib/node_modules/.pnpm/markdown-it-deflist@3.0.0/node_modules/markdown-it-deflist/index.js.map +0 -1
@@ -4,13 +4,13 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var index$1 = require('../../../../node_modules/.pnpm/markdown-it-abbr@2.0.0/node_modules/markdown-it-abbr/index.js');
6
6
  var index$2 = require('../../../../node_modules/.pnpm/markdown-it-container@4.0.0/node_modules/markdown-it-container/index.js');
7
- var index$3 = require('../../../../node_modules/.pnpm/markdown-it-deflist@3.0.0/node_modules/markdown-it-deflist/index.js');
7
+ var index$3 = require('../../../../node_modules/.pnpm/markdown-it-deflist@3.0.1/node_modules/markdown-it-deflist/index.js');
8
8
  var index$4 = require('../../../../node_modules/.pnpm/markdown-it-footnote@4.0.0/node_modules/markdown-it-footnote/index.js');
9
9
  var index$5 = require('../../../../node_modules/.pnpm/markdown-it-ins@4.0.0/node_modules/markdown-it-ins/index.js');
10
10
  var index$6 = require('../../../../node_modules/.pnpm/markdown-it-mark@4.0.0/node_modules/markdown-it-mark/index.js');
11
11
  var index$7 = require('../../../../node_modules/.pnpm/markdown-it-sub@2.0.0/node_modules/markdown-it-sub/index.js');
12
12
  var index$8 = require('../../../../node_modules/.pnpm/markdown-it-sup@2.0.0/node_modules/markdown-it-sup/index.js');
13
- var purify_es = require('../../../../node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.js');
13
+ var purify_es = require('../../../../node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.js');
14
14
  var hightIt = require('./hight-it.js');
15
15
  var index = require('../../../../node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/index.js');
16
16
  var full = require('../../../../node_modules/.pnpm/markdown-it-emoji@3.0.0/node_modules/markdown-it-emoji/lib/full.js');
@@ -32,6 +32,12 @@ const mdInstance = new index.default({
32
32
  mdInstance.renderer.rules.table_open = function() {
33
33
  return '<table class="table touchchat-table">\n';
34
34
  };
35
+ mdInstance.renderer.rules.link_open = function(tokens, idx, options, env, slf) {
36
+ const token = tokens[idx];
37
+ token.attrSet("target", "_blank");
38
+ token.attrSet("rel", "noopener noreferrer");
39
+ return slf.renderToken(tokens, idx, options, env, slf);
40
+ };
35
41
  mdInstance.renderer.rules.paragraph_open = mdInstance.renderer.rules.heading_open = (tokens, idx, options, env, slf) => {
36
42
  let line;
37
43
  if (tokens[idx].map && tokens[idx].level === 0) {
@@ -41,6 +47,14 @@ mdInstance.renderer.rules.paragraph_open = mdInstance.renderer.rules.heading_ope
41
47
  }
42
48
  return slf.renderToken(tokens, idx, options, env, slf);
43
49
  };
50
+ const addTargetBlank = (html) => {
51
+ return html.replace(/<a([^>]*)>/gi, (match, attrs) => {
52
+ if (!/target\s*=\s*["']/i.test(attrs)) {
53
+ return `<a${attrs} target="_blank" rel="noopener noreferrer">`;
54
+ }
55
+ return match;
56
+ });
57
+ };
44
58
  const markdown = {
45
59
  render: (content, options) => {
46
60
  if (!content)
@@ -49,13 +63,16 @@ const markdown = {
49
63
  if (options == null ? void 0 : options.isReasoning) {
50
64
  processedContent = processedContent.trim();
51
65
  }
52
- const html = mdInstance.render(processedContent);
66
+ let html = mdInstance.render(processedContent);
53
67
  const purify = getDOMPurify();
54
- const sanitizedHtml = purify ? purify.sanitize(html) : html;
68
+ if (purify) {
69
+ html = purify.sanitize(html);
70
+ }
71
+ html = addTargetBlank(html);
55
72
  if (options == null ? void 0 : options.isReasoning) {
56
- return sanitizedHtml;
73
+ return html;
57
74
  }
58
- return sanitizedHtml;
75
+ return html;
59
76
  }
60
77
  };
61
78
  console.log("markdown", markdown);
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sources":["../../../../../../packages/components/touchchat/utils/markdown.ts"],"sourcesContent":["import Markdown from 'markdown-it'\nimport mdAbbr from 'markdown-it-abbr'\nimport mdContainer from 'markdown-it-container'\nimport mdDeflist from 'markdown-it-deflist'\nimport { full as mdEmoji } from 'markdown-it-emoji'\nimport mdFootnote from 'markdown-it-footnote'\nimport mdIns from 'markdown-it-ins'\nimport mdMark from 'markdown-it-mark'\nimport mdSub from 'markdown-it-sub'\nimport mdSup from 'markdown-it-sup'\nimport DOMPurify from 'dompurify'\nimport highlightPlugin from './hight-it.ts'\n\n// 确保 DOMPurify 在浏览器环境中正确初始化\nconst getDOMPurify = () => {\n\tif (typeof window !== 'undefined') {\n\t\treturn DOMPurify\n\t}\n\treturn null\n}\n\ninterface RenderOptions {\n\tisReasoning?: boolean\n}\n\n// 创建原始 markdown-it 实例\nconst mdInstance = new Markdown({\n\thtml: true,\n\txhtmlOut: false,\n\tbreaks: true,\n\tlangPrefix: 'language-',\n\tlinkify: false,\n\ttypographer: true\n})\n\t.use(mdAbbr)\n\t.use(mdContainer, 'warning')\n\t.use(mdDeflist)\n\t.use(mdEmoji)\n\t.use(mdFootnote)\n\t.use(mdIns)\n\t.use(mdMark)\n\t.use(mdSub)\n\t.use(mdSup)\n\t.use(highlightPlugin)\n\n// 自定义渲染规则\nmdInstance.renderer.rules.table_open = function () {\n\treturn '<table class=\"table touchchat-table\">\\n'\n}\n\nmdInstance.renderer.rules.paragraph_open = mdInstance.renderer.rules.heading_open = (tokens: any[], idx: number, options: any, env: any, slf: any) => {\n\tlet line: number | undefined\n\tif (tokens[idx].map && tokens[idx].level === 0) {\n\t\tline = tokens[idx].map[0]\n\t\ttokens[idx].attrJoin('class', 'line')\n\t\ttokens[idx].attrSet('data-line', String(line))\n\t}\n\treturn slf.renderToken(tokens, idx, options, env, slf)\n}\n\n// 创建包装对象,支持带参数的 render 方法\nconst markdown = {\n\trender: (content: string, options?: RenderOptions): string => {\n\t\tif (!content) return ''\n\n\t\t// 根据 isReasoning 参数添加不同的 CSS 类\n\t\tlet processedContent = content\n\t\tif (options?.isReasoning) {\n\t\t\t// 对于推理内容,可以添加特定的标记或处理\n\t\t\t// 这里可以根据需要添加特殊的渲染逻辑\n\t\t\t// 例如,可以添加一个包装 div 来标识这是推理内容\n\t\t\tprocessedContent = processedContent.trim()\n\t\t}\n\n\t\tconst html = mdInstance.render(processedContent)\n\t\t\n\t\t// 安全地使用 DOMPurify\n\t\tconst purify = getDOMPurify()\n\t\tconst sanitizedHtml = purify ? purify.sanitize(html) : html\n\n\t\t// 如果是推理内容,可以添加额外的包装\n\t\tif (options?.isReasoning) {\n\t\t\t// 可以在这里添加特殊的 CSS 类或包装\n\t\t\t// 例如:return `<div class=\"reasoning-content\">${sanitizedHtml}</div>`\n\t\t\treturn sanitizedHtml\n\t\t}\n\n\t\treturn sanitizedHtml\n\t}\n}\n\nconsole.log('markdown', markdown)\n\nexport default markdown\n"],"names":["DOMPurify","Markdown","mdAbbr","mdContainer","mdDeflist","mdEmoji","mdFootnote","mdIns","mdMark","mdSub","mdSup","highlightPlugin"],"mappings":";;;;;;;;;;;;;;;;;AAcA,MAAM,eAAe,MAAM;AAC1B,EAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AAClC,IAAO,OAAAA,iBAAA,CAAA;AAAA,GACR;AACA,EAAO,OAAA,IAAA,CAAA;AACR,CAAA,CAAA;AAOA,MAAM,UAAA,GAAa,IAAIC,aAAS,CAAA;AAAA,EAC/B,IAAM,EAAA,IAAA;AAAA,EACN,QAAU,EAAA,KAAA;AAAA,EACV,MAAQ,EAAA,IAAA;AAAA,EACR,UAAY,EAAA,WAAA;AAAA,EACZ,OAAS,EAAA,KAAA;AAAA,EACT,WAAa,EAAA,IAAA;AACd,CAAC,CACC,CAAA,GAAA,CAAIC,eAAM,CAAA,CACV,GAAI,CAAAC,eAAA,EAAa,SAAS,CAAA,CAC1B,GAAI,CAAAC,eAAS,CACb,CAAA,GAAA,CAAIC,YAAO,CACX,CAAA,GAAA,CAAIC,eAAU,CAAA,CACd,GAAI,CAAAC,eAAK,CACT,CAAA,GAAA,CAAIC,eAAM,CAAA,CACV,GAAI,CAAAC,eAAK,CACT,CAAA,GAAA,CAAIC,eAAK,CAAA,CACT,IAAIC,eAAe,CAAA,CAAA;AAGrB,UAAW,CAAA,QAAA,CAAS,KAAM,CAAA,UAAA,GAAa,WAAY;AAClD,EAAO,OAAA,yCAAA,CAAA;AACR,CAAA,CAAA;AAEA,UAAA,CAAW,QAAS,CAAA,KAAA,CAAM,cAAiB,GAAA,UAAA,CAAW,QAAS,CAAA,KAAA,CAAM,YAAe,GAAA,CAAC,MAAe,EAAA,GAAA,EAAa,OAAc,EAAA,GAAA,EAAU,GAAa,KAAA;AACrJ,EAAI,IAAA,IAAA,CAAA;AACJ,EAAI,IAAA,MAAA,CAAO,GAAG,CAAE,CAAA,GAAA,IAAO,OAAO,GAAG,CAAA,CAAE,UAAU,CAAG,EAAA;AAC/C,IAAA,IAAA,GAAO,MAAO,CAAA,GAAG,CAAE,CAAA,GAAA,CAAI,CAAC,CAAA,CAAA;AACxB,IAAA,MAAA,CAAO,GAAG,CAAA,CAAE,QAAS,CAAA,OAAA,EAAS,MAAM,CAAA,CAAA;AACpC,IAAA,MAAA,CAAO,GAAG,CAAE,CAAA,OAAA,CAAQ,WAAa,EAAA,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,GAC9C;AACA,EAAA,OAAO,IAAI,WAAY,CAAA,MAAA,EAAQ,GAAK,EAAA,OAAA,EAAS,KAAK,GAAG,CAAA,CAAA;AACtD,CAAA,CAAA;AAGA,MAAM,QAAW,GAAA;AAAA,EAChB,MAAA,EAAQ,CAAC,OAAA,EAAiB,OAAoC,KAAA;AAC7D,IAAA,IAAI,CAAC,OAAA;AAAS,MAAO,OAAA,EAAA,CAAA;AAGrB,IAAA,IAAI,gBAAmB,GAAA,OAAA,CAAA;AACvB,IAAA,IAAI,mCAAS,WAAa,EAAA;AAIzB,MAAA,gBAAA,GAAmB,iBAAiB,IAAK,EAAA,CAAA;AAAA,KAC1C;AAEA,IAAM,MAAA,IAAA,GAAO,UAAW,CAAA,MAAA,CAAO,gBAAgB,CAAA,CAAA;AAG/C,IAAA,MAAM,SAAS,YAAa,EAAA,CAAA;AAC5B,IAAA,MAAM,aAAgB,GAAA,MAAA,GAAS,MAAO,CAAA,QAAA,CAAS,IAAI,CAAI,GAAA,IAAA,CAAA;AAGvD,IAAA,IAAI,mCAAS,WAAa,EAAA;AAGzB,MAAO,OAAA,aAAA,CAAA;AAAA,KACR;AAEA,IAAO,OAAA,aAAA,CAAA;AAAA,GACR;AACD,EAAA;AAEA,OAAQ,CAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;;;;"}
1
+ {"version":3,"file":"markdown.js","sources":["../../../../../../packages/components/touchchat/utils/markdown.ts"],"sourcesContent":["import Markdown from 'markdown-it'\r\nimport mdAbbr from 'markdown-it-abbr'\r\nimport mdContainer from 'markdown-it-container'\r\nimport mdDeflist from 'markdown-it-deflist'\r\nimport { full as mdEmoji } from 'markdown-it-emoji'\r\nimport mdFootnote from 'markdown-it-footnote'\r\nimport mdIns from 'markdown-it-ins'\r\nimport mdMark from 'markdown-it-mark'\r\nimport mdSub from 'markdown-it-sub'\r\nimport mdSup from 'markdown-it-sup'\r\nimport DOMPurify from 'dompurify'\r\nimport highlightPlugin from './hight-it.ts'\r\n\r\n// 确保 DOMPurify 在浏览器环境中正确初始化\r\nconst getDOMPurify = () => {\r\n\tif (typeof window !== 'undefined') {\r\n\t\treturn DOMPurify\r\n\t}\r\n\treturn null\r\n}\r\n\r\ninterface RenderOptions {\r\n\tisReasoning?: boolean\r\n}\r\n\r\n// 创建原始 markdown-it 实例\r\nconst mdInstance = new Markdown({\r\n\thtml: true,\r\n\txhtmlOut: false,\r\n\tbreaks: true,\r\n\tlangPrefix: 'language-',\r\n\tlinkify: false,\r\n\ttypographer: true\r\n})\r\n\t.use(mdAbbr)\r\n\t.use(mdContainer, 'warning')\r\n\t.use(mdDeflist)\r\n\t.use(mdEmoji)\r\n\t.use(mdFootnote)\r\n\t.use(mdIns)\r\n\t.use(mdMark)\r\n\t.use(mdSub)\r\n\t.use(mdSup)\r\n\t.use(highlightPlugin)\r\n\r\n// 自定义渲染规则\r\nmdInstance.renderer.rules.table_open = function () {\r\n\treturn '<table class=\"table touchchat-table\">\\n'\r\n}\r\n\r\n// 自定义链接渲染规则,添加 target=\"_blank\" 在新窗口打开\r\nmdInstance.renderer.rules.link_open = function (tokens: any[], idx: number, options: any, env: any, slf: any) {\r\n\tconst token = tokens[idx]\r\n\t// 添加 target=\"_blank\" 属性\r\n\ttoken.attrSet('target', '_blank')\r\n\t// 添加 rel=\"noopener noreferrer\" 安全属性\r\n\ttoken.attrSet('rel', 'noopener noreferrer')\r\n\treturn slf.renderToken(tokens, idx, options, env, slf)\r\n}\r\n\r\nmdInstance.renderer.rules.paragraph_open = mdInstance.renderer.rules.heading_open = (tokens: any[], idx: number, options: any, env: any, slf: any) => {\r\n\tlet line: number | undefined\r\n\tif (tokens[idx].map && tokens[idx].level === 0) {\r\n\t\tline = tokens[idx].map[0]\r\n\t\ttokens[idx].attrJoin('class', 'line')\r\n\t\ttokens[idx].attrSet('data-line', String(line))\r\n\t}\r\n\treturn slf.renderToken(tokens, idx, options, env, slf)\r\n}\r\n\r\n// 为所有 <a> 标签添加 target=\"_blank\" 属性\r\nconst addTargetBlank = (html: string): string => {\r\n\t// 匹配 <a> 标签,确保没有已存在的 target 属性\r\n\treturn html.replace(/<a([^>]*)>/gi, (match, attrs) => {\r\n\t\t// 检查是否已有 target 属性\r\n\t\tif (!/target\\s*=\\s*[\"']/i.test(attrs)) {\r\n\t\t\treturn `<a${attrs} target=\"_blank\" rel=\"noopener noreferrer\">`\r\n\t\t}\r\n\t\treturn match\r\n\t})\r\n}\r\n\r\n// 创建包装对象,支持带参数的 render 方法\r\nconst markdown = {\r\n\trender: (content: string, options?: RenderOptions): string => {\r\n\t\tif (!content) return ''\r\n\r\n\t\t// 根据 isReasoning 参数添加不同的 CSS 类\r\n\t\tlet processedContent = content\r\n\t\tif (options?.isReasoning) {\r\n\t\t\t// 对于推理内容,可以添加特定的标记或处理\r\n\t\t\t// 这里可以根据需要添加特殊的渲染逻辑\r\n\t\t\t// 例如,可以添加一个包装 div 来标识这是推理内容\r\n\t\t\tprocessedContent = processedContent.trim()\r\n\t\t}\r\n\r\n\t\tlet html = mdInstance.render(processedContent)\r\n\r\n\t\t// 安全地使用 DOMPurify\r\n\t\tconst purify = getDOMPurify()\r\n\t\tif (purify) {\r\n\t\t\thtml = purify.sanitize(html)\r\n\t\t}\r\n\r\n\t\t// sanitize 之后,手动为所有 <a> 标签添加 target=\"_blank\"\r\n\t\thtml = addTargetBlank(html)\r\n\r\n\t\t// 如果是推理内容,可以添加额外的包装\r\n\t\tif (options?.isReasoning) {\r\n\t\t\t// 可以在这里添加特殊的 CSS 类或包装\r\n\t\t\t// 例如:return `<div class=\"reasoning-content\">${sanitizedHtml}</div>`\r\n\t\t\treturn html\r\n\t\t}\r\n\r\n\t\treturn html\r\n\t}\r\n}\r\n\r\nconsole.log('markdown', markdown)\r\n\r\nexport default markdown\r\n"],"names":["DOMPurify","Markdown","mdAbbr","mdContainer","mdDeflist","mdEmoji","mdFootnote","mdIns","mdMark","mdSub","mdSup","highlightPlugin"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"socket.js","sources":["../../../../../../packages/components/touchchat/utils/socket.ts"],"sourcesContent":["export const SOCKET_STATUS = {\n WAITING: 'waiting', // 等待连接,初始状态\n CONNECTING: 'connecting', // 连接中\n RECONNECTING: 'reconnecting', // 重新连接中\n CONNECTED: 'connected', // 已经连接成功\n CLOSING: 'closing', // 关闭连接中\n} as const;\n\ntype SocketStatus = (typeof SOCKET_STATUS)[keyof typeof SOCKET_STATUS];\n\ntype MessageCallback = (data: any) => void;\ntype StatusCallback = (status: SocketStatus) => void;\n\nexport class Socket {\n #socket: WebSocket | undefined;\n #url: string;\n #onMsgCallback: MessageCallback | undefined;\n #statusCallback: StatusCallback | undefined;\n #autoReconnect: boolean | undefined;\n #timeTask: ReturnType<typeof setTimeout> | undefined;\n #directivity: any;\n status: SocketStatus;\n\n constructor(\n url: string,\n onMsgCallback?: MessageCallback,\n statusCallback?: StatusCallback,\n directivity?: any\n ) {\n this.#url = url;\n this.#onMsgCallback = onMsgCallback;\n this.#statusCallback = statusCallback;\n this.status = SOCKET_STATUS.WAITING;\n this.#directivity = directivity; // 用于修改 this 指向\n }\n\n // 使用箭头函数确保 this 指向正确\n connect = (autoReconnect: boolean = true): Promise<boolean> => {\n if (!this.#url) throw new Error('url is not initialized');\n if (this.#socket) throw new Error('socket is already initialized');\n this.#autoReconnect = autoReconnect;\n return new Promise((resolve, reject) => this.#connect(resolve, reject));\n };\n\n #notifyStatus(): void {\n if (this.#statusCallback) {\n this.#statusCallback.call(this.#directivity, this.status);\n }\n }\n\n // eslint-disable-next-line no-dupe-class-members\n #connect(resolve?: (value: boolean) => void, reject?: (reason?: any) => void): void {\n if (this.status === SOCKET_STATUS.CLOSING) return;\n console.log('socket connect');\n clearTimeout(this.#timeTask);\n console.log('this.#url ========= ', this.#url);\n this.#socket = new WebSocket(this.#url);\n this.status = SOCKET_STATUS.WAITING;\n this.#socket.onopen = () => {\n console.log('socket onopen');\n if (this.status === SOCKET_STATUS.CLOSING) {\n this.close();\n return;\n }\n this.status = SOCKET_STATUS.CONNECTED;\n this.#notifyStatus();\n if (resolve) {\n resolve(true);\n }\n };\n this.#socket.onerror = (event: Event) => {\n console.log('socket onerror');\n this.#socket?.close();\n this.#socket = undefined;\n if (\n this.#autoReconnect === true &&\n this.status !== SOCKET_STATUS.RECONNECTING &&\n this.status !== SOCKET_STATUS.CONNECTED &&\n this.status !== SOCKET_STATUS.CLOSING\n ) {\n this.status = SOCKET_STATUS.RECONNECTING;\n this.#notifyStatus();\n this.#timeTask = setTimeout(() => {\n this.#connect(resolve, reject);\n }, 3000);\n return;\n } else if (reject) {\n reject(event);\n }\n this.status = SOCKET_STATUS.WAITING;\n this.#notifyStatus();\n };\n this.#socket.onclose = (event: CloseEvent) => {\n console.log('socket onclose', event);\n this.#socket = undefined;\n\n // 先保存当前状态,然后再进行判断\n const currentStatus = this.status;\n this.status = SOCKET_STATUS.CLOSING;\n\n if (event.code === 1000) {\n this.#notifyStatus();\n return;\n }\n\n if (\n this.#autoReconnect === true &&\n currentStatus !== SOCKET_STATUS.RECONNECTING &&\n currentStatus !== SOCKET_STATUS.CONNECTED &&\n currentStatus !== SOCKET_STATUS.CLOSING\n ) {\n this.status = SOCKET_STATUS.RECONNECTING;\n this.#notifyStatus();\n this.#timeTask = setTimeout(() => {\n this.#connect();\n }, 3000);\n } else {\n this.status = SOCKET_STATUS.CLOSING;\n this.#notifyStatus();\n }\n };\n this.#socket.onmessage = (event: MessageEvent) => {\n if (this.#onMsgCallback && typeof this.#onMsgCallback === 'function') {\n if (typeof event.data === 'string') {\n try {\n const data = JSON.parse(event.data);\n this.#onMsgCallback.call(this.#directivity, data); // 使得 onMsgCallback 方法的 this 能指向 globalWebSocket\n data.type === 'chatCrmSuccess' && console.log('Socket message chatCrmSuccess', data);\n } catch (e) {\n this.#onMsgCallback.call(this.#directivity, event.data);\n console.log('Socket message received', event.data);\n }\n } else {\n this.#onMsgCallback.call(this.#directivity, event.data);\n }\n }\n };\n }\n\n /**\n * 发送数据\n * @param data 发送的数据,可以是字符串、对象或 Blob\n * @param sendType 发送类型,可选值:binary、text\n */\n async send(\n data: string | object | Blob | ArrayBuffer,\n sendType: 'text' | 'binary' = 'text'\n ): Promise<void> {\n if (this.#socket && this.status === SOCKET_STATUS.CONNECTED) {\n let finalData: string | Blob | ArrayBuffer;\n if (data instanceof Blob || data instanceof ArrayBuffer) {\n finalData = data;\n } else if (sendType === 'text') {\n if (typeof data === 'string') {\n finalData = data;\n } else {\n finalData = JSON.stringify(data);\n }\n } else {\n if (typeof data === 'string') {\n finalData = new Blob([data]);\n } else {\n finalData = new Blob([JSON.stringify(data)]);\n }\n }\n this.#socket.send(finalData);\n }\n }\n\n close(): void {\n if (this.status === SOCKET_STATUS.CLOSING || this.status === SOCKET_STATUS.WAITING) return;\n console.log('socket close');\n if (this.#socket && this.status === SOCKET_STATUS.CONNECTED) {\n this.#socket.close();\n }\n if (this.#timeTask) {\n clearTimeout(this.#timeTask);\n this.#timeTask = undefined;\n }\n this.status = SOCKET_STATUS.CLOSING;\n this.#autoReconnect = false;\n this.#notifyStatus();\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"socket.js","sources":["../../../../../../packages/components/touchchat/utils/socket.ts"],"sourcesContent":["export const SOCKET_STATUS = {\r\n WAITING: 'waiting', // 等待连接,初始状态\r\n CONNECTING: 'connecting', // 连接中\r\n RECONNECTING: 'reconnecting', // 重新连接中\r\n CONNECTED: 'connected', // 已经连接成功\r\n CLOSING: 'closing', // 关闭连接中\r\n} as const;\r\n\r\ntype SocketStatus = (typeof SOCKET_STATUS)[keyof typeof SOCKET_STATUS];\r\n\r\ntype MessageCallback = (data: any) => void;\r\ntype StatusCallback = (status: SocketStatus) => void;\r\n\r\nexport class Socket {\r\n #socket: WebSocket | undefined;\r\n #url: string;\r\n #onMsgCallback: MessageCallback | undefined;\r\n #statusCallback: StatusCallback | undefined;\r\n #autoReconnect: boolean | undefined;\r\n #timeTask: ReturnType<typeof setTimeout> | undefined;\r\n #directivity: any;\r\n status: SocketStatus;\r\n\r\n constructor(\r\n url: string,\r\n onMsgCallback?: MessageCallback,\r\n statusCallback?: StatusCallback,\r\n directivity?: any\r\n ) {\r\n this.#url = url;\r\n this.#onMsgCallback = onMsgCallback;\r\n this.#statusCallback = statusCallback;\r\n this.status = SOCKET_STATUS.WAITING;\r\n this.#directivity = directivity; // 用于修改 this 指向\r\n }\r\n\r\n // 使用箭头函数确保 this 指向正确\r\n connect = (autoReconnect: boolean = true): Promise<boolean> => {\r\n if (!this.#url) throw new Error('url is not initialized');\r\n if (this.#socket) throw new Error('socket is already initialized');\r\n this.#autoReconnect = autoReconnect;\r\n return new Promise((resolve, reject) => this.#connect(resolve, reject));\r\n };\r\n\r\n #notifyStatus(): void {\r\n if (this.#statusCallback) {\r\n this.#statusCallback.call(this.#directivity, this.status);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line no-dupe-class-members\r\n #connect(resolve?: (value: boolean) => void, reject?: (reason?: any) => void): void {\r\n if (this.status === SOCKET_STATUS.CLOSING) return;\r\n console.log('socket connect');\r\n clearTimeout(this.#timeTask);\r\n console.log('this.#url ========= ', this.#url);\r\n this.#socket = new WebSocket(this.#url);\r\n this.status = SOCKET_STATUS.WAITING;\r\n this.#socket.onopen = () => {\r\n console.log('socket onopen');\r\n if (this.status === SOCKET_STATUS.CLOSING) {\r\n this.close();\r\n return;\r\n }\r\n this.status = SOCKET_STATUS.CONNECTED;\r\n this.#notifyStatus();\r\n if (resolve) {\r\n resolve(true);\r\n }\r\n };\r\n this.#socket.onerror = (event: Event) => {\r\n console.log('socket onerror');\r\n this.#socket?.close();\r\n this.#socket = undefined;\r\n if (\r\n this.#autoReconnect === true &&\r\n this.status !== SOCKET_STATUS.RECONNECTING &&\r\n this.status !== SOCKET_STATUS.CONNECTED &&\r\n this.status !== SOCKET_STATUS.CLOSING\r\n ) {\r\n this.status = SOCKET_STATUS.RECONNECTING;\r\n this.#notifyStatus();\r\n this.#timeTask = setTimeout(() => {\r\n this.#connect(resolve, reject);\r\n }, 3000);\r\n return;\r\n } else if (reject) {\r\n reject(event);\r\n }\r\n this.status = SOCKET_STATUS.WAITING;\r\n this.#notifyStatus();\r\n };\r\n this.#socket.onclose = (event: CloseEvent) => {\r\n console.log('socket onclose', event);\r\n this.#socket = undefined;\r\n\r\n // 先保存当前状态,然后再进行判断\r\n const currentStatus = this.status;\r\n this.status = SOCKET_STATUS.CLOSING;\r\n\r\n if (event.code === 1000) {\r\n this.#notifyStatus();\r\n return;\r\n }\r\n\r\n if (\r\n this.#autoReconnect === true &&\r\n currentStatus !== SOCKET_STATUS.RECONNECTING &&\r\n currentStatus !== SOCKET_STATUS.CONNECTED &&\r\n currentStatus !== SOCKET_STATUS.CLOSING\r\n ) {\r\n this.status = SOCKET_STATUS.RECONNECTING;\r\n this.#notifyStatus();\r\n this.#timeTask = setTimeout(() => {\r\n this.#connect();\r\n }, 3000);\r\n } else {\r\n this.status = SOCKET_STATUS.CLOSING;\r\n this.#notifyStatus();\r\n }\r\n };\r\n this.#socket.onmessage = (event: MessageEvent) => {\r\n if (this.#onMsgCallback && typeof this.#onMsgCallback === 'function') {\r\n if (typeof event.data === 'string') {\r\n try {\r\n const data = JSON.parse(event.data);\r\n this.#onMsgCallback.call(this.#directivity, data); // 使得 onMsgCallback 方法的 this 能指向 globalWebSocket\r\n data.type === 'chatCrmSuccess' && console.log('Socket message chatCrmSuccess', data);\r\n } catch (e) {\r\n this.#onMsgCallback.call(this.#directivity, event.data);\r\n console.log('Socket message received', event.data);\r\n }\r\n } else {\r\n this.#onMsgCallback.call(this.#directivity, event.data);\r\n }\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * 发送数据\r\n * @param data 发送的数据,可以是字符串、对象或 Blob\r\n * @param sendType 发送类型,可选值:binary、text\r\n */\r\n async send(\r\n data: string | object | Blob | ArrayBuffer,\r\n sendType: 'text' | 'binary' = 'text'\r\n ): Promise<void> {\r\n if (this.#socket && this.status === SOCKET_STATUS.CONNECTED) {\r\n let finalData: string | Blob | ArrayBuffer;\r\n if (data instanceof Blob || data instanceof ArrayBuffer) {\r\n finalData = data;\r\n } else if (sendType === 'text') {\r\n if (typeof data === 'string') {\r\n finalData = data;\r\n } else {\r\n finalData = JSON.stringify(data);\r\n }\r\n } else {\r\n if (typeof data === 'string') {\r\n finalData = new Blob([data]);\r\n } else {\r\n finalData = new Blob([JSON.stringify(data)]);\r\n }\r\n }\r\n this.#socket.send(finalData);\r\n }\r\n }\r\n\r\n close(): void {\r\n if (this.status === SOCKET_STATUS.CLOSING || this.status === SOCKET_STATUS.WAITING) return;\r\n console.log('socket close');\r\n if (this.#socket && this.status === SOCKET_STATUS.CONNECTED) {\r\n this.#socket.close();\r\n }\r\n if (this.#timeTask) {\r\n clearTimeout(this.#timeTask);\r\n this.#timeTask = undefined;\r\n }\r\n this.status = SOCKET_STATUS.CLOSING;\r\n this.#autoReconnect = false;\r\n this.#notifyStatus();\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -46,16 +46,16 @@ function showToast(message, type = "info", duration = 2e3) {
46
46
  transition: opacity 0.3s ease;
47
47
  }
48
48
  .touch-toast-success {
49
- background-color: rgba(52, 199, 89, 0.9);
49
+ background-color: rgba(103, 194, 58, 0.95);
50
50
  }
51
51
  .touch-toast-error {
52
- background-color: rgba(235, 87, 87, 0.9);
52
+ background-color: rgba(245, 108, 108, 0.95);
53
53
  }
54
54
  .touch-toast-warning {
55
- background-color: rgba(250, 204, 21, 0.9);
55
+ background-color: rgba(230, 162, 60, 0.95);
56
56
  }
57
57
  .touch-toast-info {
58
- background-color: rgba(0, 0, 0, 0.9);
58
+ background-color: rgba(144, 147, 153, 0.95);
59
59
  }
60
60
  .touch-toast-fadeout {
61
61
  opacity: 0;
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sources":["../../../../../../packages/components/touchchat/utils/tools.ts"],"sourcesContent":["/**\n * 生成唯一聊天ID\n * @returns 唯一ID字符串\n */\nexport function generateChatId(): string {\n const timestamp = Date.now().toString(36);\n const randomStr = Math.random().toString(36).substring(2, 10);\n return `${timestamp}${randomStr}`;\n}\n\n/**\n * 格式化日期\n * @param date 日期对象或时间戳\n * @param format 日期格式字符串,默认为'YYYY-MM-DD HH:mm:ss'\n * @returns 格式化后的日期字符串\n */\nexport function formatDate(date: Date | number, format: string = 'YYYY-MM-DD HH:mm:ss'): string {\n if (typeof date === 'number') {\n date = new Date(date);\n }\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n return format\n .replace('YYYY', year.toString())\n .replace('MM', month)\n .replace('DD', day)\n .replace('HH', hours)\n .replace('mm', minutes)\n .replace('ss', seconds);\n}\n\n/**\n * 节流函数\n * @param func 需要节流的函数\n * @param wait 等待时间(毫秒)\n * @returns 节流后的函数\n */\n// 定义一个通用的函数类型\ntype AnyFunction = (...args: any[]) => any;\n\nexport function throttle(func: AnyFunction, wait: number): AnyFunction {\n let lastTime = 0;\n return function (this: any, ...args: any[]) {\n const now = Date.now();\n if (now - lastTime >= wait) {\n lastTime = now;\n return func.apply(this, args);\n }\n };\n}\n\n/**\n * 显示提示框\n * @param message 提示消息\n * @param type 提示类型,可选值:'success', 'error', 'warning', 'info'\n * @param duration 提示框显示时间(毫秒),默认为2000\n */\nexport function showToast(\n message: string,\n type: 'success' | 'error' | 'warning' | 'info' = 'info',\n duration: number = 2000\n): void {\n // 创建toast元素\n const toast = document.createElement('div');\n toast.className = `touch-toast touch-toast-${type}`;\n toast.textContent = message;\n\n // 添加样式\n const style = document.createElement('style');\n style.textContent = `\n .touch-toast {\n position: fixed;\n top: 4%;\n left: 50%;\n transform: translate(-50%, -50%);\n padding: 0.75em 1.25em;\n border-radius: 0.5em;\n color: #fff;\n font-size: 0.875em;\n z-index: 9999;\n transition: opacity 0.3s ease;\n }\n .touch-toast-success {\n background-color: rgba(52, 199, 89, 0.9);\n }\n .touch-toast-error {\n background-color: rgba(235, 87, 87, 0.9);\n }\n .touch-toast-warning {\n background-color: rgba(250, 204, 21, 0.9);\n }\n .touch-toast-info {\n background-color: rgba(0, 0, 0, 0.9);\n }\n .touch-toast-fadeout {\n opacity: 0;\n }\n `;\n document.head.appendChild(style);\n\n // 添加到文档\n document.body.appendChild(toast);\n\n // 设置自动移除\n setTimeout(() => {\n toast.classList.add('touch-toast-fadeout');\n setTimeout(() => {\n document.body.removeChild(toast);\n document.head.removeChild(style);\n }, 300);\n }, duration);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sources":["../../../../../../packages/components/touchchat/utils/tools.ts"],"sourcesContent":["/**\r\n * 生成唯一聊天ID\r\n * @returns 唯一ID字符串\r\n */\r\nexport function generateChatId(): string {\r\n\tconst timestamp = Date.now().toString(36)\r\n\tconst randomStr = Math.random().toString(36).substring(2, 10)\r\n\treturn `${timestamp}${randomStr}`\r\n}\r\n\r\n/**\r\n * 格式化日期\r\n * @param date 日期对象或时间戳\r\n * @param format 日期格式字符串,默认为'YYYY-MM-DD HH:mm:ss'\r\n * @returns 格式化后的日期字符串\r\n */\r\nexport function formatDate(date: Date | number, format: string = 'YYYY-MM-DD HH:mm:ss'): string {\r\n\tif (typeof date === 'number') {\r\n\t\tdate = new Date(date)\r\n\t}\r\n\r\n\tconst year = date.getFullYear()\r\n\tconst month = String(date.getMonth() + 1).padStart(2, '0')\r\n\tconst day = String(date.getDate()).padStart(2, '0')\r\n\tconst hours = String(date.getHours()).padStart(2, '0')\r\n\tconst minutes = String(date.getMinutes()).padStart(2, '0')\r\n\tconst seconds = String(date.getSeconds()).padStart(2, '0')\r\n\r\n\treturn format.replace('YYYY', year.toString()).replace('MM', month).replace('DD', day).replace('HH', hours).replace('mm', minutes).replace('ss', seconds)\r\n}\r\n\r\n/**\r\n * 节流函数\r\n * @param func 需要节流的函数\r\n * @param wait 等待时间(毫秒)\r\n * @returns 节流后的函数\r\n */\r\n// 定义一个通用的函数类型\r\ntype AnyFunction = (...args: any[]) => any\r\n\r\nexport function throttle(func: AnyFunction, wait: number): AnyFunction {\r\n\tlet lastTime = 0\r\n\treturn function (this: any, ...args: any[]) {\r\n\t\tconst now = Date.now()\r\n\t\tif (now - lastTime >= wait) {\r\n\t\t\tlastTime = now\r\n\t\t\treturn func.apply(this, args)\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * 显示提示框\r\n * @param message 提示消息\r\n * @param type 提示类型,可选值:'success', 'error', 'warning', 'info'\r\n * @param duration 提示框显示时间(毫秒),默认为2000\r\n */\r\nexport function showToast(message: string, type: 'success' | 'error' | 'warning' | 'info' = 'info', duration: number = 2000): void {\r\n\t// 创建toast元素\r\n\tconst toast = document.createElement('div')\r\n\ttoast.className = `touch-toast touch-toast-${type}`\r\n\ttoast.textContent = message\r\n\r\n\t// 添加样式\r\n\tconst style = document.createElement('style')\r\n\tstyle.textContent = `\r\n .touch-toast {\r\n position: fixed;\r\n top: 4%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n padding: 0.75em 1.25em;\r\n border-radius: 0.5em;\r\n color: #fff;\r\n font-size: 0.875em;\r\n z-index: 9999;\r\n transition: opacity 0.3s ease;\r\n }\r\n .touch-toast-success {\r\n background-color: rgba(103, 194, 58, 0.95);\r\n }\r\n .touch-toast-error {\r\n background-color: rgba(245, 108, 108, 0.95);\r\n }\r\n .touch-toast-warning {\r\n background-color: rgba(230, 162, 60, 0.95);\r\n }\r\n .touch-toast-info {\r\n background-color: rgba(144, 147, 153, 0.95);\r\n }\r\n .touch-toast-fadeout {\r\n opacity: 0;\r\n }\r\n `\r\n\tdocument.head.appendChild(style)\r\n\r\n\t// 添加到文档\r\n\tdocument.body.appendChild(toast)\r\n\r\n\t// 设置自动移除\r\n\tsetTimeout(() => {\r\n\t\ttoast.classList.add('touch-toast-fadeout')\r\n\t\tsetTimeout(() => {\r\n\t\t\tdocument.body.removeChild(toast)\r\n\t\t\tdocument.head.removeChild(style)\r\n\t\t}, 300)\r\n\t}, duration)\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"uuid.js","sources":["../../../../../../packages/components/touchchat/utils/uuid.ts"],"sourcesContent":["export default function generateUUID(): string {\n const s: string[] = [];\n const hexDigits: string = '0123456789abcdef';\n for (let i = 0; i < 36; i++) {\n s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);\n }\n s[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010\n s[19] = hexDigits.substr((parseInt(s[19], 16) & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01\n s[8] = s[13] = s[18] = s[23] = '-';\n const uuid: string = s.join('');\n return uuid;\n}\n"],"names":[],"mappings":";;;;AAAA,SAAwB,YAAuB,GAAA;AAC7C,EAAA,MAAM,IAAc,EAAC,CAAA;AACrB,EAAA,MAAM,SAAoB,GAAA,kBAAA,CAAA;AAC1B,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,EAAA,EAAI,CAAK,EAAA,EAAA;AAC3B,IAAE,CAAA,CAAA,CAAC,CAAI,GAAA,SAAA,CAAU,MAAO,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,MAAO,EAAA,GAAI,EAAI,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,GAC7D;AACA,EAAA,CAAA,CAAE,EAAE,CAAI,GAAA,GAAA,CAAA;AACR,EAAA,CAAA,CAAE,EAAE,CAAA,GAAI,SAAU,CAAA,MAAA,CAAQ,QAAS,CAAA,CAAA,CAAE,EAAE,CAAA,EAAG,EAAE,CAAA,GAAI,CAAO,GAAA,CAAA,EAAK,CAAC,CAAA,CAAA;AAC7D,EAAE,CAAA,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,EAAE,CAAA,GAAI,EAAE,EAAE,CAAA,GAAI,CAAE,CAAA,EAAE,CAAI,GAAA,GAAA,CAAA;AAC/B,EAAM,MAAA,IAAA,GAAe,CAAE,CAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AAC9B,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"uuid.js","sources":["../../../../../../packages/components/touchchat/utils/uuid.ts"],"sourcesContent":["export default function generateUUID(): string {\r\n const s: string[] = [];\r\n const hexDigits: string = '0123456789abcdef';\r\n for (let i = 0; i < 36; i++) {\r\n s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);\r\n }\r\n s[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010\r\n s[19] = hexDigits.substr((parseInt(s[19], 16) & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01\r\n s[8] = s[13] = s[18] = s[23] = '-';\r\n const uuid: string = s.join('');\r\n return uuid;\r\n}\r\n"],"names":[],"mappings":";;;;AAAA,SAAwB,YAAuB,GAAA;AAC7C,EAAA,MAAM,IAAc,EAAC,CAAA;AACrB,EAAA,MAAM,SAAoB,GAAA,kBAAA,CAAA;AAC1B,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,EAAA,EAAI,CAAK,EAAA,EAAA;AAC3B,IAAE,CAAA,CAAA,CAAC,CAAI,GAAA,SAAA,CAAU,MAAO,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,MAAO,EAAA,GAAI,EAAI,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,GAC7D;AACA,EAAA,CAAA,CAAE,EAAE,CAAI,GAAA,GAAA,CAAA;AACR,EAAA,CAAA,CAAE,EAAE,CAAA,GAAI,SAAU,CAAA,MAAA,CAAQ,QAAS,CAAA,CAAA,CAAE,EAAE,CAAA,EAAG,EAAE,CAAA,GAAI,CAAO,GAAA,CAAA,EAAK,CAAC,CAAA,CAAA;AAC7D,EAAE,CAAA,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,EAAE,CAAA,GAAI,EAAE,EAAE,CAAA,GAAI,CAAE,CAAA,EAAE,CAAI,GAAA,GAAA,CAAA;AAC/B,EAAM,MAAA,IAAA,GAAe,CAAE,CAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AAC9B,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../../../packages/utils/config.ts"],"sourcesContent":["import { getCurrentInstance } from 'vue';\n\n// 定义全局配置选项类型\nexport interface TouchVueUIOptions {\n size?: 'small' | 'medium' | 'large';\n zIndex?: number;\n // 其他可能的配置项...\n}\n\n/**\n * 获取组件库全局配置\n * 可以在组件内部使用此函数获取全局配置\n * @returns 全局配置对象\n */\nexport const useGlobalConfig = (): TouchVueUIOptions => {\n const instance = getCurrentInstance();\n if (!instance) {\n console.warn('useGlobalConfig() 只能在setup()或生命周期钩子中调用');\n return {} as TouchVueUIOptions;\n }\n\n // 从应用实例中获取全局配置\n return instance.appContext.config.globalProperties.$TOUCHVUE_CONFIG || {};\n};\n\n/**\n * 获取组件配置\n * 合并全局配置和组件自身的props配置\n * @param props 组件props\n * @param key 配置键名(必须是TouchVueUIOptions中存在的属性)\n * @returns 合并后的配置值\n */\nexport const getComponentConfig = <T extends keyof TouchVueUIOptions>(\n props: Record<string, any>,\n key: T\n): TouchVueUIOptions[T] => {\n const globalConfig = useGlobalConfig();\n\n // 优先使用组件自身的props配置,如果没有则使用全局配置\n return (props[key] ?? globalConfig[key]) as TouchVueUIOptions[T];\n};\n"],"names":["getCurrentInstance"],"mappings":";;;;AAcO,MAAM,kBAAkB,MAAyB;AACtD,EAAA,MAAM,WAAWA,sBAAmB,EAAA,CAAA;AACpC,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,OAAA,CAAQ,KAAK,yGAAwC,CAAA,CAAA;AACrD,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAGA,EAAA,OAAO,QAAS,CAAA,UAAA,CAAW,MAAO,CAAA,gBAAA,CAAiB,oBAAoB,EAAC,CAAA;AAC1E,EAAA;AASa,MAAA,kBAAA,GAAqB,CAChC,KAAA,EACA,GACyB,KAAA;AAnC3B,EAAA,IAAA,EAAA,CAAA;AAoCE,EAAA,MAAM,eAAe,eAAgB,EAAA,CAAA;AAGrC,EAAA,OAAA,CAAQ,EAAM,GAAA,KAAA,CAAA,GAAG,CAAT,KAAA,IAAA,GAAA,EAAA,GAAc,aAAa,GAAG,CAAA,CAAA;AACxC;;;;;"}
1
+ {"version":3,"file":"config.js","sources":["../../../../packages/utils/config.ts"],"sourcesContent":["import { getCurrentInstance } from 'vue';\r\n\r\n// 定义全局配置选项类型\r\nexport interface TouchVueUIOptions {\r\n size?: 'small' | 'medium' | 'large';\r\n zIndex?: number;\r\n // 其他可能的配置项...\r\n}\r\n\r\n/**\r\n * 获取组件库全局配置\r\n * 可以在组件内部使用此函数获取全局配置\r\n * @returns 全局配置对象\r\n */\r\nexport const useGlobalConfig = (): TouchVueUIOptions => {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n console.warn('useGlobalConfig() 只能在setup()或生命周期钩子中调用');\r\n return {} as TouchVueUIOptions;\r\n }\r\n\r\n // 从应用实例中获取全局配置\r\n return instance.appContext.config.globalProperties.$TOUCHVUE_CONFIG || {};\r\n};\r\n\r\n/**\r\n * 获取组件配置\r\n * 合并全局配置和组件自身的props配置\r\n * @param props 组件props\r\n * @param key 配置键名(必须是TouchVueUIOptions中存在的属性)\r\n * @returns 合并后的配置值\r\n */\r\nexport const getComponentConfig = <T extends keyof TouchVueUIOptions>(\r\n props: Record<string, any>,\r\n key: T\r\n): TouchVueUIOptions[T] => {\r\n const globalConfig = useGlobalConfig();\r\n\r\n // 优先使用组件自身的props配置,如果没有则使用全局配置\r\n return (props[key] ?? globalConfig[key]) as TouchVueUIOptions[T];\r\n};\r\n"],"names":["getCurrentInstance"],"mappings":";;;;AAcO,MAAM,kBAAkB,MAAyB;AACtD,EAAA,MAAM,WAAWA,sBAAmB,EAAA,CAAA;AACpC,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,OAAA,CAAQ,KAAK,yGAAwC,CAAA,CAAA;AACrD,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAGA,EAAA,OAAO,QAAS,CAAA,UAAA,CAAW,MAAO,CAAA,gBAAA,CAAiB,oBAAoB,EAAC,CAAA;AAC1E,EAAA;AASa,MAAA,kBAAA,GAAqB,CAChC,KAAA,EACA,GACyB,KAAA;AAnC3B,EAAA,IAAA,EAAA,CAAA;AAoCE,EAAA,MAAM,eAAe,eAAgB,EAAA,CAAA;AAGrC,EAAA,OAAA,CAAQ,EAAM,GAAA,KAAA,CAAA,GAAG,CAAT,KAAA,IAAA,GAAA,EAAA,GAAc,aAAa,GAAG,CAAA,CAAA;AACxC;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../../packages/utils/types.ts"],"sourcesContent":["import type { App, Plugin } from 'vue';\n\n/* 生成install函数 */\n\nexport type SFCWithInstall<T> = T & Plugin;\n\nexport type SFCInstallWithContext<T> = SFCWithInstall<T> & {\n _context: App | null;\n};\n\nexport const withInstall = <T, E extends Record<string, any>>(main: T, extra?: E) => {\n (main as SFCWithInstall<T>).install = (app: App): void => {\n for (const comp of [main, ...Object.values(extra ?? {})]) {\n app.component(comp.name, comp);\n }\n };\n\n if (extra) {\n for (const [key, comp] of Object.entries(extra)) {\n (main as any)[key] = comp;\n }\n }\n return main as SFCWithInstall<T> & E;\n};\n\nexport const withInstallFunction = <T>(fn: T, name: string) => {\n (fn as SFCWithInstall<T>).install = (app: App) => {\n (fn as SFCInstallWithContext<T>)._context = app;\n app.config.globalProperties[name] = fn;\n };\n\n return fn as SFCInstallWithContext<T>;\n};\n"],"names":[],"mappings":";;AAUa,MAAA,WAAA,GAAc,CAAmC,IAAA,EAAS,KAAc,KAAA;AACnF,EAAC,IAAA,CAA2B,OAAU,GAAA,CAAC,GAAmB,KAAA;AACxD,IAAW,KAAA,MAAA,IAAA,IAAQ,CAAC,IAAA,EAAM,GAAG,MAAA,CAAO,OAAO,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,EAAE,CAAC,CAAG,EAAA;AACxD,MAAI,GAAA,CAAA,SAAA,CAAU,IAAK,CAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAAA,KAC/B;AAAA,GACF,CAAA;AAEA,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,KAAA,MAAW,CAAC,GAAK,EAAA,IAAI,KAAK,MAAO,CAAA,OAAA,CAAQ,KAAK,CAAG,EAAA;AAC/C,MAAC,IAAA,CAAa,GAAG,CAAI,GAAA,IAAA,CAAA;AAAA,KACvB;AAAA,GACF;AACA,EAAO,OAAA,IAAA,CAAA;AACT,EAAA;AAEa,MAAA,mBAAA,GAAsB,CAAI,EAAA,EAAO,IAAiB,KAAA;AAC7D,EAAC,EAAA,CAAyB,OAAU,GAAA,CAAC,GAAa,KAAA;AAChD,IAAC,GAAgC,QAAW,GAAA,GAAA,CAAA;AAC5C,IAAI,GAAA,CAAA,MAAA,CAAO,gBAAiB,CAAA,IAAI,CAAI,GAAA,EAAA,CAAA;AAAA,GACtC,CAAA;AAEA,EAAO,OAAA,EAAA,CAAA;AACT;;;;;"}
1
+ {"version":3,"file":"types.js","sources":["../../../../packages/utils/types.ts"],"sourcesContent":["import type { App, Plugin } from 'vue';\r\n\r\n/* 生成install函数 */\r\n\r\nexport type SFCWithInstall<T> = T & Plugin;\r\n\r\nexport type SFCInstallWithContext<T> = SFCWithInstall<T> & {\r\n _context: App | null;\r\n};\r\n\r\nexport const withInstall = <T, E extends Record<string, any>>(main: T, extra?: E) => {\r\n (main as SFCWithInstall<T>).install = (app: App): void => {\r\n for (const comp of [main, ...Object.values(extra ?? {})]) {\r\n app.component(comp.name, comp);\r\n }\r\n };\r\n\r\n if (extra) {\r\n for (const [key, comp] of Object.entries(extra)) {\r\n (main as any)[key] = comp;\r\n }\r\n }\r\n return main as SFCWithInstall<T> & E;\r\n};\r\n\r\nexport const withInstallFunction = <T>(fn: T, name: string) => {\r\n (fn as SFCWithInstall<T>).install = (app: App) => {\r\n (fn as SFCInstallWithContext<T>)._context = app;\r\n app.config.globalProperties[name] = fn;\r\n };\r\n\r\n return fn as SFCInstallWithContext<T>;\r\n};\r\n"],"names":[],"mappings":";;AAUa,MAAA,WAAA,GAAc,CAAmC,IAAA,EAAS,KAAc,KAAA;AACnF,EAAC,IAAA,CAA2B,OAAU,GAAA,CAAC,GAAmB,KAAA;AACxD,IAAW,KAAA,MAAA,IAAA,IAAQ,CAAC,IAAA,EAAM,GAAG,MAAA,CAAO,OAAO,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,EAAE,CAAC,CAAG,EAAA;AACxD,MAAI,GAAA,CAAA,SAAA,CAAU,IAAK,CAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAAA,KAC/B;AAAA,GACF,CAAA;AAEA,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,KAAA,MAAW,CAAC,GAAK,EAAA,IAAI,KAAK,MAAO,CAAA,OAAA,CAAQ,KAAK,CAAG,EAAA;AAC/C,MAAC,IAAA,CAAa,GAAG,CAAI,GAAA,IAAA,CAAA;AAAA,KACvB;AAAA,GACF;AACA,EAAO,OAAA,IAAA,CAAA;AACT,EAAA;AAEa,MAAA,mBAAA,GAAsB,CAAI,EAAA,EAAO,IAAiB,KAAA;AAC7D,EAAC,EAAA,CAAyB,OAAU,GAAA,CAAC,GAAa,KAAA;AAChD,IAAC,GAAgC,QAAW,GAAA,GAAA,CAAA;AAC5C,IAAI,GAAA,CAAA,MAAA,CAAO,gBAAiB,CAAA,IAAI,CAAI,GAAA,EAAA,CAAA;AAAA,GACtC,CAAA;AAEA,EAAO,OAAA,EAAA,CAAA;AACT;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@touchvue/chat",
3
- "version": "1.0.0-beta.55",
3
+ "version": "1.0.0-beta.57",
4
4
  "description": "TouchVue Chat Component Library",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.mjs",