vite-uni-dev-tool 1.1.0 → 1.2.1

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 (195) hide show
  1. package/README.md +21 -1
  2. package/dist/const.cjs +1 -1
  3. package/dist/const.d.ts +2 -1
  4. package/dist/const.js +1 -1
  5. package/dist/core-shared.d.ts +2 -3
  6. package/dist/core.d.ts +8 -8
  7. package/dist/core.js +2 -2
  8. package/dist/i18n/index.d.ts +0 -1
  9. package/dist/i18n/instance.d.ts +0 -1
  10. package/dist/i18n/locales/en.cjs +1 -1
  11. package/dist/i18n/locales/en.d.ts +6 -1
  12. package/dist/i18n/locales/en.js +1 -1
  13. package/dist/i18n/locales/zh-Hans.cjs +1 -1
  14. package/dist/i18n/locales/zh-Hans.d.ts +6 -1
  15. package/dist/i18n/locales/zh-Hans.js +1 -1
  16. package/dist/index.d.ts +0 -1
  17. package/dist/modules/devConsole/index.cjs +4 -4
  18. package/dist/modules/devConsole/index.d.ts +6 -107
  19. package/dist/modules/devConsole/index.js +4 -4
  20. package/dist/modules/devEvent/index.cjs +3 -3
  21. package/dist/modules/devEvent/index.d.ts +2 -3
  22. package/dist/modules/devEvent/index.js +3 -3
  23. package/dist/modules/devIntercept/index.cjs +14 -14
  24. package/dist/modules/devIntercept/index.d.ts +34 -6
  25. package/dist/modules/devIntercept/index.js +14 -14
  26. package/dist/modules/devStore/index.cjs +1 -1
  27. package/dist/modules/devStore/index.d.ts +48 -40
  28. package/dist/modules/devStore/index.js +1 -1
  29. package/dist/modules/devToolInfo/index.cjs +1 -1
  30. package/dist/modules/devToolInfo/index.d.ts +6 -25
  31. package/dist/modules/devToolInfo/index.js +1 -1
  32. package/dist/plugins/uniDevTool/transform/transformApp.d.ts +0 -1
  33. package/dist/plugins/uniDevTool/transform/transformMain.cjs +3 -3
  34. package/dist/plugins/uniDevTool/transform/transformMain.d.ts +2 -2
  35. package/dist/plugins/uniDevTool/transform/transformMain.js +3 -3
  36. package/dist/plugins/uniDevTool/transform/transformVue.cjs +31 -25
  37. package/dist/plugins/uniDevTool/transform/transformVue.d.ts +2 -2
  38. package/dist/plugins/uniDevTool/transform/transformVue.js +30 -24
  39. package/dist/plugins/uniDevTool/uniDevTool.cjs +3 -3
  40. package/dist/plugins/uniDevTool/uniDevTool.d.ts +3 -2
  41. package/dist/plugins/uniDevTool/uniDevTool.js +3 -3
  42. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts +0 -1
  43. package/dist/plugins/utils/index.d.ts +0 -1
  44. package/dist/shims-uni.d.ts +26 -22
  45. package/dist/type.d.ts +47 -43
  46. package/dist/utils/array.d.ts +0 -1
  47. package/dist/utils/date.d.ts +0 -1
  48. package/dist/utils/file.d.ts +0 -1
  49. package/dist/utils/function.d.ts +0 -1
  50. package/dist/utils/index.d.ts +0 -1
  51. package/dist/utils/ip.d.ts +0 -1
  52. package/dist/utils/language.d.ts +14 -15
  53. package/dist/utils/object.cjs +1 -1
  54. package/dist/utils/object.d.ts +7 -8
  55. package/dist/utils/object.js +1 -1
  56. package/dist/utils/openLink.d.ts +0 -1
  57. package/dist/utils/page.d.ts +0 -1
  58. package/dist/utils/platform.d.ts +0 -1
  59. package/dist/utils/string.d.ts +0 -1
  60. package/dist/utils/utils.d.ts +0 -1
  61. package/dist/v3/DevTool/components/BluetoothList/BluetoothItem.vue +199 -199
  62. package/dist/v3/DevTool/components/BluetoothList/BluetoothTool.vue +730 -730
  63. package/dist/v3/DevTool/components/BluetoothList/index.vue +167 -167
  64. package/dist/v3/DevTool/components/CaptureScreen/index.vue +109 -109
  65. package/dist/v3/DevTool/components/ConsoleList/ConsoleItem.vue +230 -225
  66. package/dist/v3/DevTool/components/ConsoleList/RunJSInput.vue +247 -247
  67. package/dist/v3/DevTool/components/ConsoleList/index.vue +171 -171
  68. package/dist/v3/DevTool/components/ConsoleList/staticTips.ts +1145 -1145
  69. package/dist/v3/DevTool/components/DevToolButton/index.vue +42 -6
  70. package/dist/v3/DevTool/components/DevToolTitle/index.vue +24 -24
  71. package/dist/v3/DevTool/components/DevToolWindow/DevToolOverlay.vue +197 -197
  72. package/dist/v3/DevTool/components/DevToolWindow/hooks/dataUtils.ts +48 -48
  73. package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolData.ts +411 -387
  74. package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolHandlers.ts +644 -629
  75. package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolOverlay.ts +201 -197
  76. package/dist/v3/DevTool/components/DevToolWindow/index.vue +27 -64
  77. package/dist/v3/DevTool/components/ElEvent/ElEventItem.vue +105 -105
  78. package/dist/v3/DevTool/components/ElEvent/index.vue +106 -106
  79. package/dist/v3/DevTool/components/Instance/components/InstanceTreeNode.vue +265 -265
  80. package/dist/v3/DevTool/components/Instance/flatten.ts +226 -226
  81. package/dist/v3/DevTool/components/Instance/index.vue +94 -94
  82. package/dist/v3/DevTool/components/Instance/registry.ts +49 -49
  83. package/dist/v3/DevTool/components/Instance/transformTree.ts +393 -375
  84. package/dist/v3/DevTool/components/Instance/transformTreeCtx.ts +268 -268
  85. package/dist/v3/DevTool/components/Instance/typing.d.ts +43 -43
  86. package/dist/v3/DevTool/components/InstanceDetail/index.vue +485 -485
  87. package/dist/v3/DevTool/components/JsonDetail/index.vue +70 -70
  88. package/dist/v3/DevTool/components/NFCList/NFCItem.vue +112 -112
  89. package/dist/v3/DevTool/components/NFCList/NFCTool.vue +454 -454
  90. package/dist/v3/DevTool/components/NFCList/const.ts +56 -56
  91. package/dist/v3/DevTool/components/NFCList/index.vue +94 -94
  92. package/dist/v3/DevTool/components/NetworkList/InterceptConfig.vue +624 -624
  93. package/dist/v3/DevTool/components/NetworkList/InterceptItem.vue +140 -140
  94. package/dist/v3/DevTool/components/NetworkList/NetworkDetail.vue +287 -287
  95. package/dist/v3/DevTool/components/NetworkList/NetworkIntercept.vue +88 -88
  96. package/dist/v3/DevTool/components/NetworkList/NetworkItem.vue +163 -163
  97. package/dist/v3/DevTool/components/NetworkList/NetworkSend.vue +589 -589
  98. package/dist/v3/DevTool/components/NetworkList/const.ts +4 -4
  99. package/dist/v3/DevTool/components/NetworkList/hooks/useNetworkForm.ts +86 -86
  100. package/dist/v3/DevTool/components/NetworkList/index.vue +160 -160
  101. package/dist/v3/DevTool/components/NetworkList/utils.ts +101 -101
  102. package/dist/v3/DevTool/components/Performance/index.vue +498 -498
  103. package/dist/v3/DevTool/components/Performance/modules/PerformanceMetrics.vue +153 -153
  104. package/dist/v3/DevTool/components/Performance/modules/usePerformanceChart.ts +460 -460
  105. package/dist/v3/DevTool/components/Performance/modules/usePerformanceData.ts +258 -258
  106. package/dist/v3/DevTool/components/PiniaList/index.vue +93 -93
  107. package/dist/v3/DevTool/components/RunJS/index.vue +148 -148
  108. package/dist/v3/DevTool/components/ScanCodeList/ScanCodeItem.vue +97 -97
  109. package/dist/v3/DevTool/components/ScanCodeList/index.vue +100 -100
  110. package/dist/v3/DevTool/components/SettingButton/index.vue +45 -45
  111. package/dist/v3/DevTool/components/SettingList/index.vue +226 -218
  112. package/dist/v3/DevTool/components/SettingList/modules/SettingBarrage.vue +320 -304
  113. package/dist/v3/DevTool/components/SettingList/modules/SettingDevTool.vue +212 -212
  114. package/dist/v3/DevTool/components/SettingList/modules/SettingInfo.vue +157 -157
  115. package/dist/v3/DevTool/components/SettingList/modules/SettingLanguage.vue +74 -74
  116. package/dist/v3/DevTool/components/SettingList/modules/SettingLog.vue +230 -230
  117. package/dist/v3/DevTool/components/SettingList/typing.d.ts +2 -2
  118. package/dist/v3/DevTool/components/SourceCode/Line.vue +127 -127
  119. package/dist/v3/DevTool/components/SourceCode/parseCode.ts +609 -609
  120. package/dist/v3/DevTool/components/StorageList/index.vue +174 -174
  121. package/dist/v3/DevTool/components/TransferList/TransferDetail.vue +268 -268
  122. package/dist/v3/DevTool/components/VuexList/index.vue +84 -84
  123. package/dist/v3/DevTool/index.vue +85 -138
  124. package/dist/v3/components/AppTransition/index.vue +156 -176
  125. package/dist/v3/components/AutoSizer/index.vue +192 -192
  126. package/dist/v3/components/AutoSizer/index1.vue +184 -184
  127. package/dist/v3/components/AutoSizer/utils.ts +49 -49
  128. package/dist/v3/components/Barrage/BarrageItem.vue +194 -137
  129. package/dist/v3/components/Barrage/index.vue +205 -202
  130. package/dist/v3/components/CircularButton/index.vue +84 -84
  131. package/dist/v3/components/CustomSwiper/CustomSwiperItem.vue +49 -49
  132. package/dist/v3/components/CustomSwiper/index.vue +104 -104
  133. package/dist/v3/components/DevErrorBoundary/index.vue +388 -0
  134. package/dist/v3/components/DraggableContainer/index.vue +186 -73
  135. package/dist/v3/components/Empty/index.vue +29 -29
  136. package/dist/v3/components/FilterSelect/index.vue +179 -179
  137. package/dist/v3/components/JsonPretty/components/Brackets/index.vue +27 -27
  138. package/dist/v3/components/JsonPretty/components/Carets/index.vue +59 -59
  139. package/dist/v3/components/JsonPretty/components/CheckController/index.vue +136 -136
  140. package/dist/v3/components/JsonPretty/components/TreeNode/index.vue +387 -387
  141. package/dist/v3/components/JsonPretty/hooks/useClipboard.ts +21 -21
  142. package/dist/v3/components/JsonPretty/hooks/useError.ts +21 -21
  143. package/dist/v3/components/JsonPretty/type.ts +127 -127
  144. package/dist/v3/components/JsonPretty/utils/index.ts +169 -169
  145. package/dist/v3/components/MovableContainer/index.vue +10 -4
  146. package/dist/v3/components/Pick/index.vue +321 -322
  147. package/dist/v3/components/Tag/index.vue +113 -113
  148. package/dist/v3/components/VirtualList/AutoSize.vue +40 -40
  149. package/dist/v3/components/VirtualList/index.vue +416 -416
  150. package/dist/v3/hooks/useBluetooth/index.ts +561 -561
  151. package/dist/v3/hooks/useContainerStyle.ts +95 -153
  152. package/dist/v3/hooks/useNFC/index.ts +107 -107
  153. package/dist/v3/hooks/useNFC/typing.d.ts +396 -396
  154. package/dist/v3/hooks/useNFC/useNFCAndroid.ts +966 -966
  155. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.ts +812 -812
  156. package/dist/v3/hooks/useNFC/utils.ts +754 -754
  157. package/dist/v3/hooks/useRequest/index.ts +586 -586
  158. package/dist/v3/hooks/useRequest/utils.ts +267 -267
  159. package/dist/v3/hooks/useScanCode/index.ts +206 -206
  160. package/dist/v3/hooks/useWebsocket/index.ts +253 -253
  161. package/dist/v3/styles/theme.ts +12 -12
  162. package/package.json +70 -59
  163. package/dist/const.d.ts.map +0 -1
  164. package/dist/core-shared.d.ts.map +0 -1
  165. package/dist/core.d.ts.map +0 -1
  166. package/dist/i18n/index.d.ts.map +0 -1
  167. package/dist/i18n/instance.d.ts.map +0 -1
  168. package/dist/i18n/locales/en.d.ts.map +0 -1
  169. package/dist/i18n/locales/zh-Hans.d.ts.map +0 -1
  170. package/dist/index.d.ts.map +0 -1
  171. package/dist/modules/devConsole/index.d.ts.map +0 -1
  172. package/dist/modules/devEvent/index.d.ts.map +0 -1
  173. package/dist/modules/devIntercept/index.d.ts.map +0 -1
  174. package/dist/modules/devStore/index.d.ts.map +0 -1
  175. package/dist/modules/devToolInfo/index.d.ts.map +0 -1
  176. package/dist/plugins/uniDevTool/transform/transformApp.d.ts.map +0 -1
  177. package/dist/plugins/uniDevTool/transform/transformMain.d.ts.map +0 -1
  178. package/dist/plugins/uniDevTool/transform/transformVue.d.ts.map +0 -1
  179. package/dist/plugins/uniDevTool/uniDevTool.d.ts.map +0 -1
  180. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts.map +0 -1
  181. package/dist/plugins/utils/index.d.ts.map +0 -1
  182. package/dist/type.d.ts.map +0 -1
  183. package/dist/utils/array.d.ts.map +0 -1
  184. package/dist/utils/date.d.ts.map +0 -1
  185. package/dist/utils/file.d.ts.map +0 -1
  186. package/dist/utils/function.d.ts.map +0 -1
  187. package/dist/utils/index.d.ts.map +0 -1
  188. package/dist/utils/ip.d.ts.map +0 -1
  189. package/dist/utils/language.d.ts.map +0 -1
  190. package/dist/utils/object.d.ts.map +0 -1
  191. package/dist/utils/openLink.d.ts.map +0 -1
  192. package/dist/utils/page.d.ts.map +0 -1
  193. package/dist/utils/platform.d.ts.map +0 -1
  194. package/dist/utils/string.d.ts.map +0 -1
  195. package/dist/utils/utils.d.ts.map +0 -1
