vite-uni-dev-tool 0.0.48 → 1.0.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 (292) hide show
  1. package/README.md +20 -0
  2. package/dist/const.cjs +1 -0
  3. package/dist/const.d.ts +78 -161
  4. package/dist/const.d.ts.map +1 -1
  5. package/dist/const.js +1 -47
  6. package/dist/core-shared.d.ts +44 -0
  7. package/dist/core-shared.d.ts.map +1 -0
  8. package/dist/core-shared.js +1 -0
  9. package/dist/core.d.ts +2 -40
  10. package/dist/core.d.ts.map +1 -1
  11. package/dist/core.js +4 -159
  12. package/dist/i18n/index.cjs +1 -0
  13. package/dist/i18n/index.d.ts +9 -0
  14. package/dist/i18n/index.d.ts.map +1 -0
  15. package/dist/i18n/index.js +1 -0
  16. package/dist/i18n/instance.cjs +1 -0
  17. package/dist/i18n/instance.d.ts +15 -0
  18. package/dist/i18n/instance.d.ts.map +1 -0
  19. package/dist/i18n/instance.js +1 -0
  20. package/dist/i18n/locales/en.cjs +1 -0
  21. package/dist/i18n/locales/en.d.ts +470 -0
  22. package/dist/i18n/locales/en.d.ts.map +1 -0
  23. package/dist/i18n/locales/en.js +1 -0
  24. package/dist/i18n/locales/zh-Hans.cjs +1 -0
  25. package/dist/i18n/locales/zh-Hans.d.ts +476 -0
  26. package/dist/i18n/locales/zh-Hans.d.ts.map +1 -0
  27. package/dist/i18n/locales/zh-Hans.js +1 -0
  28. package/dist/index.cjs +1 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +1 -1
  31. package/dist/modules/devConsole/index.cjs +4 -0
  32. package/dist/{devConsole → modules/devConsole}/index.d.ts +1 -1
  33. package/dist/modules/devConsole/index.d.ts.map +1 -0
  34. package/dist/modules/devConsole/index.js +4 -0
  35. package/dist/modules/devEvent/index.cjs +5 -0
  36. package/dist/modules/devEvent/index.d.ts +115 -0
  37. package/dist/modules/devEvent/index.d.ts.map +1 -0
  38. package/dist/modules/devEvent/index.js +5 -0
  39. package/dist/modules/devIntercept/index.cjs +13 -0
  40. package/dist/modules/devIntercept/index.d.ts +71 -0
  41. package/dist/modules/devIntercept/index.d.ts.map +1 -0
  42. package/dist/modules/devIntercept/index.js +13 -0
  43. package/dist/modules/devStore/index.cjs +1 -0
  44. package/dist/modules/devStore/index.d.ts +159 -0
  45. package/dist/modules/devStore/index.d.ts.map +1 -0
  46. package/dist/modules/devStore/index.js +1 -0
  47. package/dist/modules/devToolInfo/index.cjs +1 -0
  48. package/dist/modules/devToolInfo/index.d.ts +27 -0
  49. package/dist/modules/devToolInfo/index.d.ts.map +1 -0
  50. package/dist/modules/devToolInfo/index.js +1 -0
  51. package/dist/plugins/uniDevTool/transform/transformApp.cjs +44 -0
  52. package/dist/plugins/uniDevTool/transform/transformApp.d.ts.map +1 -1
  53. package/dist/plugins/uniDevTool/transform/transformApp.js +17 -17
  54. package/dist/plugins/uniDevTool/transform/transformMain.cjs +3 -0
  55. package/dist/plugins/uniDevTool/transform/transformMain.d.ts.map +1 -1
  56. package/dist/plugins/uniDevTool/transform/transformMain.js +3 -3
  57. package/dist/plugins/uniDevTool/transform/transformVue.cjs +41 -0
  58. package/dist/plugins/uniDevTool/transform/transformVue.d.ts +1 -2
  59. package/dist/plugins/uniDevTool/transform/transformVue.d.ts.map +1 -1
  60. package/dist/plugins/uniDevTool/transform/transformVue.js +32 -19
  61. package/dist/plugins/uniDevTool/uniDevTool.cjs +5 -0
  62. package/dist/plugins/uniDevTool/uniDevTool.d.ts +3 -11
  63. package/dist/plugins/uniDevTool/uniDevTool.d.ts.map +1 -1
  64. package/dist/plugins/uniDevTool/uniDevTool.js +3 -3
  65. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.cjs +19 -0
  66. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts.map +1 -1
  67. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.js +11 -19
  68. package/dist/plugins/uniParseStock/index.d.ts +10 -0
  69. package/dist/plugins/uniParseStock/index.d.ts.map +1 -0
  70. package/dist/plugins/utils/index.cjs +2 -0
  71. package/dist/plugins/utils/index.d.ts +1 -3
  72. package/dist/plugins/utils/index.d.ts.map +1 -1
  73. package/dist/plugins/utils/index.js +2 -2
  74. package/dist/shims-uni.d.ts +140 -0
  75. package/dist/type.d.ts +174 -16
  76. package/dist/type.d.ts.map +1 -1
  77. package/dist/utils/array.cjs +1 -0
  78. package/dist/utils/array.d.ts.map +1 -1
  79. package/dist/utils/array.js +1 -12
  80. package/dist/utils/date.cjs +1 -0
  81. package/dist/utils/date.d.ts.map +1 -1
  82. package/dist/utils/date.js +1 -59
  83. package/dist/utils/file.cjs +1 -0
  84. package/dist/utils/file.d.ts.map +1 -1
  85. package/dist/utils/file.js +1 -85
  86. package/dist/utils/function.cjs +1 -0
  87. package/dist/utils/function.d.ts +13 -0
  88. package/dist/utils/function.d.ts.map +1 -1
  89. package/dist/utils/function.js +1 -68
  90. package/dist/utils/index.cjs +1 -0
  91. package/dist/utils/index.d.ts.map +1 -1
  92. package/dist/utils/index.js +1 -63
  93. package/dist/utils/ip.cjs +1 -0
  94. package/dist/utils/ip.d.ts +1 -1
  95. package/dist/utils/ip.d.ts.map +1 -1
  96. package/dist/utils/ip.js +1 -45
  97. package/dist/utils/language.cjs +1 -0
  98. package/dist/utils/language.d.ts +2 -1
  99. package/dist/utils/language.d.ts.map +1 -1
  100. package/dist/utils/language.js +1 -63
  101. package/dist/utils/object.cjs +1 -0
  102. package/dist/utils/object.d.ts +4 -5
  103. package/dist/utils/object.d.ts.map +1 -1
  104. package/dist/utils/object.js +1 -136
  105. package/dist/utils/openLink.cjs +1 -0
  106. package/dist/utils/openLink.d.ts.map +1 -1
  107. package/dist/utils/openLink.js +1 -28
  108. package/dist/utils/page.cjs +1 -0
  109. package/dist/utils/page.d.ts.map +1 -1
  110. package/dist/utils/page.js +1 -7
  111. package/dist/utils/platform.cjs +1 -0
  112. package/dist/utils/platform.d.ts.map +1 -1
  113. package/dist/utils/platform.js +1 -17
  114. package/dist/utils/string.cjs +1 -0
  115. package/dist/utils/string.d.ts.map +1 -1
  116. package/dist/utils/string.js +1 -114
  117. package/dist/utils/utils.cjs +1 -0
  118. package/dist/utils/utils.d.ts +1 -1
  119. package/dist/utils/utils.d.ts.map +1 -1
  120. package/dist/utils/utils.js +1 -126
  121. package/dist/v3/AppTransition/index.vue +170 -0
  122. package/dist/v3/AutoSizer/index.vue +4 -5
  123. package/dist/v3/AutoSizer/index1.vue +4 -6
  124. package/dist/v3/AutoSizer/utils.ts +1 -1
  125. package/dist/v3/CaptureScreen/index.vue +19 -8
  126. package/dist/v3/CircularButton/index.vue +64 -13
  127. package/dist/v3/ConsoleList/ConsoleItem.vue +56 -5
  128. package/dist/v3/ConsoleList/RunJSInput.vue +10 -6
  129. package/dist/v3/ConsoleList/index.vue +51 -35
  130. package/dist/v3/CustomSwiper/CustomSwiperItem.vue +49 -0
  131. package/dist/v3/CustomSwiper/index.vue +104 -0
  132. package/dist/v3/DevTool/fps-collector.render.ts +148 -0
  133. package/dist/v3/DevTool/index.vue +209 -102
  134. package/dist/v3/DevToolButton/index.vue +40 -59
  135. package/dist/v3/DevToolTitle/index.vue +4 -1
  136. package/dist/v3/DevToolWindow/DevToolOverlay.vue +182 -0
  137. package/dist/v3/DevToolWindow/const.ts +47 -69
  138. package/dist/v3/DevToolWindow/hooks/dataUtils.ts +48 -0
  139. package/dist/v3/DevToolWindow/hooks/useDevToolData.ts +338 -0
  140. package/dist/v3/DevToolWindow/hooks/useDevToolHandlers.ts +549 -0
  141. package/dist/v3/DevToolWindow/hooks/useDevToolOverlay.ts +184 -0
  142. package/dist/v3/DevToolWindow/index.css +89 -0
  143. package/dist/v3/DevToolWindow/index.vue +800 -1450
  144. package/dist/v3/DraggableContainer/index.vue +456 -0
  145. package/dist/v3/ElEvent/ElEventItem.vue +4 -3
  146. package/dist/v3/ElEvent/index.vue +26 -9
  147. package/dist/v3/Empty/index.vue +1 -0
  148. package/dist/v3/FilterInput/index.vue +8 -22
  149. package/dist/v3/FilterSelect/index.vue +37 -24
  150. package/dist/v3/Instance/components/InstanceTreeNode.vue +265 -0
  151. package/dist/v3/Instance/flatten.ts +226 -0
  152. package/dist/v3/Instance/index.vue +94 -0
  153. package/dist/v3/Instance/registry.ts +49 -0
  154. package/dist/v3/Instance/transformTree.ts +375 -0
  155. package/dist/v3/Instance/transformTreeCtx.ts +268 -0
  156. package/dist/v3/{InstanceTree → Instance}/typing.d.ts +15 -2
  157. package/dist/v3/InstanceDetail/index.vue +433 -44
  158. package/dist/v3/JsonDetail/index.vue +12 -8
  159. package/dist/v3/JsonPretty/components/Brackets/index.vue +1 -0
  160. package/dist/v3/JsonPretty/components/Carets/index.vue +2 -1
  161. package/dist/v3/JsonPretty/components/CheckController/index.vue +26 -15
  162. package/dist/v3/JsonPretty/components/TreeNode/index.vue +42 -20
  163. package/dist/v3/JsonPretty/index.vue +60 -37
  164. package/dist/v3/JsonPretty/utils/index.ts +41 -44
  165. package/dist/v3/MovableContainer/index.vue +89 -0
  166. package/dist/v3/NFCList/NFCItem.vue +14 -14
  167. package/dist/v3/NFCList/NFCTool.vue +99 -81
  168. package/dist/v3/NFCList/index.vue +14 -10
  169. package/dist/v3/NetworkList/InterceptConfig.vue +154 -364
  170. package/dist/v3/NetworkList/InterceptItem.vue +14 -6
  171. package/dist/v3/NetworkList/NetworkDetail.vue +34 -29
  172. package/dist/v3/NetworkList/NetworkIntercept.vue +11 -8
  173. package/dist/v3/NetworkList/NetworkItem.vue +27 -11
  174. package/dist/v3/NetworkList/NetworkSend.vue +132 -290
  175. package/dist/v3/NetworkList/hooks/useNetworkForm.ts +86 -0
  176. package/dist/v3/NetworkList/index.vue +32 -24
  177. package/dist/v3/NetworkList/utils.ts +101 -0
  178. package/dist/v3/Performance/index.vue +495 -0
  179. package/dist/v3/Performance/modules/PerformanceMetrics.vue +153 -0
  180. package/dist/v3/Performance/modules/PerformanceWidget.vue +249 -0
  181. package/dist/v3/Performance/modules/usePerformanceChart.ts +460 -0
  182. package/dist/v3/Performance/modules/usePerformanceData.ts +258 -0
  183. package/dist/v3/Pick/index.vue +322 -0
  184. package/dist/v3/PiniaList/index.vue +38 -17
  185. package/dist/v3/RouteList/index.vue +32 -15
  186. package/dist/v3/RunJS/index.vue +30 -10
  187. package/dist/v3/ScanCodeList/ScanCodeItem.vue +2 -9
  188. package/dist/v3/ScanCodeList/index.vue +12 -9
  189. package/dist/v3/SettingButton/index.vue +45 -0
  190. package/dist/v3/SettingList/index.css +120 -0
  191. package/dist/v3/SettingList/index.vue +96 -537
  192. package/dist/v3/SettingList/modules/SettingDevTool.vue +208 -0
  193. package/dist/v3/SettingList/modules/SettingInfo.vue +119 -0
  194. package/dist/v3/SettingList/modules/SettingLanguage.vue +74 -0
  195. package/dist/v3/SettingList/modules/SettingLog.vue +230 -0
  196. package/dist/v3/SettingList/modules/SettingNetwork.vue +120 -0
  197. package/dist/v3/SettingList/modules/SettingTheme.vue +312 -0
  198. package/dist/v3/SourceCode/Line.vue +15 -2
  199. package/dist/v3/SourceCode/index.vue +25 -24
  200. package/dist/v3/SourceCode/parseCode.ts +114 -56
  201. package/dist/v3/StorageList/index.vue +33 -33
  202. package/dist/v3/Tabs/index.vue +31 -28
  203. package/dist/v3/Tag/index.vue +39 -20
  204. package/dist/v3/TransferList/TransferDetail.vue +268 -0
  205. package/dist/v3/TransferList/TransferItem.vue +125 -0
  206. package/dist/v3/TransferList/index.vue +181 -0
  207. package/dist/v3/UniEvent/UniEventItem.vue +1 -0
  208. package/dist/v3/UniEvent/index.vue +28 -29
  209. package/dist/v3/{VirtualListPro → VirtualList}/AutoSize.vue +1 -1
  210. package/dist/v3/VirtualList/index.vue +382 -82
  211. package/dist/v3/VuexList/index.vue +38 -17
  212. package/dist/v3/WebSocket/WebSocketDetail.vue +142 -80
  213. package/dist/v3/WebSocket/WebSocketItem.vue +10 -4
  214. package/dist/v3/WebSocket/index.vue +44 -30
  215. package/dist/v3/hooks/useNFC/index.ts +6 -6
  216. package/dist/v3/hooks/useNFC/typing.d.ts +2 -2
  217. package/dist/v3/hooks/useNFC/useNFCAndroid.ts +215 -626
  218. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.ts +54 -85
  219. package/dist/v3/hooks/useNFC/utils.ts +3 -3
  220. package/dist/v3/hooks/useRequest/index.ts +2 -2
  221. package/dist/v3/hooks/useScanCode/index.ts +10 -8
  222. package/dist/v3/styles/theme.css +290 -0
  223. package/dist/v3/styles/theme.ts +12 -0
  224. package/package.json +25 -5
  225. package/dist/devConsole/index.d.ts.map +0 -1
  226. package/dist/devConsole/index.js +0 -273
  227. package/dist/devEvent/index.d.ts +0 -328
  228. package/dist/devEvent/index.d.ts.map +0 -1
  229. package/dist/devEvent/index.js +0 -697
  230. package/dist/devEventBus/index.d.ts +0 -42
  231. package/dist/devEventBus/index.d.ts.map +0 -1
  232. package/dist/devEventBus/index.js +0 -70
  233. package/dist/devIntercept/index.d.ts +0 -281
  234. package/dist/devIntercept/index.d.ts.map +0 -1
  235. package/dist/devIntercept/index.js +0 -949
  236. package/dist/devRunJS/index.d.ts +0 -67
  237. package/dist/devRunJS/index.d.ts.map +0 -1
  238. package/dist/devStore/index.d.ts +0 -199
  239. package/dist/devStore/index.d.ts.map +0 -1
  240. package/dist/devStore/index.js +0 -562
  241. package/dist/devToolInfo/index.d.ts +0 -17
  242. package/dist/devToolInfo/index.d.ts.map +0 -1
  243. package/dist/devToolInfo/index.js +0 -15
  244. package/dist/v3/AutoSizer/utils.d.ts +0 -5
  245. package/dist/v3/AutoSizer/utils.d.ts.map +0 -1
  246. package/dist/v3/ConsoleList/staticTips.d.ts +0 -13
  247. package/dist/v3/ConsoleList/staticTips.d.ts.map +0 -1
  248. package/dist/v3/DevToolWindow/const.d.ts +0 -46
  249. package/dist/v3/DevToolWindow/const.d.ts.map +0 -1
  250. package/dist/v3/InstanceTree/components/InstanceTreeNode.vue +0 -81
  251. package/dist/v3/InstanceTree/flatten.d.ts +0 -10
  252. package/dist/v3/InstanceTree/flatten.d.ts.map +0 -1
  253. package/dist/v3/InstanceTree/flatten.ts +0 -75
  254. package/dist/v3/InstanceTree/index.vue +0 -51
  255. package/dist/v3/InstanceTree/transformTree.d.ts +0 -17
  256. package/dist/v3/InstanceTree/transformTree.d.ts.map +0 -1
  257. package/dist/v3/InstanceTree/transformTree.ts +0 -237
  258. package/dist/v3/JsonPretty/hooks/useClipboard.d.ts +0 -4
  259. package/dist/v3/JsonPretty/hooks/useClipboard.d.ts.map +0 -1
  260. package/dist/v3/JsonPretty/hooks/useError.d.ts +0 -8
  261. package/dist/v3/JsonPretty/hooks/useError.d.ts.map +0 -1
  262. package/dist/v3/JsonPretty/type.d.ts +0 -94
  263. package/dist/v3/JsonPretty/type.d.ts.map +0 -1
  264. package/dist/v3/JsonPretty/utils/index.d.ts +0 -10
  265. package/dist/v3/JsonPretty/utils/index.d.ts.map +0 -1
  266. package/dist/v3/NFCList/const.d.ts +0 -13
  267. package/dist/v3/NFCList/const.d.ts.map +0 -1
  268. package/dist/v3/NetworkList/const.d.ts +0 -5
  269. package/dist/v3/NetworkList/const.d.ts.map +0 -1
  270. package/dist/v3/SourceCode/parseCode.d.ts +0 -27
  271. package/dist/v3/SourceCode/parseCode.d.ts.map +0 -1
  272. package/dist/v3/UploadList/UploadDetail.vue +0 -255
  273. package/dist/v3/UploadList/UploadItem.vue +0 -122
  274. package/dist/v3/UploadList/index.vue +0 -125
  275. package/dist/v3/VirtualListPro/index.vue +0 -229
  276. package/dist/v3/hooks/useContainerStyle.d.ts +0 -15
  277. package/dist/v3/hooks/useContainerStyle.d.ts.map +0 -1
  278. package/dist/v3/hooks/useNFC/index.d.ts +0 -5
  279. package/dist/v3/hooks/useNFC/index.d.ts.map +0 -1
  280. package/dist/v3/hooks/useNFC/useNFCAndroid.d.ts +0 -2
  281. package/dist/v3/hooks/useNFC/useNFCAndroid.d.ts.map +0 -1
  282. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.d.ts +0 -2
  283. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.d.ts.map +0 -1
  284. package/dist/v3/hooks/useNFC/utils.d.ts +0 -95
  285. package/dist/v3/hooks/useNFC/utils.d.ts.map +0 -1
  286. package/dist/v3/hooks/useRequest/index.d.ts +0 -126
  287. package/dist/v3/hooks/useRequest/index.d.ts.map +0 -1
  288. package/dist/v3/hooks/useRequest/utils.d.ts +0 -35
  289. package/dist/v3/hooks/useRequest/utils.d.ts.map +0 -1
  290. package/dist/v3/hooks/useScanCode/index.d.ts +0 -36
  291. package/dist/v3/hooks/useScanCode/index.d.ts.map +0 -1
  292. /package/dist/v3/{VirtualListPro → VirtualList}/readme.md +0 -0
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <view class="filter-select-wrapper">
2
+ <view class="filter-select-wrapper" :style="customStyle">
3
3
  <view
