@myun/gimi-chat 0.0.5 → 0.0.6

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 (49) hide show
  1. package/dist/components/ai-chat-dialogue/index.js +181 -135
  2. package/dist/components/ai-correction/index.js +38 -25
  3. package/dist/components/ai-loading/index.js +12 -8
  4. package/dist/components/answer-item/index.js +135 -113
  5. package/dist/components/ask-card/index.js +42 -33
  6. package/dist/components/chat-input/index.js +135 -114
  7. package/dist/components/chat-voice/VoiceCommunication.js +23 -21
  8. package/dist/components/chat-voice/VoiceRecord.js +24 -21
  9. package/dist/components/conversation-delete/index.js +10 -8
  10. package/dist/components/dots-loading/index.js +10 -7
  11. package/dist/components/empty/index.js +12 -7
  12. package/dist/components/excel-components/ExcelCard.js +7 -3
  13. package/dist/components/excel-components/ExcelExcuting.js +60 -43
  14. package/dist/components/excel-components/ExcelFailCard.js +15 -10
  15. package/dist/components/excel-components/ExcelSuccessCard.js +3 -2
  16. package/dist/components/file-card/fileCardSidebar.js +23 -16
  17. package/dist/components/file-card/index.js +68 -49
  18. package/dist/components/file-preview/index.js +36 -29
  19. package/dist/components/file-upload/index.js +10 -7
  20. package/dist/components/file-upload/uploadV1.js +33 -27
  21. package/dist/components/gimi-sidebar/index.js +20 -13
  22. package/dist/components/header/index.js +18 -11
  23. package/dist/components/iconfont-com/index.js +2 -1
  24. package/dist/components/knowledge-trace/KnowledgeIconComponent.js +28 -22
  25. package/dist/components/knowledge-trace/classList.js +37 -28
  26. package/dist/components/knowledge-trace/documentList.js +36 -27
  27. package/dist/components/knowledge-trace/index.js +28 -21
  28. package/dist/components/knowledge-trace/videoList.js +46 -36
  29. package/dist/components/lottie-img/index.js +10 -8
  30. package/dist/components/message-actions/CopyButton.js +25 -22
  31. package/dist/components/message-actions/LikeButton.js +25 -22
  32. package/dist/components/message-actions/RegenerateButton.js +21 -18
  33. package/dist/components/message-actions/UnLikeButton.js +25 -22
  34. package/dist/components/message-actions/VoicePlay.js +25 -22
  35. package/dist/components/message-list/index.js +85 -72
  36. package/dist/components/no-microphone-root/index.js +39 -29
  37. package/dist/components/preset-agent-content/index.js +20 -15
  38. package/dist/components/reasoning-content/index.js +55 -42
  39. package/dist/components/reference-content/index.js +72 -63
  40. package/dist/components/templates/CommonChat.js +78 -64
  41. package/dist/components/templates/GimiChatComponent.js +13 -6
  42. package/dist/components/templates/demo/demo.js +104 -102
  43. package/dist/components/upload-list/index.js +56 -41
  44. package/dist/components/voice-bars/index.js +22 -19
  45. package/dist/components/voice-check-dialog/index.js +24 -17
  46. package/dist/components/voice-recording/index.js +57 -42
  47. package/dist/components/work-flow-content/demo.js +2 -1
  48. package/dist/components/work-flow-content/index.js +12 -9
  49. package/package.json +6 -5
@@ -3,6 +3,8 @@ import styles from "./index.module.css";
3
3
  import reTry from "../../assets/image/retry.png";
4
4
  import { FileStatus } from "../../interfaces/fileInterface";
