@ant-design/agentic-ui 2.30.1 → 2.30.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.
@@ -6,7 +6,8 @@ export declare const JINJA_DOLLAR_PLACEHOLDER = "\uE01A";
6
6
  /**
7
7
  * 保护时间格式(如 02:20:31)不被 remark-directive 误解析为 textDirective。
8
8
  * remark-directive 会将 ":20"、":31" 等解析为指令,导致 "Cannot handle unknown node textDirective"。
9
- * 在数字与冒号间插入零宽空格 \u200B 以阻断误解析。
9
+ * 使用反斜杠转义冒号(remark-directive 推荐:\:port 可防止 :port 被解析为指令)。
10
+ * 围栏代码块与行内反引号内不处理:该处为字面量,不应出现 `\:` 污染。
10
11
  * 须在 remark-directive 解析前执行。
11
12
  */
12
13
  export declare function preprocessProtectTimeFromDirective(markdown: string): string;
@@ -3,18 +3,96 @@
3
3
  * 在 markdown 解析前替换,渲染与序列化时还原为 $。
4
4
  */ export var JINJA_DOLLAR_PLACEHOLDER = '\uE01A';
5
5
  /** URL 协议占位符,用于保护时间格式预处理时不影响 https:// 等 */ var URL_PROTOCOL_PLACEHOLDER = '\uE01B\uE01B';