4
4
  v-if="readonly"
5
5
  :class="`filter-select ${!modelValue ? 'filter-select-placeholder' : ''}`"
@@ -9,28 +9,41 @@
9
9
  </view>
10
10
  <input
11
11
  v-else
12
- :class="`filter-select`"
12
+ class="filter-select"
13
13
  :value="label"
14
14
  :placeholder="placeholder || '请选择'"
15
- @confirm="debounceInput"
15
+ @input="debounceInput"
16
+ @confirm="onInput"
16
17
  @focus="onOpenList"
17
18
  />
18
- <view class="filter-select-clear" v-if="allowClear" @click="onClear">
19
+ <view
20
+ class="filter-select-clear"
21
+ v-if="allowClear && modelValue"
22
+ @click.stop="onClear"
23
+ >
19
24
  ×
20
25
  </view>
21
26
 
22
- <view class="filter-select-list" v-if="isActive">
23
- <view
24
- v-for="item in options"
25
- :key="item.value"
26
- :class="`filter-select-item ${
27
- item.value === modelValue ? 'filter-select-item-active' : ''
28
- }`"
29
- @click="onSelect(item)"
30
- >
31
- {{ item.label }}
27
+ <AppTransition
28
+ :show="isActive"
29
+ name="fade"
30
+ :duration="200"
31
+ :showContainer="false"
32
+ customStyle="position: absolute; top: 100%; left: 0; width: 100%; z-index: 10000;"
33
+ >
34
+ <view class="filter-select-list">
35
+ <view
36
+ v-for="item in options"
37
+ :key="item.value"
38
+ :class="`filter-select-item ${
39
+ item.value === modelValue ? 'filter-select-item-active' : ''
40
+ }`"
41
+ @click.stop="onSelect(item)"
42
+ >
43
+ {{ item.label }}
44
+ </view>
32
45
  </view>
33
- </view>
46
+ </AppTransition>
34
47
 
35
48
  <view
36
49
  class="filter-select-mask"
@@ -42,12 +55,14 @@
42
55
  <script lang="ts" setup>
43
56
  import { debounce } from '../../utils';
44
57
  import { ref, computed } from 'vue';
58
+ import AppTransition from '../AppTransition/index.vue';
45
59
  const props = defineProps<{
46
60
  placeholder?: string;
47
61
  modelValue?: string;
48
62
  readonly?: boolean;
49
63
  allowClear?: boolean;
50
64
  options?: { label: string; value: any }[];
65
+ customStyle?: Record<string, any> | string;
51
66
  }>();
52
67
  const emit = defineEmits<{
53
68
  (e: 'update:modelValue', value: string): void;
@@ -66,7 +81,7 @@ const label = computed(() => {
66
81
  });
67
82
 
68
83
  function onInput(e: any) {
69
- const value = e.detail.value;
84
+ const value = e.detail?.value ?? e.target?.value;
70
85
  emit('update:modelValue', value);
71
86
  emit('search', value);
72
87
  }
@@ -97,10 +112,8 @@ function onSelect(item: { label: string; value: any }) {
97
112
  width: 100%;
98
113
  min-width: 100px;
99
114
  height: 24px;
100
-
101
115
  border-radius: 4px;
102
116
  border: 1px solid var(--dev-tool-border-color);
103
-
104
117
  background-color: var(--dev-tool-bg-color);
105
118
  transition: background-color 0.3s;
106
119
  box-sizing: border-box;
@@ -110,11 +123,11 @@ function onSelect(item: { label: string; value: any }) {
110
123
  flex: 1;
111
124
  box-shadow: none;
112
125
  box-sizing: border-box;
113
- border-radius: 5;
126
+ font: unset;
127
+ border-radius: 5px;
114
128
  font-family: inherit;
115
129
  color: var(--dev-tool-text-color);
116
130
  font-weight: 400;
117
- font: unset;
118
131
  height: 24px;
119
132
  line-height: 24px;
120
133
  transition: color 0.3s;
@@ -134,14 +147,14 @@ function onSelect(item: { label: string; value: any }) {
134
147
  }
135
148
 
136
149
  .filter-select-list {
137
- z-index: 9999;
138
- position: absolute;
139
- top: 24px;
140
- left: 0;
141
150
  max-height: 300px;
142
151
  width: 100%;
143
152
  overflow: auto;
144
153
  background-color: var(--dev-tool-bg2-color);
154
+ box-shadow: 0 4px 12px rgb(0 0 0 / 15%);
155
+ border: 1px solid var(--dev-tool-border-color);
156
+ border-radius: 4px;
157
+ margin-top: 4px;
145
158
  }
146
159
 
147
160
  .filter-select-item {
@@ -0,0 +1,265 @@
1
+ <template>
2
+ <view
3
+ class="instance-tree-node"
4
+ :class="{ 'is-active': isActive }"
5
+ @click="$emit('select', node)">
6
+ <template v-if="showLine">
7
+ <view
8
+ v-for="i in node.level"
9
+ :key="i"
10
+ class="instance-tree-indent"></view>
11
+ </template>
12
+
13
+ <!-- 展开/收起 图标 -->
14
+ <view
15
+ v-if="node.isStartNode && node.hasChildren"
16
+ class="instance-tree-toggle"
17
+ :class="{ 'is-collapsed': node.isCollapsed }"
18
+ @click.stop="node.uid !== undefined && $emit('toggle', node.uid)">
19
+ <!-- 更加圆润的 SVG 箭头 -->
20
+ <svg
21
+ width="12"
22
+ height="12"
23
+ viewBox="0 0 24 24"
24
+ fill="none"
25
+ xmlns="http://www.w3.org/2000/svg">
26
+ <path
27
+ d="M9 18L15 12L9 6"
28
+ stroke="currentColor"
29
+ stroke-width="3"
30
+ stroke-linecap="round"
31
+ stroke-linejoin="round" />
32
+ </svg>
33
+ </view>
34
+ <view
35
+ v-else-if="node.isStartNode"
36
+ class="instance-tree-toggle-placeholder"></view>
37
+
38
+ <!-- 节点主体 (开始标签 或 文本内容 或 注释) -->
39
+ <view
40
+ v-if="node.isStartNode"
41
+ class="instance-tree-tag-inline"
42
+ @click="$emit('select', node)">
43
+ <template v-if="node.type === 'v-cmt'">
44
+ <text class="instance-tree-comment">
45
+ {{ CMT_START }} {{ node.inlineContent || node?.content || '' }}
46
+ </text>
47
+ <text v-if="node.isInline" class="instance-tree-comment">
48
+ {{ CMT_END }}
49
+ </text>
50
+ </template>
51
+ <template v-else>
52
+ <text class="instance-tree-bracket">{{ LT }}</text>
53
+ <text class="instance-tree-tag">{{ node.type }}</text>
54
+
55
+ <!-- 渲染属性:id, style (来自 styles) -->
56
+ <!-- <template v-if="node.styles">
57
+ <block v-for="(val, key) in node.styles" :key="key">
58
+ <template v-if="['id', 'style'].includes(key)">
59
+ &nbsp;&nbsp;
60
+ <text class="instance-tree-attr-key">{{ key }}</text>
61
+ <text class="instance-tree-bracket">=</text>
62
+ <text class="instance-tree-attr-value">"{{ val }}"</text>
63
+ </template>
64
+ </block>
65
+ </template> -->
66
+
67
+ <!-- 渲染 class (来自 props) 以及 data- 属性 -->
68
+ <!-- <template v-if="node.props">
69
+ <block v-for="(val, key) in node.props" :key="key">
70
+ <template v-if="!key.startsWith('data-v-')">
71
+ &nbsp;&nbsp;
72
+ <text class="instance-tree-attr-key">{{ key }}</text>
73
+ <text class="instance-tree-bracket">=</text>
74
+ <text class="instance-tree-attr-value">"{{ val }}"</text>
75
+ </template>
76
+ </block>
77
+ </template> -->
78
+
79
+ <!-- 如果没有子节点且非内联(无内容),显示自闭合 -->
80
+ <template v-if="!node.hasChildren && !node.isInline">
81
+ <text class="instance-tree-bracket">{{ ST }}</text>
82
+ </template>
83
+
84
+ <template v-else>
85
+ <text class="instance-tree-bracket">{{ GT }}</text>
86
+
87
+ <!-- 如果收起了,显示 ... 及 闭合标签 -->
88
+ <template v-if="node.isCollapsed">
89
+ <text class="instance-tree-content">...</text>
90
+ <text class="instance-tree-bracket">{{ LT }}/</text>
91
+ <text class="instance-tree-tag">{{ node.type }}</text>
92
+ <text class="instance-tree-bracket">{{ GT }}</text>
93
+ </template>
94
+
95
+ <!-- 如果是空标签 (Optionally keep for compat, but !hasChildren covers most) -->
96
+ <template v-else-if="node.isEmptyTag">
97
+ <text class="instance-tree-bracket">{{ LT }}/</text>
98
+ <text class="instance-tree-tag">{{ node.type }}</text>
99
+ <text class="instance-tree-bracket">{{ GT }}</text>
100
+ </template>
101
+
102
+ <!-- 如果是内联文本 -->
103
+ <template v-else-if="node.isInline">
104
+ <text class="instance-tree-text-content">
105
+ {{ node.inlineContent }}
106
+ </text>
107
+ <view class="instance-tree-tag-inline">
108
+ <text class="instance-tree-bracket">{{ LT }}/</text>
109
+ <text class="instance-tree-tag">{{ node.type }}</text>
110
+ <text class="instance-tree-bracket">{{ GT }}</text>
111
+ </view>
112
+ </template>
113
+ </template>
114
+ </template>
115
+ </view>
116
+
117
+ <!-- 内容 -->
118
+ <view v-if="node.isContentNode" class="instance-tree-content">
119
+ <text v-if="node.type === 'v-cmt'" class="instance-tree-comment">
120
+ {{ node?.content }}
121
+ </text>
122
+ <text v-else>{{ node?.content }}</text>
123
+ </view>
124
+
125
+ <!-- 结束标签 -->
126
+ <view v-if="node.isEndNode" class="instance-tree-node-end">
127
+ <view
128
+ v-if="node.hasChildren"
129
+ class="instance-tree-toggle-placeholder"></view>
130
+ <template v-if="node.type === 'v-cmt'">
131
+ <text class="instance-tree-comment">{{ CMT_END }}</text>
132
+ </template>
133
+ <template v-else>
134
+ <view class="instance-tree-tag-inline">
135
+ <text class="instance-tree-bracket">{{ LT }}/</text>
136
+ <text class="instance-tree-tag">{{ node.type }}</text>
137
+ <text class="instance-tree-bracket">{{ GT }}</text>
138
+ </view>
139
+ </template>
140
+ </view>
141
+ </view>
142
+ </template>
143
+ <script lang="ts" setup>
144
+ const CMT_START = '<!--';
145
+ const CMT_END = '-->';
146
+ const LT = '<';
147
+ const GT = '>';
148
+ const ST = '/>';
149
+
150
+ const _props = defineProps<{
151
+ node: InstanceTree.FlattenedNodeWithEnd;
152
+ showLine?: boolean;
153
+ isActive?: boolean;
154
+ }>();
155
+
156
+ defineEmits<{
157
+ (e: 'toggle', uid: string | number): void;
158
+ (e: 'select', node: any): void;
159
+ }>();
160
+ </script>
161
+ <style scoped>
162
+ .instance-tree-node {
163
+ display: flex;
164
+ align-items: center;
165
+ line-height: 20px;
166
+ font-size: 12px;
167
+ min-width: 100%;
168
+ width: fit-content;
169
+ box-sizing: border-box;
170
+ }
171
+
172
+ .instance-tree-node.is-active {
173
+ background-color: var(--dev-tool-selection-bg-color, rgb(55 148 255 / 23%));
174
+ }
175
+
176
+ .instance-tree-indent {
177
+ flex-shrink: 0;
178
+ width: 18px;
179
+ height: 20px;
180
+ line-height: 20px;
181
+ }
182
+
183
+ .instance-tree-tag-inline {
184
+ display: flex;
185
+ flex-direction: row;
186
+ align-items: center;
187
+ }
188
+
189
+ .has-line {
190
+ border-left: 1px solid var(--dev-tool-border-color);
191
+ }
192
+
193
+ .instance-tree-bracket {
194
+ color: var(--dev-tool-bracket-color);
195
+ }
196
+
197
+ .instance-tree-content {
198
+ white-space: nowrap;
199
+ flex: 1; /* 占据剩余空间,配合 align-items */
200
+ }
201
+
202
+ .instance-tree-cmt {
203
+ white-space: nowrap;
204
+ color: var(--dev-tool-note-color);
205
+ }
206
+
207
+ .instance-tree-node-end {
208
+ display: flex;
209
+ align-items: center;
210
+ }
211
+
212
+ .instance-tree-tag {
213
+ white-space: nowrap;
214
+ color: var(--dev-tool-keyword-color);
215
+ }
216
+
217
+ .instance-tree-text-content {
218
+ color: var(--dev-tool-text-color, #333);
219
+ white-space: pre;
220
+ }
221
+
222
+ .instance-tree-comment {
223
+ color: var(--dev-tool-comment-color, #6a9955);
224
+ white-space: pre;
225
+ font-style: italic;
226
+ }
227
+
228
+ .instance-tree-attr-key {
229
+ color: var(--dev-tool-attr-key-color, #9cdcfe);
230
+ white-space: nowrap;
231
+ }
232
+
233
+ .instance-tree-attr-value {
234
+ color: var(--dev-tool-attr-value-color, #ce9178);
235
+ white-space: nowrap;
236
+ }
237
+
238
+ .instance-tree-toggle {
239
+ flex-shrink: 0;
240
+ width: 14px;
241
+ height: 20px;
242
+ display: flex;
243
+ align-items: center;
244
+ justify-content: center;
245
+ cursor: pointer;
246
+ transition: transform 0.2s;
247
+ transform: rotate(90deg); /* 默认展开 */
248
+ }
249
+
250
+ .instance-tree-toggle.is-collapsed {
251
+ transform: rotate(0deg);
252
+ }
253
+
254
+ .instance-tree-toggle-placeholder {
255
+ flex-shrink: 0;
256
+ width: 14px;
257
+ height: 20px;
258
+ }
259
+
260
+ .instance-tree-arrow {
261
+ font-size: 16px;
262
+ color: var(--dev-tool-text-color-secondary, #888);
263
+ margin-top: -1px; /* 修正符号重心偏移 */
264
+ }
265
+ </style>
@@ -0,0 +1,226 @@
1
+ /**
2
+ * 将树结构扁平化并添加层级及闭合层级信息(包含闭合节点)
3
+ * 这个函数会为每个节点添加开始和结束标记,形成类似括号匹配的结构
4
+ * @param tree - 生成的树结构
5
+ * @param collapsedIds - 收起的节点UID集合
6
+ * @param result - 结果数组 (递归使用)
7
+ * @param level - 当前层级,默认为0
8
+ * @param parentUid - 父节点UID,默认为undefined
9
+ * @returns 扁平化的节点数组(包含闭合节点)
10
+ */
11
+ // 栈中的项结构,用于模拟递归帧
12
+ type StackItem = {
13
+ node: InstanceTree.TreeNode;
14
+ level: number;
15
+ parentUid?: string | number;
16
+ processed: boolean; // false: 处理开始标记和入栈子节点; true: 处理结束标记
17
+ };
18
+
19
+ export function flattenTreeWithEndMarkers(
20
+ tree: InstanceTree.TreeNode | null,
21
+ expandedIds: Set<string | number>,
22
+ result: InstanceTree.FlattenedNodeWithEnd[] = [],
23
+ level: number = 0,
24
+ parentUid?: string | number,
25
+ ): InstanceTree.FlattenedNodeWithEnd[] {
26
+ if (!tree) {
27
+ return result;
28
+ }
29
+
30
+ // 使用栈代替递归
31
+ const stack: StackItem[] = [
32
+ { node: tree, level, parentUid, processed: false },
33
+ ];
34
+
35
+ while (stack.length > 0) {
36
+ const frame = stack[stack.length - 1]; // 查看栈顶,不直接 pop
37
+ const { node, level, parentUid, processed } = frame;
38
+
39
+ if (processed) {
40
+ // 阶段2:后序处理(处理结束标记)
41
+ stack.pop(); // 真正移除
42
+
43
+ // 重新计算一些基本状态用于判断是否需要结束标记
44
+ // 注意:这些状态必须与开始标记阶段一致
45
+ const hasChildren =
46
+ (node.hasChildren ||
47
+ (node.children && node.children.length > 0) ||
48
+ (node.content !== undefined &&
49
+ node.content !== null &&
50
+ node.content !== '')) ??
51
+ false;
52
+
53
+ const isExpanded =
54
+ node.uid !== undefined ? expandedIds.has(node.uid) : false;
55
+ const isCollapsed = !isExpanded;
56
+ const isEmptyTag = !hasChildren && !isCollapsed;
57
+
58
+ // 判断内联状态 (必须完全复刻开始阶段的逻辑)
59
+ let isInline = false;
60
+ if (!isCollapsed) {
61
+ if (node.type === 'v-cmt') {
62
+ const content = node.content || '';
63
+ if (!content.includes('\n')) {
64
+ isInline = true;
65
+ }
66
+ } else {
67
+ const hasChildrenNodes = node.children && node.children.length > 0;
68
+ const hasContentValue =
69
+ node.content !== undefined &&
70
+ node.content !== null &&
71
+ node.content !== '';
72
+ if (hasChildrenNodes && node.children) {
73
+ const allText = node.children.every((c) => c.type === 'text');
74
+ if (allText) {
75
+ isInline = true;
76
+ }
77
+ } else if (hasContentValue) {
78
+ isInline = true;
79
+ }
80
+ }
81
+ }
82
+
83
+ // 如果收起了,或是空标签,或是内联展示,就不生成结束标记
84
+ if (isCollapsed || isEmptyTag || isInline) {
85
+ continue;
86
+ }
87
+
88
+ // 添加结束标记
89
+ const endNode: InstanceTree.FlattenedNodeWithEnd = {
90
+ type: node.type,
91
+ level: level,
92
+ ...(node.uid !== undefined && { uid: node.uid }),
93
+ ...(node.content !== undefined && { content: '' }),
94
+ ...(parentUid !== undefined && { parentUid: parentUid }),
95
+ isEndNode: true,
96
+ hasChildren,
97
+ };
98
+
99
+ if (endNode.type || endNode.content) {
100
+ result.push(endNode);
101
+ }
102
+ } else {
103
+ // 阶段1:前序处理(生成开始标记,处理内容,将子节点入栈)
104
+ frame.processed = true; // 标记为已处理过开始阶段,下次循环处理结束阶段
105
+
106
+ const hasChildren =
107
+ (node.hasChildren ||
108
+ (node.children && node.children.length > 0) ||
109
+ (node.content !== undefined &&
110
+ node.content !== null &&
111
+ node.content !== '')) ??
112
+ false;
113
+
114
+ const isExpanded =
115
+ node.uid !== undefined ? expandedIds.has(node.uid) : false;
116
+ const isCollapsed = !isExpanded;
117
+ const isEmptyTag = !hasChildren && !isCollapsed;
118
+
119
+ let isInline = false;
120
+ let inlineContent = '';
121
+ if (!isCollapsed) {
122
+ if (node.type === 'v-cmt') {
123
+ const content = node.content || '';
124
+ if (!content.includes('\n')) {
125
+ isInline = true;
126
+ inlineContent = content;
127
+ }
128
+ } else {
129
+ const hasChildrenNodes = node.children && node.children.length > 0;
130
+ const hasContentValue =
131
+ node.content !== undefined &&
132
+ node.content !== null &&
133
+ node.content !== '';
134
+
135
+ if (hasChildrenNodes && node.children) {
136
+ const allText = node.children.every((c) => c.type === 'text');
137
+ if (allText) {
138
+ isInline = true;
139
+ inlineContent = node.children
140
+ .map((c) => c.content || '')
141
+ .join('');
142
+ }
143
+ } else if (hasContentValue) {
144
+ isInline = true;
145
+ inlineContent = node.content!;
146
+ }
147
+ }
148
+ }
149
+
150
+ // 生成开始标记
151
+ const startNode: InstanceTree.FlattenedNodeWithEnd = {
152
+ type: node.type,
153
+ level: level,
154
+ ...(node.uid !== undefined && { uid: node.uid }),
155
+ ...(node.content !== undefined && { content: '' }),
156
+ ...(parentUid !== undefined && { parentUid: parentUid }),
157
+ isStartNode: true,
158
+ hasChildren: node.type === 'v-cmt' || isInline ? false : hasChildren,
159
+ isCollapsed,
160
+ isEmptyTag,
161
+ isInline,
162
+ inlineContent,
163
+ props: node.props,
164
+ styles: node.styles,
165
+ other: node.other,
166
+ provides: node.provides,
167
+ data: node.data,
168
+ functions: node.functions,
169
+ emits: node.emits,
170
+ };
171
+
172
+ if (startNode.type || startNode.content) {
173
+ result.push(startNode);
174
+ }
175
+
176
+ if (isCollapsed || isEmptyTag || isInline) {
177
+ // 不需要处理子节点,直接移除栈顶项(其实就是刚才的 frame),因为不需要后序处理结束标记了
178
+ // 注意:这里需要把刚刚标记为 true 的 frame 彻底 pop 掉
179
+ // 但为了简单,可以在这里直接 continue,并且因为 frame.processed 已经是 true,
180
+ // 下次循环会进入上面的 if(processed) 分支。
181
+ // 为了不在那里重复计算 isInline 等逻辑,我们在那里也加了检查。
182
+ // 不过更高效的做法是如果这里决定不再深入,直接 pop。
183
+ stack.pop();
184
+ continue;
185
+ }
186
+
187
+ // 处理多行内容节点
188
+ if (
189
+ node.content !== undefined &&
190
+ node.content !== null &&
191
+ node.content !== ''
192
+ ) {
193
+ const content = node.content || '';
194
+ const lines = content.split('\n');
195
+ // 是否有 startNode 决定了 level 偏移
196
+ const hasStart = !!(startNode.type || startNode.content);
197
+
198
+ lines.forEach((line) => {
199
+ const contentNode: InstanceTree.FlattenedNodeWithEnd = {
200
+ type: node.type,
201
+ level: level + (hasStart ? 1 : 0),
202
+ content: line,
203
+ parentUid: node.uid,
204
+ isContentNode: true,
205
+ };
206
+ result.push(contentNode);
207
+ });
208
+ }
209
+
210
+ // 将子节点入栈 (注意:栈是后进先出,所以要逆序入栈,从而保证正序处理)
211
+ if (node.children && node.children.length > 0) {
212
+ for (let i = node.children.length - 1; i >= 0; i--) {
213
+ const child = node.children[i];
214
+ stack.push({
215
+ node: child,
216
+ level: level + 1,
217
+ parentUid: node.uid,
218
+ processed: false,
219
+ });
220
+ }
221
+ }
222
+ }
223
+ }
224
+
225
+ return result;
226
+ }