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.
Files changed (104) hide show
  1. package/README.md +17 -1
  2. package/dist/const.cjs +1 -1
  3. package/dist/const.d.ts +1 -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 +1 -1
  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 +1 -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 +1 -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 +33 -5
  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.d.ts +0 -1
  34. package/dist/plugins/uniDevTool/transform/transformVue.d.ts +0 -1
  35. package/dist/plugins/uniDevTool/uniDevTool.d.ts +0 -1
  36. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts +0 -1
  37. package/dist/plugins/utils/index.d.ts +0 -1
  38. package/dist/shims-uni.d.ts +26 -22
  39. package/dist/type.d.ts +44 -43
  40. package/dist/utils/array.d.ts +0 -1
  41. package/dist/utils/date.d.ts +0 -1
  42. package/dist/utils/file.d.ts +0 -1
  43. package/dist/utils/function.d.ts +0 -1
  44. package/dist/utils/index.d.ts +0 -1
  45. package/dist/utils/ip.d.ts +0 -1
  46. package/dist/utils/language.d.ts +14 -15
  47. package/dist/utils/object.cjs +1 -1
  48. package/dist/utils/object.d.ts +7 -8
  49. package/dist/utils/object.js +1 -1
  50. package/dist/utils/openLink.d.ts +0 -1
  51. package/dist/utils/page.d.ts +0 -1
  52. package/dist/utils/platform.d.ts +0 -1
  53. package/dist/utils/string.d.ts +0 -1
  54. package/dist/utils/utils.d.ts +0 -1
  55. package/dist/v3/DevTool/components/DevToolButton/index.vue +42 -6
  56. package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolData.ts +36 -12
  57. package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolHandlers.ts +16 -1
  58. package/dist/v3/DevTool/components/DevToolWindow/index.vue +27 -64
  59. package/dist/v3/DevTool/components/Instance/transformTree.ts +156 -138
  60. package/dist/v3/DevTool/components/SettingList/index.vue +8 -0
  61. package/dist/v3/DevTool/components/SettingList/modules/SettingBarrage.vue +16 -0
  62. package/dist/v3/DevTool/index.vue +87 -138
  63. package/dist/v3/components/AppTransition/index.vue +33 -53
  64. package/dist/v3/components/Barrage/BarrageItem.vue +66 -9
  65. package/dist/v3/components/Barrage/index.vue +3 -0
  66. package/dist/v3/components/DevErrorBoundary/index.vue +13 -5
  67. package/dist/v3/components/DraggableContainer/index.vue +186 -73
  68. package/dist/v3/components/MovableContainer/index.vue +2 -0
  69. package/dist/v3/components/Pick/index.vue +29 -30
  70. package/dist/v3/hooks/useContainerStyle.ts +15 -73
  71. package/package.json +4 -1
  72. package/dist/const.d.ts.map +0 -1
  73. package/dist/core-shared.d.ts.map +0 -1
  74. package/dist/core.d.ts.map +0 -1
  75. package/dist/i18n/index.d.ts.map +0 -1
  76. package/dist/i18n/instance.d.ts.map +0 -1
  77. package/dist/i18n/locales/en.d.ts.map +0 -1
  78. package/dist/i18n/locales/zh-Hans.d.ts.map +0 -1
  79. package/dist/index.d.ts.map +0 -1
  80. package/dist/modules/devConsole/index.d.ts.map +0 -1
  81. package/dist/modules/devEvent/index.d.ts.map +0 -1
  82. package/dist/modules/devIntercept/index.d.ts.map +0 -1
  83. package/dist/modules/devStore/index.d.ts.map +0 -1
  84. package/dist/modules/devToolInfo/index.d.ts.map +0 -1
  85. package/dist/plugins/uniDevTool/transform/transformApp.d.ts.map +0 -1
  86. package/dist/plugins/uniDevTool/transform/transformMain.d.ts.map +0 -1
  87. package/dist/plugins/uniDevTool/transform/transformVue.d.ts.map +0 -1
  88. package/dist/plugins/uniDevTool/uniDevTool.d.ts.map +0 -1
  89. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts.map +0 -1
  90. package/dist/plugins/utils/index.d.ts.map +0 -1
  91. package/dist/type.d.ts.map +0 -1
  92. package/dist/utils/array.d.ts.map +0 -1
  93. package/dist/utils/date.d.ts.map +0 -1
  94. package/dist/utils/file.d.ts.map +0 -1
  95. package/dist/utils/function.d.ts.map +0 -1
  96. package/dist/utils/index.d.ts.map +0 -1
  97. package/dist/utils/ip.d.ts.map +0 -1
  98. package/dist/utils/language.d.ts.map +0 -1
  99. package/dist/utils/object.d.ts.map +0 -1
  100. package/dist/utils/openLink.d.ts.map +0 -1
  101. package/dist/utils/page.d.ts.map +0 -1
  102. package/dist/utils/platform.d.ts.map +0 -1
  103. package/dist/utils/string.d.ts.map +0 -1
  104. 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,5 +1,7 @@
1
1
  <template>
2
+ <!-- are you ok ? -->
2
3
  <movable-area class="movable-area" :style="areaStyle">
4
+ <!-- are you ok ? -->
3
5
  <movable-view
4
6
  class="movable-view"
5
7
  :style="viewStyle"
@@ -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?: { label: string; value: any }[];
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: { label: string; value: any }): void;
87
+ (e: 'change', value: Option): void;
84
88
  }>();
85
89
 
86
90
  const isActive = ref(false);
87
91
  const searchText = ref('');
88
92
 
89
- // Computed label for the trigger
90
- const label = computed(() => {
91
- return (
92
- props.options?.find((item) => item.value === modelValue.value)?.label ??
93
- modelValue.value
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
- if (!searchText.value) return props.options || [];
99
- const lowerSearch = searchText.value.toLowerCase();
100
- return (props.options || []).filter(
101
- (item) => item.label && item.label.toLowerCase().includes(lowerSearch),
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
- function onOpenPick() {
106
+ const onOpenPick = () => {
106
107
  isActive.value = true;
107
108
  searchText.value = '';
108
109
  emit('openSearch', true);
109
- }
110
+ };
110
111
 
111
- function onClosePick() {
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(onInput, 300);
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
- function onSelect(item: { label: string; value: any }) {
123
+ const onSelect = (item: Option) => {
125
124
  modelValue.value = item.value;
126
125
  emit('change', item);
127
126
  onClosePick();
128
- }
127
+ };
129
128
 
130
- function onClear() {
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
- ...(style || {
28
- height: '0px',
29
- boxSizing: 'border-box',
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
- let screenHeight: number = 0;
39
- let windowHeight: number = 0;
40
- let height: number = 0;
41
- let statusBarHeight: number = 0;
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 = screenHeight - windowHeight - statusBarHeight;
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: height + 'px',
138
- boxSizing: 'border-box',
86
+ height: safeH + 'px',
139
87
  });
140
- contentHeight.value = height - 50 - 44;
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.0",
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
  }
@@ -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"}