@@ -1,12 +1,29 @@
1
1
  <template>
2
2
  <view
3
3
  class="draggable-container"
4
+ :class="{ 'is-full-screen': isFullScreen }"
4
5
  :style="containerStyle"
5
6
  @touchstart="onTouchStart"
6
7
  @touchmove.stop="onTouchMove"
7
8
  @touchend="onTouchEnd"
8
9
  @mousedown="onMouseDown">
9
- <slot></slot>
10
+ <!-- 拖拽手柄容器 -->
11
+ <view
12
+ v-if="!isFullScreen"
13
+ class="draggable-handle-container"
14
+ :class="theme"
15
+ data-drag-handle="1">
16
+ <slot name="handle">
17
+ <view class="window-header-default" data-drag-handle="1">
18
+ <view class="drag-indicator-default" data-drag-handle="1"></view>
19
+ </view>
20
+ </slot>
21
+ </view>
22
+
23
+ <!-- 主体内容 -->
24
+ <view class="draggable-content">
25
+ <slot></slot>
26
+ </view>
10
27
 
11
28
  <!-- 缩放句柄 -->
12
29
  <view
@@ -42,7 +59,7 @@ const props = withDefaults(
42
59
  width?: number | string;
43
60
  height?: number | string;
44
61
  zIndex?: number;
45
- customStyle?: Record<string, any>;
62
+ customStyle?: Record<string, string | number>;
46
63
  boundaryPadding?: number;
47
64
  // 是否启用缩放
48
65
  resizable?: boolean;
@@ -53,6 +70,11 @@ const props = withDefaults(
53
70
  // 是否全屏状态
54
71
  isFullScreen?: boolean;
55
72
  maxWidth?: number;
73
+ // 颜色主题
74
+ theme?: string;
75
+ // 安全区域边距
76
+ safeTop?: number;
77
+ safeBottom?: number;
56
78
  }>(),
57
79
  {
58
80
  x: 0,
@@ -65,6 +87,9 @@ const props = withDefaults(
65
87
  minWidth: 200,
66
88
  minHeight: 150,
67
89
  isFullScreen: false,
90
+ theme: 'light',
91
+ safeTop: 0,
92
+ safeBottom: 0,
68
93
  },
69
94
  );
70
95
 
@@ -79,9 +104,9 @@ const emit = defineEmits<{
79
104
  ): void;
80
105
  }>();