6
+ /** CommonMark:最多 3 个前导空白后接至少 3 个 backtick 的围栏行 */ var FENCE_DELIMITER_LINE = /^[\t \uFEFF]{0,3}`{3,}/;
7
+ function protectLineFromDirectiveTime(markdownLine) {
8
+ var withProtocolProtected = markdownLine.replace(/:\/\//g, URL_PROTOCOL_PLACEHOLDER);
9
+ var withTimeProtected = withProtocolProtected.replace(/:(\d)/g, function(_, d) {
10
+ return "\\:".concat(d);
11
+ });
12
+ return withTimeProtected.replace(/\uE01B\uE01B/g, '://');
13
+ }
14
+ /**
15
+ * CommonMark 行内代码:起始与结束为等长反引号串,结束串后不得紧跟反引号(避免与更长串混淆)。
16
+ */ function findInlineCodeClose(line, contentStart, openCount) {
17
+ for(var pos = contentStart; pos < line.length; pos++){
18
+ if (line[pos] !== '`') continue;
19
+ var k = 0;
20
+ while(k < openCount && pos + k < line.length && line[pos + k] === '`'){
21
+ k++;
22
+ }
23
+ if (k !== openCount) continue;
24
+ if (pos + openCount < line.length && line[pos + openCount] === '`') continue;
25
+ return pos;
26
+ }
27
+ return -1;
28
+ }
29
+ /** 围栏外单行:跳过行内反引号包裹片段,仅对其余文本做 directive 时间保护 */ function protectLineOutsideInlineCode(markdownLine) {
30
+ var result = '';
31
+ var i = 0;
32
+ while(i < markdownLine.length){
33
+ if (markdownLine[i] !== '`') {
34
+ var next = markdownLine.indexOf('`', i);
35
+ if (next === -1) {
36
+ result += protectLineFromDirectiveTime(markdownLine.slice(i));
37
+ break;
38
+ }
39
+ result += protectLineFromDirectiveTime(markdownLine.slice(i, next));
40
+ i = next;
41
+ continue;
42
+ }
43
+ var blockStart = i;
44
+ var openCount = 0;
45
+ while(i < markdownLine.length && markdownLine[i] === '`'){
46
+ openCount++;
47
+ i++;
48
+ }
49
+ var contentStart = i;
50
+ var closePos = findInlineCodeClose(markdownLine, contentStart, openCount);
51
+ if (closePos === -1) {
52
+ result += markdownLine.slice(blockStart);
53
+ break;
54
+ }
55
+ var blockEnd = closePos + openCount;
56
+ result += markdownLine.slice(blockStart, blockEnd);
57
+ i = blockEnd;
58
+ }
59
+ return result;
60
+ }
6
61
  /**
7
62
  * 保护时间格式(如 02:20:31)不被 remark-directive 误解析为 textDirective。
8
63
  * remark-directive 会将 ":20"、":31" 等解析为指令,导致 "Cannot handle unknown node textDirective"。
9
- * 在数字与冒号间插入零宽空格 \u200B 以阻断误解析。
64
+ * 使用反斜杠转义冒号(remark-directive 推荐:\:port 可防止 :port 被解析为指令)。
65
+ * 围栏代码块与行内反引号内不处理:该处为字面量,不应出现 `\:` 污染。
10
66
  * 须在 remark-directive 解析前执行。
11
67
  */ export function preprocessProtectTimeFromDirective(markdown) {
12
68
  if (!markdown || markdown.length === 0) return markdown;
13
- var withProtocolProtected = markdown.replace(/:\/\//g, URL_PROTOCOL_PLACEHOLDER);
14
- // 使用反斜杠转义冒号,阻止 ":20"、":31" 等被 remark-directive 解析为 textDirective
15
- // remark-directive 官方推荐:\:port 可防止 :port 被解析为指令
16
- var withTimeProtected = withProtocolProtected.replace(/:(\d)/g, function(_, d) {
17
- return "\\:".concat(d);
18
- });
19
- return withTimeProtected.replace(/\uE01B\uE01B/g, '://');
69
+ var lines = markdown.split('\n');
70
+ var inFence = false;
71
+ var out = [];
72
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
73
+ try {
74
+ for(var _iterator = lines[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
75
+ var line = _step.value;
76
+ if (FENCE_DELIMITER_LINE.test(line)) {
77
+ inFence = !inFence;
78
+ out.push(line);
79
+ continue;
80
+ }
81
+ out.push(inFence ? line : protectLineOutsideInlineCode(line));
82
+ }
83
+ } catch (err) {
84
+ _didIteratorError = true;
85
+ _iteratorError = err;
86
+ } finally{
87
+ try {
88
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
89
+ _iterator.return();
90
+ }
91
+ } finally{
92
+ if (_didIteratorError) {
93
+ throw _iteratorError;
94
+ }
95
+ }
96
+ }
97
+ return out.join('\n');
20
98
  }
@@ -3,7 +3,6 @@ import { Subject } from 'rxjs';
3
3
  import { BaseEditor, Node, NodeMatch, Path, RangeMode, Selection } from 'slate';
4
4
  import { HistoryEditor } from 'slate-history';
5
5
  import { ReactEditor } from 'slate-react';
6
- import { T } from 'vitest/dist/chunks/environment.LoooBwUu.js';
7
6
  import { FootnoteDefinitionNode } from '../el';
8
7
  import type { MarkdownEditorPlugin } from '../plugin';
9
8
  import { CommentDataType, MarkdownEditorProps } from '../types';
@@ -236,7 +235,7 @@ export declare class EditorStore {
236
235
  */
237
236
  removeNodes: (options?: {
238
237
  at?: Location;
239
- match?: NodeMatch<T>;
238
+ match?: NodeMatch<Node>;
240
239
  mode?: RangeMode;
241
240
  hanging?: boolean;
242
241
  voids?: boolean;
@@ -15,9 +15,7 @@ export var ToolBarItem = /*#__PURE__*/ React.memo(function(param) {
15
15
  }, [
16
16
  onMouseDown
17
17
  ]);
18
- return /*#__PURE__*/ React.createElement(Tooltip, {
19
- title: title
20
- }, /*#__PURE__*/ React.createElement("div", {
18
+ var content = /*#__PURE__*/ React.createElement("div", {
21
19
  role: role,
22
20
  className: className,
23
21
  style: style,
@@ -25,6 +23,10 @@ export var ToolBarItem = /*#__PURE__*/ React.memo(function(param) {
25
23
  onMouseDown: handleMouseDown,
26
24
  onMouseEnter: onMouseEnter,
27
25
  tabIndex: tabIndex
28
- }, children || icon));
26
+ }, children || icon);
27
+ // 仅在有 title 时使用 Tooltip,避免 rc-resize-observer 的 findDOMNode 弃用警告
28
+ return title ? /*#__PURE__*/ React.createElement(Tooltip, {
29
+ title: title
30
+ }, content) : content;
29
31
  });
30
32
  ToolBarItem.displayName = 'ToolBarItem';
@@ -142,6 +142,7 @@ import React, { useEffect, useMemo, useRef, useState } from "react";
142
142
  import { ErrorBoundary } from "react-error-boundary";
143
143
  import { Loading } from "../../Components/Loading";
144
144
  import { ChartRender } from "../../Plugins/chart/ChartRender";
145
+ import { parseChineseCurrencyToNumber } from "../../Plugins/chart/utils";
145
146
  var extractTextContent = function extractTextContent1(children) {
146
147
  var _children_props;
147
148
  if (typeof children === 'string') return children;
@@ -366,13 +367,21 @@ var extractTextContent = function extractTextContent1(children) {
366
367
  var row = _object_spread_props(_object_spread({}, rowData), {
367
368
  column_list: Object.keys(rowData)
368
369
  });
370
+ var coerceChartAxisCell = function coerceChartAxisCell(raw) {
371
+ if (typeof raw === 'number' && Number.isFinite(raw)) return raw;
372
+ var n = Number(raw);
373
+ if (Number.isFinite(n)) return n;
374
+ if (typeof raw === 'string') {
375
+ var cn = parseChineseCurrencyToNumber(raw);
376
+ if (cn !== null) return cn;
377
+ }
378
+ return raw;
379
+ };
369
380
  if (x && row[x] !== undefined) {
370
- var num = Number(row[x]);
371
- if (!isNaN(num)) row[x] = num;
381
+ row[x] = coerceChartAxisCell(row[x]);
372
382
  }
373
383
  if (y && row[y] !== undefined) {
374
- var num1 = Number(row[y]);
375
- if (!isNaN(num1)) row[y] = num1;
384
+ row[y] = coerceChartAxisCell(row[y]);
376
385
  }
377
386
  return row;
378
387
  });
@@ -138,6 +138,7 @@ import { JINJA_DOLLAR_PLACEHOLDER } from "../MarkdownEditor/editor/parser/consta
138
138
  import { remarkDirectiveContainer } from "../MarkdownEditor/editor/parser/remarkDirectiveContainer";
139
139
  import { convertParagraphToImage, fixStrongWithSpecialChars, protectJinjaDollarInText } from "../MarkdownEditor/editor/parser/remarkParse";
140
140
  import { REMARK_REHYPE_DIRECTIVE_HANDLERS } from "../MarkdownEditor/editor/utils/markdownToHtml";
141
+ import { parseChineseCurrencyToNumber } from "../Plugins/chart/utils";
141
142
  import { ToolUseBarThink } from "../ToolUseBarThink";
142
143
  import AnimationText from "./AnimationText";
143
144
  var INLINE_MATH_WITH_SINGLE_DOLLAR = {
@@ -177,8 +178,17 @@ var extractCellText = function extractCellText1(cell) {
177
178
  row.children.forEach(function(cell, j) {
178
179
  if (j < columns.length) {
179
180
  var val = extractCellText(cell);
180
- var num = Number(val);
181
- record[columns[j].dataIndex] = isNaN(num) || val === '' ? val : num;
181
+ if (val === '') {
182
+ record[columns[j].dataIndex] = val;
183
+ } else {
184
+ var num = Number(val);
185
+ if (Number.isFinite(num)) {
186
+ record[columns[j].dataIndex] = num;
187
+ } else {
188
+ var cn = parseChineseCurrencyToNumber(val);
189
+ record[columns[j].dataIndex] = cn !== null ? cn : val;
190
+ }
191
+ }
182
192
  }
183
193
  });
184
194
  dataSource.push(record);
@@ -356,14 +366,13 @@ var createHastProcessor = function createHastProcessor(extraRemarkPlugins, confi
356
366
  };
357
367
  var extractLanguageFromClassName = function extractLanguageFromClassName(className) {
358
368
  if (!className) return undefined;
359
- var classes = Array.isArray(className) ? className : [
360
- className
361
- ];
369
+ var flat = typeof className === 'string' ? className : className.map(String).join(' ');
370
+ var classes = flat.split(/\s+/).filter(Boolean);
362
371
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
363
372
  try {
364
373
  for(var _iterator = classes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
365
374
  var cls = _step.value;
366
- var match = String(cls).match(/^language-(.+)$/);
375
+ var match = cls.match(/^language-(.+)$/);
367
376
  if (match) return match[1];
368
377
  }
369
378
  } catch (err) {
@@ -766,13 +775,15 @@ var extractLanguageFromClassName = function extractLanguageFromClassName(classNa
766
775
  }));
767
776
  },
768
777
  code: function code(props) {
769
- var _node = props.node, children = props.children, rest = _object_without_properties(props, [
778
+ var _node = props.node, children = props.children, className = props.className, rest = _object_without_properties(props, [
770
779
  "node",
771
- "children"
780
+ "children",
781
+ "className"
772
782
  ]);
783
+ var fenceLang = extractLanguageFromClassName(className);
773
784
  return jsx('code', _object_spread_props(_object_spread({}, rest), {
774
- 'data-testid': 'markdown-inline-code',
775
- className: "".concat(contentCls, "-inline-code"),
785
+ 'data-testid': fenceLang ? 'markdown-fenced-code' : 'markdown-inline-code',
786
+ className: fenceLang ? className : "".concat(contentCls, "-inline-code"),
776
787
  children: children
777
788
  }));
778
789
  },
@@ -822,19 +833,24 @@ var extractLanguageFromClassName = function extractLanguageFromClassName(classNa
822
833
  // ================================================================
823
834
  // 代码块 pre > code → 路由到自定义渲染器
824
835
  pre: function pre(props) {
825
- var _node = props.node, children = props.children, rest = _object_without_properties(props, [
836
+ var _hastPreNode_children_, _hastPreNode_children, _hastPreNode_children__properties;
837
+ var hastPreNode = props.node, children = props.children, rest = _object_without_properties(props, [
826
838
  "node",
827
839
  "children"
828
840
  ]);
829
841
  var codeChild = Array.isArray(children) ? children[0] : children;
830
842
  var codeProps = (codeChild === null || codeChild === void 0 ? void 0 : codeChild.props) || {};
843
+ var codeHastClass = (hastPreNode === null || hastPreNode === void 0 ? void 0 : (_hastPreNode_children = hastPreNode.children) === null || _hastPreNode_children === void 0 ? void 0 : (_hastPreNode_children_ = _hastPreNode_children[0]) === null || _hastPreNode_children_ === void 0 ? void 0 : _hastPreNode_children_.type) === 'element' && hastPreNode.children[0].tagName === 'code' ? (_hastPreNode_children__properties = hastPreNode.children[0].properties) === null || _hastPreNode_children__properties === void 0 ? void 0 : _hastPreNode_children__properties.className : undefined;
831
844
  var language = extractLanguageFromClassName(codeProps.className);
845
+ if (!language) {
846
+ language = extractLanguageFromClassName(codeHastClass);
847
+ }
832
848
  var CodeBlockComponent = userComponents.__codeBlock || userComponents.code;
833
849
  if (CodeBlockComponent) {
834
850
  return jsx(CodeBlockComponent, _object_spread_props(_object_spread({}, rest), {
835
851
  language: language,
836
852
  children: codeProps.children,
837
- node: _node
853
+ node: hastPreNode
838
854
  }));
839
855
  }
840
856
  return jsxs('pre', _object_spread_props(_object_spread({}, rest), {
@@ -1056,7 +1072,8 @@ var extractLanguageFromClassName = function extractLanguageFromClassName(classNa
1056
1072
  Fragment: Fragment,
1057
1073
  jsx: jsx,
1058
1074
  jsxs: jsxs,
1059
- components: components
1075
+ components: components,
1076
+ passNode: true
1060
1077
  });
1061
1078
  } catch (unused) {
1062
1079
  return null;
@@ -1232,7 +1249,8 @@ export var useMarkdownToReact = function useMarkdownToReact(content, options) {
1232
1249
  Fragment: Fragment,
1233
1250
  jsx: jsx,
1234
1251
  jsxs: jsxs,
1235
- components: allComponents
1252
+ components: allComponents,
1253
+ passNode: true
1236
1254
  });
1237
1255
  } catch (error) {
1238
1256
  console.error('Failed to render markdown:', error);
@@ -120,7 +120,7 @@ import React, { useContext, useEffect, useMemo, useRef, useState } from "react";
120
120
  import { Bar } from "react-chartjs-2";
121
121
  import { ChartContainer, ChartFilter, ChartStatistic, ChartToolBar, downloadChart } from "../components";
122
122
  import { defaultColorList } from "../const";
123
- import { extractAndSortXValues, findDataPointByXValue, hexToRgba, resolveCssVariable } from "../utils";
123
+ import { extractAndSortXValues, findDataPointByXValue, hexToRgba, resolveCssVariable, toNumber } from "../utils";
124
124
  import { useStyle } from "./style";
125
125
  /**
126
126
  * @fileoverview 柱状图组件文件
@@ -279,7 +279,7 @@ var BarChart = function BarChart(param) {
279
279
  // 是否是正负柱图(同一批次同时存在正值与负值)
280
280
  var hasPositive = useMemo(function() {
281
281
  return filteredData.some(function(item) {
282
- var v = typeof item.y === 'number' ? item.y : Number(item.y);
282
+ var v = typeof item.y === 'number' ? item.y : toNumber(item.y, Number.NaN);
283
283
  return Number.isFinite(v) && v > 0;
284
284
  });
285
285
  }, [
@@ -287,7 +287,7 @@ var BarChart = function BarChart(param) {
287
287
  ]);
288
288
  var hasNegative = useMemo(function() {
289
289
  return filteredData.some(function(item) {
290
- var v = typeof item.y === 'number' ? item.y : Number(item.y);
290
+ var v = typeof item.y === 'number' ? item.y : toNumber(item.y, Number.NaN);
291
291
  return Number.isFinite(v) && v < 0;
292
292
  });
293
293
  }, [
@@ -316,7 +316,7 @@ var BarChart = function BarChart(param) {
316
316
  var typeData = xValues.map(function(x) {
317
317
  var dataPoint = findDataPointByXValue(filteredData, x, type);
318
318
  var v = dataPoint === null || dataPoint === void 0 ? void 0 : dataPoint.y;
319
- var n = typeof v === 'number' ? v : Number(v);
319
+ var n = typeof v === 'number' ? v : toNumber(v, Number.NaN);
320
320
  return Number.isFinite(n) ? n : null;
321
321
  });
322
322
  return _object_spread_props(_object_spread({
@@ -537,7 +537,7 @@ var BarChart = function BarChart(param) {
537
537
  var maxWidth = 0;
538
538
  // 遍历所有数据点,计算标签文本的最大宽度
539
539
  filteredData.forEach(function(item) {
540
- var value = typeof item.y === 'number' ? item.y : Number(item.y);
540
+ var value = typeof item.y === 'number' ? item.y : toNumber(item.y, Number.NaN);
541
541
  if (Number.isFinite(value)) {
542
542
  var labelText = '';
543
543
  if (dataLabelFormatter) {
@@ -85,6 +85,19 @@ export interface ChartDataItem {
85
85
  /** 筛选标签,用于数据筛选和过滤 */
86
86
  filterLabel?: string;
87
87
  }
88
+ /**
89
+ * 将含「亿元 / 万元 / 元」的人民币口语字符串转为数值(以「元」为数值单位)。
90
+ *
91
+ * - `533亿元` → `533 * 1e8`
92
+ * - `549万元` → `549 * 1e4`
93
+ * - `128.5元` → `128.5`
94
+ *
95
+ * 不含上述单位且无法识别为纯数字时返回 `null`,避免误解析如 `8%`。
96
+ *
97
+ * @param value - 原始单元格或字段值
98
+ * @returns 解析后的有限数字,无法解析则为 `null`
99
+ */
100
+ export declare const parseChineseCurrencyToNumber: (value: unknown) => number | null;
88
101
  /**
89
102
  * 归一化 X 轴值
90
103
  *
@@ -209,6 +222,7 @@ export declare const findDataPointByXValue: (data: ChartDataItem[], xValue: numb
209
222
  *
210
223
  * 安全地将任意值转换为数字类型,转换失败时返回默认值。
211
224
  * 如果输入已经是有效的数字,直接返回;否则尝试转换。
225
+ * 字符串支持「亿元 / 万元 / 元」等人民币口语格式(见 `parseChineseCurrencyToNumber`)。
212
226
  *
213
227
  * @param {any} val - 要转换的值
214
228
  * @param {number} fallback - 转换失败时的默认值
@@ -114,6 +114,45 @@ function _unsupported_iterable_to_array(o, minLen) {
114
114
  };
115
115
  return fn;
116
116
  }
117
+ /** 1 亿(人民币口语单位)对应的「元」数量 */ var CHINESE_YI_TO_YUAN = 1e8;
118
+ /** 1 万对应的「元」数量 */ var CHINESE_WAN_TO_YUAN = 1e4;
119
+ /**
120
+ * 将含「亿元 / 万元 / 元」的人民币口语字符串转为数值(以「元」为数值单位)。
121
+ *
122
+ * - `533亿元` → `533 * 1e8`
123
+ * - `549万元` → `549 * 1e4`
124
+ * - `128.5元` → `128.5`
125
+ *
126
+ * 不含上述单位且无法识别为纯数字时返回 `null`,避免误解析如 `8%`。
127
+ *
128
+ * @param value - 原始单元格或字段值
129
+ * @returns 解析后的有限数字,无法解析则为 `null`
130
+ */ export var parseChineseCurrencyToNumber = function parseChineseCurrencyToNumber(value) {
131
+ if (value === null || value === undefined) return null;
132
+ if (typeof value === 'number') {
133
+ return Number.isFinite(value) ? value : null;
134
+ }
135
+ if (typeof value !== 'string') return null;
136
+ var s = value.trim();
137
+ if (!s) return null;
138
+ s = s.replace(/,/g, '').replace(/,/g, '').replace(/[¥¥\s]/g, '');
139
+ var yi = s.match(/(-?\d+(?:\.\d+)?)\s*亿/);
140
+ if (yi) {
141
+ var n = parseFloat(yi[1]);
142
+ return Number.isFinite(n) ? n * CHINESE_YI_TO_YUAN : null;
143
+ }
144
+ var wan = s.match(/(-?\d+(?:\.\d+)?)\s*万/);
145
+ if (wan) {
146
+ var n1 = parseFloat(wan[1]);
147
+ return Number.isFinite(n1) ? n1 * CHINESE_WAN_TO_YUAN : null;
148
+ }
149
+ var yuan = s.match(/(-?\d+(?:\.\d+)?)\s*元/);
150
+ if (yuan) {
151
+ var n2 = parseFloat(yuan[1]);
152
+ return Number.isFinite(n2) ? n2 : null;
153
+ }
154
+ return null;
155
+ };
117
156
  /**
118
157
  * 归一化 X 轴值
119
158
  *
@@ -138,7 +177,9 @@ function _unsupported_iterable_to_array(o, minLen) {
138
177
  var s = String(value).trim();
139
178
  if (s === '') return value;
140
179
  var n = Number(s);
141
- return Number.isFinite(n) ? n : value;
180
+ if (Number.isFinite(n)) return n;
181
+ var cn = parseChineseCurrencyToNumber(s);
182
+ return cn !== null ? cn : value;
142
183
  };
143
184
  /**
144
185
  * 比较两个 X 轴值的大小
@@ -283,6 +324,7 @@ function _unsupported_iterable_to_array(o, minLen) {
283
324
  *
284
325
  * 安全地将任意值转换为数字类型,转换失败时返回默认值。
285
326
  * 如果输入已经是有效的数字,直接返回;否则尝试转换。
327
+ * 字符串支持「亿元 / 万元 / 元」等人民币口语格式(见 `parseChineseCurrencyToNumber`)。
286
328
  *
287
329
  * @param {any} val - 要转换的值
288
330
  * @param {number} fallback - 转换失败时的默认值
@@ -300,7 +342,12 @@ function _unsupported_iterable_to_array(o, minLen) {
300
342
  */ export var toNumber = function toNumber(val, fallback) {
301
343
  if (typeof val === 'number' && !Number.isNaN(val)) return val;
302
344
  var n = Number(val);
303
- return Number.isFinite(n) ? n : fallback;
345
+ if (Number.isFinite(n)) return n;
346
+ if (typeof val === 'string') {
347
+ var cn = parseChineseCurrencyToNumber(val);
348
+ if (cn !== null && Number.isFinite(cn)) return cn;
349
+ }
350
+ return fallback;
304
351
  };
305
352
  /**
306
353
  * 检查值是否不为空
@@ -104,7 +104,7 @@ function _unsupported_iterable_to_array(o, minLen) {
104
104
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
105
105
  }
106
106
  import { CircleDashed, Copy, Play } from "@sofa-design/icons";
107
- import { Button, ConfigProvider } from "antd";
107
+ import { Button, ConfigProvider, message } from "antd";
108
108
  import classNames from "clsx";
109
109
  import copy from "copy-to-clipboard";
110
110
  import React, { forwardRef, memo, useCallback, useContext, useImperativeHandle, useMemo, useState } from "react";
@@ -241,13 +241,20 @@ import { useStyle } from "./style";
241
241
  setIsSchemaRendered(true);
242
242
  }, []);
243
243
  // 复制函数
244
- var handleCopyContent = useCallback(function(content) {
244
+ var handleCopyContent = useCallback(function(content, type) {
245
245
  if (!content || !content.trim()) {
246
+ message.warning(locale['schemaEditor.noContentToCopy']);
246
247
  return;
247
248
  }
248
249
  try {
249
- copy(content);
250
+ var ok = copy(content);
251
+ if (ok) {
252
+ message.success("".concat(type === 'html' ? 'HTML' : 'JSON').concat(locale['schemaEditor.copySuccess']));
253
+ } else {
254
+ message.error(locale['schemaEditor.copyFailed']);
255
+ }
250
256
  } catch (error) {
257
+ message.error(locale['schemaEditor.copyFailed']);
251
258
  console.error(locale['schemaEditor.copyFailed'], error);
252
259
  }
253
260
  }, [
@@ -255,14 +262,14 @@ import { useStyle } from "./style";
255
262
  ]);
256
263
  // 处理复制HTML内容
257
264
  var handleCopyHtml = useCallback(function() {
258
- handleCopyContent(htmlContent);
265
+ handleCopyContent(htmlContent, 'html');
259
266
  }, [
260
267
  htmlContent,
261
268
  handleCopyContent
262
269
  ]);
263
270
  // 处理复制JSON内容
264
271
  var handleCopyJson = useCallback(function() {
265
- handleCopyContent(schemaString);
272
+ handleCopyContent(schemaString, 'json');
266
273
  }, [
267
274
  schemaString,
268
275
  handleCopyContent
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ant-design/agentic-ui",
3
- "version": "2.30.1",
3
+ "version": "2.30.2",
4
4
  "description": "面向智能体的 UI 组件库,提供多步推理可视化、工具调用展示、任务执行协同等 Agentic UI 能力",
5
5
  "repository": "git@github.com:ant-design/agentic-ui.git",
6
6
  "license": "MIT",
@@ -24,7 +24,6 @@
24
24
  "lint:css": "stylelint \"{src,test}/**/*.{css,less}\"",
25
25
  "lint:es": "eslint \"{src,test}/**/*.{js,jsx,ts,tsx}\"",
26
26
  "prepare": "husky install && dumi setup",
27
- "prepublishOnly": "npm run build && npm run test",
28
27
  "prettier": "prettier --write \"{src,docs,test}/**/*.{js,jsx,ts,tsx,css,less,json,md}\"",
29
28
  "preview": "pnpm dumi preview",
30
29
  "report:demo": "node scripts/generateDemoReport.js",
@@ -152,9 +151,9 @@
152
151
  "@types/styled-components": "^5.1.36",
153
152
  "@types/uuid": "^10.0.0",
154
153
  "@umijs/lint": "^4.6.25",
155
- "@vitejs/plugin-react": "^4.7.0",
156
- "@vitest/coverage-istanbul": "^2.1.9",
157
- "@vitest/ui": "2.1.9",
154
+ "@vitejs/plugin-react": "^5.2.0",
155
+ "@vitest/coverage-istanbul": "^4.1.0",
156
+ "@vitest/ui": "^4.1.0",
158
157
  "cross-env": "^7.0.3",
159
158
  "dumi": "^2.4.21",
160
159
  "dumi-theme-antd-style": "^0.31.1",
@@ -178,7 +177,8 @@
178
177
  "sast": "^0.8.1",
179
178
  "stylelint": "^14.16.1",
180
179
  "typescript": "^5.9.3",
181
- "vitest": "^2.1.9"
180
+ "vite": "^6.4.1",
181
+ "vitest": "^4.1.0"
182
182
  },
183
183
  "peerDependencies": {
184
184
  "react": ">=16.9.0",