5
5
  import { formatSizeToKB } from "../../utils/tools";
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ import { jsxs as _jsxs } from "react/jsx-runtime";
6
8
  var UploadFile = function UploadFile(_ref) {
7
9
  var file = _ref.file,
8
10
  handleDelFile = _ref.handleDelFile,
@@ -45,46 +47,59 @@ var UploadFile = function UploadFile(_ref) {
45
47
 
46
48
  var isError = file.status === FileStatus.UPLOAD_FAILED || file.status === FileStatus.ANALYSE_FAILED || file.status === FileStatus.NETWORK_ERROR;
47
49
  var isLoading = [FileStatus.PADDING, FileStatus.RETRING, FileStatus.UPLOADING].includes(file.status);
48
- return /*#__PURE__*/React.createElement("div", {
49
- className: styles.uploadBox
50
- }, /*#__PURE__*/React.createElement("div", {
51
- className: styles.uploadIcon
52
- }, /*#__PURE__*/React.createElement("img", {
53
- src: fileIcon,
54
- alt: "file-icon"
55
- })), /*#__PURE__*/React.createElement("div", {
56
- className: styles.uploadName
57
- }, /*#__PURE__*/React.createElement("div", {
58
- className: styles.uploadfileName
59
- }, /*#__PURE__*/React.createElement("div", {
60
- className: styles.fileName
61
- }, fileName)), (fileSize || isError) && /*#__PURE__*/React.createElement("div", {
62
- className: styles.sizeText
63
- }, fileSize && !isError && /*#__PURE__*/React.createElement("span", {
64
- className: styles.size
65
- }, fileSize), isError && /*#__PURE__*/React.createElement("span", {
66
- className: styles.errorText
67
- }, file.status === FileStatus.UPLOAD_FAILED ? '上传失败' : file.status === FileStatus.NETWORK_ERROR ? '网络错误' : '解析失败'))), isLoading && /*#__PURE__*/React.createElement("div", {
68
- className: styles.uploadLoading
69
- }, /*#__PURE__*/React.createElement("span", null, file.status === FileStatus.PADDING ? '解析中...' : file.status === FileStatus.UPLOADING ? '上传中...' : '重试中...'), /*#__PURE__*/React.createElement("img", {
70
- src: "https://simg01.gaodunwangxiao.com/uploadfiles/tmp/upload/202509/07/0a0fa_20250907093927.gif",
71
- alt: "loading"
72
- })), isError && /*#__PURE__*/React.createElement("div", {
73
- className: styles.uploadError,
74
- onClick: handleRetryClick
75
- }, "\u91CD\u8BD5", /*#__PURE__*/React.createElement("img", {
76
- src: reTry,
77
- alt: "",
78
- style: {
79
- width: 16,
80
- height: 16
81
- }
82
- })), showDel && /*#__PURE__*/React.createElement("div", {
83
- className: styles.delIcon,
84
- onClick: handleDeleteClick
85
- }, /*#__PURE__*/React.createElement("img", {
86
- src: "https://simg01.gaodunwangxiao.com/uploadimgs/tmp/upload/202509/12/6fa3e_20250912145501.png",
87
- alt: "delete"
88
- })));
50
+ return /*#__PURE__*/_jsxs("div", {
51
+ className: styles.uploadBox,
52
+ children: [/*#__PURE__*/_jsx("div", {
53
+ className: styles.uploadIcon,
54
+ children: /*#__PURE__*/_jsx("img", {
55
+ src: fileIcon,
56
+ alt: "file-icon"
57
+ })
58
+ }), /*#__PURE__*/_jsxs("div", {
59
+ className: styles.uploadName,
60
+ children: [/*#__PURE__*/_jsx("div", {
61
+ className: styles.uploadfileName,
62
+ children: /*#__PURE__*/_jsx("div", {
63
+ className: styles.fileName,
64
+ children: fileName
65
+ })
66
+ }), (fileSize || isError) && /*#__PURE__*/_jsxs("div", {
67
+ className: styles.sizeText,
68
+ children: [fileSize && !isError && /*#__PURE__*/_jsx("span", {
69
+ className: styles.size,
70
+ children: fileSize
71
+ }), isError && /*#__PURE__*/_jsx("span", {
72
+ className: styles.errorText,
73
+ children: file.status === FileStatus.UPLOAD_FAILED ? '上传失败' : file.status === FileStatus.NETWORK_ERROR ? '网络错误' : '解析失败'
74
+ })]
75
+ })]
76
+ }), isLoading && /*#__PURE__*/_jsxs("div", {
77
+ className: styles.uploadLoading,
78
+ children: [/*#__PURE__*/_jsx("span", {
79
+ children: file.status === FileStatus.PADDING ? '解析中...' : file.status === FileStatus.UPLOADING ? '上传中...' : '重试中...'
80
+ }), /*#__PURE__*/_jsx("img", {
81
+ src: "https://simg01.gaodunwangxiao.com/uploadfiles/tmp/upload/202509/07/0a0fa_20250907093927.gif",
82
+ alt: "loading"
83
+ })]
84
+ }), isError && /*#__PURE__*/_jsxs("div", {
85
+ className: styles.uploadError,
86
+ onClick: handleRetryClick,
87
+ children: ["\u91CD\u8BD5", /*#__PURE__*/_jsx("img", {
88
+ src: reTry,
89
+ alt: "",
90
+ style: {
91
+ width: 16,
92
+ height: 16
93
+ }
94
+ })]
95
+ }), showDel && /*#__PURE__*/_jsx("div", {
96
+ className: styles.delIcon,
97
+ onClick: handleDeleteClick,
98
+ children: /*#__PURE__*/_jsx("img", {
99
+ src: "https://simg01.gaodunwangxiao.com/uploadimgs/tmp/upload/202509/12/6fa3e_20250912145501.png",
100
+ alt: "delete"
101
+ })
102
+ })]
103
+ });
89
104
  };
90
105
  export default UploadFile;
@@ -9,6 +9,7 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
9
9
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
10
10
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
11
11
  import React from 'react';
12
+ import { jsx as _jsx } from "react/jsx-runtime";
12
13
  export default function VoiceBars(_ref) {
13
14
  var _ref$parentWidth = _ref.parentWidth,
14
15
  parentWidth = _ref$parentWidth === void 0 ? undefined : _ref$parentWidth;
@@ -151,24 +152,26 @@ export default function VoiceBars(_ref) {
151
152
  }
152
153
  };
153
154
  }, []);
