vite-uni-dev-tool 0.0.13 → 0.0.14

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 (109) hide show
  1. package/dist/v2/AppInfo/index.vue +41 -0
  2. package/dist/v2/AutoSizer/index.vue +189 -0
  3. package/dist/v2/AutoSizer/index1.vue +193 -0
  4. package/dist/v2/AutoSizer/utils.ts +49 -0
  5. package/dist/v2/CaptureScreen/index.vue +78 -0
  6. package/dist/v2/CloseButton/index.vue +32 -0
  7. package/dist/v2/Connection/index.vue +94 -0
  8. package/dist/v2/ConsoleList/ConsoleItem.vue +235 -0
  9. package/dist/v2/ConsoleList/RunJSInput.vue +243 -0
  10. package/dist/v2/ConsoleList/index.vue +164 -0
  11. package/dist/v2/ConsoleList/staticTips.js +1144 -0
  12. package/dist/v2/DevTool/index.vue +162 -0
  13. package/dist/v2/DevToolButton/index.vue +228 -0
  14. package/dist/v2/DevToolTitle/index.vue +28 -0
  15. package/dist/v2/DevToolWindow/index.vue +1051 -0
  16. package/dist/v2/DeviceInfo/index.vue +48 -0
  17. package/dist/v2/Empty/empty.png +0 -0
  18. package/dist/v2/Empty/index.vue +40 -0
  19. package/dist/v2/FilterInput/index.vue +100 -0
  20. package/dist/v2/JsonPretty/components/Brackets/index.vue +30 -0
  21. package/dist/v2/JsonPretty/components/Carets/index.vue +65 -0
  22. package/dist/v2/JsonPretty/components/CheckController/index.vue +127 -0
  23. package/dist/v2/JsonPretty/components/TreeNode/index.vue +417 -0
  24. package/dist/v2/JsonPretty/hooks/useClipboard.ts +21 -0
  25. package/dist/v2/JsonPretty/hooks/useError.ts +21 -0
  26. package/dist/v2/JsonPretty/index.vue +531 -0
  27. package/dist/v2/JsonPretty/type.ts +125 -0
  28. package/dist/v2/JsonPretty/utils/index.js +211 -0
  29. package/dist/v2/NetworkList/NetworkDetail.vue +215 -0
  30. package/dist/v2/NetworkList/NetworkItem.vue +135 -0
  31. package/dist/v2/NetworkList/index.vue +148 -0
  32. package/dist/v2/PiniaList/index.vue +79 -0
  33. package/dist/v2/RouteList/index.vue +137 -0
  34. package/dist/v2/RunJS/index.vue +128 -0
  35. package/dist/v2/SettingList/index.vue +318 -0
  36. package/dist/v2/SourceCode/index.vue +237 -0
  37. package/dist/v2/StorageList/index.vue +165 -0
  38. package/dist/v2/SystemInfo/index.vue +49 -0
  39. package/dist/v2/Tabs/index.vue +127 -0
  40. package/dist/v2/Tag/index.vue +91 -0
  41. package/dist/v2/UniEvent/UniEventItem.vue +157 -0
  42. package/dist/v2/UniEvent/index.vue +127 -0
  43. package/dist/v2/UploadList/UploadDetail.vue +204 -0
  44. package/dist/v2/UploadList/UploadItem.vue +134 -0
  45. package/dist/v2/UploadList/index.vue +143 -0
  46. package/dist/v2/VirtualList/index.vue +140 -0
  47. package/dist/v2/VirtualListPro/AutoSize.vue +50 -0
  48. package/dist/v2/VirtualListPro/index.vue +255 -0
  49. package/dist/v2/VirtualListPro/readme.md +40 -0
  50. package/dist/v2/VuexList/index.vue +80 -0
  51. package/dist/v2/WebSocket/WebSocketItem.vue +129 -0
  52. package/dist/v2/WebSocket/WebSocketList.vue +183 -0
  53. package/dist/v2/WebSocket/index.vue +155 -0
  54. package/dist/v2/WindowInfo/index.vue +49 -0
  55. package/dist/v3/AppInfo/index.vue +35 -0
  56. package/dist/v3/AutoSizer/index.vue +193 -0
  57. package/dist/v3/AutoSizer/index1.vue +186 -0
  58. package/dist/v3/AutoSizer/utils.ts +49 -0
  59. package/dist/v3/CaptureScreen/index.vue +62 -0
  60. package/dist/v3/CloseButton/index.vue +29 -0
  61. package/dist/v3/Connection/index.vue +88 -0
  62. package/dist/v3/ConsoleList/ConsoleItem.vue +208 -0
  63. package/dist/v3/ConsoleList/RunJSInput.vue +240 -0
  64. package/dist/v3/ConsoleList/index.vue +139 -0
  65. package/dist/v3/ConsoleList/staticTips.ts +1145 -0
  66. package/dist/v3/DevTool/index.vue +217 -0
  67. package/dist/v3/DevToolButton/index.vue +210 -0
  68. package/dist/v3/DevToolTitle/index.vue +21 -0
  69. package/dist/v3/DevToolWindow/index.vue +1116 -0
  70. package/dist/v3/DeviceInfo/index.vue +32 -0
  71. package/dist/v3/Empty/empty.png +0 -0
  72. package/dist/v3/Empty/index.vue +28 -0
  73. package/dist/v3/FilterInput/index.vue +87 -0
  74. package/dist/v3/JsonPretty/components/Brackets/index.vue +23 -0
  75. package/dist/v3/JsonPretty/components/Carets/index.vue +59 -0
  76. package/dist/v3/JsonPretty/components/CheckController/index.vue +125 -0
  77. package/dist/v3/JsonPretty/components/TreeNode/index.vue +349 -0
  78. package/dist/v3/JsonPretty/hooks/useClipboard.ts +21 -0
  79. package/dist/v3/JsonPretty/hooks/useError.ts +21 -0
  80. package/dist/v3/JsonPretty/index.vue +476 -0
  81. package/dist/v3/JsonPretty/type.ts +125 -0
  82. package/dist/v3/JsonPretty/utils/index.ts +172 -0
  83. package/dist/v3/NetworkList/NetworkDetail.vue +194 -0
  84. package/dist/v3/NetworkList/NetworkItem.vue +120 -0
  85. package/dist/v3/NetworkList/index.vue +128 -0
  86. package/dist/v3/PiniaList/index.vue +64 -0
  87. package/dist/v3/RouteList/index.vue +121 -0
  88. package/dist/v3/RunJS/index.vue +128 -0
  89. package/dist/v3/SettingList/index.vue +313 -0
  90. package/dist/v3/SourceCode/index.vue +231 -0
  91. package/dist/v3/StorageList/index.vue +170 -0
  92. package/dist/v3/SystemInfo/index.vue +34 -0
  93. package/dist/v3/Tabs/index.vue +123 -0
  94. package/dist/v3/Tag/index.vue +89 -0
  95. package/dist/v3/UniEvent/UniEventItem.vue +126 -0
  96. package/dist/v3/UniEvent/index.vue +98 -0
  97. package/dist/v3/UploadList/UploadDetail.vue +192 -0
  98. package/dist/v3/UploadList/UploadItem.vue +117 -0
  99. package/dist/v3/UploadList/index.vue +117 -0
  100. package/dist/v3/VirtualList/index.vue +112 -0
  101. package/dist/v3/VirtualListPro/AutoSize.vue +43 -0
  102. package/dist/v3/VirtualListPro/index.vue +238 -0
  103. package/dist/v3/VirtualListPro/readme.md +40 -0
  104. package/dist/v3/VuexList/index.vue +54 -0
  105. package/dist/v3/WebSocket/WebSocketItem.vue +103 -0
  106. package/dist/v3/WebSocket/WebSocketList.vue +161 -0
  107. package/dist/v3/WebSocket/index.vue +124 -0
  108. package/dist/v3/WindowInfo/index.vue +33 -0
  109. package/package.json +1 -1