81
106
 
82
- // 定义插槽类型,解决外部使用的类型报错
83
107
  defineSlots<{
84
- default(): any;
108
+ default(): unknown;
109
+ handle(): unknown;
85
110
  }>();
86
111
 
87
112
  // 当前位置和尺寸
@@ -103,28 +128,45 @@ let startHeight = 0;
103
128
  let screenWidth = 375;
104
129
  let screenHeight = 667;
105
130
 
106
- onMounted(() => {
131
+ /**
132
+ * 获取最新的屏幕/窗口尺寸
133
+ */
134
+ function updateScreenSize() {
107
135
  const sysInfo = uni.getSystemInfoSync();
108
- screenWidth = sysInfo.windowWidth || 375;
109
- screenHeight = sysInfo.windowHeight || 667;
136
+ // H5 环境优先使用 window.innerHeight/Width 以获得更高精度
137
+ if (typeof window !== 'undefined') {
138
+ screenWidth = window.innerWidth;
139
+ screenHeight = window.innerHeight;
140
+ } else {
141
+ screenWidth = sysInfo.windowWidth || 375;
142
+ screenHeight = sysInfo.windowHeight || 667;
143
+ }
144
+ }
145
+
146
+ onMounted(() => {
147
+ updateScreenSize();
110
148
 
111
149
  if (typeof window !== 'undefined') {
112
150
  window.addEventListener('mousemove', onGlobalMouseMove);
113
151
  window.addEventListener('mouseup', onGlobalMouseUp);
114
152
  window.addEventListener('resize', onWindowResize);
115
153
  }
154
+
155
+ // 增加 UniApp 原生窗口调整监听,增强跨端兼容性
156
+ if (typeof uni !== 'undefined' && uni.onWindowResize) {
157
+ uni.onWindowResize(onWindowResize);
158
+ }
116
159
  });
117
160
 
118
161
  function onWindowResize() {
119
- const sysInfo = uni.getSystemInfoSync();
120
162
  const oldScreenWidth = screenWidth;
121
163
  const oldScreenHeight = screenHeight;
122
164
 
123
- screenWidth = sysInfo.windowWidth || 375;
124
- screenHeight = sysInfo.windowHeight || 667;
165
+ updateScreenSize();
125
166
 
126
- // 如果宽度变窄导致溢出,或者窗口宽度发生改变,重新居中
167
+ // 如果尺寸确实发生了变化
127
168
  if (oldScreenWidth !== screenWidth || oldScreenHeight !== screenHeight) {
169
+ // 处理 maxWidth 变化
128
170
  if (
129
171
  props.maxWidth &&
130
172
  localWidth.value > screenWidth * (props.maxWidth / 100)
@@ -132,9 +174,15 @@ function onWindowResize() {
132
174
  localWidth.value = Math.floor(screenWidth * (props.maxWidth / 100));
133
175
  }
134
176
 
135
- // 居中逻辑
136
- localX.value = Math.max(0, (screenWidth - localWidth.value) / 2);
137
- localY.value = Math.max(0, (screenHeight - localHeight.value) / 2);
177
+ // 修复:不再强制居中,而是对现有位置进行边界修正,保持用户拖拽后的状态
178
+ const { x, y } = clampPosition(
179
+ localX.value,
180
+ localY.value,
181
+ localWidth.value,
182
+ localHeight.value,
183
+ );
184
+ localX.value = x;
185
+ localY.value = y;
138
186
 
139
187
  emit('update:x', localX.value);
140
188
  emit('update:y', localY.value);
@@ -149,6 +197,10 @@ onUnmounted(() => {
149
197
  window.removeEventListener('mouseup', onGlobalMouseUp);
150
198
  window.removeEventListener('resize', onWindowResize);
151
199
  }
200
+
201
+ if (typeof uni !== 'undefined' && uni.offWindowResize) {
202
+ uni.offWindowResize(onWindowResize);
203
+ }
152
204
  });
153
205
 
154
206
  watch(
@@ -176,37 +228,45 @@ const containerStyle = computed(() => {
176
228
  };
177
229
  }
178
230
  const finalWidth = localWidth.value;
179
- const maxWidthVal = props.maxWidth ? `${props.maxWidth}%` : 'none';
180
231
 
181
232
  return {
182
233
  ...props.customStyle,
183
234
  position: 'fixed' as const,
184
- left: `${localX.value}px`,
185
- top: `${localY.value}px`,
235
+ left: 0, // 核心改变:固定在 0,0,通过 transform 位移
236
+ top: 0,
186
237
  width: typeof finalWidth === 'number' ? `${finalWidth}px` : finalWidth,
187
- maxWidth: maxWidthVal,
188
238
  height:
189
239
  typeof localHeight.value === 'number'
190
240
  ? `${localHeight.value}px`
191
241
  : localHeight.value,
192
242
  zIndex: props.zIndex,
243
+ transform: `translate3d(${localX.value}px, ${localY.value}px, 0)`,
193
244
  touchAction: 'none',
245
+ // 关键:拖拽时绝对不能有 transition 干扰位移
246
+ transition:
247
+ isDragging || isResizing
248
+ ? 'none'
249
+ : 'transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), width 0.3s, height 0.3s',
194
250
  };
195
251
  });
196
252
 
197
253
  function clampPosition(x: number, y: number, w: number, h: number) {
198
254
  const padding = props.boundaryPadding;
255
+ const safeTop = props.safeTop || 0;
256
+ const safeBottom = props.safeBottom || 0;
257
+
199
258
  // 计算实际视觉宽度(受 maxWidth 限制)
200
259
  const actualWidth =
201
260
  props.maxWidth && typeof w === 'number'
202
261
  ? Math.min(w, screenWidth * (props.maxWidth / 100))
203
- : w;
262
+ : (w as number);
204
263
 
205
264
  const maxX = Math.max(0, screenWidth - actualWidth - padding);
206
- const maxY = Math.max(0, screenHeight - h - padding);
265
+ const minY = safeTop + padding;
266
+ const maxY = Math.max(minY, screenHeight - h - padding - safeBottom);
207
267
  return {
208
268
  x: Math.max(padding, Math.min(maxX, x)),
209
- y: Math.max(padding, Math.min(maxY, y)),
269
+ y: Math.max(minY, Math.min(maxY, y)),
210
270
  };
211
271
  }
212
272
 
@@ -224,52 +284,48 @@ function onMouseDown(e: MouseEvent) {
224
284
  if (props.isFullScreen) return;
225
285
 
226
286
  // 检查是否在句柄上触发
227
- if (props.handle && !isTargetOnHandle(e.target)) return;
287
+ if (!isTargetOnHandle(e.target)) return;
228
288
 
229
- startDrag(e.clientX, e.clientY);
289
+ e.preventDefault(); // 关键:阻止浏览器默认选择/拖拽行为
290
+ startDrag(e.clientX, e.clientY + props.safeTop);
230
291
  }
231
292
 
232
- function isTargetOnHandle(target: any): boolean {
233
- if (!props.handle) return true;
234
-
235
- // 1. 优先通过 dataset 判断(UniApp/小程序跨端最可靠方案)
236
- if (
237
- target &&
238
- target.dataset &&
239
- (target.dataset.dragHandle || target.dataset.handle)
240
- ) {
241
- return true;
242
- }
293
+ function isTargetOnHandle(target: EventTarget | null): boolean {
294
+ const element = target as HTMLElement;
295
+ if (!element) return false;
243
296
 
244
- // 2. 备选:通过选择器判断(主要支持 H5)
245
- let curr = target;
246
- const handleClass = props.handle.startsWith('.')
247
- ? props.handle.slice(1)
248
- : props.handle;
297
+ let curr: HTMLElement | null = element;
298
+ const handleClass =
299
+ props.handle && props.handle.startsWith('.')
300
+ ? props.handle.slice(1)
301
+ : props.handle;
249
302
 
250
303
  while (curr) {
304
+ // 1. 优先通过 dataset 判断(内置手柄和 Tabs 已带该属性)
305
+ if (curr.dataset && (curr.dataset.dragHandle || curr.dataset.handle)) {
306
+ return true;
307
+ }
308
+
309
+ // 2. 备选:通过选择器判断
251
310
  if (
311
+ handleClass &&
252
312
  curr.className &&
253
313
  typeof curr.className === 'string' &&
254
314
  curr.className.includes(handleClass)
255
315
  ) {
256
316
  return true;
257
317
  }
258
- // 检查 dataset
259
- if (curr.dataset && (curr.dataset.dragHandle || curr.dataset.handle)) {
260
- return true;
261
- }
262
318
 
263
319
  // 向上遍历父节点
264
- curr = curr.parentNode || curr.parentElement;
320
+ curr = curr.parentElement;
265
321
  if (
266
- curr === null ||
267
- curr === undefined ||
322
+ !curr ||
268
323
  (curr.className &&
269
324
  typeof curr.className === 'string' &&
270
325
  curr.className.includes('draggable-container'))
271
- )
326
+ ) {
272
327
  break;
328
+ }
273
329
  }
274
330
  return false;
275
331
  }
@@ -355,23 +411,22 @@ function onResizeMove(e: TouchEvent) {
355
411
  function updateSize(clientX: number, clientY: number) {
356
412
  const dx = clientX - startX;
357
413
  const dy = clientY - startY;
358
- localWidth.value = Math.max(props.minWidth, startWidth + dx);
359
- localHeight.value = Math.max(props.minHeight, startHeight + dy);
360
-
361
- // 边缘及最大宽度修正
362
- if (props.maxWidth) {
363
- const absoluteMaxWidth = screenWidth * (props.maxWidth / 100);
364
- if (localWidth.value > absoluteMaxWidth) {
365
- localWidth.value = absoluteMaxWidth;
366
- }
367
- }
368
414
 
369
- if (localX.value + localWidth.value > screenWidth) {
370
- localWidth.value = screenWidth - localX.value;
371
- }
372
- if (localY.value + localHeight.value > screenHeight) {
373
- localHeight.value = screenHeight - localY.value;
374
- }
415
+ // 限制最小尺寸
416
+ let newWidth = Math.max(props.minWidth, startWidth + dx);
417
+ let newHeight = Math.max(props.minHeight, startHeight + dy);
418
+
419
+ // 限制最大宽度 (百分比)
420
+ const maxWidthLimit = screenWidth * ((props.maxWidth || 100) / 100);
421
+ if (newWidth > maxWidthLimit) newWidth = maxWidthLimit;
422
+
423
+ // 限制最大高度
424
+ const maxHeightLimit = screenHeight - localY.value - props.boundaryPadding;
425
+ if (newHeight > maxHeightLimit) newHeight = maxHeightLimit;
426
+
427
+ localWidth.value = newWidth;
428
+ localHeight.value = newHeight;
429
+ emitChange();
375
430
  }
376
431
 
377
432
  function onResizeEnd() {
@@ -427,27 +482,85 @@ const emitChange = debounce(() => {
427
482
  touch-action: none;
428
483
  overflow: hidden;
429
484
  background-color: var(--dev-tool-bg3-color);
430
- box-shadow: 0 4px 16px rgb(0 0 0 / 15%);
485
+ box-shadow: 0 8px 24px rgb(0 0 0 / 20%);
431
486
  display: flex;
432
487
  flex-direction: column;
433
488
  pointer-events: auto; /* 确保容器及其子项能够接收事件 */
489
+ border-radius: 12px;
490
+ border: 1px solid var(--dev-tool-border-color, #eee);
491
+ box-sizing: border-box;
492
+ }
493
+
494
+ .draggable-container.is-full-screen {
495
+ border-radius: 0;
496
+ border: none;
497
+ }
498
+
499
+ .draggable-content {
500
+ flex: 1;
501
+ overflow: hidden;
502
+ position: relative;
503
+ }
504
+
505
+ .draggable-handle-container {
506
+ flex-shrink: 0;
507
+ cursor: move;
508
+ width: 100%;
509
+ }
510
+
511
+ .window-header-default {
512
+ height: 18px;
513
+ display: flex;
514
+ justify-content: center;
515
+ align-items: center;
516
+ width: 100%;
517
+ }
518
+
519
+ .drag-indicator-default {
520
+ width: 32px;
521
+ height: 4px;
522
+ border-radius: 2px;
523
+ background-color: var(--dev-tool-border-color, #f0f0f0);
524
+ opacity: 0.6;
525
+ }
526
+
527
+ .draggable-handle-container.dark .drag-indicator-default {
528
+ background-color: #555;
434
529
  }
435
530
 
436
531
  .resize-handle {
437
532
  position: absolute;
438
533
  right: 0;
439
534
  bottom: 0;
440
- width: 32px; /* 增加热区面积 */
441
- height: 32px;
535
+ width: 24px;
536
+ height: 24px;
442
537
  cursor: nwse-resize;
443
- background: linear-gradient(
444
- 135deg,
445
- transparent 60%,
446
- var(--dev-tool-main-color) 60%
447
- );
538
+ pointer-events: auto;
448
539
  opacity: 0.6;
449
- pointer-events: auto; /* 显式开启事件响应 */
450
- border-radius: 12px;
540
+ transition: opacity 0.2s;
541
+ }
542
+
543
+ .resize-handle::before,
544
+ .resize-handle::after {
545
+ content: '';
546
+ position: absolute;
547
+ border-right: 2px solid var(--dev-tool-main-color);
548
+ border-bottom: 2px solid var(--dev-tool-main-color);
549
+ border-bottom-right-radius: 100%;
550
+ }
551
+
552
+ .resize-handle::before {
553
+ width: 12px;
554
+ height: 12px;
555
+ bottom: 4px;
556
+ right: 4px;
557
+ }
558
+
559
+ .resize-handle::after {
560
+ width: 6px;
561
+ height: 6px;
562
+ bottom: 3px;
563
+ right: 3px;
451
564
  }
452
565
 
453
566
  .resize-handle:active {
@@ -1,29 +1,29 @@
1
- <template>
2
- <view class="dev-tool-empty">
3
- <image :src="empty" class="dev-tool-empty-image" />
4
- <text class="dev-tool-empty-text">{{ text ?? '暂无调试信息' }}</text>
5
- </view>
6
- </template>
7
- <script lang="ts" setup>
8
- import empty from './empty.png';
9
- defineProps<{ text?: string }>();
10
- </script>
11
- <style scoped>
12
- .dev-tool-empty {
13
- display: flex;
14
- flex-direction: column;
15
- justify-content: center;
16
- align-items: center;
17
- margin: 0 auto;
18
- }
19
-
20
- .dev-tool-empty-image {
21
- margin-top: 50px;
22
- width: 50px;
23
- height: 50px;
24
- }
25
-
26
- .dev-tool-empty-text {
27
- color: #888;
28
- }
29
- </style>
1
+ <template>
2
+ <view class="dev-tool-empty">
3
+ <image :src="empty" class="dev-tool-empty-image" />
4
+ <text class="dev-tool-empty-text">{{ text ?? '暂无调试信息' }}</text>
5
+ </view>
6
+ </template>
7
+ <script lang="ts" setup>
8
+ import empty from './empty.png';
9
+ defineProps<{ text?: string }>();
10
+ </script>
11
+ <style scoped>
12
+ .dev-tool-empty {
13
+ display: flex;
14
+ flex-direction: column;
15
+ justify-content: center;
16
+ align-items: center;
17
+ margin: 0 auto;
18
+ }
19
+
20
+ .dev-tool-empty-image {
21
+ margin-top: 50px;
22
+ width: 50px;
23
+ height: 50px;
24
+ }
25
+
26
+ .dev-tool-empty-text {
27
+ color: #888;
28
+ }
29
+ </style>