154
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
155
- style: {
156
- display: 'flex',
157
- alignItems: 'center',
158
- justifyContent: 'center',
159
- height: 40,
160
- gap: 6
161
- }
162
- }, volumes.map(function (h, i) {
163
- return /*#__PURE__*/React.createElement("div", {
164
- key: i,
155
+ return /*#__PURE__*/_jsx("div", {
156
+ children: /*#__PURE__*/_jsx("div", {
165
157
  style: {
166
- width: 6,
167
- height: h,
168
- background: '#4f8cff',
169
- borderRadius: 4,
170
- transition: 'height 0.1s ease-out'
171
- }
172
- });
173
- })));
158
+ display: 'flex',
159
+ alignItems: 'center',
160
+ justifyContent: 'center',
161
+ height: 40,
162
+ gap: 6
163
+ },
164
+ children: volumes.map(function (h, i) {
165
+ return /*#__PURE__*/_jsx("div", {
166
+ style: {
167
+ width: 6,
168
+ height: h,
169
+ background: '#4f8cff',
170
+ borderRadius: 4,
171
+ transition: 'height 0.1s ease-out'
172
+ }
173
+ }, i);
174
+ })
175
+ })
176
+ });
174
177
  }
@@ -16,6 +16,9 @@ import styles from "./index.module.css";
16
16
  import NoMicrophoneModalContent from "../no-microphone-root";
17
17
  import { useAppDispatch, useAppSelector } from "../../store/hooks";
18
18
  import { setShowMicWarning } from "../../store/slices/gimiMenuSlice";
19
+ import { jsx as _jsx } from "react/jsx-runtime";
20
+ import { Fragment as _Fragment } from "react/jsx-runtime";
21
+ import { jsxs as _jsxs } from "react/jsx-runtime";
19
22
  var VoiceCheckDialog = function VoiceCheckDialog(_ref) {
20
23
  var _layout$x, _layout$y;
21
24
  var className = _ref.className,
@@ -142,22 +145,26 @@ var VoiceCheckDialog = function VoiceCheckDialog(_ref) {
142
145
  showMicWarning: false
143
146
  }));
