vite-uni-dev-tool 0.0.16 → 0.0.18

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 (44) hide show
  1. package/README.md +12 -0
  2. package/dist/devIntercept/index.d.ts.map +1 -1
  3. package/dist/devIntercept/index.js +139 -137
  4. package/dist/devStore/index.js +1 -1
  5. package/dist/type.d.ts +5 -1
  6. package/dist/type.d.ts.map +1 -1
  7. package/dist/v2/{CloseButton → CircularButton}/index.vue +5 -2
  8. package/dist/v2/NetworkList/NetworkDetail.vue +3 -3
  9. package/dist/v2/NetworkList/NetworkItem.vue +5 -3
  10. package/dist/v2/SettingList/index.vue +1 -1
  11. package/dist/v2/SourceCode/index.vue +3 -3
  12. package/dist/v2/StorageList/index.vue +7 -3
  13. package/dist/v2/Tabs/index.vue +3 -3
  14. package/dist/v2/UploadList/UploadDetail.vue +3 -3
  15. package/dist/v2/WebSocket/WebSocketList.vue +3 -3
  16. package/dist/v3/AppInfo/index.vue +2 -1
  17. package/dist/v3/{CloseButton → CircularButton}/index.vue +4 -2
  18. package/dist/v3/ConsoleList/ConsoleItem.vue +44 -96
  19. package/dist/v3/ConsoleList/index.vue +2 -0
  20. package/dist/v3/DevTool/index.vue +4 -4
  21. package/dist/v3/DevToolWindow/index.vue +182 -19
  22. package/dist/v3/DeviceInfo/index.vue +2 -1
  23. package/dist/v3/FilterSelect/index.vue +166 -0
  24. package/dist/v3/JsonPretty/index.vue +2 -0
  25. package/dist/v3/NetworkList/NetworkDetail.vue +12 -8
  26. package/dist/v3/NetworkList/NetworkItem.vue +56 -26
  27. package/dist/v3/NetworkList/NetworkSend.vue +701 -0
  28. package/dist/v3/NetworkList/const.d.ts +5 -0
  29. package/dist/v3/NetworkList/const.d.ts.map +1 -0
  30. package/dist/v3/NetworkList/const.ts +4 -0
  31. package/dist/v3/NetworkList/index.vue +104 -21
  32. package/dist/v3/PiniaList/index.vue +5 -4
  33. package/dist/v3/SettingList/index.vue +3 -3
  34. package/dist/v3/SourceCode/index.vue +22 -8
  35. package/dist/v3/StorageList/index.vue +9 -6
  36. package/dist/v3/SystemInfo/index.vue +2 -1
  37. package/dist/v3/Tabs/index.vue +2 -2
  38. package/dist/v3/UniEvent/UniEventItem.vue +6 -54
  39. package/dist/v3/UniEvent/index.vue +2 -0
  40. package/dist/v3/UploadList/UploadDetail.vue +2 -2
  41. package/dist/v3/VuexList/index.vue +4 -2
  42. package/dist/v3/WebSocket/WebSocketList.vue +2 -2
  43. package/dist/v3/WindowInfo/index.vue +2 -1
  44. package/package.json +1 -1
