vite-uni-dev-tool 1.0.0 → 1.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.
Files changed (168) hide show
  1. package/README.md +46 -0
  2. package/dist/const.cjs +1 -1
  3. package/dist/const.d.ts +12 -0
  4. package/dist/const.d.ts.map +1 -1
  5. package/dist/const.js +1 -1
  6. package/dist/core-shared.d.ts +1 -1
  7. package/dist/core-shared.d.ts.map +1 -1
  8. package/dist/core-shared.js +1 -1
  9. package/dist/core.d.ts +10 -3
  10. package/dist/core.d.ts.map +1 -1
  11. package/dist/core.js +2 -2
  12. package/dist/i18n/locales/en.cjs +1 -1
  13. package/dist/i18n/locales/en.d.ts +81 -0
  14. package/dist/i18n/locales/en.d.ts.map +1 -1
  15. package/dist/i18n/locales/en.js +1 -1
  16. package/dist/i18n/locales/zh-Hans.cjs +1 -1
  17. package/dist/i18n/locales/zh-Hans.d.ts +82 -1
  18. package/dist/i18n/locales/zh-Hans.d.ts.map +1 -1
  19. package/dist/i18n/locales/zh-Hans.js +1 -1
  20. package/dist/modules/devConsole/index.cjs +1 -1
  21. package/dist/modules/devConsole/index.js +3 -3
  22. package/dist/modules/devEvent/index.cjs +3 -3
  23. package/dist/modules/devEvent/index.d.ts +1 -0
  24. package/dist/modules/devEvent/index.d.ts.map +1 -1
  25. package/dist/modules/devEvent/index.js +3 -3
  26. package/dist/modules/devIntercept/index.cjs +14 -13
  27. package/dist/modules/devIntercept/index.d.ts +19 -0
  28. package/dist/modules/devIntercept/index.d.ts.map +1 -1
  29. package/dist/modules/devIntercept/index.js +14 -13
  30. package/dist/modules/devStore/index.cjs +1 -1
  31. package/dist/modules/devStore/index.d.ts +21 -0
  32. package/dist/modules/devStore/index.d.ts.map +1 -1
  33. package/dist/modules/devStore/index.js +1 -1
  34. package/dist/plugins/uniDevTool/transform/transformMain.cjs +1 -1
  35. package/dist/plugins/uniDevTool/transform/transformMain.js +1 -1
  36. package/dist/type.d.ts +47 -2
  37. package/dist/type.d.ts.map +1 -1
  38. package/dist/utils/language.cjs +1 -1
  39. package/dist/utils/language.d.ts.map +1 -1
  40. package/dist/utils/language.js +1 -1
  41. package/dist/utils/object.cjs +1 -1
  42. package/dist/utils/object.d.ts.map +1 -1
  43. package/dist/utils/object.js +1 -1
  44. package/dist/v3/DevTool/components/BluetoothList/BluetoothItem.vue +199 -0
  45. package/dist/v3/DevTool/components/BluetoothList/BluetoothTool.vue +730 -0
  46. package/dist/v3/DevTool/components/BluetoothList/index.vue +167 -0
  47. package/dist/v3/{CaptureScreen → DevTool/components/CaptureScreen}/index.vue +109 -109
  48. package/dist/v3/{ConsoleList → DevTool/components/ConsoleList}/ConsoleItem.vue +225 -224
  49. package/dist/v3/{ConsoleList → DevTool/components/ConsoleList}/RunJSInput.vue +247 -249
  50. package/dist/v3/{ConsoleList → DevTool/components/ConsoleList}/index.vue +171 -160
  51. package/dist/v3/{ConsoleList → DevTool/components/ConsoleList}/staticTips.ts +1145 -1145
  52. package/dist/v3/{DevToolButton → DevTool/components/DevToolButton}/index.vue +7 -4
  53. package/dist/v3/{DevToolTitle → DevTool/components/DevToolTitle}/index.vue +24 -24
  54. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/DevToolOverlay.vue +197 -182
  55. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/const.ts +28 -5
  56. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/hooks/dataUtils.ts +48 -48
  57. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/hooks/useDevToolData.ts +387 -338
  58. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/hooks/useDevToolHandlers.ts +629 -549
  59. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/hooks/useDevToolOverlay.ts +197 -184
  60. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/index.vue +67 -16
  61. package/dist/v3/{ElEvent → DevTool/components/ElEvent}/ElEventItem.vue +105 -105
  62. package/dist/v3/{ElEvent → DevTool/components/ElEvent}/index.vue +106 -109
  63. package/dist/v3/{Instance → DevTool/components/Instance}/components/InstanceTreeNode.vue +265 -265
  64. package/dist/v3/{Instance → DevTool/components/Instance}/flatten.ts +226 -226
  65. package/dist/v3/{Instance → DevTool/components/Instance}/index.vue +94 -94
  66. package/dist/v3/{Instance → DevTool/components/Instance}/registry.ts +49 -49
  67. package/dist/v3/{Instance → DevTool/components/Instance}/transformTree.ts +375 -375
  68. package/dist/v3/{Instance → DevTool/components/Instance}/transformTreeCtx.ts +268 -268
  69. package/dist/v3/{Instance → DevTool/components/Instance}/typing.d.ts +43 -43
  70. package/dist/v3/{InstanceDetail → DevTool/components/InstanceDetail}/index.vue +485 -485
  71. package/dist/v3/{JsonDetail → DevTool/components/JsonDetail}/index.vue +70 -70
  72. package/dist/v3/{NFCList → DevTool/components/NFCList}/NFCItem.vue +112 -113
  73. package/dist/v3/{NFCList → DevTool/components/NFCList}/NFCTool.vue +454 -478
  74. package/dist/v3/{NFCList → DevTool/components/NFCList}/const.ts +56 -56
  75. package/dist/v3/{NFCList → DevTool/components/NFCList}/index.vue +94 -98
  76. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/InterceptConfig.vue +624 -608
  77. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/InterceptItem.vue +140 -140
  78. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/NetworkDetail.vue +287 -296
  79. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/NetworkIntercept.vue +88 -93
  80. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/NetworkItem.vue +163 -167
  81. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/NetworkSend.vue +589 -556
  82. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/const.ts +4 -4
  83. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/hooks/useNetworkForm.ts +86 -86
  84. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/index.vue +160 -160
  85. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/utils.ts +101 -101
  86. package/dist/v3/{Performance → DevTool/components/Performance}/index.vue +498 -495
  87. package/dist/v3/{Performance → DevTool/components/Performance}/modules/PerformanceMetrics.vue +153 -153
  88. package/dist/v3/{Performance → DevTool/components/Performance}/modules/PerformanceWidget.vue +12 -9
  89. package/dist/v3/{Performance → DevTool/components/Performance}/modules/usePerformanceChart.ts +460 -460
  90. package/dist/v3/{Performance → DevTool/components/Performance}/modules/usePerformanceData.ts +258 -258
  91. package/dist/v3/{PiniaList → DevTool/components/PiniaList}/index.vue +93 -94
  92. package/dist/v3/{RouteList → DevTool/components/RouteList}/index.vue +21 -24
  93. package/dist/v3/{RunJS → DevTool/components/RunJS}/index.vue +148 -148
  94. package/dist/v3/{ScanCodeList → DevTool/components/ScanCodeList}/ScanCodeItem.vue +97 -98
  95. package/dist/v3/{ScanCodeList → DevTool/components/ScanCodeList}/index.vue +100 -104
  96. package/dist/v3/{SettingButton → DevTool/components/SettingButton}/index.vue +45 -45
  97. package/dist/v3/{SettingList → DevTool/components/SettingList}/index.vue +218 -150
  98. package/dist/v3/DevTool/components/SettingList/modules/SettingBarrage.vue +304 -0
  99. package/dist/v3/{SettingList → DevTool/components/SettingList}/modules/SettingDevTool.vue +212 -208
  100. package/dist/v3/{SettingList → DevTool/components/SettingList}/modules/SettingInfo.vue +157 -119
  101. package/dist/v3/{SettingList → DevTool/components/SettingList}/modules/SettingLanguage.vue +74 -74
  102. package/dist/v3/{SettingList → DevTool/components/SettingList}/modules/SettingLog.vue +230 -230
  103. package/dist/v3/{SettingList → DevTool/components/SettingList}/modules/SettingNetwork.vue +3 -3
  104. package/dist/v3/{SettingList → DevTool/components/SettingList}/modules/SettingTheme.vue +37 -7
  105. package/dist/v3/{SettingList → DevTool/components/SettingList}/typing.d.ts +2 -2
  106. package/dist/v3/{SourceCode → DevTool/components/SourceCode}/Line.vue +127 -116
  107. package/dist/v3/{SourceCode → DevTool/components/SourceCode}/index.vue +8 -8
  108. package/dist/v3/{SourceCode → DevTool/components/SourceCode}/parseCode.ts +609 -701
  109. package/dist/v3/{StorageList → DevTool/components/StorageList}/index.vue +174 -174
  110. package/dist/v3/{TransferList → DevTool/components/TransferList}/TransferDetail.vue +268 -268
  111. package/dist/v3/{TransferList → DevTool/components/TransferList}/TransferItem.vue +4 -4
  112. package/dist/v3/{TransferList → DevTool/components/TransferList}/index.vue +8 -8
  113. package/dist/v3/{UniEvent → DevTool/components/UniEvent}/UniEventItem.vue +6 -7
  114. package/dist/v3/{UniEvent → DevTool/components/UniEvent}/index.vue +6 -6
  115. package/dist/v3/{VuexList → DevTool/components/VuexList}/index.vue +84 -84
  116. package/dist/v3/{WebSocket → DevTool/components/WebSocket}/WebSocketDetail.vue +8 -8
  117. package/dist/v3/{WebSocket → DevTool/components/WebSocket}/WebSocketItem.vue +4 -4
  118. package/dist/v3/{WebSocket → DevTool/components/WebSocket}/index.vue +8 -8
  119. package/dist/v3/DevTool/index.vue +179 -5
  120. package/dist/v3/{AppTransition → components/AppTransition}/index.vue +176 -170
  121. package/dist/v3/{AutoSizer → components/AutoSizer}/index.vue +192 -192
  122. package/dist/v3/{AutoSizer → components/AutoSizer}/index1.vue +184 -184
  123. package/dist/v3/{AutoSizer → components/AutoSizer}/utils.ts +49 -49
  124. package/dist/v3/components/Barrage/BarrageItem.vue +137 -0
  125. package/dist/v3/components/Barrage/index.vue +202 -0
  126. package/dist/v3/{CircularButton → components/CircularButton}/index.vue +84 -84
  127. package/dist/v3/{CustomSwiper → components/CustomSwiper}/CustomSwiperItem.vue +49 -49
  128. package/dist/v3/{CustomSwiper → components/CustomSwiper}/index.vue +104 -104
  129. package/dist/v3/{DraggableContainer → components/DraggableContainer}/index.vue +1 -1
  130. package/dist/v3/{Empty → components/Empty}/index.vue +29 -29
  131. package/dist/v3/{FilterInput → components/FilterInput}/index.vue +1 -1
  132. package/dist/v3/{FilterSelect → components/FilterSelect}/index.vue +179 -179
  133. package/dist/v3/{JsonPretty → components/JsonPretty}/components/Brackets/index.vue +27 -27
  134. package/dist/v3/{JsonPretty → components/JsonPretty}/components/Carets/index.vue +59 -59
  135. package/dist/v3/{JsonPretty → components/JsonPretty}/components/CheckController/index.vue +136 -136
  136. package/dist/v3/{JsonPretty → components/JsonPretty}/components/TreeNode/index.vue +387 -381
  137. package/dist/v3/{JsonPretty → components/JsonPretty}/hooks/useClipboard.ts +21 -21
  138. package/dist/v3/{JsonPretty → components/JsonPretty}/hooks/useError.ts +21 -21
  139. package/dist/v3/{JsonPretty → components/JsonPretty}/index.vue +16 -13
  140. package/dist/v3/{JsonPretty → components/JsonPretty}/type.ts +127 -126
  141. package/dist/v3/{JsonPretty → components/JsonPretty}/utils/index.ts +169 -169
  142. package/dist/v3/{MovableContainer → components/MovableContainer}/index.vue +1 -1
  143. package/dist/v3/{Pick → components/Pick}/index.vue +322 -322
  144. package/dist/v3/{Tabs → components/Tabs}/index.vue +30 -4
  145. package/dist/v3/{Tag → components/Tag}/index.vue +113 -113
  146. package/dist/v3/{VirtualList → components/VirtualList}/AutoSize.vue +40 -40
  147. package/dist/v3/{VirtualList → components/VirtualList}/index.vue +416 -412
  148. package/dist/v3/hooks/useBluetooth/index.ts +561 -0
  149. package/dist/v3/hooks/useContainerStyle.ts +153 -153
  150. package/dist/v3/hooks/useNFC/index.ts +107 -107
  151. package/dist/v3/hooks/useNFC/typing.d.ts +396 -396
  152. package/dist/v3/hooks/useNFC/useNFCAndroid.ts +966 -966
  153. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.ts +812 -812
  154. package/dist/v3/hooks/useNFC/utils.ts +754 -754
  155. package/dist/v3/hooks/useRequest/index.ts +586 -573
  156. package/dist/v3/hooks/useRequest/utils.ts +267 -267
  157. package/dist/v3/hooks/useScanCode/index.ts +206 -206
  158. package/dist/v3/hooks/useWebsocket/README.md +79 -0
  159. package/dist/v3/hooks/useWebsocket/index.ts +253 -0
  160. package/dist/v3/styles/theme.css +17 -10
  161. package/dist/v3/styles/theme.ts +12 -12
  162. package/package.json +59 -64
  163. package/dist/plugins/uniParseStock/index.d.ts +0 -10
  164. package/dist/plugins/uniParseStock/index.d.ts.map +0 -1
  165. /package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/index.css +0 -0
  166. /package/dist/v3/{SettingList → DevTool/components/SettingList}/index.css +0 -0
  167. /package/dist/v3/{Empty → components/Empty}/empty.png +0 -0
  168. /package/dist/v3/{VirtualList → components/VirtualList}/readme.md +0 -0