144
147
  };
145
- return /*#__PURE__*/React.createElement(React.Fragment, null, trigger && /*#__PURE__*/React.createElement("div", {
146
- ref: triggerRef,
147
- style: {
148
- display: 'flex'
149
- }
150
- }, trigger), showMicWarning && /*#__PURE__*/React.createElement("div", {
151
- ref: dialogRef,
152
- className: classNames(styles['voice-check-dialog'], className),
153
- style: _objectSpread({
154
- left: "".concat((_layout$x = layout === null || layout === void 0 ? void 0 : layout.x) !== null && _layout$x !== void 0 ? _layout$x : 0, "px"),
155
- top: "".concat((_layout$y = layout === null || layout === void 0 ? void 0 : layout.y) !== null && _layout$y !== void 0 ? _layout$y : 0, "px"),
156
- opacity: layout ? 1 : 0,
157
- visibility: layout ? 'visible' : 'hidden'
158
- }, style)
159
- }, /*#__PURE__*/React.createElement(NoMicrophoneModalContent, {
160
- onOk: onCancel
161
- })));
148
+ return /*#__PURE__*/_jsxs(_Fragment, {
149
+ children: [trigger && /*#__PURE__*/_jsx("div", {
150
+ ref: triggerRef,
151
+ style: {
152
+ display: 'flex'
153
+ },
154
+ children: trigger
155
+ }), showMicWarning && /*#__PURE__*/_jsx("div", {
156
+ ref: dialogRef,
157
+ className: classNames(styles['voice-check-dialog'], className),
158
+ style: _objectSpread({
159
+ left: "".concat((_layout$x = layout === null || layout === void 0 ? void 0 : layout.x) !== null && _layout$x !== void 0 ? _layout$x : 0, "px"),
160
+ top: "".concat((_layout$y = layout === null || layout === void 0 ? void 0 : layout.y) !== null && _layout$y !== void 0 ? _layout$y : 0, "px"),
161
+ opacity: layout ? 1 : 0,
162
+ visibility: layout ? 'visible' : 'hidden'
163
+ }, style),
164
+ children: /*#__PURE__*/_jsx(NoMicrophoneModalContent, {
165
+ onOk: onCancel
166
+ })
167
+ })]
168
+ });
162
169
  };
163
170
  export default VoiceCheckDialog;
@@ -2,53 +2,68 @@ import { Tooltip } from '@douyinfe/semi-ui';
2
2
  import VoiceBars from "../voice-bars";
3
3
  import styles from "./index.module.css";
4
4
  import React from 'react';
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ import { Fragment as _Fragment } from "react/jsx-runtime";
7
+ import { jsxs as _jsxs } from "react/jsx-runtime";
5
8
  var CHECK_ICON_ADDRESS = 'https://simg01.gaodunwangxiao.com/uploadimgs/tmp/upload/202601/04/8b0e2_20260104154821.png';
6
9
  var CANCEL_ICON_ADDRESS = 'https://simg01.gaodunwangxiao.com/uploadimgs/tmp/upload/202601/04/94bfe_20260104154857.png';
