vite-uni-dev-tool 1.2.0 → 1.2.2
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.
- package/README.md +17 -1
- package/dist/const.cjs +1 -1
- package/dist/const.d.ts +1 -1
- package/dist/const.js +1 -1
- package/dist/core-shared.d.ts +2 -3
- package/dist/core.d.ts +8 -8
- package/dist/core.js +1 -1
- package/dist/i18n/index.d.ts +0 -1
- package/dist/i18n/instance.d.ts +0 -1
- package/dist/i18n/locales/en.cjs +1 -1
- package/dist/i18n/locales/en.d.ts +1 -1
- package/dist/i18n/locales/en.js +1 -1
- package/dist/i18n/locales/zh-Hans.cjs +1 -1
- package/dist/i18n/locales/zh-Hans.d.ts +1 -1
- package/dist/i18n/locales/zh-Hans.js +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/modules/devConsole/index.cjs +4 -4
- package/dist/modules/devConsole/index.d.ts +6 -107
- package/dist/modules/devConsole/index.js +4 -4
- package/dist/modules/devEvent/index.cjs +3 -3
- package/dist/modules/devEvent/index.d.ts +2 -3
- package/dist/modules/devEvent/index.js +3 -3
- package/dist/modules/devIntercept/index.cjs +14 -14
- package/dist/modules/devIntercept/index.d.ts +33 -5
- package/dist/modules/devIntercept/index.js +14 -14
- package/dist/modules/devStore/index.cjs +1 -1
- package/dist/modules/devStore/index.d.ts +48 -40
- package/dist/modules/devStore/index.js +1 -1
- package/dist/modules/devToolInfo/index.cjs +1 -1
- package/dist/modules/devToolInfo/index.d.ts +6 -25
- package/dist/modules/devToolInfo/index.js +1 -1
- package/dist/plugins/uniDevTool/transform/transformApp.d.ts +0 -1
- package/dist/plugins/uniDevTool/transform/transformMain.d.ts +0 -1
- package/dist/plugins/uniDevTool/transform/transformVue.d.ts +0 -1
- package/dist/plugins/uniDevTool/uniDevTool.d.ts +0 -1
- package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts +0 -1
- package/dist/plugins/utils/index.d.ts +0 -1
- package/dist/shims-uni.d.ts +26 -22
- package/dist/type.d.ts +44 -43
- package/dist/utils/array.d.ts +0 -1
- package/dist/utils/date.d.ts +0 -1
- package/dist/utils/file.d.ts +0 -1
- package/dist/utils/function.d.ts +0 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/ip.d.ts +0 -1
- package/dist/utils/language.d.ts +14 -15
- package/dist/utils/object.cjs +1 -1
- package/dist/utils/object.d.ts +7 -8
- package/dist/utils/object.js +1 -1
- package/dist/utils/openLink.d.ts +0 -1
- package/dist/utils/page.d.ts +0 -1
- package/dist/utils/platform.d.ts +0 -1
- package/dist/utils/string.d.ts +0 -1
- package/dist/utils/utils.d.ts +0 -1
- package/dist/v3/DevTool/components/DevToolButton/index.vue +42 -6
- package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolData.ts +36 -12
- package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolHandlers.ts +16 -1
- package/dist/v3/DevTool/components/DevToolWindow/index.vue +27 -64
- package/dist/v3/DevTool/components/Instance/transformTree.ts +156 -138
- package/dist/v3/DevTool/components/SettingList/index.vue +8 -0
- package/dist/v3/DevTool/components/SettingList/modules/SettingBarrage.vue +16 -0
- package/dist/v3/DevTool/index.vue +87 -138
- package/dist/v3/components/AppTransition/index.vue +33 -53
- package/dist/v3/components/Barrage/BarrageItem.vue +66 -9
- package/dist/v3/components/Barrage/index.vue +3 -0
- package/dist/v3/components/DevErrorBoundary/index.vue +13 -5
- package/dist/v3/components/DraggableContainer/index.vue +186 -73
- package/dist/v3/components/MovableContainer/index.vue +2 -0
- package/dist/v3/components/Pick/index.vue +29 -30
- package/dist/v3/hooks/useContainerStyle.ts +15 -73
- package/package.json +4 -1
- package/dist/const.d.ts.map +0 -1
- package/dist/core-shared.d.ts.map +0 -1
- package/dist/core.d.ts.map +0 -1
- package/dist/i18n/index.d.ts.map +0 -1
- package/dist/i18n/instance.d.ts.map +0 -1
- package/dist/i18n/locales/en.d.ts.map +0 -1
- package/dist/i18n/locales/zh-Hans.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/modules/devConsole/index.d.ts.map +0 -1
- package/dist/modules/devEvent/index.d.ts.map +0 -1
- package/dist/modules/devIntercept/index.d.ts.map +0 -1
- package/dist/modules/devStore/index.d.ts.map +0 -1
- package/dist/modules/devToolInfo/index.d.ts.map +0 -1
- package/dist/plugins/uniDevTool/transform/transformApp.d.ts.map +0 -1
- package/dist/plugins/uniDevTool/transform/transformMain.d.ts.map +0 -1
- package/dist/plugins/uniDevTool/transform/transformVue.d.ts.map +0 -1
- package/dist/plugins/uniDevTool/uniDevTool.d.ts.map +0 -1
- package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts.map +0 -1
- package/dist/plugins/utils/index.d.ts.map +0 -1
- package/dist/type.d.ts.map +0 -1
- package/dist/utils/array.d.ts.map +0 -1
- package/dist/utils/date.d.ts.map +0 -1
- package/dist/utils/file.d.ts.map +0 -1
- package/dist/utils/function.d.ts.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/ip.d.ts.map +0 -1
- package/dist/utils/language.d.ts.map +0 -1
- package/dist/utils/object.d.ts.map +0 -1
- package/dist/utils/openLink.d.ts.map +0 -1
- package/dist/utils/page.d.ts.map +0 -1
- package/dist/utils/platform.d.ts.map +0 -1
- package/dist/utils/string.d.ts.map +0 -1
- 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
|
-
|
|
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,
|
|
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():
|
|
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
|
-
|
|
131
|
+
/**
|
|
132
|
+
* 获取最新的屏幕/窗口尺寸
|
|
133
|
+
*/
|
|
134
|
+
function updateScreenSize() {
|
|
107
135
|
const sysInfo = uni.getSystemInfoSync();
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
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
|
-
|
|
137
|
-
|
|
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:
|
|
185
|
-
top:
|
|
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
|
|
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(
|
|
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 (
|
|
287
|
+
if (!isTargetOnHandle(e.target)) return;
|
|
228
288
|
|
|
229
|
-
|
|
289
|
+
e.preventDefault(); // 关键:阻止浏览器默认选择/拖拽行为
|
|
290
|
+
startDrag(e.clientX, e.clientY + props.safeTop);
|
|
230
291
|
}
|
|
231
292
|
|
|
232
|
-
function isTargetOnHandle(target:
|
|
233
|
-
|
|
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
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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.
|
|
320
|
+
curr = curr.parentElement;
|
|
265
321
|
if (
|
|
266
|
-
curr
|
|
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
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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
|
|
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:
|
|
441
|
-
height:
|
|
535
|
+
width: 24px;
|
|
536
|
+
height: 24px;
|
|
442
537
|
cursor: nwse-resize;
|
|
443
|
-
|
|
444
|
-
135deg,
|
|
445
|
-
transparent 60%,
|
|
446
|
-
var(--dev-tool-main-color) 60%
|
|
447
|
-
);
|
|
538
|
+
pointer-events: auto;
|
|
448
539
|
opacity: 0.6;
|
|
449
|
-
|
|
450
|
-
|
|
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 {
|
|
@@ -67,71 +67,70 @@
|
|
|
67
67
|
import { debounce } from '../../../utils';
|
|
68
68
|
import { ref, computed } from 'vue';
|
|
69
69
|
|
|
70
|
+
interface Option {
|
|
71
|
+
label: string;
|
|
72
|
+
value: any;
|
|
73
|
+
}
|
|
74
|
+
|
|
70
75
|
const props = defineProps<{
|
|
71
76
|
placeholder?: string;
|
|
72
77
|
readonly?: boolean;
|
|
73
78
|
allowClear?: boolean;
|
|
74
|
-
options?:
|
|
79
|
+
options?: Option[];
|
|
75
80
|
customStyle?: Record<string, any> | string;
|
|
76
81
|
}>();
|
|
77
82
|
|
|
78
83
|
const modelValue = defineModel<string>('modelValue');
|
|
79
|
-
|
|
80
84
|
const emit = defineEmits<{
|
|
81
85
|
(e: 'search', value: string): void;
|
|
82
86
|
(e: 'openSearch', value: boolean): void;
|
|
83
|
-
(e: 'change', value:
|
|
87
|
+
(e: 'change', value: Option): void;
|
|
84
88
|
}>();
|
|
85
89
|
|
|
86
90
|
const isActive = ref(false);
|
|
87
91
|
const searchText = ref('');
|
|
88
92
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
);
|
|
95
|
-
});
|
|
93
|
+
const label = computed(
|
|
94
|
+
() =>
|
|
95
|
+
props.options?.find((i) => i.value === modelValue.value)?.label ??
|
|
96
|
+
modelValue.value,
|
|
97
|
+
);
|
|
96
98
|
|
|
97
99
|
const filteredOptions = computed(() => {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
);
|
|
100
|
+
const list = props.options || [];
|
|
101
|
+
if (!searchText.value) return list;
|
|
102
|
+
const s = searchText.value.toLowerCase();
|
|
103
|
+
return list.filter((i) => i.label?.toLowerCase().includes(s));
|
|
103
104
|
});
|
|
104
105
|
|
|
105
|
-
|
|
106
|
+
const onOpenPick = () => {
|
|
106
107
|
isActive.value = true;
|
|
107
108
|
searchText.value = '';
|
|
108
109
|
emit('openSearch', true);
|
|
109
|
-
}
|
|
110
|
+
};
|
|
110
111
|
|
|
111
|
-
|
|
112
|
+
const onClosePick = () => {
|
|
112
113
|
isActive.value = false;
|
|
113
114
|
emit('openSearch', false);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function onInput(e: any) {
|
|
117
|
-
const value = e.detail?.value ?? e.target?.value;
|
|
118
|
-
searchText.value = value;
|
|
119
|
-
emit('search', value);
|
|
120
|
-
}
|
|
115
|
+
};
|
|
121
116
|
|
|
122
|
-
const debounceInput = debounce(
|
|
117
|
+
const debounceInput = debounce((e: any) => {
|
|
118
|
+
const val = e.detail?.value ?? e.target?.value;
|
|
119
|
+
searchText.value = val;
|
|
120
|
+
emit('search', val);
|
|
121
|
+
}, 300);
|
|
123
122
|
|
|
124
|
-
|
|
123
|
+
const onSelect = (item: Option) => {
|
|
125
124
|
modelValue.value = item.value;
|
|
126
125
|
emit('change', item);
|
|
127
126
|
onClosePick();
|
|
128
|
-
}
|
|
127
|
+
};
|
|
129
128
|
|
|
130
|
-
|
|
129
|
+
const onClear = () => {
|
|
131
130
|
modelValue.value = '';
|
|
132
131
|
emit('search', '');
|
|
133
132
|
emit('change', { label: '', value: '' });
|
|
134
|
-
}
|
|
133
|
+
};
|
|
135
134
|
</script>
|
|
136
135
|
|
|
137
136
|
<style scoped>
|
|
@@ -23,54 +23,30 @@ let tabHeight = 50;
|
|
|
23
23
|
* @return {*}
|
|
24
24
|
*/
|
|
25
25
|
const useContainerStyle = (style?: Record<string, any>) => {
|
|
26
|
-
const customStyle = reactive({
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}),
|
|
26
|
+
const customStyle = reactive<Record<string, any>>({
|
|
27
|
+
height: '0px',
|
|
28
|
+
boxSizing: 'border-box' as const,
|
|
29
|
+
...style,
|
|
31
30
|
});
|
|
32
|
-
|
|
33
31
|
const contentHeight = ref(0);
|
|
34
|
-
|
|
35
32
|
const contentType = ref('');
|
|
36
33
|
|
|
37
34
|
onMounted(() => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (uni.getWindowInfo) {
|
|
44
|
-
const winInfo = uni.getWindowInfo();
|
|
45
|
-
screenHeight = winInfo.screenHeight;
|
|
46
|
-
windowHeight = winInfo.windowHeight;
|
|
47
|
-
height = winInfo.safeArea.height;
|
|
48
|
-
statusBarHeight = winInfo.statusBarHeight;
|
|
49
|
-
} else {
|
|
50
|
-
const sysInfo = uni.getSystemInfoSync();
|
|
51
|
-
screenHeight = sysInfo.screenHeight;
|
|
52
|
-
windowHeight = sysInfo.windowHeight;
|
|
53
|
-
height = sysInfo.safeArea?.height ?? 0;
|
|
54
|
-
statusBarHeight = sysInfo.statusBarHeight ?? 0;
|
|
55
|
-
}
|
|
35
|
+
const info = uni.getWindowInfo
|
|
36
|
+
? uni.getWindowInfo()
|
|
37
|
+
: uni.getSystemInfoSync();
|
|
38
|
+
const { screenHeight, windowHeight, statusBarHeight = 0 } = info;
|
|
39
|
+
const safeH = ('safeArea' in info ? info.safeArea?.height : 0) || 0;
|
|
56
40
|
|
|
57
41
|
const diff = screenHeight - windowHeight;
|
|
58
|
-
const diffStatus =
|
|
59
|
-
|
|
60
|
-
// console.log('diff: ', diff);
|
|
61
|
-
// console.log('diffStatus: ', diffStatus);
|
|
62
|
-
// console.log('windowHeight: ', windowHeight);
|
|
63
|
-
// console.log('screenHeight: ', screenHeight);
|
|
64
|
-
// console.log('statusBarHeight: ', statusBarHeight);
|
|
42
|
+
const diffStatus = diff - statusBarHeight;
|
|
65
43
|
|
|
66
44
|
// #ifdef !H5
|
|
45
|
+
Object.assign(customStyle, { height: windowHeight + 'px' });
|
|
67
46
|
if (diffStatus === navigateHeight) {
|
|
68
|
-
// console.log('当前页只存在 navigate: ');
|
|
69
47
|
Object.assign(customStyle, {
|
|
70
48
|
paddingTop: '0px',
|
|
71
49
|
paddingBottom: tabHeight + 'px',
|
|
72
|
-
height: windowHeight + 'px',
|
|
73
|
-
boxSizing: 'border-box',
|
|
74
50
|
});
|
|
75
51
|
contentHeight.value = windowHeight - tabHeight;
|
|
76
52
|
contentType.value = 'navigate';
|
|
@@ -78,76 +54,42 @@ const useContainerStyle = (style?: Record<string, any>) => {
|
|
|
78
54
|
diff > navigateHeight &&
|
|
79
55
|
diff < navigateHeight + statusBarHeight
|
|
80
56
|
) {
|
|
81
|
-
// 当前页只存在 tab
|
|
82
|
-
// console.log('当前页只存在 tab: ');
|
|
83
|
-
// 微信模拟器中 navigateHeight 已经被计算到 windowHeight 中 ,导致高度计算异常
|
|
84
|
-
// 暂时没有办法补偿 凸(艹皿艹 )
|
|
85
|
-
|
|
86
57
|
Object.assign(customStyle, {
|
|
87
58
|
paddingTop: navigateHeight + statusBarHeight + 'px',
|
|
88
59
|
paddingBottom: 0,
|
|
89
|
-
height: windowHeight + 'px',
|
|
90
|
-
boxSizing: 'border-box',
|
|
91
60
|
});
|
|
92
|
-
|
|
93
|
-
// 最终算的结果和原有的 50 存在差距
|
|
94
61
|
tabHeight = diff;
|
|
95
62
|
contentHeight.value =
|
|
96
63
|
screenHeight - navigateHeight - diff - statusBarHeight;
|
|
97
64
|
contentType.value = 'tab';
|
|
98
65
|
} else if (diff === 0) {
|
|
99
|
-
// 当前页不存在 navigate 和 tab
|
|
100
|
-
// console.log('当前页不存在 navigate 和 tab: ');
|
|
101
|
-
|
|
102
66
|
Object.assign(customStyle, {
|
|
103
67
|
paddingTop: navigateHeight + statusBarHeight + 'px',
|
|
104
68
|
paddingBottom: tabHeight + 'px',
|
|
105
|
-
height: windowHeight + 'px',
|
|
106
|
-
boxSizing: 'border-box',
|
|
107
69
|
});
|
|
108
|
-
|
|
109
70
|
contentHeight.value =
|
|
110
71
|
screenHeight - navigateHeight - tabHeight - statusBarHeight;
|
|
111
72
|
contentType.value = '';
|
|
112
73
|
} else {
|
|
113
|
-
// 当前页存在 navigate 和 tab
|
|
114
|
-
// console.log('当前页存在 navigate 和 tab: ');
|
|
115
|
-
|
|
116
|
-
// 最终算的结果和原有的 50 存在差距
|
|
117
74
|
tabHeight = diff - navigateHeight - statusBarHeight;
|
|
118
|
-
|
|
119
|
-
Object.assign(customStyle, {
|
|
120
|
-
paddingTop: '0px',
|
|
121
|
-
paddingBottom: '0px',
|
|
122
|
-
height: windowHeight + 'px',
|
|
123
|
-
boxSizing: 'border-box',
|
|
124
|
-
});
|
|
75
|
+
Object.assign(customStyle, { paddingTop: '0px', paddingBottom: '0px' });
|
|
125
76
|
contentHeight.value =
|
|
126
77
|
screenHeight - tabHeight - navigateHeight - statusBarHeight;
|
|
127
|
-
|
|
128
78
|
contentType.value = 'navigateAndTab';
|
|
129
79
|
}
|
|
130
|
-
|
|
131
80
|
// #endif
|
|
132
81
|
|
|
133
82
|
// #ifdef H5
|
|
134
83
|
Object.assign(customStyle, {
|
|
135
84
|
paddingTop: '44px',
|
|
136
85
|
paddingBottom: '50px',
|
|
137
|
-
height:
|
|
138
|
-
boxSizing: 'border-box',
|
|
86
|
+
height: safeH + 'px',
|
|
139
87
|
});
|
|
140
|
-
contentHeight.value =
|
|
88
|
+
contentHeight.value = safeH - 50 - 44;
|
|
141
89
|
// #endif
|
|
142
|
-
// console.log('tabHeight: ', tabHeight);
|
|
143
|
-
// console.log('customStyle: ', customStyle);
|
|
144
90
|
});
|
|
145
91
|
|
|
146
|
-
return {
|
|
147
|
-
contentType,
|
|
148
|
-
customStyle,
|
|
149
|
-
contentHeight,
|
|
150
|
-
};
|
|
92
|
+
return { contentType, customStyle, contentHeight };
|
|
151
93
|
};
|
|
152
94
|
|
|
153
95
|
export default useContainerStyle;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vite-uni-dev-tool",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "vite-uni-dev-tool, debug, uni-app, 一处编写,到处调试",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"vite",
|
|
@@ -63,5 +63,8 @@
|
|
|
63
63
|
],
|
|
64
64
|
"publishConfig": {
|
|
65
65
|
"access": "public"
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"esbuild": "^0.27.3"
|
|
66
69
|
}
|
|
67
70
|
}
|
package/dist/const.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../src/const.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C;;;;GAIG;AAGH,eAAO,MAAM,QAAQ;;;;;;;;;;;CAkBX,CAAC;AAGX,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqEX,CAAC;AAEX;;;;GAIG;AAGH,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,eAAO,MAAM,uBAAuB,kCAAkC,CAAC;AACvE,eAAO,MAAM,sBAAsB,iCAAiC,CAAC;AACrE,eAAO,MAAM,qBAAqB,gCAAgC,CAAC;AAGnE,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AACnD,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AAGzD,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE;;;;GAIG;AAEH,eAAO,MAAM,aAAa,kBAAkB,CAAC"}
|