@@ -1,184 +1,184 @@
1
- <template>
2
- <view
3
- class="l-resize l-class"
4
- :class="{ 'l-resize-target': hasNoDefaultSlot }"
5
- :style="[styles, lStyle]"
6
- >
7
- <!--插槽需要脱离父容器文档流,防止父容器固宽固高,进而导致插槽大小被被父容器限制-->
8
- <view
9
- ref="l-resize__container"
10
- class="l-resize__container l-container-class"
11
- :style="[lStyle]"
12
- >
13
- <!--被监听的插槽-->
14
- <slot></slot>
15
- <!--监听插槽变大-->
16
- <scroll-view
17
- class="l-resize__wrapper"
18
- :scroll-y="true"
19
- :scroll-x="true"
20
- :scroll-top="expandScrollTop"
21
- :scroll-left="expandScrollLeft"
22
- @scroll="onScrollHandler"
23
- >
24
- <view
25
- class="l-resize__wrapper--placeholder"
26
- style="height: 100000px; width: 100000px"
27
- ></view>
28
- </scroll-view>
29
- <!--监听插槽变小-->
30
- <scroll-view
31
- class="l-resize__wrapper"
32
- :scroll-y="true"
33
- :scroll-x="true"
34
- :scroll-top="shrinkScrollTop"
35
- :scroll-left="shrinkScrollLeft"
36
- @scroll="onScrollHandler"
37
- >
38
- <view
39
- class="l-resize__wrapper--placeholder"
40
- style="height: 250%; width: 250%"
41
- ></view>
42
- </scroll-view>
43
- </view>
44
- </view>
45
- </template>
46
- <script lang="ts" setup>
47
- import { ref, onMounted, getCurrentInstance, computed } from 'vue';
48
- import { getRect, addUnit } from './utils';
49
-
50
- interface ResizeResult {
51
- bottom?: number;
52
- top?: number;
53
- left?: number;
54
- right?: number;
55
- height?: number;
56
- width?: number;
57
- }
58
-
59
- defineProps<{
60
- lStyle?: any;
61
- }>();
62
-
63
- const emit = defineEmits(['resize']);
64
-
65
- const context = getCurrentInstance();
66
- const width = ref(0);
67
- const hasNoDefaultSlot = ref(false);
68
- const height = ref(0);
69
- const expandScrollTop = ref(0);
70
- const expandScrollLeft = ref(0);
71
- const shrinkScrollTop = ref(0);
72
- const shrinkScrollLeft = ref(0);
73
-
74
- let scrollEventCount = 0;
75
- let lastHeight = 0;
76
- let lastWidth = 0;
77
- const querySelector = '.l-resize__container';
78
- let onScrollHandlerClone = () => {
79
- getRect(querySelector, context).then((res: ResizeResult) => {
80
- // 前两次滚动事件被触发,说明 created 的修改已渲染,通知用户代码当前容器大小
81
- if (scrollEventCount++ === 0) {
82
- resizeEvent(res);
83
- }
84
- // 滚动条拉到底部会触发两次多余的事件,屏蔽掉。
85
- if (scrollEventCount < 3) return;
86
- // 手动设置父容器高宽,防止父容器坍塌
87
- // 滚动完,重新获取容器新的高度
88
- const newHeight = res.height;
89
- const newWidth = res.width;
90
- // 立即填充父容器高宽
91
- height.value = newHeight ?? 0;
92
- width.value = newWidth ?? 0;
93
- // 宽高都改变时,只需要触发一次 size 事件
94
- const emitStack = [];
95
- if (newHeight !== lastHeight) {
96
- lastHeight = newHeight ?? 0;
97
- emitStack.push(1);
98
- }
99
- if (newWidth !== lastWidth) {
100
- lastWidth = newWidth ?? 0;
101
- emitStack.push(1);
102
- }
103
- if (emitStack.length !== 0) {
104
- resizeEvent(res);
105
- }
106
- // 滚动条拉到底部(如果使用 nextTick 效果更佳)
107
- scrollToBottom({ width: lastWidth, height: lastHeight });
108
- });
109
- };
110
- let onScrollHandler = () => {
111
- if (onScrollHandlerClone) {
112
- onScrollHandlerClone();
113
- }
114
- };
115
- const scrollToBottom = (res: Record<string, number>) => {
116
- expandScrollTop.value = 100000 + res.height;
117
- shrinkScrollTop.value = 3 * height.value + res.height;
118
- expandScrollLeft.value = 100000 + res.width;
119
- shrinkScrollLeft.value = 3 * width.value + res.width;
120
- };
121
- const resizeEvent = (res: ResizeResult) => {
122
- const result: any = {};
123
- ['bottom', 'top', 'left', 'right', 'height', 'width'].forEach((propName) => {
124
- result[propName] = res[propName as keyof ResizeResult];
125
- });
126
- emit('resize', result);
127
- };
128
- const styles = computed(() => {
129
- if (context && context.slots?.default && (width.value || height.value)) {
130
- return {
131
- width: addUnit(width.value),
132
- height: addUnit(height.value),
133
- };
134
- }
135
- return {};
136
- });
137
- onMounted(() => {
138
- // const options = { context };
139
- hasNoDefaultSlot.value = !context?.slots.default;
140
- getRect(querySelector, context).then((res) => {
141
- // 闭包记录容器高度
142
- lastHeight = res.height ?? 0;
143
- lastWidth = res.width ?? 0;
144
- // 立即填充父容器高宽
145
- width.value = lastWidth;
146
- height.value = lastHeight;
147
-
148
- scrollToBottom({ width: lastWidth, height: lastHeight });
149
- });
150
- });
151
- </script>
152
- <style lang="scss" scoped>
153
- .l-resize {
154
- &__container {
155
- position: absolute;
156
- min-width: 1px;
157
- min-height: 1px;
158
- }
159
-
160
- &-target,
161
- &__wrapper {
162
- background-color: aqua;
163
- position: absolute;
164
- inset: 0;
165
- z-index: -9999;
166
- overflow: hidden;
167
- visibility: hidden;
168
- }
169
-
170
- &-target {
171
- .l-resize__container {
172
- width: 100%;
173
- height: 100%;
174
- }
175
- }
176
-
177
- &__wrapper {
178
- &--placeholder {
179
- transition: 0s;
180
- animation: none;
181
- }
182
- }
183
- }
184
- </style>
1
+ <template>
2
+ <view
3
+ class="l-resize l-class"
4
+ :class="{ 'l-resize-target': hasNoDefaultSlot }"
5
+ :style="[styles, lStyle]"
6
+ >
7
+ <!--插槽需要脱离父容器文档流,防止父容器固宽固高,进而导致插槽大小被被父容器限制-->
8
+ <view
9
+ ref="l-resize__container"
10
+ class="l-resize__container l-container-class"
11
+ :style="[lStyle]"
12
+ >
13
+ <!--被监听的插槽-->
14
+ <slot></slot>
15
+ <!--监听插槽变大-->
16
+ <scroll-view
17
+ class="l-resize__wrapper"
18
+ :scroll-y="true"
19
+ :scroll-x="true"
20
+ :scroll-top="expandScrollTop"
21
+ :scroll-left="expandScrollLeft"
22
+ @scroll="onScrollHandler"
23
+ >
24
+ <view
25
+ class="l-resize__wrapper--placeholder"
26
+ style="height: 100000px; width: 100000px"
27
+ ></view>
28
+ </scroll-view>
29
+ <!--监听插槽变小-->
30
+ <scroll-view
31
+ class="l-resize__wrapper"
32
+ :scroll-y="true"
33
+ :scroll-x="true"
34
+ :scroll-top="shrinkScrollTop"
35
+ :scroll-left="shrinkScrollLeft"
36
+ @scroll="onScrollHandler"
37
+ >
38
+ <view
39
+ class="l-resize__wrapper--placeholder"
40
+ style="height: 250%; width: 250%"
41
+ ></view>
42
+ </scroll-view>
43
+ </view>
44
+ </view>
45
+ </template>
46
+ <script lang="ts" setup>
47
+ import { ref, onMounted, getCurrentInstance, computed } from 'vue';
48
+ import { getRect, addUnit } from './utils';
49
+
50
+ interface ResizeResult {
51
+ bottom?: number;
52
+ top?: number;
53
+ left?: number;
54
+ right?: number;
55
+ height?: number;
56
+ width?: number;
57
+ }
58
+
59
+ defineProps<{
60
+ lStyle?: any;
61
+ }>();
62
+
63
+ const emit = defineEmits(['resize']);
64
+
65
+ const context = getCurrentInstance();
66
+ const width = ref(0);
67
+ const hasNoDefaultSlot = ref(false);
68
+ const height = ref(0);
69
+ const expandScrollTop = ref(0);
70
+ const expandScrollLeft = ref(0);
71
+ const shrinkScrollTop = ref(0);
72
+ const shrinkScrollLeft = ref(0);
73
+
74
+ let scrollEventCount = 0;
75
+ let lastHeight = 0;
76
+ let lastWidth = 0;
77
+ const querySelector = '.l-resize__container';
78
+ let onScrollHandlerClone = () => {
79
+ getRect(querySelector, context).then((res: ResizeResult) => {
80
+ // 前两次滚动事件被触发,说明 created 的修改已渲染,通知用户代码当前容器大小
81
+ if (scrollEventCount++ === 0) {
82
+ resizeEvent(res);
83
+ }
84
+ // 滚动条拉到底部会触发两次多余的事件,屏蔽掉。
85
+ if (scrollEventCount < 3) return;
86
+ // 手动设置父容器高宽,防止父容器坍塌
87
+ // 滚动完,重新获取容器新的高度
88
+ const newHeight = res.height;
89
+ const newWidth = res.width;
90
+ // 立即填充父容器高宽
91
+ height.value = newHeight ?? 0;
92
+ width.value = newWidth ?? 0;
93
+ // 宽高都改变时,只需要触发一次 size 事件
94
+ const emitStack = [];
95
+ if (newHeight !== lastHeight) {
96
+ lastHeight = newHeight ?? 0;
97
+ emitStack.push(1);
98
+ }
99
+ if (newWidth !== lastWidth) {
100
+ lastWidth = newWidth ?? 0;
101
+ emitStack.push(1);
102
+ }
103
+ if (emitStack.length !== 0) {
104
+ resizeEvent(res);
105
+ }
106
+ // 滚动条拉到底部(如果使用 nextTick 效果更佳)
107
+ scrollToBottom({ width: lastWidth, height: lastHeight });
108
+ });
109
+ };
110
+ let onScrollHandler = () => {
111
+ if (onScrollHandlerClone) {
112
+ onScrollHandlerClone();
113
+ }
114
+ };
115
+ const scrollToBottom = (res: Record<string, number>) => {
116
+ expandScrollTop.value = 100000 + res.height;
117
+ shrinkScrollTop.value = 3 * height.value + res.height;
118
+ expandScrollLeft.value = 100000 + res.width;
119
+ shrinkScrollLeft.value = 3 * width.value + res.width;
120
+ };
121
+ const resizeEvent = (res: ResizeResult) => {
122
+ const result: any = {};
123
+ ['bottom', 'top', 'left', 'right', 'height', 'width'].forEach((propName) => {
124
+ result[propName] = res[propName as keyof ResizeResult];
125
+ });
126
+ emit('resize', result);
127
+ };
128
+ const styles = computed(() => {
129
+ if (context && context.slots?.default && (width.value || height.value)) {
130
+ return {
131
+ width: addUnit(width.value),
132
+ height: addUnit(height.value),
133
+ };
134
+ }
135
+ return {};
136
+ });
137
+ onMounted(() => {
138
+ // const options = { context };
139
+ hasNoDefaultSlot.value = !context?.slots.default;
140
+ getRect(querySelector, context).then((res) => {
141
+ // 闭包记录容器高度
142
+ lastHeight = res.height ?? 0;
143
+ lastWidth = res.width ?? 0;
144
+ // 立即填充父容器高宽
145
+ width.value = lastWidth;
146
+ height.value = lastHeight;
147
+
148
+ scrollToBottom({ width: lastWidth, height: lastHeight });
149
+ });
150
+ });
151
+ </script>
152
+ <style lang="scss" scoped>
153
+ .l-resize {
154
+ &__container {
155
+ position: absolute;
156
+ min-width: 1px;
157
+ min-height: 1px;
158
+ }
159
+
160
+ &-target,
161
+ &__wrapper {
162
+ background-color: aqua;
163
+ position: absolute;
164
+ inset: 0;
165
+ z-index: -9999;
166
+ overflow: hidden;
167
+ visibility: hidden;
168
+ }
169
+
170
+ &-target {
171
+ .l-resize__container {
172
+ width: 100%;
173
+ height: 100%;
174
+ }
175
+ }
176
+
177
+ &__wrapper {
178
+ &--placeholder {
179
+ transition: 0s;
180
+ animation: none;
181
+ }
182
+ }
183
+ }
184
+ </style>
@@ -1,49 +1,49 @@
1
- import type { ComponentInternalInstance } from 'vue';
2
-
3
- export function getRect(
4
- selector: string,
5
- context: ComponentInternalInstance | null | any,
6
- node: boolean = false,
7
- ) {
8
- // 之前是个对象,现在改成实例,防止旧版会报错
9
- if (context == null) {
10
- return Promise.reject('context is null');
11
- }
12
- if (context?.context) {
13
- context = context.context;
14
- }
15
-
16
- return new Promise<UniNamespace.NodeInfo>((resolve, reject) => {
17
- const dom = uni.createSelectorQuery().in(context).select(selector);
18
- const result: any = (rect: UniNamespace.NodeInfo) => {
19
- if (rect) {
20
- resolve(rect);
21
- } else {
22
- reject('no rect');
23
- }
24
- };
25
-
26
- if (!node) {
27
- dom.boundingClientRect(result).exec();
28
- } else {
29
- dom
30
- .fields(
31
- {
32
- node: true,
33
- size: true,
34
- rect: true,
35
- },
36
- result,
37
- )
38
- .exec();
39
- }
40
- });
41
- }
42
-
43
- export function addUnit(value?: string | number): string {
44
- if (!value) {
45
- return '0px';
46
- }
47
-
48
- return typeof value === 'number' ? `${value}px` : value;
49
- }
1
+ import type { ComponentInternalInstance } from 'vue';
2
+
3
+ export function getRect(
4
+ selector: string,
5
+ context: ComponentInternalInstance | null | any,
6
+ node: boolean = false,
7
+ ) {
8
+ // 之前是个对象,现在改成实例,防止旧版会报错
9
+ if (context == null) {
10
+ return Promise.reject('context is null');
11
+ }
12
+ if (context?.context) {
13
+ context = context.context;
14
+ }
15
+
16
+ return new Promise<UniNamespace.NodeInfo>((resolve, reject) => {
17
+ const dom = uni.createSelectorQuery().in(context).select(selector);
18
+ const result: any = (rect: UniNamespace.NodeInfo) => {
19
+ if (rect) {
20
+ resolve(rect);
21
+ } else {
22
+ reject('no rect');
23
+ }
24
+ };
25
+
26
+ if (!node) {
27
+ dom.boundingClientRect(result).exec();
28
+ } else {
29
+ dom
30
+ .fields(
31
+ {
32
+ node: true,
33
+ size: true,
34
+ rect: true,
35
+ },
36
+ result,
37
+ )
38
+ .exec();
39
+ }
40
+ });
41
+ }
42
+
43
+ export function addUnit(value?: string | number): string {
44
+ if (!value) {
45
+ return '0px';
46
+ }
47
+
48
+ return typeof value === 'number' ? `${value}px` : value;
49
+ }
@@ -0,0 +1,137 @@
1
+ <template>
2
+ <view class="barrage-item" :style="itemStyle" @animationend="onAnimationEnd">
3
+ <view class="barrage-content" :class="type">
4
+ <view class="barrage-type-tag">
5
+ {{ typeTag }}
6
+ </view>
7
+ <view class="barrage-text">{{ text }}</view>
8
+ </view>
9
+ </view>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ import { computed } from 'vue';
14
+
15
+ const props = defineProps<{
16
+ text: string;
17
+ type: string;
18
+ top: number;
19
+ duration: number;
20
+ delay?: number; // 新增延迟属性,毫秒单位
21
+ maxLength?: number;
22
+ color?: string;
23
+ }>();
24
+
25
+ const emit = defineEmits<{
26
+ (e: 'remove'): void;
27
+ }>();
28
+
29
+ const typeTag = computed(() => {
30
+ const t = props.type.toLowerCase();
31
+ if (t === 'network') return 'NET';
32
+ return t.toUpperCase();
33
+ });
34
+
35
+ const itemStyle = computed(() => ({
36
+ top: `${props.top}px`,
37
+ '--barrage-duration': `${props.duration}s`,
38
+ '--barrage-delay': `${props.delay || 0}ms`,
39
+ '--barrage-max-width': props.maxLength ? 'none' : '300px',
40
+ color: props.color || 'inherit',
41
+ }));
42
+
43
+ function onAnimationEnd() {
44
+ emit('remove');
45
+ }
46
+ </script>
47
+
48
+ <style scoped>
49
+ .barrage-item {
50
+ position: fixed;
51
+ left: 100%;
52
+ top: 0;
53
+ white-space: nowrap;
54
+ pointer-events: none;
55
+ z-index: 10001;
56
+ display: flex;
57
+ will-change: transform;
58
+ animation: barrage-move var(--barrage-duration) linear var(--barrage-delay)
59
+ forwards;
60
+ }
61
+
62
+ .barrage-item:hover {
63
+ animation-play-state: paused;
64
+ z-index: 20000;
65
+ }
66
+
67
+ @keyframes barrage-move {
68
+ from {
69
+ transform: translateX(0);
70
+ }
71
+
72
+ to {
73
+ transform: translateX(calc(-100vw - 100%));
74
+ }
75
+ }
76
+
77
+ .barrage-content {
78
+ display: flex;
79
+ align-items: center;
80
+ padding: 4px 12px;
81
+ border-radius: 16px;
82
+ background: rgb(0 0 0 / 60%);
83
+ backdrop-filter: blur(4px);
84
+ color: #fff;
85
+ font-size: 12px;
86
+ box-shadow: 0 2px 8px rgb(0 0 0 / 20%);
87
+ pointer-events: auto;
88
+ cursor: pointer;
89
+ }
90
+
91
+ /* Log & Info: 白色/中性系 */
92
+ .barrage-content.log,
93
+ .barrage-content.info {
94
+ background: rgb(255 255 255 / 90%);
95
+ color: #333;
96
+ box-shadow: 0 2px 10px rgb(0 0 0 / 10%);
97
+ }
98
+
99
+ .barrage-content.log .barrage-type-tag,
100
+ .barrage-content.info .barrage-type-tag {
101
+ background: rgb(0 0 0 / 10%);
102
+ }
103
+
104
+ /* Warn: 黄橙色系 */
105
+ .barrage-content.warn {
106
+ background: rgb(180 100 0 / 75%);
107
+ box-shadow: 0 0 10px rgb(255 149 0 / 30%);
108
+ }
109
+
110
+ /* Error & Network: 红色系 */
111
+ .barrage-content.error,
112
+ .barrage-content.network {
113
+ background: rgb(180 30 20 / 75%);
114
+ box-shadow: 0 0 10px rgb(255 59 48 / 30%);
115
+ }
116
+
117
+ /* Debug: 灰色系 */
118
+ .barrage-content.debug {
119
+ background: rgb(80 80 80 / 75%);
120
+ box-shadow: 0 0 10px rgb(142 142 147 / 30%);
121
+ }
122
+
123
+ .barrage-type-tag {
124
+ font-weight: bold;
125
+ margin-right: 6px;
126
+ font-size: 10px;
127
+ padding: 2px 4px;
128
+ background: rgb(0 0 0 / 5%);
129
+ border-radius: 4px;
130
+ }
131
+
132
+ .barrage-text {
133
+ max-width: var(--barrage-max-width, 300px);
134
+ overflow: hidden;
135
+ text-overflow: ellipsis;
136
+ }
137
+ </style>