vite-uni-dev-tool 1.1.0 → 1.2.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 (135) hide show
  1. package/README.md +8 -0
  2. package/dist/const.cjs +1 -1
  3. package/dist/const.d.ts +1 -0
  4. package/dist/const.d.ts.map +1 -1
  5. package/dist/const.js +1 -1
  6. package/dist/core.d.ts.map +1 -1
  7. package/dist/core.js +2 -2
  8. package/dist/i18n/locales/en.cjs +1 -1
  9. package/dist/i18n/locales/en.d.ts +5 -0
  10. package/dist/i18n/locales/en.d.ts.map +1 -1
  11. package/dist/i18n/locales/en.js +1 -1
  12. package/dist/i18n/locales/zh-Hans.cjs +1 -1
  13. package/dist/i18n/locales/zh-Hans.d.ts +5 -0
  14. package/dist/i18n/locales/zh-Hans.d.ts.map +1 -1
  15. package/dist/i18n/locales/zh-Hans.js +1 -1
  16. package/dist/modules/devIntercept/index.cjs +9 -9
  17. package/dist/modules/devIntercept/index.d.ts +1 -1
  18. package/dist/modules/devIntercept/index.d.ts.map +1 -1
  19. package/dist/modules/devIntercept/index.js +9 -9
  20. package/dist/modules/devStore/index.cjs +1 -1
  21. package/dist/modules/devStore/index.d.ts.map +1 -1
  22. package/dist/modules/devStore/index.js +1 -1
  23. package/dist/plugins/uniDevTool/transform/transformMain.cjs +3 -3
  24. package/dist/plugins/uniDevTool/transform/transformMain.d.ts +2 -1
  25. package/dist/plugins/uniDevTool/transform/transformMain.d.ts.map +1 -1
  26. package/dist/plugins/uniDevTool/transform/transformMain.js +3 -3
  27. package/dist/plugins/uniDevTool/transform/transformVue.cjs +31 -25
  28. package/dist/plugins/uniDevTool/transform/transformVue.d.ts +2 -1
  29. package/dist/plugins/uniDevTool/transform/transformVue.d.ts.map +1 -1
  30. package/dist/plugins/uniDevTool/transform/transformVue.js +30 -24
  31. package/dist/plugins/uniDevTool/uniDevTool.cjs +3 -3
  32. package/dist/plugins/uniDevTool/uniDevTool.d.ts +3 -1
  33. package/dist/plugins/uniDevTool/uniDevTool.d.ts.map +1 -1
  34. package/dist/plugins/uniDevTool/uniDevTool.js +3 -3
  35. package/dist/type.d.ts +3 -0
  36. package/dist/type.d.ts.map +1 -1
  37. package/dist/v3/DevTool/components/BluetoothList/BluetoothItem.vue +199 -199
  38. package/dist/v3/DevTool/components/BluetoothList/BluetoothTool.vue +730 -730
  39. package/dist/v3/DevTool/components/BluetoothList/index.vue +167 -167
  40. package/dist/v3/DevTool/components/CaptureScreen/index.vue +109 -109
  41. package/dist/v3/DevTool/components/ConsoleList/ConsoleItem.vue +230 -225
  42. package/dist/v3/DevTool/components/ConsoleList/RunJSInput.vue +247 -247
  43. package/dist/v3/DevTool/components/ConsoleList/index.vue +171 -171
  44. package/dist/v3/DevTool/components/ConsoleList/staticTips.ts +1145 -1145
  45. package/dist/v3/DevTool/components/DevToolTitle/index.vue +24 -24
  46. package/dist/v3/DevTool/components/DevToolWindow/DevToolOverlay.vue +197 -197
  47. package/dist/v3/DevTool/components/DevToolWindow/hooks/dataUtils.ts +48 -48
  48. package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolData.ts +387 -387
  49. package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolHandlers.ts +629 -629
  50. package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolOverlay.ts +201 -197
  51. package/dist/v3/DevTool/components/ElEvent/ElEventItem.vue +105 -105
  52. package/dist/v3/DevTool/components/ElEvent/index.vue +106 -106
  53. package/dist/v3/DevTool/components/Instance/components/InstanceTreeNode.vue +265 -265
  54. package/dist/v3/DevTool/components/Instance/flatten.ts +226 -226
  55. package/dist/v3/DevTool/components/Instance/index.vue +94 -94
  56. package/dist/v3/DevTool/components/Instance/registry.ts +49 -49
  57. package/dist/v3/DevTool/components/Instance/transformTree.ts +375 -375
  58. package/dist/v3/DevTool/components/Instance/transformTreeCtx.ts +268 -268
  59. package/dist/v3/DevTool/components/Instance/typing.d.ts +43 -43
  60. package/dist/v3/DevTool/components/InstanceDetail/index.vue +485 -485
  61. package/dist/v3/DevTool/components/JsonDetail/index.vue +70 -70
  62. package/dist/v3/DevTool/components/NFCList/NFCItem.vue +112 -112
  63. package/dist/v3/DevTool/components/NFCList/NFCTool.vue +454 -454
  64. package/dist/v3/DevTool/components/NFCList/const.ts +56 -56
  65. package/dist/v3/DevTool/components/NFCList/index.vue +94 -94
  66. package/dist/v3/DevTool/components/NetworkList/InterceptConfig.vue +624 -624
  67. package/dist/v3/DevTool/components/NetworkList/InterceptItem.vue +140 -140
  68. package/dist/v3/DevTool/components/NetworkList/NetworkDetail.vue +287 -287
  69. package/dist/v3/DevTool/components/NetworkList/NetworkIntercept.vue +88 -88
  70. package/dist/v3/DevTool/components/NetworkList/NetworkItem.vue +163 -163
  71. package/dist/v3/DevTool/components/NetworkList/NetworkSend.vue +589 -589
  72. package/dist/v3/DevTool/components/NetworkList/const.ts +4 -4
  73. package/dist/v3/DevTool/components/NetworkList/hooks/useNetworkForm.ts +86 -86
  74. package/dist/v3/DevTool/components/NetworkList/index.vue +160 -160
  75. package/dist/v3/DevTool/components/NetworkList/utils.ts +101 -101
  76. package/dist/v3/DevTool/components/Performance/index.vue +498 -498
  77. package/dist/v3/DevTool/components/Performance/modules/PerformanceMetrics.vue +153 -153
  78. package/dist/v3/DevTool/components/Performance/modules/usePerformanceChart.ts +460 -460
  79. package/dist/v3/DevTool/components/Performance/modules/usePerformanceData.ts +258 -258
  80. package/dist/v3/DevTool/components/PiniaList/index.vue +93 -93
  81. package/dist/v3/DevTool/components/RunJS/index.vue +148 -148
  82. package/dist/v3/DevTool/components/ScanCodeList/ScanCodeItem.vue +97 -97
  83. package/dist/v3/DevTool/components/ScanCodeList/index.vue +100 -100
  84. package/dist/v3/DevTool/components/SettingButton/index.vue +45 -45
  85. package/dist/v3/DevTool/components/SettingList/index.vue +218 -218
  86. package/dist/v3/DevTool/components/SettingList/modules/SettingBarrage.vue +304 -304
  87. package/dist/v3/DevTool/components/SettingList/modules/SettingDevTool.vue +212 -212
  88. package/dist/v3/DevTool/components/SettingList/modules/SettingInfo.vue +157 -157
  89. package/dist/v3/DevTool/components/SettingList/modules/SettingLanguage.vue +74 -74
  90. package/dist/v3/DevTool/components/SettingList/modules/SettingLog.vue +230 -230
  91. package/dist/v3/DevTool/components/SettingList/typing.d.ts +2 -2
  92. package/dist/v3/DevTool/components/SourceCode/Line.vue +127 -127
  93. package/dist/v3/DevTool/components/SourceCode/parseCode.ts +609 -609
  94. package/dist/v3/DevTool/components/StorageList/index.vue +174 -174
  95. package/dist/v3/DevTool/components/TransferList/TransferDetail.vue +268 -268
  96. package/dist/v3/DevTool/components/VuexList/index.vue +84 -84
  97. package/dist/v3/DevTool/index.vue +1 -0
  98. package/dist/v3/components/AppTransition/index.vue +176 -176
  99. package/dist/v3/components/AutoSizer/index.vue +192 -192
  100. package/dist/v3/components/AutoSizer/index1.vue +184 -184
  101. package/dist/v3/components/AutoSizer/utils.ts +49 -49
  102. package/dist/v3/components/Barrage/BarrageItem.vue +137 -137
  103. package/dist/v3/components/Barrage/index.vue +202 -202
  104. package/dist/v3/components/CircularButton/index.vue +84 -84
  105. package/dist/v3/components/CustomSwiper/CustomSwiperItem.vue +49 -49
  106. package/dist/v3/components/CustomSwiper/index.vue +104 -104
  107. package/dist/v3/components/DevErrorBoundary/index.vue +380 -0
  108. package/dist/v3/components/Empty/index.vue +29 -29
  109. package/dist/v3/components/FilterSelect/index.vue +179 -179
  110. package/dist/v3/components/JsonPretty/components/Brackets/index.vue +27 -27
  111. package/dist/v3/components/JsonPretty/components/Carets/index.vue +59 -59
  112. package/dist/v3/components/JsonPretty/components/CheckController/index.vue +136 -136
  113. package/dist/v3/components/JsonPretty/components/TreeNode/index.vue +387 -387
  114. package/dist/v3/components/JsonPretty/hooks/useClipboard.ts +21 -21
  115. package/dist/v3/components/JsonPretty/hooks/useError.ts +21 -21
  116. package/dist/v3/components/JsonPretty/type.ts +127 -127
  117. package/dist/v3/components/JsonPretty/utils/index.ts +169 -169
  118. package/dist/v3/components/MovableContainer/index.vue +8 -4
  119. package/dist/v3/components/Pick/index.vue +322 -322
  120. package/dist/v3/components/Tag/index.vue +113 -113
  121. package/dist/v3/components/VirtualList/AutoSize.vue +40 -40
  122. package/dist/v3/components/VirtualList/index.vue +416 -416
  123. package/dist/v3/hooks/useBluetooth/index.ts +561 -561
  124. package/dist/v3/hooks/useContainerStyle.ts +153 -153
  125. package/dist/v3/hooks/useNFC/index.ts +107 -107
  126. package/dist/v3/hooks/useNFC/typing.d.ts +396 -396
  127. package/dist/v3/hooks/useNFC/useNFCAndroid.ts +966 -966
  128. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.ts +812 -812
  129. package/dist/v3/hooks/useNFC/utils.ts +754 -754
  130. package/dist/v3/hooks/useRequest/index.ts +586 -586
  131. package/dist/v3/hooks/useRequest/utils.ts +267 -267
  132. package/dist/v3/hooks/useScanCode/index.ts +206 -206
  133. package/dist/v3/hooks/useWebsocket/index.ts +253 -253
  134. package/dist/v3/styles/theme.ts +12 -12
  135. package/package.json +9 -1
@@ -1,265 +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>
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>