@@ -0,0 +1,157 @@
1
+ <template>
2
+ <view class="uni-event-item">
3
+ <view class="uni-event-item-row"> {{ eventItem.eventName }} </view>
4
+ <view class="uni-event-item-row">
5
+ <Tag mode="info" v-if="eventItem.type == 'on'">
6
+ {{ eventItem.type }}
7
+ </Tag>
8
+ <Tag mode="warn" v-if="eventItem.type == 'once'">
9
+ {{ eventItem.type }}
10
+ </Tag>
11
+ <Tag mode="main" v-if="eventItem.type == 'emit'">
12
+ {{ eventItem.type }}
13
+ </Tag>
14
+ <Tag mode="error" v-if="eventItem.type == 'off'">
15
+ {{ eventItem.type }}
16
+ </Tag>
17
+ <view class="uni-event-item-right"> {{ eventItem.timer }}</view>
18
+ </view>
19
+
20
+ <view
21
+ :class="`uni-event-item-right ${isUseDevSource ? 'link' : ''}`"
22
+ @click="onStackClick"
23
+ >
24
+ {{ eventItem.stack }}
25
+ </view>
26
+
27
+ <SourceCode
28
+ v-if="openCode && eventItem.stack"
29
+ :url="eventItem.stack"
30
+ :sourceFileServers="sourceFileServers"
31
+ :mode="mode"
32
+ :zIndex="zIndex"
33
+ @close="onCloseCode"
34
+ />
35
+ </view>
36
+ </template>
37
+
38
+ <script>
39
+ import Tag from '../Tag/index.vue';
40
+ import SourceCode from '../SourceCode/index.vue';
41
+ import { isAndroid, isMockWX } from '../../utils';
42
+
43
+ export default {
44
+ components: {
45
+ Tag,
46
+ SourceCode,
47
+ },
48
+ props: {
49
+ eventItem: {
50
+ type: Object,
51
+ required: true,
52
+ validator: (value) => {
53
+ // 基础验证确保必要字段存在
54
+ return ['eventName', 'type', 'timer', 'stack'].every(
55
+ (key) => key in value,
56
+ );
57
+ },
58
+ },
59
+ mode: {
60
+ type: String,
61
+ default: '',
62
+ },
63
+ useDevSource: {
64
+ type: Boolean,
65
+ default: false,
66
+ },
67
+ sourceFileServers: {
68
+ type: Array,
69
+ default: () => [],
70
+ },
71
+ zIndex: {
72
+ type: Number,
73
+ default: 0,
74
+ },
75
+ },
76
+ data() {
77
+ return {
78
+ openCode: false,
79
+ };
80
+ },
81
+ computed: {
82
+ isUseDevSource() {
83
+ return (
84
+ !isMockWX(this.eventItem?.stack ?? '') &&
85
+ this.mode === 'development' &&
86
+ this.useDevSource
87
+ );
88
+ },
89
+ isWXLink() {
90
+ console.log('eventItem: ', this.eventItem);
91
+ console.log('mode: ', this.mode);
92
+ return (
93
+ isMockWX(this.eventItem?.stack ?? '') || this.mode !== 'development'
94
+ );
95
+ },
96
+ },
97
+ methods: {
98
+ onStackClick() {
99
+ if (this.isWXLink) {
100
+ uni.showToast({
101
+ icon: 'none',
102
+ title: '[DevTool] 请在小程序真机调试模式下查看源码',
103
+ });
104
+ return;
105
+ }
106
+
107
+ if (!this.isUseDevSource) {
108
+ return;
109
+ }
110
+
111
+ if (isAndroid()) {
112
+ if (this.sourceFileServers && this.sourceFileServers.length > 0) {
113
+ this.openCode = true;
114
+ } else {
115
+ uni.showToast({
116
+ icon: 'none',
117
+ title: '[DevTool] sourceFileServers 配置异常',
118
+ });
119
+ if (uni?.__dev__console?.log) {
120
+ uni.__dev__console.log('[DevTool] sourceFileServers 配置异常');
121
+ }
122
+ }
123
+ } else {
124
+ this.openCode = true;
125
+ }
126
+ },
127
+ onCloseCode() {
128
+ this.openCode = false;
129
+ },
130
+ },
131
+ };
132
+ </script>
133
+
134
+ <style scoped>
135
+ .uni-event-item {
136
+ padding: 16px;
137
+ border-bottom: 1px solid var(--dev-tool-border-color);
138
+ box-sizing: border-box;
139
+ }
140
+
141
+ .uni-event-item-row {
142
+ display: flex;
143
+ align-items: center;
144
+ justify-content: space-between;
145
+ height: 28px;
146
+ word-break: break-all;
147
+ }
148
+
149
+ .uni-event-item-right {
150
+ text-align: right;
151
+ word-break: break-all;
152
+ }
153
+ .link {
154
+ cursor: pointer;
155
+ text-decoration: underline;
156
+ }
157
+ </style>
@@ -0,0 +1,127 @@
1
+ <template>
2
+ <view class="uni-event-content">
3
+ <DevToolTitle innerStyle="padding: 0 16px">事件触发统计</DevToolTitle>
4
+ <view class="uni-event-statistics">
5
+ <view class="uni-event-statistics-item">
6
+ <view>on: </view>
7
+ <Tag mode="log" style="flex: 1; justify-content: center">
8
+ {{ eventCount?.on ?? 0 }}
9
+ </Tag>
10
+ </view>
11
+ <view class="uni-event-statistics-item">
12
+ <view>once: </view>
13
+ <Tag mode="warn" style="flex: 1; justify-content: center">
14
+ {{ eventCount?.once ?? 0 }}
15
+ </Tag>
16
+ </view>
17
+ <view class="uni-event-statistics-item">
18
+ <view>emit: </view>
19
+ <Tag mode="main" style="flex: 1; justify-content: center">
20
+ {{ eventCount?.emit ?? 0 }}
21
+ </Tag>
22
+ </view>
23
+ <view class="uni-event-statistics-item">
24
+ <view>off: </view>
25
+ <Tag mode="error" style="flex: 1; justify-content: center">
26
+ {{ eventCount?.off ?? 0 }}
27
+ </Tag>
28
+ </view>
29
+ </view>
30
+ <DevToolTitle innerStyle="padding: 0 16px">
31
+ 事件触发列表
32
+
33
+ <Tag mode="clear" style="margin-left: auto" @click="handleClear">
34
+ 清空
35
+ </Tag>
36
+ </DevToolTitle>
37
+ <view class="uni-event-list">
38
+ <UniEventItem
39
+ v-for="item in eventList"
40
+ :eventItem="item"
41
+ :mode="mode"
42
+ :useDevSource="useDevSource"
43
+ :sourceFileServers="sourceFileServers"
44
+ :zIndex="zIndex"
45
+ :key="item.id"
46
+ ></UniEventItem>
47
+ <Empty v-if="!eventList || eventList.length === 0"> </Empty>
48
+ </view>
49
+ </view>
50
+ </template>
51
+
52
+ <script>
53
+ import DevToolTitle from '../DevToolTitle/index.vue';
54
+ import UniEventItem from './UniEventItem.vue';
55
+ import Tag from '../Tag/index.vue';
56
+ import Empty from '../Empty/index.vue';
57
+
58
+ export default {
59
+ components: {
60
+ DevToolTitle,
61
+ UniEventItem,
62
+ Tag,
63
+ Empty,
64
+ },
65
+ props: {
66
+ eventList: {
67
+ type: Array,
68
+ default: () => [],
69
+ },
70
+ eventCount: {
71
+ type: Object,
72
+ default: () => ({}),
73
+ },
74
+ useDevSource: {
75
+ type: Boolean,
76
+ default: false,
77
+ },
78
+ mode: {
79
+ type: String,
80
+ default: '',
81
+ },
82
+ sourceFileServers: {
83
+ type: Array,
84
+ default: () => [],
85
+ },
86
+ zIndex: {
87
+ type: Number,
88
+ default: 0,
89
+ },
90
+ },
91
+ methods: {
92
+ handleClear() {
93
+ this.$emit('clear');
94
+ },
95
+ },
96
+ };
97
+ </script>
98
+
99
+ <style scoped>
100
+ .uni-event-content {
101
+ height: 100%;
102
+ overflow: auto;
103
+ font-size: var(--dev-tool-base-font-size);
104
+ }
105
+
106
+ .uni-event-statistics {
107
+ display: flex;
108
+ align-items: center;
109
+ justify-content: space-around;
110
+ padding: 0 16px;
111
+ height: 32px;
112
+ box-sizing: border-box;
113
+ gap: 12px;
114
+ }
115
+ .uni-event-statistics-item {
116
+ display: flex;
117
+ align-items: center;
118
+ width: 25%;
119
+ }
120
+ .uni-event-statistics-item view:first-child {
121
+ margin-right: 8px;
122
+ }
123
+ .uni-event-list {
124
+ height: calc(100% - 32px * 3);
125
+ overflow: auto;
126
+ }
127
+ </style>
@@ -0,0 +1,204 @@
1
+ <template>
2
+ <view class="upload-detail" :style="{ zIndex: zIndex }">
3
+ <view class="upload-detail-control">
4
+ <Tag
5
+ v-for="item in selectItems"
6
+ :active="currentSelect === item.value"
7
+ :mode="item.mode"
8
+ :key="item.value"
9
+ @click="onSelect(item)"
10
+ >
11
+ {{ item.label }}
12
+ </Tag>
13
+
14
+ <CloseButton style="margin-left: auto" @click="onClose" />
15
+ </view>
16
+
17
+ <view class="upload-detail-header" v-if="currentSelect === 'header'">
18
+ <view class="upload-detail-title">常规</view>
19
+ <view class="net-detail-item">
20
+ <view>请求url:</view>
21
+ <view>{{ upload.url }}</view>
22
+ </view>
23
+ <view class="net-detail-item">
24
+ <view>请求方法:</view>
25
+ <Tag mode="info">{{ upload.method ?? 'POST' }}</Tag>
26
+ </view>
27
+ <view class="net-detail-item">
28
+ <view>状态代码:</view>
29
+ <Tag mode="info">{{ upload.status }}</Tag>
30
+ </view>
31
+ <view class="upload-detail-title">请求头</view>
32
+ <view
33
+ class="net-detail-item"
34
+ v-for="item in upload?.headers?.requestHeader"
35
+ :key="item.key"
36
+ >
37
+ <view>{{ item.key }}:</view>
38
+ {{ item.value }}
39
+ </view>
40
+ </view>
41
+
42
+ <template v-if="currentSelect === 'formdata'">
43
+ <template v-if="formData?.type === 'object'">
44
+ <JsonPretty :data="formData.value" />
45
+ </template>
46
+ <view
47
+ v-else-if="formData?.type === 'string'"
48
+ class="upload-detail-payload"
49
+ >
50
+ {{ formData.value }}
51
+ </view>
52
+ <Empty v-else />
53
+ </template>
54
+
55
+ <template v-if="currentSelect === 'response'">
56
+ <template v-if="response?.type === 'object'">
57
+ <JsonPretty :data="response.value" virtual />
58
+ </template>
59
+ <view
60
+ v-else-if="response?.type === 'string'"
61
+ class="upload-detail-payload"
62
+ >
63
+ {{ response.value }}
64
+ </view>
65
+ <Empty v-else />
66
+ </template>
67
+ </view>
68
+ </template>
69
+
70
+ <script>
71
+ import JsonPretty from '../JsonPretty/index.vue';
72
+ import Tag from '../Tag/index.vue';
73
+ import Empty from '../Empty/index.vue';
74
+ import CloseButton from '../CloseButton/index.vue';
75
+
76
+ export default {
77
+ components: {
78
+ JsonPretty,
79
+ Tag,
80
+ Empty,
81
+ CloseButton,
82
+ },
83
+ props: {
84
+ upload: {
85
+ type: Object,
86
+ required: true,
87
+ },
88
+ zIndex: {
89
+ type: Number,
90
+ default: 1001,
91
+ },
92
+ },
93
+ data() {
94
+ return {
95
+ currentSelect: 'header',
96
+ selectItems: [
97
+ {
98
+ label: 'header',
99
+ value: 'header',
100
+ mode: 'info',
101
+ },
102
+ {
103
+ label: 'formdata',
104
+ value: 'formdata',
105
+ mode: 'info',
106
+ },
107
+ {
108
+ label: 'response',
109
+ value: 'response',
110
+ mode: 'info',
111
+ },
112
+ ],
113
+ };
114
+ },
115
+ computed: {
116
+ formData() {
117
+ try {
118
+ if (this.upload.formData) {
119
+ return {
120
+ value: JSON.parse(JSON.stringify(this.upload.formData)),
121
+ type: 'object',
122
+ };
123
+ }
124
+ return {
125
+ value: {},
126
+ type: 'empty',
127
+ };
128
+ } catch (error) {
129
+ return {
130
+ value: JSON.parse(JSON.stringify(this.upload.formData)),
131
+ type: 'object',
132
+ };
133
+ }
134
+ },
135
+ response() {
136
+ try {
137
+ if (this.upload.response) {
138
+ return {
139
+ value: JSON.parse(JSON.stringify(this.upload.response)),
140
+ type: 'object',
141
+ };
142
+ }
143
+ return {
144
+ value: {},
145
+ type: 'empty',
146
+ };
147
+ } catch (error) {
148
+ return {
149
+ value: this.upload.response,
150
+ type: this.upload.response ? 'string' : 'empty',
151
+ };
152
+ }
153
+ },
154
+ },
155
+ methods: {
156
+ onSelect(item) {
157
+ this.currentSelect = item.value;
158
+ },
159
+ onClose() {
160
+ this.$emit('close');
161
+ },
162
+ },
163
+ };
164
+ </script>
165
+
166
+ <style scoped>
167
+ .upload-detail {
168
+ position: fixed;
169
+ width: 100vw;
170
+ height: 100vh;
171
+ z-index: 1001;
172
+ top: 0;
173
+ left: 0;
174
+ padding: 0 16px;
175
+ background-color: var(--dev-tool-bg2-color);
176
+ box-sizing: border-box;
177
+ transform: background-color 0.3s;
178
+ }
179
+ .upload-detail .upload-detail-control {
180
+ display: flex;
181
+ align-items: center;
182
+ margin-bottom: 4px;
183
+ gap: 12px;
184
+ height: 32px;
185
+ border-bottom: 1px solid transparent;
186
+ box-sizing: border-box;
187
+ }
188
+
189
+ .upload-detail .upload-detail-header .net-detail-item {
190
+ display: flex;
191
+ align-items: center;
192
+ min-height: 28px;
193
+ word-break: break-all;
194
+ }
195
+ .upload-detail .upload-detail-header .net-detail-item > view:first-child {
196
+ white-space: nowrap;
197
+ margin-right: 8px;
198
+ color: var(--dev-tool-info-color);
199
+ }
200
+ .upload-detail .upload-detail-payload {
201
+ word-break: break-all;
202
+ max-width: 100%;
203
+ }
204
+ </style>
@@ -0,0 +1,134 @@
1
+ <template>
2
+ <view class="upload-item">
3
+ <view class="upload-url-row">
4
+ <Tag mode="info">POST</Tag>
5
+ <view class="upload-url" v-html="upload.url" />
6
+ <Tag
7
+ mode="main"
8
+ class="upload-detail-icon"
9
+ @click="showDetail = !showDetail"
10
+ >详情</Tag
11
+ >
12
+ </view>
13
+ <view class="upload-info">
14
+ <view>
15
+ <Tag v-if="upload.status === 'pending'" mode="info">
16
+ {{ upload.status }}
17
+ </Tag>
18
+ <Tag v-if="upload.status === 'uploading'" mode="warn">
19
+ {{ upload.status }}
20
+ </Tag>
21
+ <Tag v-if="upload.status === 'success'" mode="success">
22
+ {{ upload.status }}
23
+ </Tag>
24
+ <Tag v-if="upload.status === 'error'" mode="error">
25
+ {{ upload.status }}
26
+ </Tag>
27
+ </view>
28
+ <view>进度: {{ upload.progress }}%</view>
29
+ <view>
30
+ 开始:
31
+ {{ upload.startTime ? formatDate(upload.startTime, ' HH:mm:ss') : '-' }}
32
+ </view>
33
+ <view>
34
+ 结束:
35
+ {{ upload.endTime ? formatDate(upload.endTime, ' HH:mm:ss') : '-' }}
36
+ </view>
37
+ </view>
38
+ </view>
39
+ <UploadDetail
40
+ v-if="showDetail"
41
+ :upload="upload"
42
+ :zIndex="zIndex"
43
+ @close="onClose"
44
+ />
45
+ </template>
46
+
47
+ <script>
48
+ import Tag from '../Tag/index.vue';
49
+ import UploadDetail from './UploadDetail.vue';
50
+ import { formatDate } from '../../utils';
51
+
52
+ export default {
53
+ components: {
54
+ Tag,
55
+ UploadDetail,
56
+ },
57
+ props: {
58
+ /** @type {{url: string; status: string; progress: string; startTime: string; endTime: string}} */
59
+ upload: {
60
+ type: Object,
61
+ required: true,
62
+ },
63
+ zIndex: {
64
+ type: Number,
65
+ default: 1000,
66
+ },
67
+ },
68
+ data() {
69
+ return {
70
+ showDetail: false,
71
+ };
72
+ },
73
+ methods: {
74
+ onClose() {
75
+ this.showDetail = false;
76
+ },
77
+ formatDate, // 引入工具函数
78
+ },
79
+ };
80
+ </script>
81
+
82
+ <style scoped>
83
+ .upload-item {
84
+ padding: 16px;
85
+ border-bottom: 1px solid var(--dev-tool-border-color);
86
+ font-size: var(--dev-tool-base-font-size);
87
+ }
88
+ .upload-item .upload-url-row {
89
+ display: flex;
90
+ align-items: center;
91
+ word-break: break-all;
92
+ }
93
+ .websocket-item .websocket-url-row .websocket-url {
94
+ margin-left: 4px;
95
+ flex: 1;
96
+ white-space: nowrap;
97
+ overflow: hidden;
98
+ text-overflow: ellipsis;
99
+ }
100
+
101
+ .upload-item .upload-url-row .upload-detail-icon {
102
+ flex-shrink: 0;
103
+ margin-left: auto;
104
+ }
105
+ .upload-url {
106
+ margin-left: 4px;
107
+ flex: 1;
108
+ white-space: nowrap;
109
+ overflow: hidden;
110
+ text-overflow: ellipsis;
111
+ }
112
+ .upload-item .upload-url-row .upload-detail-active {
113
+ transform: rotate(135deg);
114
+ }
115
+ .upload-item .upload-info {
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: space-between;
119
+ margin-top: 4px;
120
+ color: var(--dev-tool-text-color);
121
+ }
122
+
123
+ .slide-fade-enter-active {
124
+ transition: all 0.8s ease-out;
125
+ }
126
+ .slide-fade-leave-active {
127
+ transition: all 0.8s cubic-bezier(1, 0.5, 0.8, 1);
128
+ }
129
+ .slide-fade-enter-from,
130
+ .slide-fade-leave-to {
131
+ transform: translateY(20px);
132
+ opacity: 0;
133
+ }
134
+ </style>