7
10
  var VoiceRecording = function VoiceRecording(_ref) {
8
11
  var recordingCount = _ref.recordingCount,
9
12
  stopRecording = _ref.stopRecording,
10
13
  containerWidth = _ref.containerWidth;
11
- return /*#__PURE__*/React.createElement("div", {
12
- className: styles.main
13
- }, /*#__PURE__*/React.createElement("div", {
14
- className: styles.text
15
- }, /*#__PURE__*/React.createElement("span", {
16
- className: styles.font_weight_600
17
- }, "\u8BED\u97F3\u8F93\u5165\u4E2D"), recordingCount > 0 && recordingCount <= 10 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
18
- className: styles.font_weight_400
19
- }, "(\u5012\u8BA1\u65F6"), /*#__PURE__*/React.createElement("span", {
20
- className: styles.count
21
- }, recordingCount), /*#__PURE__*/React.createElement("span", {
22
- className: styles.font_weight_400
23
- }, "\u79D2)"))), /*#__PURE__*/React.createElement("div", {
24
- className: styles.voice_bar
25
- }, /*#__PURE__*/React.createElement(VoiceBars, {
26
- parentWidth: containerWidth - 48 * 2 - 20 * 2 - 10
27
- }), /*#__PURE__*/React.createElement("div", {
28
- style: {
29
- display: 'flex',
30
- gap: '10px'
31
- }
32
- }, /*#__PURE__*/React.createElement(Tooltip, {
33
- content: "\u653E\u5F03\u8F6C\u5199",
34
- arrowPointAtCenter: true
35
- }, /*#__PURE__*/React.createElement("img", {
36
- className: styles.icon,
37
- src: CANCEL_ICON_ADDRESS,
38
- alt: "\u653E\u5F03\u8F6C\u5199",
39
- onClick: function onClick() {
40
- stopRecording(false);
41
- }
42
- })), /*#__PURE__*/React.createElement(Tooltip, {
43
- content: "\u5F00\u59CB\u8F6C\u5199",
44
- arrowPointAtCenter: true
45
- }, /*#__PURE__*/React.createElement("img", {
46
- className: styles.icon,
47
- src: CHECK_ICON_ADDRESS,
48
- alt: "\u5F00\u59CB\u8F6C\u5199",
49
- onClick: function onClick() {
50
- stopRecording(true);
51
- }
52
- })))));
14
+ return /*#__PURE__*/_jsxs("div", {
15
+ className: styles.main,
16
+ children: [/*#__PURE__*/_jsxs("div", {
17
+ className: styles.text,
18
+ children: [/*#__PURE__*/_jsx("span", {
19
+ className: styles.font_weight_600,
20
+ children: "\u8BED\u97F3\u8F93\u5165\u4E2D"
21
+ }), recordingCount > 0 && recordingCount <= 10 && /*#__PURE__*/_jsxs(_Fragment, {
22
+ children: [/*#__PURE__*/_jsx("span", {
23
+ className: styles.font_weight_400,
24
+ children: "(\u5012\u8BA1\u65F6"
25
+ }), /*#__PURE__*/_jsx("span", {
26
+ className: styles.count,
27
+ children: recordingCount
28
+ }), /*#__PURE__*/_jsx("span", {
29
+ className: styles.font_weight_400,
30
+ children: "\u79D2)"
31
+ })]
32
+ })]
33
+ }), /*#__PURE__*/_jsxs("div", {
34
+ className: styles.voice_bar,
35
+ children: [/*#__PURE__*/_jsx(VoiceBars, {
36
+ parentWidth: containerWidth - 48 * 2 - 20 * 2 - 10
37
+ }), /*#__PURE__*/_jsxs("div", {
38
+ style: {
39
+ display: 'flex',
40
+ gap: '10px'
41
+ },
42
+ children: [/*#__PURE__*/_jsx(Tooltip, {
43
+ content: "\u653E\u5F03\u8F6C\u5199",
44
+ arrowPointAtCenter: true,
45
+ children: /*#__PURE__*/_jsx("img", {
46
+ className: styles.icon,
47
+ src: CANCEL_ICON_ADDRESS,
48
+ alt: "\u653E\u5F03\u8F6C\u5199",
49
+ onClick: function onClick() {
50
+ stopRecording(false);
51
+ }
52
+ })
53
+ }), /*#__PURE__*/_jsx(Tooltip, {
54
+ content: "\u5F00\u59CB\u8F6C\u5199",
55
+ arrowPointAtCenter: true,
56
+ children: /*#__PURE__*/_jsx("img", {
57
+ className: styles.icon,
58
+ src: CHECK_ICON_ADDRESS,
59
+ alt: "\u5F00\u59CB\u8F6C\u5199",
60
+ onClick: function onClick() {
61
+ stopRecording(true);
62
+ }
63
+ })
64
+ })]
65
+ })]
66
+ })]
67
+ });
53
68
  };
