@ant-design/agentic-ui 2.0.27 → 2.1.0

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.
@@ -207,6 +207,10 @@ export declare class EditorStore {
207
207
  * @private
208
208
  */
209
209
  private _splitMarkdown;
210
+ private _collectSeparatorMatches;
211
+ private _isLineStart;
212
+ private _matchFence;
213
+ private _findLineEnd;
210
214
  /**
211
215
  * 移除节点
212
216
  * @param options
@@ -488,7 +488,116 @@ var EditorStore = class {
488
488
  * @private
489
489
  */
490
490
  _splitMarkdown(md, separator) {
491
- return md.split(separator).filter(Boolean);
491
+ if (!md) {
492
+ return [];
493
+ }
494
+ const separatorMatches = this._collectSeparatorMatches(md, separator);
495
+ if (separatorMatches.length === 0) {
496
+ return [md];
497
+ }
498
+ const chunks = [];
499
+ let start = 0;
500
+ let currentMatchIndex = 0;
501
+ let insideFence = false;
502
+ let activeFence = null;
503
+ let index = 0;
504
+ while (index < md.length) {
505
+ if (this._isLineStart(md, index)) {
506
+ const fence = this._matchFence(md, index);
507
+ if (fence) {
508
+ if (!insideFence) {
509
+ insideFence = true;
510
+ activeFence = fence.marker;
511
+ } else if (activeFence === fence.marker) {
512
+ insideFence = false;
513
+ activeFence = null;
514
+ }
515
+ index = fence.end;
516
+ continue;
517
+ }
518
+ }
519
+ const match = separatorMatches[currentMatchIndex];
520
+ if (!insideFence && match && index === match.index) {
521
+ const chunk = md.slice(start, index);
522
+ if (chunk.length > 0) {
523
+ chunks.push(chunk);
524
+ }
525
+ start = index + match.length;
526
+ currentMatchIndex += 1;
527
+ index = start;
528
+ continue;
529
+ }
530
+ index += 1;
531
+ }
532
+ const tail = md.slice(start);
533
+ if (tail.length > 0) {
534
+ chunks.push(tail);
535
+ }
536
+ return chunks.length > 0 ? chunks : [md];
537
+ }
538
+ _collectSeparatorMatches(md, separator) {
539
+ if (typeof separator === "string") {
540
+ const matches2 = [];
541
+ let searchIndex = md.indexOf(separator);
542
+ while (searchIndex !== -1) {
543
+ matches2.push({ index: searchIndex, length: separator.length });
544
+ searchIndex = md.indexOf(separator, searchIndex + separator.length);
545
+ }
546
+ return matches2;
547
+ }
548
+ const flags = separator.flags.includes("g") ? separator.flags : `${separator.flags}g`;
549
+ const globalRegex = new RegExp(separator.source, flags);
550
+ const matches = [];
551
+ let match;
552
+ while ((match = globalRegex.exec(md)) !== null) {
553
+ const matchedText = match[0];
554
+ matches.push({ index: match.index, length: matchedText.length });
555
+ if (matchedText.length === 0) {
556
+ globalRegex.lastIndex += 1;
557
+ }
558
+ }
559
+ return matches;
560
+ }
561
+ _isLineStart(content, position) {
562
+ if (position === 0) {
563
+ return true;
564
+ }
565
+ return content[position - 1] === "\n";
566
+ }
567
+ _matchFence(content, position) {
568
+ let cursor = position;
569
+ let spaces = 0;
570
+ while (cursor < content.length && content[cursor] === " " && spaces < 3) {
571
+ cursor += 1;
572
+ spaces += 1;
573
+ }
574
+ if (cursor >= content.length) {
575
+ return null;
576
+ }
577
+ const char = content[cursor];
578
+ if (char !== "`" && char !== "~") {
579
+ return null;
580
+ }
581
+ let fenceLength = 0;
582
+ while (cursor < content.length && content[cursor] === char) {
583
+ cursor += 1;
584
+ fenceLength += 1;
585
+ }
586
+ if (fenceLength < 3) {
587
+ return null;
588
+ }
589
+ const lineEnd = this._findLineEnd(content, cursor);
590
+ return { marker: char, end: lineEnd };
591
+ }
592
+ _findLineEnd(content, position) {
593
+ let cursor = position;
594
+ while (cursor < content.length && content[cursor] !== "\n") {
595
+ cursor += 1;
596
+ }
597
+ if (cursor < content.length && content[cursor] === "\n") {
598
+ return cursor + 1;
599
+ }
600
+ return cursor;
492
601
  }
493
602
  /**
494
603
  * 获取当前编辑器内容作为节点列表
@@ -35,6 +35,7 @@ var blinkCaret = new Keyframes("blink-caret", {
35
35
  to: { borderColor: "transparent" },
36
36
  "50%": { borderColor: "var(--color-primary-control-fill-primary)" }
37
37
  });
38
+ var COMMENT_HIGHLIGHT_COLOR = "var(--agentic-comment-highlight-color, rgba(21, 0, 255, 0.15))";
38
39
  var genStyle = (token) => {
39
40
  return {
40
41
  // 拖拽手柄样式
@@ -412,11 +413,11 @@ var genStyle = (token) => {
412
413
  },
413
414
  "& &-comment-comment": {
414
415
  display: "inline-block",
415
- background: "linear-gradient(transparent 65%, rgba(21, 0, 255, 0.15))",
416
+ background: `linear-gradient(transparent 65%, ${COMMENT_HIGHLIGHT_COLOR})`,
416
417
  cursor: "pointer"
417
418
  },
418
419
  "& &-comment-highlight": {
419
- backgroundColor: "rgba(21, 0, 255, 0.15)",
420
+ backgroundColor: COMMENT_HIGHLIGHT_COLOR,
420
421
  borderBottom: 0,
421
422
  cursor: "pointer"
422
423
  },
@@ -30,6 +30,7 @@ import {
30
30
  PointElement,
31
31
  Tooltip
32
32
  } from "chart.js";
33
+ import classNames from "classnames";
33
34
  import React, { useContext, useEffect, useMemo, useRef, useState } from "react";
34
35
  import { Line } from "react-chartjs-2";
35
36
  import {
@@ -44,6 +45,7 @@ import {
44
45
  extractAndSortXValues,
45
46
  findDataPointByXValue
46
47
  } from "../utils";
48
+ import { useStyle } from "./style";
47
49
  ChartJS.register(
48
50
  CategoryScale,
49
51
  LinearScale,
@@ -111,6 +113,7 @@ var AreaChart = ({
111
113
  }, []);
112
114
  const context = useContext(ConfigProvider.ConfigContext);
113
115
  const baseClassName = context == null ? void 0 : context.getPrefixCls("area-chart-container");
116
+ const { wrapSSR, hashId } = useStyle(baseClassName);
114
117
  const chartRef = useRef(null);
115
118
  const statistics = useMemo(() => {
116
119
  if (!statisticConfig)
@@ -321,66 +324,74 @@ var AreaChart = ({
321
324
  const handleDownload = () => {
322
325
  downloadChart(chartRef.current, "area-chart");
323
326
  };
324
- return /* @__PURE__ */ React.createElement(
325
- ChartContainer,
326
- {
327
- baseClassName,
328
- className,
329
- theme,
330
- isMobile,
331
- variant,
332
- style: {
333
- width: responsiveWidth,
334
- height: responsiveHeight
335
- }
336
- },
327
+ return wrapSSR(
337
328
  /* @__PURE__ */ React.createElement(
338
- ChartToolBar,
329
+ ChartContainer,
339
330
  {
340
- title,
331
+ baseClassName,
332
+ className,
341
333
  theme,
342
- onDownload: handleDownload,
343
- extra: toolbarExtra,
344
- dataTime,
345
- filter: renderFilterInToolbar && filterOptions && filterOptions.length > 1 ? /* @__PURE__ */ React.createElement(
346
- ChartFilter,
347
- __spreadProps(__spreadValues({
348
- filterOptions,
349
- selectedFilter,
350
- onFilterChange: setSelectedFilter
351
- }, filterLabels && {
352
- customOptions: filteredDataByFilterLabel,
353
- selectedCustomSelection: selectedFilterLabel,
354
- onSelectionChange: setSelectedFilterLabel
355
- }), {
356
- theme,
357
- variant: "compact"
358
- })
359
- ) : void 0
360
- }
361
- ),
362
- statistics && /* @__PURE__ */ React.createElement("div", { className: `${baseClassName}-statistic-container` }, statistics.map((config, index) => /* @__PURE__ */ React.createElement(ChartStatistic, __spreadProps(__spreadValues({ key: index }, config), { theme })))),
363
- !renderFilterInToolbar && filterOptions && filterOptions.length > 1 && /* @__PURE__ */ React.createElement(
364
- ChartFilter,
365
- __spreadProps(__spreadValues({
366
- filterOptions,
367
- selectedFilter,
368
- onFilterChange: setSelectedFilter
369
- }, filterLabels && {
370
- customOptions: filteredDataByFilterLabel,
371
- selectedCustomSelection: selectedFilterLabel,
372
- onSelectionChange: setSelectedFilterLabel
373
- }), {
374
- theme
375
- })
376
- ),
377
- /* @__PURE__ */ React.createElement(
378
- "div",
379
- {
380
- className: `${baseClassName}-wrapper`,
381
- style: { marginTop: "20px", height: responsiveHeight }
334
+ isMobile,
335
+ variant,
336
+ style: {
337
+ width: responsiveWidth,
338
+ height: responsiveHeight
339
+ }
382
340
  },
383
- /* @__PURE__ */ React.createElement(Line, { ref: chartRef, data: processedData, options })
341
+ /* @__PURE__ */ React.createElement(
342
+ ChartToolBar,
343
+ {
344
+ title,
345
+ theme,
346
+ onDownload: handleDownload,
347
+ extra: toolbarExtra,
348
+ dataTime,
349
+ filter: renderFilterInToolbar && filterOptions && filterOptions.length > 1 ? /* @__PURE__ */ React.createElement(
350
+ ChartFilter,
351
+ __spreadProps(__spreadValues({
352
+ filterOptions,
353
+ selectedFilter,
354
+ onFilterChange: setSelectedFilter
355
+ }, filterLabels && {
356
+ customOptions: filteredDataByFilterLabel,
357
+ selectedCustomSelection: selectedFilterLabel,
358
+ onSelectionChange: setSelectedFilterLabel
359
+ }), {
360
+ theme,
361
+ variant: "compact"
362
+ })
363
+ ) : void 0
364
+ }
365
+ ),
366
+ statistics && /* @__PURE__ */ React.createElement(
367
+ "div",
368
+ {
369
+ className: classNames(`${baseClassName}-statistic-container`, hashId)
370
+ },
371
+ statistics.map((config, index) => /* @__PURE__ */ React.createElement(ChartStatistic, __spreadProps(__spreadValues({ key: index }, config), { theme })))
372
+ ),
373
+ !renderFilterInToolbar && filterOptions && filterOptions.length > 1 && /* @__PURE__ */ React.createElement(
374
+ ChartFilter,
375
+ __spreadProps(__spreadValues({
376
+ filterOptions,
377
+ selectedFilter,
378
+ onFilterChange: setSelectedFilter
379
+ }, filterLabels && {
380
+ customOptions: filteredDataByFilterLabel,
381
+ selectedCustomSelection: selectedFilterLabel,
382
+ onSelectionChange: setSelectedFilterLabel
383
+ }), {
384
+ theme
385
+ })
386
+ ),
387
+ /* @__PURE__ */ React.createElement(
388
+ "div",
389
+ {
390
+ className: `${baseClassName}-wrapper`,
391
+ style: { marginTop: "20px", height: responsiveHeight }
392
+ },
393
+ /* @__PURE__ */ React.createElement(Line, { ref: chartRef, data: processedData, options })
394
+ )
384
395
  )
385
396
  );
386
397
  };
@@ -20,6 +20,7 @@ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
20
 
21
21
  // src/Plugins/chart/BarChart/index.tsx
22
22
  import { ConfigProvider } from "antd";
23
+ import classNames from "classnames";
23
24
  import {
24
25
  BarElement,
25
26
  CategoryScale,
@@ -43,6 +44,7 @@ import {
43
44
  extractAndSortXValues,
44
45
  findDataPointByXValue
45
46
  } from "../utils";
47
+ import { useStyle } from "./style";
46
48
  ChartJS.register(CategoryScale, LinearScale, BarElement, Tooltip, Legend);
47
49
  var hexToRgba = (hex, alpha) => {
48
50
  const sanitized = hex.replace("#", "");
@@ -109,6 +111,7 @@ var BarChart = ({
109
111
  }, []);
110
112
  const context = useContext(ConfigProvider.ConfigContext);
111
113
  const baseClassName = context == null ? void 0 : context.getPrefixCls("bar-chart-container");
114
+ const { wrapSSR, hashId } = useStyle(baseClassName);
112
115
  const chartRef = useRef(null);
113
116
  const statistics = useMemo(() => {
114
117
  if (!statisticConfig)
@@ -621,73 +624,81 @@ var BarChart = ({
621
624
  const handleDownload = () => {
622
625
  downloadChart(chartRef.current, "bar-chart");
623
626
  };
624
- return /* @__PURE__ */ React.createElement(
625
- ChartContainer,
626
- {
627
- baseClassName,
628
- className,
629
- theme,
630
- isMobile,
631
- variant,
632
- style: {
633
- width: responsiveWidth,
634
- height: responsiveHeight
635
- }
636
- },
627
+ return wrapSSR(
637
628
  /* @__PURE__ */ React.createElement(
638
- ChartToolBar,
629
+ ChartContainer,
639
630
  {
640
- title,
631
+ baseClassName,
632
+ className,
641
633
  theme,
642
- onDownload: handleDownload,
643
- extra: toolbarExtra,
644
- dataTime,
645
- filter: renderFilterInToolbar && filterOptions && filterOptions.length > 1 ? /* @__PURE__ */ React.createElement(
646
- ChartFilter,
647
- __spreadProps(__spreadValues({
648
- filterOptions,
649
- selectedFilter,
650
- onFilterChange: setSelectedFilter
651
- }, filterLabels && {
652
- customOptions: filteredDataByFilterLabel,
653
- selectedCustomSelection: selectedFilterLabel,
654
- onSelectionChange: setSelectedFilterLabel
655
- }), {
656
- theme,
657
- variant: "compact"
658
- })
659
- ) : void 0
660
- }
661
- ),
662
- statistics && /* @__PURE__ */ React.createElement("div", { className: `${baseClassName}-statistic-container` }, statistics.map((config, index) => /* @__PURE__ */ React.createElement(ChartStatistic, __spreadProps(__spreadValues({ key: index }, config), { theme })))),
663
- !renderFilterInToolbar && filterOptions && filterOptions.length > 1 && /* @__PURE__ */ React.createElement(
664
- ChartFilter,
665
- __spreadProps(__spreadValues({
666
- filterOptions,
667
- selectedFilter,
668
- onFilterChange: setSelectedFilter
669
- }, filterLabels && {
670
- customOptions: filteredDataByFilterLabel,
671
- selectedCustomSelection: selectedFilterLabel,
672
- onSelectionChange: setSelectedFilterLabel
673
- }), {
674
- theme
675
- })
676
- ),
677
- /* @__PURE__ */ React.createElement(
678
- "div",
679
- {
680
- className: `${baseClassName}-wrapper`,
681
- style: { marginTop: "20px", height: responsiveHeight }
634
+ isMobile,
635
+ variant,
636
+ style: {
637
+ width: responsiveWidth,
638
+ height: responsiveHeight
639
+ }
682
640
  },
683
641
  /* @__PURE__ */ React.createElement(
684
- Bar,
642
+ ChartToolBar,
685
643
  {
686
- ref: chartRef,
687
- data: processedData,
688
- options,
689
- plugins: [ChartDataLabels]
644
+ title,
645
+ theme,
646
+ onDownload: handleDownload,
647
+ extra: toolbarExtra,
648
+ dataTime,
649
+ filter: renderFilterInToolbar && filterOptions && filterOptions.length > 1 ? /* @__PURE__ */ React.createElement(
650
+ ChartFilter,
651
+ __spreadProps(__spreadValues({
652
+ filterOptions,
653
+ selectedFilter,
654
+ onFilterChange: setSelectedFilter
655
+ }, filterLabels && {
656
+ customOptions: filteredDataByFilterLabel,
657
+ selectedCustomSelection: selectedFilterLabel,
658
+ onSelectionChange: setSelectedFilterLabel
659
+ }), {
660
+ theme,
661
+ variant: "compact"
662
+ })
663
+ ) : void 0
690
664
  }
665
+ ),
666
+ statistics && /* @__PURE__ */ React.createElement(
667
+ "div",
668
+ {
669
+ className: classNames(`${baseClassName}-statistic-container`, hashId)
670
+ },
671
+ statistics.map((config, index) => /* @__PURE__ */ React.createElement(ChartStatistic, __spreadProps(__spreadValues({ key: index }, config), { theme })))
672
+ ),
673
+ !renderFilterInToolbar && filterOptions && filterOptions.length > 1 && /* @__PURE__ */ React.createElement(
674
+ ChartFilter,
675
+ __spreadProps(__spreadValues({
676
+ filterOptions,
677
+ selectedFilter,
678
+ onFilterChange: setSelectedFilter
679
+ }, filterLabels && {
680
+ customOptions: filteredDataByFilterLabel,
681
+ selectedCustomSelection: selectedFilterLabel,
682
+ onSelectionChange: setSelectedFilterLabel
683
+ }), {
684
+ theme
685
+ })
686
+ ),
687
+ /* @__PURE__ */ React.createElement(
688
+ "div",
689
+ {
690
+ className: `${baseClassName}-wrapper`,
691
+ style: { marginTop: "20px", height: responsiveHeight }
692
+ },
693
+ /* @__PURE__ */ React.createElement(
694
+ Bar,
695
+ {
696
+ ref: chartRef,
697
+ data: processedData,
698
+ options,
699
+ plugins: [ChartDataLabels]
700
+ }
701
+ )
691
702
  )
692
703
  )
693
704
  );
@@ -6,9 +6,9 @@ import { useMergedState } from "rc-util";
6
6
  import React, { memo, useCallback, useContext } from "react";
7
7
  import { ActionIconBox } from "../Components/ActionIconBox";
8
8
  import { I18nContext } from "../I18n";
9
- import { LoadingLottie } from "./LoadingLottie";
9
+ import { Loading } from "../Components/Loading";
10
10
  import { useStyle } from "./style";
11
- var LOTTIE_SIZE = 16;
11
+ var LOADING_SIZE = 16;
12
12
  var buildClassName = (...args) => classNames(...args);
13
13
  var hasTaskContent = (content) => {
14
14
  if (Array.isArray(content)) {
@@ -22,7 +22,7 @@ var getArrowRotation = (collapsed) => ({
22
22
  var StatusIcon = ({ status, prefixCls, hashId }) => {
23
23
  const statusMap = {
24
24
  success: /* @__PURE__ */ React.createElement(SuccessFill, null),
25
- loading: /* @__PURE__ */ React.createElement(LoadingLottie, { size: LOTTIE_SIZE }),
25
+ loading: /* @__PURE__ */ React.createElement(Loading, { size: LOADING_SIZE }),
26
26
  pending: /* @__PURE__ */ React.createElement("div", { className: buildClassName(`${prefixCls}-status-idle`, hashId) }, /* @__PURE__ */ React.createElement(CircleDashed, null)),
27
27
  error: /* @__PURE__ */ React.createElement(X, null)
28
28
  };
@@ -83,52 +83,65 @@ var ToolUseBarItemComponent = ({
83
83
  }
84
84
  );
85
85
  }
86
- return /* @__PURE__ */ React.createElement("div", { key: tool.id, "data-testid": "ToolUserItem", className: toolClassName }, /* @__PURE__ */ React.createElement(
86
+ return /* @__PURE__ */ React.createElement(
87
87
  "div",
88
88
  {
89
- className: toolBarClassName,
90
- "data-testid": "tool-user-item-tool-bar",
91
- onClick: handleClick
89
+ key: tool.id,
90
+ "data-testid": "ToolUserItem",
91
+ className: classnames(toolClassName, {
92
+ [`${prefixCls}-tool-collapsed`]: !showContent
93
+ })
92
94
  },
93
95
  /* @__PURE__ */ React.createElement(
94
96
  "div",
95
97
  {
96
- className: toolHeaderClassName,
97
- "data-testid": "tool-user-item-tool-header"
98
+ className: classnames(toolBarClassName, {
99
+ [`${prefixCls}-tool-bar-collapsed`]: !showContent
100
+ }),
101
+ "data-testid": "tool-user-item-tool-bar",
102
+ onClick: handleClick
98
103
  },
99
- /* @__PURE__ */ React.createElement(ToolImage, { tool, prefixCls, hashId })
104
+ /* @__PURE__ */ React.createElement(
105
+ "div",
106
+ {
107
+ className: toolHeaderClassName,
108
+ "data-testid": "tool-user-item-tool-header"
109
+ },
110
+ /* @__PURE__ */ React.createElement(ToolImage, { tool, prefixCls, hashId })
111
+ ),
112
+ /* @__PURE__ */ React.createElement(
113
+ ToolHeaderRight,
114
+ {
115
+ tool,
116
+ prefixCls,
117
+ hashId,
118
+ light
119
+ }
120
+ ),
121
+ /* @__PURE__ */ React.createElement(ToolTime, { tool, prefixCls, hashId }),
122
+ /* @__PURE__ */ React.createElement(
123
+ ToolExpand,
124
+ {
125
+ showContent,
126
+ expanded,
127
+ prefixCls,
128
+ hashId,
129
+ onExpandClick: handleExpandClick
130
+ }
131
+ )
100
132
  ),
101
133
  /* @__PURE__ */ React.createElement(
102
- ToolHeaderRight,
134
+ ToolContent,
103
135
  {
104
136
  tool,
105
137
  prefixCls,
106
138
  hashId,
107
- light
108
- }
109
- ),
110
- /* @__PURE__ */ React.createElement(ToolTime, { tool, prefixCls, hashId }),
111
- /* @__PURE__ */ React.createElement(
112
- ToolExpand,
113
- {
139
+ light,
114
140
  showContent,
115
- expanded,
116
- prefixCls,
117
- hashId,
118
- onExpandClick: handleExpandClick
141
+ expanded
119
142
  }
120
143
  )
121
- ), /* @__PURE__ */ React.createElement(
122
- ToolContent,
123
- {
124
- tool,
125
- prefixCls,
126
- hashId,
127
- light,
128
- showContent,
129
- expanded
130
- }
131
- ));
144
+ );
132
145
  };
133
146
  var ToolUseBarItem = memo(ToolUseBarItemComponent);
134
147
  export {
@@ -18,7 +18,7 @@ var __spreadValues = (a, b) => {
18
18
  // src/ToolUseBar/ToolUseBarItemComponents.tsx
19
19
  import { Api, ChevronUp, X } from "@sofa-design/icons";
20
20
  import classnames from "classnames";
21
- import { motion } from "framer-motion";
21
+ import { AnimatePresence, motion } from "framer-motion";
22
22
  import React, { memo, useCallback, useMemo } from "react";
23
23
  var ToolImageComponent = ({
24
24
  tool,
@@ -217,20 +217,65 @@ var ToolContentComponent = ({
217
217
  const contentDom = useMemo(() => {
218
218
  return tool.content ? /* @__PURE__ */ React.createElement("div", { className: contentClassName }, tool.content) : null;
219
219
  }, [tool.content, contentClassName]);
220
- const containerElement = useMemo(() => {
221
- if (!showContent || !expanded)
222
- return null;
220
+ const contentVariants = useMemo(
221
+ () => ({
222
+ expanded: {
223
+ height: "auto",
224
+ opacity: 1
225
+ },
226
+ collapsed: {
227
+ height: 0,
228
+ opacity: 0
229
+ }
230
+ }),
231
+ []
232
+ );
233
+ const contentTransition = useMemo(
234
+ () => ({
235
+ height: {
236
+ duration: 0.26,
237
+ ease: [0.4, 0, 0.2, 1]
238
+ },
239
+ opacity: {
240
+ duration: 0.26,
241
+ ease: [0.4, 0, 0.2, 1]
242
+ }
243
+ }),
244
+ []
245
+ );
246
+ if (!showContent || !expanded) {
223
247
  return /* @__PURE__ */ React.createElement(
224
248
  "div",
225
249
  {
226
- className: toolContainerClassName,
227
- "data-testid": "tool-user-item-tool-container "
250
+ style: {
251
+ overflow: "hidden",
252
+ height: 1,
253
+ opacity: 0,
254
+ visibility: "hidden"
255
+ },
256
+ role: "presentation",
257
+ "aria-hidden": "true"
228
258
  },
229
259
  contentDom,
230
260
  errorDom
231
261
  );
232
- }, [showContent, expanded, toolContainerClassName, contentDom, errorDom]);
233
- return containerElement;
262
+ }
263
+ return /* @__PURE__ */ React.createElement(AnimatePresence, { initial: false, mode: "sync" }, expanded ? /* @__PURE__ */ React.createElement(
264
+ motion.div,
265
+ {
266
+ key: "tool-content",
267
+ className: toolContainerClassName,
268
+ "data-testid": "tool-user-item-tool-container",
269
+ variants: contentVariants,
270
+ initial: "collapsed",
271
+ animate: "expanded",
272
+ exit: "collapsed",
273
+ transition: contentTransition,
274
+ style: { overflow: "hidden" }
275
+ },
276
+ contentDom,
277
+ errorDom
278
+ ) : null);
234
279
  };
235
280
  var ToolContent = memo(ToolContentComponent);
236
281
  export {
@@ -40,12 +40,13 @@ var genStyle = (token) => {
40
40
  border: "var(--color-gray-border-light)",
41
41
  boxShadow: "var(--shadow-border-base)",
42
42
  minHeight: "20px",
43
+ backdropFilter: "blur(8px)",
43
44
  width: "max-content",
44
45
  transition: "padding 0.2s ease",
45
46
  display: "flex",
46
47
  alignItems: "center",
47
48
  flexDirection: "column",
48
- gap: "8px",
49
+ gap: 0,
49
50
  zIndex: 1,
50
51
  maxWidth: "min(800px,100%)",
51
52
  padding: "2px",
@@ -64,6 +65,7 @@ var genStyle = (token) => {
64
65
  "&-expanded": {
65
66
  borderRadius: "14px",
66
67
  padding: 4,
68
+ gap: 8,
67
69
  outline: "none",
68
70
  "&:hover": {
69
71
  background: "var(--color-gray-bg-card-light)",
@@ -22,6 +22,8 @@ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
22
22
  import {
23
23
  useEditorStyleRegister
24
24
  } from "../Hooks/useStyle";
25
+ var LIGHT_MODE_BACKGROUND = "rgba(255, 255, 255, 0.65)";
26
+ var LIGHT_MODE_BACKDROP_FILTER = "blur(12px)";
25
27
  var genStyle = (token) => {
26
28
  return {
27
29
  [token.componentCls]: {
@@ -69,6 +71,9 @@ var genStyle = (token) => {
69
71
  border: "none",
70
72
  borderRadius: "14px",
71
73
  padding: 4,
74
+ background: LIGHT_MODE_BACKGROUND,
75
+ backdropFilter: LIGHT_MODE_BACKDROP_FILTER,
76
+ WebkitBackdropFilter: LIGHT_MODE_BACKDROP_FILTER,
72
77
  "&:hover": {
73
78
  background: "none",
74
79
  boxShadow: "none",
@@ -226,7 +231,10 @@ var genStyle = (token) => {
226
231
  borderLeft: "1px solid var(--color-gray-border-light)",
227
232
  paddingLeft: 12,
228
233
  marginLeft: 16,
229
- marginTop: -10
234
+ marginTop: -10,
235
+ background: LIGHT_MODE_BACKGROUND,
236
+ backdropFilter: LIGHT_MODE_BACKDROP_FILTER,
237
+ WebkitBackdropFilter: LIGHT_MODE_BACKDROP_FILTER
230
238
  }
231
239
  },
232
240
  "&-container-loading": {
@@ -1,5 +1,5 @@
1
1
  // src/Workspace/Task/index.tsx
2
- import LoadingLottie from "../../TaskList/LoadingLottie";
2
+ import { Loading } from "../../Components/Loading";
3
3
  import { Check, CircleDashed, OctagonX } from "@sofa-design/icons";
4
4
  import { ConfigProvider } from "antd";
5
5
  import classNames from "classnames";
@@ -12,7 +12,7 @@ var StatusIcon = ({ status }) => {
12
12
  case "error":
13
13
  return /* @__PURE__ */ React.createElement(OctagonX, { style: { color: "var(--color-red-control-fill-primary)" } });
14
14
  case "loading":
15
- return /* @__PURE__ */ React.createElement(LoadingLottie, { style: { color: "var(--color-gray-text-disabled)" } });
15
+ return /* @__PURE__ */ React.createElement(Loading, { style: { color: "var(--color-gray-text-disabled)" } });
16
16
  case "pending":
17
17
  default:
18
18
  return /* @__PURE__ */ React.createElement(CircleDashed, { style: { color: "var(--color-gray-text-disabled)" } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ant-design/agentic-ui",
3
- "version": "2.0.27",
3
+ "version": "2.1.0",
4
4
  "description": "面向智能体的 UI 组件库,提供多步推理可视化、工具调用展示、任务执行协同等 Agentic UI 能力",
5
5
  "repository": "git@github.com:ant-design/agentic-ui.git",
6
6
  "license": "MIT",
@@ -27,7 +27,8 @@
27
27
  "start": "npm run dev",
28
28
  "test": "vitest --run",
29
29
  "test:coverage": "vitest --run --coverage",
30
- "tsc": "tsc --noEmit"
30
+ "tsc": "tsc --noEmit",
31
+ "version": "node scripts/bumpVersion.js"
31
32
  },
32
33
  "lint-staged": {
33
34
  "*.{js,jsx,ts,tsx}": [
@@ -1,60 +0,0 @@
1
- import React from 'react';
2
- export interface LottieVoiceProps {
3
- /**
4
- * 是否自动播放动画
5
- */
6
- autoplay?: boolean;
7
- /**
8
- * 是否循环播放动画
9
- */
10
- loop?: boolean;
11
- /**
12
- * 动画容器类名
13
- */
14
- className?: string;
15
- /**
16
- * 动画容器样式
17
- */
18
- style?: React.CSSProperties;
19
- /**
20
- * 动画尺寸
21
- */
22
- size?: number;
23
- }
24
- /**
25
- * LoadingLottie 组件 - Lottie加载动画组件
26
- *
27
- * 该组件使用Lottie动画库提供流畅的加载动画效果,支持自定义尺寸、播放控制等。
28
- * 提供更好的用户体验,替代传统的CSS加载动画。
29
- *
30
- * @component
31
- * @description Lottie加载动画组件,提供流畅的加载动画效果
32
- * @param {LottieVoiceProps} props - 组件属性
33
- * @param {boolean} [props.autoplay=true] - 是否自动播放动画
34
- * @param {boolean} [props.loop=true] - 是否循环播放动画
35
- * @param {string} [props.className] - 动画容器类名
36
- * @param {React.CSSProperties} [props.style] - 动画容器样式
37
- * @param {number} [props.size=32] - 动画尺寸
38
- *
39
- * @example
40
- * ```tsx
41
- * <LoadingLottie
42
- * autoplay={true}
43
- * loop={true}
44
- * size={48}
45
- * className="custom-loading"
46
- * />
47
- * ```
48
- *
49
- * @returns {React.ReactElement} 渲染的Lottie加载动画组件
50
- *
51
- * @remarks
52
- * - 使用Lottie动画库
53
- * - 提供流畅的动画效果
54
- * - 支持自定义尺寸
55
- * - 支持播放控制
56
- * - 支持自定义样式
57
- * - 提供默认的加载动画
58
- */
59
- export declare const LoadingLottie: React.FC<LottieVoiceProps>;
60
- export default LoadingLottie;
@@ -1,39 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
- var __hasOwnProp = Object.prototype.hasOwnProperty;
4
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
- var __spreadValues = (a, b) => {
7
- for (var prop in b || (b = {}))
8
- if (__hasOwnProp.call(b, prop))
9
- __defNormalProp(a, prop, b[prop]);
10
- if (__getOwnPropSymbols)
11
- for (var prop of __getOwnPropSymbols(b)) {
12
- if (__propIsEnum.call(b, prop))
13
- __defNormalProp(a, prop, b[prop]);
14
- }
15
- return a;
16
- };
17
-
18
- // src/TaskList/LoadingLottie/index.tsx
19
- import Lottie from "lottie-react";
20
- import React from "react";
21
- import loadingLottie from "./loading.json";
22
- var LoadingLottie = ({
23
- autoplay = true,
24
- loop = true,
25
- className,
26
- style,
27
- size = 32
28
- }) => {
29
- const containerStyle = __spreadValues({
30
- width: size,
31
- height: size
32
- }, style);
33
- return /* @__PURE__ */ React.createElement("div", { style: containerStyle, className }, /* @__PURE__ */ React.createElement(Lottie, { animationData: loadingLottie, loop, autoplay }));
34
- };
35
- var LoadingLottie_default = LoadingLottie;
36
- export {
37
- LoadingLottie,
38
- LoadingLottie_default as default
39
- };
@@ -1,483 +0,0 @@
1
- {
2
- "v": "5.12.2",
3
- "fr": 25,
4
- "ip": 0,
5
- "op": 70,
6
- "w": 300,
7
- "h": 300,
8
- "nm": "loading 2",
9
- "ddd": 0,
10
- "assets": [],
11
- "layers": [
12
- {
13
- "ddd": 0,
14
- "ind": 1,
15
- "ty": 4,
16
- "nm": "loading",
17
- "sr": 1,
18
- "ks": {
19
- "o": { "a": 0, "k": 100, "ix": 11 },
20
- "r": {
21
- "a": 1,
22
- "k": [
23
- {
24
- "i": { "x": [0.667], "y": [1] },
25
- "o": { "x": [0.167], "y": [0] },
26
- "t": 0,
27
- "s": [45]
28
- },
29
- {
30
- "i": { "x": [0.667], "y": [1] },
31
- "o": { "x": [0.333], "y": [0] },
32
- "t": 15,
33
- "s": [45]
34
- },
35
- {
36
- "i": { "x": [0.833], "y": [1] },
37
- "o": { "x": [0.333], "y": [0] },
38
- "t": 35,
39
- "s": [405]
40
- },
41
- {
42
- "i": { "x": [0.833], "y": [1] },
43
- "o": { "x": [0.167], "y": [0] },
44
- "t": 50,
45
- "s": [405]
46
- },
47
- { "t": 70, "s": [765] }
48
- ],
49
- "ix": 10
50
- },
51
- "p": { "a": 0, "k": [150, 150, 0], "ix": 2, "l": 2 },
52
- "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 },
53
- "s": {
54
- "a": 1,
55
- "k": [
56
- {
57
- "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] },
58
- "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
59
- "t": 0,
60
- "s": [90, 90, 100]
61
- },
62
- {
63
- "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] },
64
- "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
65
- "t": 10,
66
- "s": [110, 110, 100]
67
- },
68
- {
69
- "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] },
70
- "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
71
- "t": 15,
72
- "s": [90, 90, 100]
73
- },
74
- {
75
- "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] },
76
- "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
77
- "t": 25,
78
- "s": [80, 80, 100]
79
- },
80
- {
81
- "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] },
82
- "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
83
- "t": 35,
84
- "s": [90, 90, 100]
85
- },
86
- {
87
- "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] },
88
- "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
89
- "t": 45,
90
- "s": [110, 110, 100]
91
- },
92
- {
93
- "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] },
94
- "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
95
- "t": 50,
96
- "s": [90, 90, 100]
97
- },
98
- {
99
- "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] },
100
- "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] },
101
- "t": 60,
102
- "s": [80, 80, 100]
103
- },
104
- { "t": 70, "s": [90, 90, 100] }
105
- ],
106
- "ix": 6,
107
- "l": 2
108
- }
109
- },
110
- "ao": 0,
111
- "sy": [
112
- {
113
- "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 5 },
114
- "o": { "a": 0, "k": 50, "ix": 2 },
115
- "s": { "a": 0, "k": 15, "ix": 11 },
116
- "r": { "a": 0, "k": 50, "ix": 12 },
117
- "sr": { "a": 0, "k": 1, "ix": 9 },
118
- "ch": { "a": 0, "k": 0, "ix": 10 },
119
- "bm": { "a": 0, "k": 11, "ix": 1 },
120
- "no": { "a": 0, "k": 0, "ix": 3 },
121
- "j": { "a": 0, "k": 0, "ix": 13 },
122
- "ty": 4,
123
- "nm": "内发光"
124
- }
125
- ],
126
- "shapes": [
127
- {
128
- "ty": "gr",
129
- "it": [
130
- {
131
- "ind": 0,
132
- "ty": "sh",
133
- "ix": 1,
134
- "ks": {
135
- "a": 1,
136
- "k": [
137
- {
138
- "i": { "x": 0.833, "y": 0.833 },
139
- "o": { "x": 0.167, "y": 0.167 },
140
- "t": 0,
141
- "s": [
142
- {
143
- "i": [
144
- [0, -22.091],
145
- [0, 0],
146
- [22.091, 0],
147
- [0, 0],
148
- [0, 22.091],
149
- [0, 0],
150
- [-22.091, 0],
151
- [0, 0]
152
- ],
153
- "o": [
154
- [0, 0],
155
- [0, 22.091],
156
- [0, 0],
157
- [-22.091, 0],
158
- [0, 0],
159
- [0, -22.091],
160
- [0, 0],
161
- [22.091, 0]
162
- ],
163
- "v": [
164
- [100, -60],
165
- [100, 60],
166
- [60, 100],
167
- [-60, 100],
168
- [-100, 60],
169
- [-100, -60],
170
- [-60, -100],
171
- [60, -100]
172
- ],
173
- "c": true
174
- }
175
- ]
176
- },
177
- {
178
- "i": { "x": 0.833, "y": 0.833 },
179
- "o": { "x": 0.167, "y": 0.167 },
180
- "t": 15,
181
- "s": [
182
- {
183
- "i": [
184
- [0, -22.091],
185
- [0, 0],
186
- [22.091, 0],
187
- [0, 0],
188
- [0, 22.091],
189
- [0, 0],
190
- [-22.091, 0],
191
- [0, 0]
192
- ],
193
- "o": [
194
- [0, 0],
195
- [0, 22.091],
196
- [0, 0],
197
- [-22.091, 0],
198
- [0, 0],
199
- [0, -22.091],
200
- [0, 0],
201
- [22.091, 0]
202
- ],
203
- "v": [
204
- [100, -60],
205
- [100, 60],
206
- [60, 100],
207
- [-60, 100],
208
- [-100, 60],
209
- [-100, -60],
210
- [-60, -100],
211
- [60, -100]
212
- ],
213
- "c": true
214
- }
215
- ]
216
- },
217
- {
218
- "i": { "x": 0.833, "y": 0.833 },
219
- "o": { "x": 0.167, "y": 0.167 },
220
- "t": 35,
221
- "s": [
222
- {
223
- "i": [
224
- [-30.375, 0],
225
- [-19.906, -19.906],
226
- [0, -30.375],
227
- [19.906, -19.906],
228
- [30.375, 0],
229
- [19.906, 19.906],
230
- [0, 30.375],
231
- [-19.906, 19.906]
232
- ],
233
- "o": [
234
- [30.375, 0],
235
- [19.906, 19.906],
236
- [0, 30.375],
237
- [-19.906, 19.906],
238
- [-30.375, 0],
239
- [-19.906, -19.906],
240
- [0, -30.375],
241
- [19.906, -19.906]
242
- ],
243
- "v": [
244
- [0, -110],
245
- [77.782, -77.782],
246
- [110, 0],
247
- [77.782, 77.782],
248
- [0, 110],
249
- [-77.782, 77.782],
250
- [-110, 0],
251
- [-77.782, -77.782]
252
- ],
253
- "c": true
254
- }
255
- ]
256
- },
257
- {
258
- "i": { "x": 0.833, "y": 0.833 },
259
- "o": { "x": 0.167, "y": 0.167 },
260
- "t": 50,
261
- "s": [
262
- {
263
- "i": [
264
- [-30.375, 0],
265
- [-19.906, -19.906],
266
- [0, -30.375],
267
- [19.906, -19.906],
268
- [30.375, 0],
269
- [19.906, 19.906],
270
- [0, 30.375],
271
- [-19.906, 19.906]
272
- ],
273
- "o": [
274
- [30.375, 0],
275
- [19.906, 19.906],
276
- [0, 30.375],
277
- [-19.906, 19.906],
278
- [-30.375, 0],
279
- [-19.906, -19.906],
280
- [0, -30.375],
281
- [19.906, -19.906]
282
- ],
283
- "v": [
284
- [0, -110],
285
- [77.782, -77.782],
286
- [110, 0],
287
- [77.782, 77.782],
288
- [0, 110],
289
- [-77.782, 77.782],
290
- [-110, 0],
291
- [-77.782, -77.782]
292
- ],
293
- "c": true
294
- }
295
- ]
296
- },
297
- {
298
- "t": 70,
299
- "s": [
300
- {
301
- "i": [
302
- [0, -22.091],
303
- [0, 0],
304
- [22.091, 0],
305
- [0, 0],
306
- [0, 22.091],
307
- [0, 0],
308
- [-22.091, 0],
309
- [0, 0]
310
- ],
311
- "o": [
312
- [0, 0],
313
- [0, 22.091],
314
- [0, 0],
315
- [-22.091, 0],
316
- [0, 0],
317
- [0, -22.091],
318
- [0, 0],
319
- [22.091, 0]
320
- ],
321
- "v": [
322
- [100, -60],
323
- [100, 60],
324
- [60, 100],
325
- [-60, 100],
326
- [-100, 60],
327
- [-100, -60],
328
- [-60, -100],
329
- [60, -100]
330
- ],
331
- "c": true
332
- }
333
- ]
334
- }
335
- ],
336
- "ix": 2
337
- },
338
- "nm": "路径 1",
339
- "mn": "ADBE Vector Shape - Group",
340
- "hd": false
341
- },
342
- {
343
- "ty": "st",
344
- "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 3 },
345
- "o": { "a": 0, "k": 100, "ix": 4 },
346
- "w": { "a": 0, "k": 0, "ix": 5 },
347
- "lc": 1,
348
- "lj": 1,
349
- "ml": 4,
350
- "bm": 0,
351
- "nm": "描边 1",
352
- "mn": "ADBE Vector Graphic - Stroke",
353
- "hd": false
354
- },
355
- {
356
- "ty": "gf",
357
- "o": { "a": 0, "k": 100, "ix": 10 },
358
- "r": 1,
359
- "bm": 0,
360
- "g": {
361
- "p": 5,
362
- "k": {
363
- "a": 1,
364
- "k": [
365
- {
366
- "i": { "x": 0.833, "y": 0.833 },
367
- "o": { "x": 0.167, "y": 0.167 },
368
- "t": 0,
369
- "s": [
370
- 0, 0.843, 0.725, 1, 0.377, 0.888, 0.833, 0.98, 0.753,
371
- 0.933, 0.941, 0.961, 0.877, 0.933, 0.941, 0.961, 1,
372
- 0.933, 0.941, 0.961, 0, 1, 0.263, 1, 0.526, 1, 0.685,
373
- 0.75, 0.844, 0.5, 0.922, 0.75, 1, 1
374
- ]
375
- },
376
- {
377
- "i": { "x": 0.833, "y": 0.833 },
378
- "o": { "x": 0.167, "y": 0.167 },
379
- "t": 10,
380
- "s": [
381
- 0, 0.843, 0.725, 1, 0.377, 0.888, 0.833, 0.98, 0.753,
382
- 0.933, 0.941, 0.961, 0.877, 0.933, 0.941, 0.961, 1,
383
- 0.933, 0.941, 0.961, 0, 1, 0.263, 1, 0.526, 1, 0.685,
384
- 0.75, 0.844, 0.5, 0.922, 0.75, 1, 1
385
- ]
386
- },
387
- {
388
- "i": { "x": 0.833, "y": 0.833 },
389
- "o": { "x": 0.167, "y": 0.167 },
390
- "t": 15,
391
- "s": [
392
- 0, 0.296, 0.388, 1, 0.377, 0.614, 0.665, 0.98, 0.753,
393
- 0.933, 0.941, 0.961, 0.877, 0.933, 0.941, 0.961, 1,
394
- 0.933, 0.941, 0.961, 0, 1, 0.263, 1, 0.526, 1, 0.685,
395
- 0.75, 0.844, 0.5, 0.922, 0.75, 1, 1
396
- ]
397
- },
398
- {
399
- "i": { "x": 0.833, "y": 0.833 },
400
- "o": { "x": 0.167, "y": 0.167 },
401
- "t": 35,
402
- "s": [
403
- 0, 0.296, 0.388, 1, 0.377, 0.614, 0.665, 0.98, 0.753,
404
- 0.933, 0.941, 0.961, 0.877, 0.933, 0.941, 0.961, 1,
405
- 0.933, 0.941, 0.961, 0, 1, 0.263, 1, 0.526, 1, 0.685,
406
- 0.75, 0.844, 0.5, 0.922, 0.75, 1, 1
407
- ]
408
- },
409
- {
410
- "i": { "x": 0.833, "y": 0.833 },
411
- "o": { "x": 0.167, "y": 0.167 },
412
- "t": 45,
413
- "s": [
414
- 0, 0.296, 0.388, 1, 0.377, 0.614, 0.665, 0.98, 0.753,
415
- 0.933, 0.941, 0.961, 0.877, 0.933, 0.941, 0.961, 1,
416
- 0.933, 0.941, 0.961, 0, 1, 0.263, 1, 0.526, 1, 0.685,
417
- 0.75, 0.844, 0.5, 0.922, 0.75, 1, 1
418
- ]
419
- },
420
- {
421
- "i": { "x": 0.833, "y": 0.833 },
422
- "o": { "x": 0.167, "y": 0.167 },
423
- "t": 50,
424
- "s": [
425
- 0, 0.843, 0.725, 1, 0.377, 0.888, 0.833, 0.98, 0.753,
426
- 0.933, 0.941, 0.961, 0.877, 0.933, 0.941, 0.961, 1,
427
- 0.933, 0.941, 0.961, 0, 1, 0.263, 1, 0.526, 1, 0.685,
428
- 0.75, 0.844, 0.5, 0.922, 0.75, 1, 1
429
- ]
430
- },
431
- {
432
- "t": 55,
433
- "s": [
434
- 0, 0.843, 0.725, 1, 0.377, 0.888, 0.833, 0.98, 0.753,
435
- 0.933, 0.941, 0.961, 0.877, 0.933, 0.941, 0.961, 1,
436
- 0.933, 0.941, 0.961, 0, 1, 0.263, 1, 0.526, 1, 0.685,
437
- 0.75, 0.844, 0.5, 0.922, 0.75, 1, 1
438
- ]
439
- }
440
- ],
441
- "ix": 9
442
- }
443
- },
444
- "s": { "a": 0, "k": [-95.176, -7.154], "ix": 5 },
445
- "e": { "a": 0, "k": [169.105, 83.696], "ix": 6 },
446
- "t": 2,
447
- "h": { "a": 0, "k": 0, "ix": 7 },
448
- "a": { "a": 0, "k": 0, "ix": 8 },
449
- "nm": "Gradient Fill 1",
450
- "mn": "ADBE Vector Graphic - G-Fill",
451
- "hd": false
452
- },
453
- {
454
- "ty": "tr",
455
- "p": { "a": 0, "k": [0, 0], "ix": 2 },
456
- "a": { "a": 0, "k": [0, 0], "ix": 1 },
457
- "s": { "a": 0, "k": [100, 100], "ix": 3 },
458
- "r": { "a": 0, "k": 0, "ix": 6 },
459
- "o": { "a": 0, "k": 100, "ix": 7 },
460
- "sk": { "a": 0, "k": 0, "ix": 4 },
461
- "sa": { "a": 0, "k": 0, "ix": 5 },
462
- "nm": "变换"
463
- }
464
- ],
465
- "nm": "矩形 2",
466
- "np": 3,
467
- "cix": 2,
468
- "bm": 0,
469
- "ix": 1,
470
- "mn": "ADBE Vector Group",
471
- "hd": false
472
- }
473
- ],
474
- "ip": 0,
475
- "op": 125,
476
- "st": 0,
477
- "ct": 1,
478
- "bm": 0
479
- }
480
- ],
481
- "markers": [],
482
- "props": {}
483
- }