@@ -0,0 +1,701 @@
1
+ <template>
2
+ <view class="network-send" :style="{ zIndex: zIndex }">
3
+ <view class="network-send-form">
4
+ <view class="network-send-control">
5
+ <DevToolTitle>超时时间</DevToolTitle>
6
+ </view>
7
+ <input
8
+ class="network-input"
9
+ :value="state.timeout"
10
+ @input="onChangeState($event, 'timeout')"
11
+ />
12
+ <view class="network-send-control">
13
+ <DevToolTitle>请求方式</DevToolTitle>
14
+ <CircularButton style="margin-left: auto" text="×" @click="onClose" />
15
+ </view>
16
+ <radio-group class="radio-group" @change="onChangeRequestMethod">
17
+ <label
18
+ class="radio-group-item"
19
+ v-for="item in requestMethods"
20
+ :key="item.value"
21
+ >
22
+ <radio
23
+ size
24
+ style="transform: scale(0.8)"
25
+ :value="item.value"
26
+ :checked="item.value === state.method"
27
+ />
28
+
29
+ <view>{{ item.name }}</view>
30
+ </label>
31
+ </radio-group>
32
+ <view class="network-send-control">
33
+ <DevToolTitle>请求头</DevToolTitle>
34
+ <CircularButton
35
+ style="margin-left: auto"
36
+ text="+"
37
+ @click="onAddHeader"
38
+ />
39
+ </view>
40
+
41
+ <view class="network-header-list">
42
+ <checkbox-group
43
+ v-if="headerList.length > 0"
44
+ @change="onChangeHeaderChecked"
45
+ >
46
+ <view
47
+ class="network-header-item"
48
+ v-for="(item, index) in headerList"
49
+ :key="item.id"
50
+ >
51
+ <checkbox :checked="item.checked" />
52
+ <input
53
+ class="network-input"
54
+ placeholder="请输入请求头名称"
55
+ placeholderStyle="font-size: 12px"
56
+ :value="item.key"
57
+ @input="onChangeHeader($event, 'key', index)"
58
+ />
59
+ <input
60
+ class="network-input"
61
+ placeholder="请输入请求头值"
62
+ placeholderStyle="font-size: 12px"
63
+ :value="item.value"
64
+ @input="onChangeHeader($event, 'value', index)"
65
+ />
66
+ <CircularButton
67
+ style="margin-left: 6px"
68
+ text="一"
69
+ @click="onDeleteHeader(item)"
70
+ />
71
+ </view>
72
+ </checkbox-group>
73
+
74
+ <view class="network-empty" v-else> 暂无请求头 </view>
75
+ </view>
76
+ <DevToolTitle>请求地址</DevToolTitle>
77
+ <textarea
78
+ placeholder="请输入请求地址"
79
+ placeholderStyle="font-size: 12px"
80
+ class="network-textarea"
81
+ :value="state.url"
82
+ @input="onChangeUrl"
83
+ />
84
+ <view class="form-error-message">
85
+ {{ hasUrl ? '' : '请输入请求地址' }}
86
+ </view>
87
+
88
+ <view class="network-send-control">
89
+ <DevToolTitle>请求参数(query)</DevToolTitle>
90
+ <CircularButton
91
+ style="margin-left: auto"
92
+ text="+"
93
+ @click="onAddQuery"
94
+ />
95
+ </view>
96
+ <view class="network-param-list">
97
+ <checkbox-group
98
+ v-if="queryList.length > 0"
99
+ @change="onChangeQueryChecked"
100
+ >
101
+ <view
102
+ class="network-param-item"
103
+ v-for="(item, index) in queryList"
104
+ :key="item.id"
105
+ >
106
+ <checkbox :checked="item.checked" :value="item.id" />
107
+ <input
108
+ class="network-input"
109
+ placeholder="请输入参数名称"
110
+ placeholderStyle="font-size: 12px"
111
+ :value="item.key"
112
+ @input="onChangeQuery($event, 'key', index)"
113
+ />
114
+ <input
115
+ class="network-input"
116
+ placeholder="请输入参数值"
117
+ placeholderStyle="font-size: 12px"
118
+ :value="item.value"
119
+ @input="onChangeQuery($event, 'value', index)"
120
+ />
121
+ <CircularButton
122
+ text="一"
123
+ style="margin-left: 6px"
124
+ @click="onDeleteQuery(item)"
125
+ />
126
+ </view>
127
+ </checkbox-group>
128
+
129
+ <view class="network-empty" v-else> 暂无请求参数 </view>
130
+ </view>
131
+
132
+ <template v-if="!noBodyRequestMethods.includes(state.method)">
133
+ <view class="network-send-control">
134
+ <DevToolTitle>请求体(body)</DevToolTitle>
135
+ </view>
136
+
137
+ <textarea
138
+ placeholder="请输入请求体"
139
+ class="network-textarea"
140
+ placeholderStyle="font-size: 12px"
141
+ :value="state.bodyText"
142
+ @input="onChangeState($event, 'bodyText')"
143
+ />
144
+ </template>
145
+
146
+ <view class="network-send-buttons">
147
+ <button size="mini" :disabled="!isFinished" @click="onDetail">
148
+ 详情
149
+ </button>
150
+ <button size="mini" @click="onReset">重置</button>
151
+ <button size="mini" @click="onSend">发送</button>
152
+ </view>
153
+
154
+ <NetworkDetail
155
+ v-show="showDetail"
156
+ :network="network"
157
+ @close="onCloseDetail"
158
+ />
159
+ </view>
160
+ </view>
161
+ </template>
162
+ <script lang="ts" setup>
163
+ import { ref, reactive, onMounted } from 'vue';
164
+ import CircularButton from '../CircularButton/index.vue';
165
+ import DevToolTitle from '../DevToolTitle/index.vue';
166
+ import NetworkDetail from './NetworkDetail.vue';
167
+ import type { DevTool } from '../../type';
168
+
169
+ const props = defineProps<{ network: DevTool.NetworkItem; zIndex?: number }>();
170
+
171
+ const emit = defineEmits<{ (e: 'close'): void }>();
172
+
173
+ const requestMethods = [
174
+ { name: 'GET', value: 'GET' },
175
+ { name: 'POST', value: 'POST' },
176
+ { name: 'PUT', value: 'PUT' },
177
+ { name: 'DELETE', value: 'DELETE' },
178
+ { name: 'PATCH', value: 'PATCH' },
179
+ { name: 'OPTIONS', value: 'OPTIONS' },
180
+ { name: 'HEAD', value: 'HEAD' },
181
+ ];
182
+
183
+ const hasUrl = ref(true);
184
+
185
+ const state = reactive<{
186
+ method: any;
187
+ url: string;
188
+ bodyText: string;
189
+ timeout: number;
190
+ }>({
191
+ method: 'GET',
192
+ url: 'http://192.168.0.1:8080/a?a=123',
193
+ bodyText: '',
194
+ timeout: 60 * 1000,
195
+ });
196
+
197
+ const defaultHeader = [
198
+ {
199
+ id: 1,
200
+ key: 'Accept',
201
+ value: '*/*',
202
+ checked: false,
203
+ },
204
+ {
205
+ id: 2,
206
+ key: 'Accept-Language',
207
+ value: 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
208
+ checked: false,
209
+ },
210
+ {
211
+ id: 3,
212
+ key: 'Cache-Control',
213
+ value: 'no-cache',
214
+ checked: false,
215
+ },
216
+ {
217
+ id: 4,
218
+ key: 'Content-Type',
219
+ value: 'application/json; charset=utf-8',
220
+ checked: true,
221
+ },
222
+ ];
223
+
224
+ type PB = {
225
+ id: number;
226
+ key: string;
227
+ value: string;
228
+ checked: boolean;
229
+ };
230
+
231
+ const headerList = reactive([...defaultHeader]);
232
+
233
+ const queryList = reactive<PB[]>([
234
+ {
235
+ id: 1,
236
+ key: 'a',
237
+ value: '123',
238
+ checked: true,
239
+ },
240
+ ]);
241
+
242
+ const isFinished = ref(false);
243
+
244
+ const showDetail = ref(false);
245
+
246
+ const network = reactive<DevTool.NetworkItem>({
247
+ index: 0,
248
+ url: '',
249
+ name: '',
250
+ method: '',
251
+ status: '',
252
+ time: '',
253
+ startTime: 0,
254
+ endTime: 0,
255
+ size: '',
256
+ headers: {
257
+ requestHeader: [],
258
+ responseHeader: [],
259
+ },
260
+ response: '',
261
+ payload: undefined,
262
+ });
263
+
264
+ const noBodyRequestMethods = ['GET', 'HEAD', 'PATCH', 'OPTIONS'];
265
+
266
+ function onChangeState(e: any, key: keyof typeof state) {
267
+ state[key] = e.detail.value as never;
268
+ }
269
+
270
+ function parseUrlToList(url: string) {
271
+ if (url.includes('?')) {
272
+ const query = url.split('?')[1];
273
+ const queryObject = urlParamsToObject(query);
274
+ const list = objectToArray(queryObject);
275
+
276
+ return list;
277
+ }
278
+ return [];
279
+ }
280
+
281
+ function parseListToUrl(list: PB[]) {
282
+ const baseUrl = state.url.split('?')[0] || '';
283
+ if (list.length === 0) {
284
+ return baseUrl;
285
+ } else {
286
+ return (
287
+ baseUrl + '?' + arrayToUrlParams(queryList?.filter((q) => q.checked))
288
+ );
289
+ }
290
+ }
291
+
292
+ function onChangeUrl(e: any) {
293
+ const url = e.detail.value;
294
+ state.url = url;
295
+ const list = parseUrlToList(url);
296
+ queryList.splice(0, queryList.length, ...list);
297
+ }
298
+
299
+ function onDetail() {
300
+ showDetail.value = true;
301
+ }
302
+
303
+ function onCloseDetail() {
304
+ showDetail.value = false;
305
+ }
306
+
307
+ function onReset() {
308
+ isFinished.value = false;
309
+ hasUrl.value = true;
310
+ state.method = 'GET';
311
+ state.url = '';
312
+ state.bodyText = '';
313
+ headerList.splice(0, headerList.length, ...defaultHeader);
314
+ queryList.splice(0, queryList.length);
315
+ }
316
+
317
+ function onClose() {
318
+ emit('close');
319
+ onReset();
320
+ }
321
+
322
+ function onSend() {
323
+ if (!state.url) {
324
+ hasUrl.value = false;
325
+ uni.showToast({
326
+ title: '请输入请求地址',
327
+ icon: 'none',
328
+ });
329
+ return;
330
+ }
331
+ hasUrl.value = true;
332
+
333
+ const header = arrayToObject(headerList);
334
+ const query = arrayToUrlParams(queryList);
335
+
336
+ const requestOptions: UniNamespace.RequestOptions = {
337
+ url: state.url,
338
+ method: state.method,
339
+ timeout: state.timeout,
340
+ header,
341
+ };
342
+
343
+ if (noBodyRequestMethods.includes(state.method)) {
344
+ // 不支持携带 body 参数
345
+ requestOptions.data = {};
346
+ state.url = parseListToUrl(queryList);
347
+ } else {
348
+ // 支持 url 中携带参数
349
+
350
+ if (state.url.includes('?')) {
351
+ requestOptions.url = state.url + '&' + query;
352
+ } else {
353
+ requestOptions.url = state.url + '?' + query;
354
+ }
355
+
356
+ // 支持携带 body 参数
357
+ if (state.bodyText?.trim()) {
358
+ try {
359
+ const bodyJson = JSON.parse(state.bodyText);
360
+ requestOptions.data = bodyJson;
361
+ } catch (error) {
362
+ uni.showToast({
363
+ title: '请求体请输入正确的JSON格式',
364
+ icon: 'none',
365
+ });
366
+ return;
367
+ }
368
+ }
369
+ }
370
+
371
+ isFinished.value = false;
372
+
373
+ uni.showLoading({
374
+ title: '发送中...',
375
+ mask: true,
376
+ });
377
+
378
+ const baseUrl = requestOptions.url?.split('?')[0] || '';
379
+ const lastSlashIndex = baseUrl.lastIndexOf('/');
380
+ const name = lastSlashIndex !== -1 ? baseUrl.slice(lastSlashIndex + 1) : '';
381
+
382
+ network.startTime = Date.now();
383
+
384
+ uni.request({
385
+ ...requestOptions,
386
+ complete: (res: any) => {
387
+ // 赋值结果
388
+ network.url = requestOptions.url;
389
+ network.name = name;
390
+ network.method = requestOptions.method as string;
391
+ network.payload = requestOptions.data
392
+ ? JSON.stringify(requestOptions.data)
393
+ : '';
394
+ network.endTime = Date.now();
395
+ network.status = res.statusCode ?? 'error';
396
+ const diff = network.endTime - network.startTime;
397
+ network.time = diff < 1000 ? diff + 'ms' : diff / 1000 + 's';
398
+ const len =
399
+ res?.header?.['Content-Length'] || res?.header?.['content-length'] || 0;
400
+ network.size = len > 1024 ? (len / 1024).toFixed(2) + 'k' : len + 'b';
401
+ network.response = res;
402
+ network.headers.requestHeader = Object.entries(
403
+ requestOptions?.header ?? {},
404
+ ).map(([key, value]) => ({
405
+ key,
406
+ value,
407
+ }));
408
+ network.headers.responseHeader = Object.entries(res?.header ?? {}).map(
409
+ ([key, value]) => ({
410
+ key,
411
+ value,
412
+ }),
413
+ );
414
+
415
+ // 完成
416
+ uni.hideLoading();
417
+ isFinished.value = true;
418
+ uni.showToast({
419
+ title: '请求完成,点击左下角详情进行查看结果',
420
+ icon: 'none',
421
+ });
422
+ },
423
+ });
424
+ }
425
+
426
+ function onChangeRequestMethod(e: any) {
427
+ const method = e.detail.value;
428
+ state.method = method;
429
+ }
430
+
431
+ function onDeleteHeader(item: any) {
432
+ const index = headerList.findIndex((i) => i.id === item.id);
433
+ headerList.splice(index, 1);
434
+ }
435
+
436
+ function onAddHeader() {
437
+ const id = Date.now();
438
+ headerList.push({
439
+ id,
440
+ key: '',
441
+ value: '',
442
+ checked: false,
443
+ });
444
+ }
445
+
446
+ function onChangeHeaderChecked(e: any) {
447
+ const list = e.detail?.value ?? [];
448
+ headerList.forEach((q) => {
449
+ q.checked = list?.includes(q.id);
450
+ });
451
+ }
452
+
453
+ function onChangeHeader(e: any, key: 'key' | 'value', index: number) {
454
+ headerList[index][key] = e.detail.value;
455
+ }
456
+
457
+ function onDeleteQuery(item: any) {
458
+ const index = queryList.findIndex((i) => i.id === item.id);
459
+ queryList.splice(index, 1);
460
+ }
461
+ function onAddQuery() {
462
+ const id = Date.now();
463
+ queryList.push({
464
+ id,
465
+ key: '',
466
+ value: '',
467
+ checked: false,
468
+ });
469
+ }
470
+ function onChangeQueryChecked(e: any) {
471
+ const list = e.detail?.value ?? [];
472
+ queryList.forEach((q) => {
473
+ q.checked = list?.includes(q.id);
474
+ });
475
+
476
+ state.url = parseListToUrl(queryList);
477
+ }
478
+
479
+ function onChangeQuery(e: any, key: 'key' | 'value', index: number) {
480
+ queryList[index][key] = e.detail.value;
481
+
482
+ state.url = parseListToUrl(queryList);
483
+ }
484
+
485
+ function arrayToObject(arr: any[]) {
486
+ return arr.reduce((acc, cur) => {
487
+ if (cur.checked) {
488
+ acc[cur.key] = cur.value;
489
+ }
490
+ return acc;
491
+ }, {});
492
+ }
493
+
494
+ function objectToArray<T extends Record<string, any>>(obj: T) {
495
+ return Object.entries(obj).map(([key, value]) => ({
496
+ id: Date.now(),
497
+ key,
498
+ value,
499
+ checked: true,
500
+ }));
501
+ }
502
+
503
+ function objectToUrlParams(obj: any) {
504
+ return Object.keys(obj)
505
+ .map((key) => `${key}=${encodeURIComponent(obj[key])}`)
506
+ .join('&');
507
+ }
508
+
509
+ function arrayToUrlParams(arr: any[]) {
510
+ return arr
511
+ .map((item) => `${item.key}=${encodeURIComponent(item.value)}`)
512
+ ?.join('&');
513
+ }
514
+
515
+ function unionArrayByKey<T>(arr1: T[], arr2: T[], key: keyof T): T[] {
516
+ const map = new Map();
517
+ arr1.forEach((item) => {
518
+ map.set(item?.[key], item);
519
+ });
520
+ arr2.forEach((item) => {
521
+ if (map.has(item?.[key])) {
522
+ map.set(item?.[key], { ...map.get(item?.[key]), ...item });
523
+ } else {
524
+ map.set(item?.[key], item);
525
+ }
526
+ });
527
+ return Array.from(map.values());
528
+ }
529
+
530
+ function urlParamsToObject(urlParams: string) {
531
+ return urlParams.split('&').reduce(
532
+ (acc, cur) => {
533
+ const [key, value] = cur.split('=');
534
+ acc[key] = value;
535
+ return acc;
536
+ },
537
+ {} as Record<string, any>,
538
+ );
539
+ }
540
+
541
+ /**
542
+ * 处理重发参数
543
+ */
544
+ function handleResendNetwork() {
545
+ // 如果没有网络数据或尚未开始,则直接返回
546
+ if (!props.network || props.network.startTime === 0) return;
547
+
548
+ // 设置基础请求信息
549
+ state.url = props.network.url;
550
+ state.method = props.network.method?.toUpperCase() ?? 'GET';
551
+
552
+ // 初始化请求头
553
+ const requestHeaders =
554
+ props.network.headers?.requestHeader?.map((item, index) => {
555
+ return {
556
+ ...item,
557
+ checked: true,
558
+ id: index,
559
+ };
560
+ }) ?? [];
561
+
562
+ headerList.splice(0, headerList.length, ...requestHeaders);
563
+
564
+ queryList.splice(0, queryList.length);
565
+
566
+ // 解析参数
567
+ if (noBodyRequestMethods.includes(state.method)) {
568
+ // 参数在 query 中
569
+ if (props.network.url.includes('?')) {
570
+ const urlParams = objectToArray(
571
+ urlParamsToObject(props.network.url.split('?')?.[1] ?? ''),
572
+ );
573
+ const payloadParams = objectToArray(props.network.payload);
574
+
575
+ const list = unionArrayByKey(urlParams, payloadParams, 'key');
576
+
577
+ queryList.splice(0, queryList.length, ...list);
578
+ }
579
+ } else {
580
+ // 参数在 query 中
581
+ if (props.network.url.includes('?')) {
582
+ const urlParams = objectToArray(
583
+ urlParamsToObject(props.network.url.split('?')?.[1] ?? ''),
584
+ );
585
+ queryList.splice(0, queryList.length, ...urlParams);
586
+ }
587
+ state.bodyText = JSON.stringify(props.network.payload);
588
+ }
589
+ }
590
+
591
+ onMounted(() => {
592
+ handleResendNetwork();
593
+ });
594
+ </script>
595
+
596
+ <style scoped>
597
+ .network-send {
598
+ position: fixed;
599
+ width: 100vw;
600
+ height: 100%;
601
+ z-index: 5;
602
+ top: 0;
603
+ left: 0;
604
+ padding: 0 16px;
605
+ overflow: auto;
606
+
607
+ background-color: var(--dev-tool-bg3-color);
608
+ box-sizing: border-box;
609
+ }
610
+ .network-send .network-send-control {
611
+ display: flex;
612
+ align-items: center;
613
+ gap: 12px;
614
+ height: 32px;
615
+ border-bottom: 1px solid transparent;
616
+ box-sizing: border-box;
617
+ }
618
+
619
+ .network-send .network-send-control :deep(.tag) {
620
+ margin-right: 16px;
621
+ }
622
+ .network-send .network-send-control :deep(.tag):last-child {
623
+ margin-right: 0;
624
+ }
625
+
626
+ .radio-group {
627
+ display: flex;
628
+ flex-wrap: wrap;
629
+ }
630
+
631
+ .radio-group .radio-group-item {
632
+ display: flex;
633
+ align-items: center;
634
+ width: 25%;
635
+ margin-bottom: 6px;
636
+ }
637
+
638
+ .network-input {
639
+ padding: 0 6px;
640
+ height: 24px;
641
+ font-size: 12px;
642
+ border: 1px solid var(--dev-tool-border-color);
643
+ }
644
+ .network-textarea {
645
+ padding: 6px;
646
+ width: 100%;
647
+ box-sizing: border-box;
648
+ font-size: 12px;
649
+ border: 1px solid var(--dev-tool-border-color);
650
+ }
651
+ .form-error-message {
652
+ padding: 0 6px;
653
+ height: 24px;
654
+ line-height: 24px;
655
+ color: red;
656
+ }
657
+
658
+ .network-header-list {
659
+ }
660
+
661
+ .network-header-item {
662
+ display: flex;
663
+ align-items: center;
664
+ }
665
+
666
+ .network-empty {
667
+ color: var(--dev-tool-info-color);
668
+ text-align: center;
669
+ }
670
+
671
+ .network-param-list {
672
+ }
673
+ .network-param-item {
674
+ display: flex;
675
+ align-items: center;
676
+ }
677
+
678
+ .network-body-data {
679
+ }
680
+ .network-body-data-item {
681
+ display: flex;
682
+ align-items: center;
683
+ }
684
+
685
+ .network-send-buttons {
686
+ position: sticky;
687
+ display: flex;
688
+ justify-content: space-between;
689
+ /* gap: 6px; */
690
+ width: 100%;
691
+ margin-top: 12px;
692
+ background-color: var(--dev-tool-bg3-color);
693
+ }
694
+ .network-send-buttons button {
695
+ width: 100%;
696
+ margin-right: 6px;
697
+ }
698
+ .network-send-buttons button:last-child {
699
+ margin: 0;
700
+ }
701
+ </style>
@@ -0,0 +1,5 @@
1
+ export declare const sortMap: {
2
+ '-1': string;
3
+ '1': string;
4
+ };
5
+ //# sourceMappingURL=const.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../../dev/v3/NetworkList/const.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO;;;CAGnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const sortMap = {
2
+ '-1': ' ↑ ',
3
+ '1': ' ↓ ',
4
+ };