54
69
  export default VoiceRecording;
@@ -1,7 +1,8 @@
1
1
  import React from 'react';
2
2
  import WorkFlowContent from "./index";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
3
4
  var Demo = function Demo() {
4
- return /*#__PURE__*/React.createElement(WorkFlowContent, {
5
+ return /*#__PURE__*/_jsx(WorkFlowContent, {
5
6
  chatItem: {
6
7
  mcp: '这是一条工作流内容',
7
8
  status: 'executeWorkflowByDescription'
@@ -1,14 +1,16 @@
1
1
  import * as React from 'react';
2
2
  import styles from "./index.module.css";
3
3
  import { Spin } from '@douyinfe/semi-ui';
4
- import { LoadingOutlined, InfoCircleOutlined } from '@ant-design/icons';
5
- var antIcon = /*#__PURE__*/React.createElement(LoadingOutlined, {
4
+ import { IconSpin, IconInfoCircle } from '@douyinfe/semi-icons';
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ import { jsxs as _jsxs } from "react/jsx-runtime";
7
+ var antIcon = /*#__PURE__*/_jsx(IconSpin, {
6
8
  style: {
7
9
  fontSize: 16
8
10
  },
9
11
  spin: true
10
12
  });
11
- var warnIcon = /*#__PURE__*/React.createElement(InfoCircleOutlined, {
13
+ var warnIcon = /*#__PURE__*/_jsx(IconInfoCircle, {
12
14
  style: {
13
15
  fontSize: 16
14
16
  }
@@ -17,12 +19,13 @@ var WorkFlowContent = function WorkFlowContent(_ref) {
17
19
  var chatItem = _ref.chatItem;
18
20
  // const isExecuting = chatItem.mcps.some((item: MCPItem) => !item.isFinished);
19
21
  var mcp = chatItem.mcp;
20
- return /*#__PURE__*/React.createElement("div", {
21
- className: styles.layout
22
- }, mcp.status === 'executeWorkflowByDescription' ? '正在查询可用工作流...' : mcp.status === 'interrupt' ? '运行终止' : "\u6B63\u5728\u8C03\u7528 ".concat(mcp.name || '工作流', "..."), mcp.status === 'interrupt' ? warnIcon : /*#__PURE__*/React.createElement(Spin, {
23
- className: styles.spin,
24
- indicator: antIcon
25
- }));
22
+ return /*#__PURE__*/_jsxs("div", {
23
+ className: styles.layout,
24
+ children: [mcp.status === 'executeWorkflowByDescription' ? '正在查询可用工作流...' : mcp.status === 'interrupt' ? '运行终止' : "\u6B63\u5728\u8C03\u7528 ".concat(mcp.name || '工作流', "..."), mcp.status === 'interrupt' ? warnIcon : /*#__PURE__*/_jsx(Spin, {
25
+ className: styles.spin,
26
+ indicator: antIcon
27
+ })]
28
+ });
26
29
 
27
30
  // return (
28
31
  // <Collapse
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myun/gimi-chat",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "description": "> TODO: description",
5
5
  "homepage": "",
6
6
  "license": "ISC",
@@ -28,13 +28,14 @@
28
28
  "@reduxjs/toolkit": "^2.11.2",
29
29
  "@volcengine/rtc": "^4.68.0",
30
30
  "classnames": "^2.2.6",
31
- "react": "^18.3.1",
32
- "react-dom": "^18.3.1",
33
- "react-redux": "^9.2.0",
34
- "redux": "^5.0.1"
31
+ "react-redux": "^8.1.3",
32
+ "redux": "^5.0.1",
33
+ "lodash": "^4.17.21"
35
34
  },
36
35
  "devDependencies": {
37
36
  "father": "4.1.1",
37
+ "react": "^17.0.0",
38
+ "react-dom": "^17.0.0",
38
39
  "sass": "^1.69.5"
39
40
  },
40
41
  "peerDependencies": {