android-midscene-automation 0.2.1 → 0.2.3

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 (51) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/README.md +15 -1
  3. package/package.json +1 -1
  4. package/remote-agent/index.ts +50 -22
  5. package/server/analytics.test.ts +46 -0
  6. package/server/analytics.ts +24 -0
  7. package/server/api-safety-analytics.test.ts +57 -0
  8. package/server/appium-auto-save.test.ts +6 -0
  9. package/server/appium-recorder/appium-runner.ts +30 -9
  10. package/server/appium-recorder/appium-version.test.ts +55 -0
  11. package/server/appium-recorder/managed-appium.ts +37 -1
  12. package/server/appium-recorder/managed-cleanup.test.ts +38 -8
  13. package/server/appium-recorder/replay-lifecycle.test.ts +123 -0
  14. package/server/appium-recorder/routes.ts +8 -18
  15. package/server/appium-recorder/run-history.ts +11 -0
  16. package/server/config-access.test.ts +27 -0
  17. package/server/config-access.ts +27 -0
  18. package/server/http-api.ts +63 -54
  19. package/server/operations/repository.ts +8 -0
  20. package/server/remote-agents/protocol.ts +1 -0
  21. package/server/remote-agents/registry.test.ts +65 -0
  22. package/server/remote-agents/registry.ts +60 -5
  23. package/server/remote-agents/replay-integration.test.ts +79 -0
  24. package/server/remote-agents/routes.ts +12 -15
  25. package/server/request-body.test.ts +40 -0
  26. package/server/request-body.ts +48 -0
  27. package/src/App.vue +96 -758
  28. package/src/analytics/summary.ts +75 -0
  29. package/src/api.ts +11 -0
  30. package/src/appium-recorder/AppiumPage.vue +4 -1
  31. package/src/components/AppSidebar.vue +31 -0
  32. package/src/components/analytics/AnalysisCharts.vue +189 -0
  33. package/src/components/analytics/ReportAnalysis.vue +78 -0
  34. package/src/components/config/AppiumConfigPanel.vue +4 -1
  35. package/src/components/config/AppiumModelSettings.vue +1 -1
  36. package/src/components/config/BaseConfigPanel.vue +6 -2
  37. package/src/components/config/MidsceneConfigPanel.vue +4 -5
  38. package/src/components/help/HelpCenter.vue +185 -0
  39. package/src/composables/use-device-preview.ts +279 -0
  40. package/src/composables/use-initial-resource.ts +17 -0
  41. package/src/composables/use-script-execution.ts +277 -0
  42. package/src/config/credentials.ts +2 -0
  43. package/src/config/use-appium-auto-save.ts +22 -11
  44. package/src/config/use-model-config.ts +157 -0
  45. package/src/main.ts +2 -2
  46. package/src/pages/AnalysisPage.vue +60 -0
  47. package/src/pages/ConfigPage.vue +36 -5
  48. package/src/style.css +711 -123
  49. package/src/types.ts +7 -1
  50. package/src/components/help/HelpCenterDialog.vue +0 -160
  51. package/src/ui-refresh.css +0 -677
package/src/style.css CHANGED
@@ -1,5 +1,4 @@
1
1
  :root {
2
- color: #303133;
3
2
  background: #f5f7fa;
4
3
  font-family:
5
4
  "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", sans-serif;
@@ -20,8 +19,7 @@ body,
20
19
 
21
20
  body {
22
21
  margin: 0;
23
- min-width: 1280px;
24
- background: #f5f7fa;
22
+ min-width: 360px;
25
23
  }
26
24
 
27
25
  button,
@@ -33,7 +31,6 @@ select {
33
31
 
34
32
  .layout {
35
33
  display: grid;
36
- grid-template-columns: 220px minmax(0, 1fr);
37
34
  height: 100%;
38
35
  min-height: 0;
39
36
  overflow: hidden;
@@ -43,26 +40,16 @@ select {
43
40
  display: flex;
44
41
  flex-direction: column;
45
42
  min-height: 0;
46
- border-right: 1px solid #e4e7ed;
47
- background: #001529;
48
43
  }
49
44
 
50
45
  .layout-sidebar__top {
51
46
  display: flex;
52
47
  align-items: center;
53
- justify-content: center;
54
- height: 60px;
55
- border-bottom: 1px solid rgba(255, 255, 255, 0.08);
56
48
  }
57
49
 
58
50
  .layout-sidebar__logo {
59
51
  display: grid;
60
52
  place-items: center;
61
- width: 36px;
62
- height: 36px;
63
- border-radius: 8px;
64
- background: #1677ff;
65
- color: #fff;
66
53
  font-weight: 700;
67
54
  }
68
55
 
@@ -73,49 +60,7 @@ select {
73
60
  background: transparent;
74
61
  }
75
62
 
76
- .layout-menu.el-menu {
77
- --el-menu-bg-color: #001529;
78
- --el-menu-text-color: rgba(255, 255, 255, 0.85);
79
- --el-menu-hover-bg-color: #0a2540;
80
- --el-menu-active-color: #fff;
81
- }
82
-
83
- .layout-sidebar__footer {
84
- display: flex;
85
- justify-content: flex-end;
86
- height: 52px;
87
- background: #fff;
88
- }
89
-
90
- .layout-sidebar__help {
91
- display: flex;
92
- align-items: center;
93
- justify-content: center;
94
- width: 44px;
95
- height: 100%;
96
- padding: 0;
97
- border: 0;
98
- background: transparent;
99
- color: #9ca3af;
100
- cursor: pointer;
101
- transition: background-color 0.2s, color 0.2s;
102
- }
103
-
104
- .layout-sidebar__help:hover,
105
- .layout-sidebar__help:focus-visible {
106
- background: transparent;
107
- color: #6b7280;
108
- outline: none;
109
- }
110
-
111
- .layout-sidebar__help .el-icon {
112
- font-size: 17px;
113
- }
114
-
115
63
  .layout-main {
116
- display: grid;
117
- grid-template-rows: 60px minmax(0, 1fr);
118
- min-height: 0;
119
64
  overflow: hidden;
120
65
  }
121
66
 
@@ -217,19 +162,11 @@ select {
217
162
  display: flex;
218
163
  align-items: center;
219
164
  justify-content: space-between;
220
- padding: 0 24px;
221
165
  border-bottom: 1px solid #e4e7ed;
222
- background: #fff;
223
- }
224
-
225
- .layout-header__title {
226
- font-size: 18px;
227
- font-weight: 600;
228
166
  }
229
167
 
230
168
  .layout-header__actions {
231
169
  display: flex;
232
- gap: 12px;
233
170
  }
234
171
 
235
172
  .layout-header__button--loading .el-icon {
@@ -238,37 +175,23 @@ select {
238
175
 
239
176
  .page-body {
240
177
  height: 100%;
241
- min-height: 0;
242
178
  overflow: auto;
243
- padding: 24px;
244
179
  }
245
180
 
246
181
  .page-body--fixed {
247
182
  overflow: hidden;
248
183
  }
249
184
 
250
- .page-alert,
251
- .page-section {
252
- margin-bottom: 16px;
253
- }
254
-
255
185
  .appium-recorder-page {
256
186
  display: flex;
257
187
  flex-direction: column;
258
- gap: 12px;
259
188
  height: 100%;
260
189
  min-height: 0;
261
190
  }
262
191
 
263
192
  .appium-header-actions {
264
- position: fixed;
265
- top: 0;
266
- right: 24px;
267
- z-index: 10;
268
193
  display: flex;
269
194
  align-items: center;
270
- gap: 12px;
271
- height: 60px;
272
195
  min-width: 0;
273
196
  }
274
197
 
@@ -280,7 +203,6 @@ select {
280
203
  display: grid;
281
204
  flex: 1 1 auto;
282
205
  grid-template-columns: minmax(320px, 2.8fr) minmax(0, 3fr) minmax(0, 4.2fr);
283
- gap: 12px;
284
206
  align-items: stretch;
285
207
  height: auto;
286
208
  min-height: 0;
@@ -331,7 +253,6 @@ select {
331
253
 
332
254
  .appium-workbench-tabs > .el-tabs__header {
333
255
  margin: 0;
334
- padding: 0 16px;
335
256
  }
336
257
 
337
258
  .appium-workbench-tabs > .el-tabs__content {
@@ -346,8 +267,6 @@ select {
346
267
 
347
268
  .appium-workbench {
348
269
  display: grid;
349
- gap: 16px;
350
- padding: 16px;
351
270
  }
352
271
 
353
272
  .appium-workbench__section {
@@ -356,9 +275,6 @@ select {
356
275
 
357
276
  .appium-workbench__section h3 {
358
277
  margin: 0 0 12px;
359
- color: #303133;
360
- font-size: 16px;
361
- font-weight: 700;
362
278
  }
363
279
 
364
280
  .appium-section-title {
@@ -469,7 +385,6 @@ select {
469
385
 
470
386
  .appium-side-form {
471
387
  display: grid;
472
- gap: 8px;
473
388
  margin-bottom: 12px;
474
389
  }
475
390
 
@@ -498,13 +413,6 @@ select {
498
413
  align-items: center;
499
414
  padding: 10px;
500
415
  border: 1px solid #e4e7ed;
501
- border-radius: 6px;
502
- background: #fff;
503
- }
504
-
505
- .appium-script-list__item--active {
506
- border-color: #409eff;
507
- background: #f5f9ff;
508
416
  }
509
417
 
510
418
  .appium-script-list__main {
@@ -548,9 +456,6 @@ select {
548
456
  }
549
457
 
550
458
  .appium-action-dropdown__group {
551
- padding: 6px 12px 4px;
552
- color: #909399;
553
- font-size: 12px;
554
459
  line-height: 18px;
555
460
  }
556
461
 
@@ -752,7 +657,6 @@ select {
752
657
  gap: 8px;
753
658
  align-content: start;
754
659
  width: max-content;
755
- min-width: max(980px, 100%);
756
660
  min-width: 0;
757
661
  padding: 10px 12px 14px;
758
662
  transform-origin: 0 0;
@@ -1458,7 +1362,6 @@ select {
1458
1362
  .appium-replay-fab .el-button {
1459
1363
  width: 52px;
1460
1364
  height: 52px;
1461
- box-shadow: 0 8px 24px rgba(64, 158, 255, 0.28);
1462
1365
  font-size: 20px;
1463
1366
  }
1464
1367
 
@@ -1517,24 +1420,16 @@ select {
1517
1420
  }
1518
1421
 
1519
1422
  .subnav {
1520
- display: flex;
1521
1423
  gap: 8px;
1522
1424
  margin-bottom: 16px;
1523
1425
  }
1524
1426
 
1525
1427
  .subnav__item {
1526
- padding: 8px 14px;
1527
- border: 1px solid #dcdfe6;
1528
- border-radius: 4px;
1529
- background: #fff;
1530
- color: #606266;
1531
1428
  cursor: pointer;
1532
1429
  }
1533
1430
 
1534
1431
  .subnav__item--active {
1535
1432
  border-color: #409eff;
1536
- color: #409eff;
1537
- background: #ecf5ff;
1538
1433
  }
1539
1434
 
1540
1435
  .page-grid {
@@ -1690,7 +1585,6 @@ select {
1690
1585
  .config-model-grid {
1691
1586
  display: grid;
1692
1587
  grid-template-columns: repeat(2, minmax(0, 1fr));
1693
- gap: 18px;
1694
1588
  }
1695
1589
 
1696
1590
  .app-preset-list {
@@ -1749,13 +1643,11 @@ select {
1749
1643
  margin-bottom: 16px;
1750
1644
  border: 1px solid #ebeef5;
1751
1645
  border-radius: 6px;
1752
- background: #f4f8ff;
1753
1646
  }
1754
1647
 
1755
1648
  .method-guide__summary {
1756
1649
  padding: 12px 16px;
1757
1650
  cursor: pointer;
1758
- color: #303133;
1759
1651
  font-weight: 500;
1760
1652
  user-select: none;
1761
1653
  }
@@ -1858,7 +1750,6 @@ select {
1858
1750
  padding: 16px;
1859
1751
  border: 1px solid #ebeef5;
1860
1752
  border-radius: 6px;
1861
- background: #fafafa;
1862
1753
  }
1863
1754
 
1864
1755
  .step-item--readonly {
@@ -2163,11 +2054,6 @@ select {
2163
2054
  cursor: pointer;
2164
2055
  }
2165
2056
 
2166
- .script-row--active {
2167
- border-color: #409eff;
2168
- background: #ecf5ff;
2169
- }
2170
-
2171
2057
  .script-row__main {
2172
2058
  display: grid;
2173
2059
  gap: 4px;
@@ -2232,15 +2118,10 @@ select {
2232
2118
  display: grid;
2233
2119
  place-items: center;
2234
2120
  flex: 0 0 auto;
2235
- border-radius: 8px;
2236
2121
  position: relative;
2237
2122
  cursor: pointer;
2238
2123
  }
2239
2124
 
2240
- .device-action-button:hover {
2241
- background: #f5f7fb;
2242
- }
2243
-
2244
2125
  .device-action-button:disabled {
2245
2126
  cursor: not-allowed;
2246
2127
  opacity: 0.45;
@@ -2316,12 +2197,10 @@ select {
2316
2197
  overflow: hidden;
2317
2198
  height: clamp(320px, calc(100vh - 300px), 680px);
2318
2199
  min-height: 0;
2319
- background: #fff;
2320
2200
  position: relative;
2321
2201
  display: flex;
2322
2202
  align-items: center;
2323
2203
  justify-content: center;
2324
- border-radius: 0;
2325
2204
  }
2326
2205
 
2327
2206
  .device-preview--image {
@@ -2606,7 +2485,6 @@ select {
2606
2485
  border: 0;
2607
2486
  outline: 0;
2608
2487
  resize: none;
2609
- background: #101722;
2610
2488
  color: #d7e0ea;
2611
2489
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
2612
2490
  font-size: 12px;
@@ -3145,3 +3023,713 @@ select {
3145
3023
  font-weight: 600;
3146
3024
  font-size: 12px;
3147
3025
  }
3026
+
3027
+ :root {
3028
+ --ui-primary: #006be6;
3029
+ --ui-primary-hover: #3389eb;
3030
+ --ui-primary-active: #0056b8;
3031
+ --ui-success: #52c41a;
3032
+ --ui-warning: #faad14;
3033
+ --ui-danger: #ff4d4f;
3034
+ --ui-text: #303133;
3035
+ --ui-text-secondary: #6b7280;
3036
+ --ui-text-muted: #9ca3af;
3037
+ --ui-border: #e4e4e7;
3038
+ --ui-border-strong: #dcdfe6;
3039
+ --ui-bg: #f2f3f5;
3040
+ --ui-bg-soft: #fafafa;
3041
+ --ui-surface: #fff;
3042
+ --ui-radius: 12px;
3043
+ --ui-radius-control: 6px;
3044
+ --ui-shadow-popover: 0 8px 24px rgba(15, 23, 42, 0.1);
3045
+
3046
+ --el-color-primary: var(--ui-primary);
3047
+ --el-color-primary-light-3: #4d97ee;
3048
+ --el-color-primary-light-5: #80b5f3;
3049
+ --el-color-primary-light-7: #b3d3f8;
3050
+ --el-color-primary-light-8: #cce1fa;
3051
+ --el-color-primary-light-9: #e6f0fd;
3052
+ --el-color-primary-dark-2: var(--ui-primary-active);
3053
+ --el-color-success: var(--ui-success);
3054
+ --el-color-warning: var(--ui-warning);
3055
+ --el-color-danger: var(--ui-danger);
3056
+ --el-text-color-primary: var(--ui-text);
3057
+ --el-text-color-regular: #4b5563;
3058
+ --el-text-color-secondary: var(--ui-text-secondary);
3059
+ --el-text-color-placeholder: var(--ui-text-muted);
3060
+ --el-border-color: var(--ui-border-strong);
3061
+ --el-border-color-light: var(--ui-border);
3062
+ --el-border-color-lighter: #edf0f3;
3063
+ --el-fill-color-light: #f6f8fb;
3064
+ --el-fill-color-lighter: #fafbfc;
3065
+ --el-bg-color-page: var(--ui-bg);
3066
+ --el-border-radius-base: var(--ui-radius-control);
3067
+ --el-border-radius-small: 4px;
3068
+ --el-box-shadow-light: var(--ui-shadow-popover);
3069
+ color: var(--ui-text);
3070
+ }
3071
+
3072
+ body {
3073
+ background: var(--ui-bg);
3074
+ color: var(--ui-text);
3075
+ letter-spacing: 0;
3076
+ }
3077
+
3078
+ ::selection {
3079
+ background: #e1eaff;
3080
+ color: #006be6;
3081
+ }
3082
+
3083
+ .layout {
3084
+ grid-template-columns: 224px minmax(0, 1fr);
3085
+ background: var(--ui-bg);
3086
+ }
3087
+
3088
+ .layout-sidebar {
3089
+ border-right: 1px solid var(--ui-border);
3090
+ background: #fff;
3091
+ }
3092
+
3093
+ .layout-sidebar__top {
3094
+ height: 56px;
3095
+ gap: 10px;
3096
+ padding: 0 16px;
3097
+ justify-content: flex-start;
3098
+ border-bottom: 0;
3099
+ }
3100
+
3101
+ .layout-sidebar__logo {
3102
+ border-radius: var(--ui-radius);
3103
+ flex: none;
3104
+ width: 32px;
3105
+ height: 32px;
3106
+ background: linear-gradient(135deg, #9775fa, #5178f5 55%, #20c4e7);
3107
+ box-shadow: none;
3108
+ color: #fff;
3109
+ font-size: 20px;
3110
+ }
3111
+
3112
+ .layout-menu.el-menu {
3113
+ --el-menu-bg-color: #fff;
3114
+ --el-menu-text-color: #4b5563;
3115
+ --el-menu-hover-bg-color: #f4f4f5;
3116
+ --el-menu-active-color: var(--ui-primary);
3117
+ padding: 10px 8px;
3118
+ }
3119
+
3120
+ .layout-menu .el-menu-item,
3121
+ .layout-menu .el-sub-menu__title {
3122
+ height: 44px;
3123
+ margin: 2px 0;
3124
+ border-radius: 8px;
3125
+ line-height: 44px;
3126
+ }
3127
+
3128
+ .layout-menu .el-menu-item.is-active {
3129
+ background: #e1eaff;
3130
+ box-shadow: none;
3131
+ font-weight: 600;
3132
+ }
3133
+
3134
+ .layout-menu .el-sub-menu .el-menu-item {
3135
+ min-width: 0;
3136
+ padding-left: 48px !important;
3137
+ }
3138
+
3139
+ .layout-main {
3140
+ grid-template-rows: 56px 40px minmax(0, 1fr);
3141
+ min-width: 0;
3142
+ }
3143
+
3144
+ .layout-header {
3145
+ padding: 0 20px;
3146
+ border-bottom-color: var(--ui-border);
3147
+ background: rgba(255, 255, 255, 0.96);
3148
+ }
3149
+
3150
+ .layout-header__title {
3151
+ color: var(--ui-text);
3152
+ display: flex;
3153
+ align-items: center;
3154
+ gap: 12px;
3155
+ font-size: 14px;
3156
+ font-weight: 400;
3157
+ }
3158
+
3159
+ .layout-header__actions {
3160
+ align-items: center;
3161
+ gap: 8px;
3162
+ }
3163
+
3164
+ .page-body {
3165
+ padding: 20px 24px 24px;
3166
+ scrollbar-gutter: stable;
3167
+ }
3168
+
3169
+ .page-body:not(.page-body--appium) > .generator-page,
3170
+ .page-body:not(.page-body--appium) > .config-page,
3171
+ .page-body:not(.page-body--appium) > .automation-layout {
3172
+ width: 100%;
3173
+ margin: 0;
3174
+ }
3175
+
3176
+ .page-alert,
3177
+ .page-section {
3178
+ margin-bottom: 16px;
3179
+ }
3180
+
3181
+ .el-card {
3182
+ border-color: var(--ui-border);
3183
+ border-radius: var(--ui-radius);
3184
+ background: var(--ui-surface);
3185
+ }
3186
+
3187
+ .el-card__header {
3188
+ min-height: 54px;
3189
+ padding: 15px 18px;
3190
+ border-bottom-color: var(--ui-border);
3191
+ color: var(--ui-text);
3192
+ font-size: 15px;
3193
+ font-weight: 650;
3194
+ }
3195
+
3196
+ .el-card__body {
3197
+ padding: 18px;
3198
+ }
3199
+
3200
+ .el-button {
3201
+ font-weight: 500;
3202
+ letter-spacing: 0;
3203
+ }
3204
+
3205
+ .el-button:not(.is-circle) {
3206
+ min-height: 32px;
3207
+ padding-right: 14px;
3208
+ padding-left: 14px;
3209
+ }
3210
+
3211
+ .el-button--primary:not(.is-disabled):not(.is-plain):not(.is-text):not(.is-link) {
3212
+ --el-button-text-color: #fff;
3213
+ --el-button-hover-text-color: #fff;
3214
+ --el-button-active-text-color: #fff;
3215
+ box-shadow: none;
3216
+ }
3217
+
3218
+ .layout-header .el-button--primary.is-disabled,
3219
+ .generator-page .el-button--primary.is-disabled,
3220
+ .appium-header-actions .el-button--primary.is-disabled {
3221
+ --el-button-disabled-text-color: #9ca3af;
3222
+ --el-button-disabled-bg-color: #f3f4f6;
3223
+ --el-button-disabled-border-color: #e5e7eb;
3224
+ }
3225
+
3226
+ .el-button--danger:not(.is-disabled) {
3227
+ box-shadow: 0 2px 5px rgba(255, 77, 79, 0.12);
3228
+ }
3229
+
3230
+ .el-input__wrapper,
3231
+ .el-select__wrapper,
3232
+ .el-textarea__inner,
3233
+ .el-input-number .el-input__wrapper {
3234
+ border-radius: var(--ui-radius-control);
3235
+ box-shadow: 0 0 0 1px var(--ui-border-strong) inset;
3236
+ }
3237
+
3238
+ .el-input__wrapper:hover,
3239
+ .el-select__wrapper:hover,
3240
+ .el-textarea__inner:hover {
3241
+ box-shadow: 0 0 0 1px #80b5f3 inset;
3242
+ }
3243
+
3244
+ .el-form-item__label {
3245
+ color: #374151;
3246
+ font-size: 13px;
3247
+ font-weight: 500;
3248
+ }
3249
+
3250
+ .el-dialog {
3251
+ overflow: hidden;
3252
+ border: 1px solid var(--ui-border);
3253
+ border-radius: var(--ui-radius);
3254
+ box-shadow: 0 18px 48px rgba(15, 23, 42, 0.18);
3255
+ }
3256
+
3257
+ .el-dialog__header {
3258
+ padding: 18px 20px 14px;
3259
+ border-bottom: 1px solid var(--ui-border);
3260
+ }
3261
+
3262
+ .el-dialog__title {
3263
+ color: var(--ui-text);
3264
+ font-size: 16px;
3265
+ font-weight: 650;
3266
+ }
3267
+
3268
+ .el-dialog__body {
3269
+ padding: 20px;
3270
+ }
3271
+
3272
+ .el-dialog__footer {
3273
+ padding: 12px 20px 18px;
3274
+ }
3275
+
3276
+ .el-message-box {
3277
+ border: 1px solid var(--ui-border);
3278
+ border-radius: var(--ui-radius);
3279
+ box-shadow: 0 18px 48px rgba(15, 23, 42, 0.18);
3280
+ }
3281
+
3282
+ .el-tabs__item {
3283
+ color: var(--ui-text-secondary);
3284
+ font-weight: 500;
3285
+ }
3286
+
3287
+ .el-tabs__item.is-active {
3288
+ color: var(--ui-primary);
3289
+ font-weight: 600;
3290
+ }
3291
+
3292
+ .el-alert {
3293
+ border: 1px solid color-mix(in srgb, currentColor 14%, transparent);
3294
+ border-radius: var(--ui-radius-control);
3295
+ }
3296
+
3297
+ .el-tag {
3298
+ border-radius: 4px;
3299
+ font-weight: 500;
3300
+ }
3301
+
3302
+ .el-empty__description p {
3303
+ color: var(--ui-text-muted);
3304
+ font-size: 13px;
3305
+ }
3306
+
3307
+ .el-select-dropdown,
3308
+ .el-dropdown__popper,
3309
+ .el-picker__popper,
3310
+ .el-popover.el-popper,
3311
+ .el-tooltip__popper {
3312
+ border-radius: var(--ui-radius-control);
3313
+ box-shadow: var(--ui-shadow-popover);
3314
+ }
3315
+
3316
+ .subnav {
3317
+ display: inline-flex;
3318
+ width: fit-content;
3319
+ padding: 4px;
3320
+ border: 1px solid var(--ui-border);
3321
+ border-radius: var(--ui-radius);
3322
+ background: #eef1f5;
3323
+ }
3324
+
3325
+ .subnav__item {
3326
+ min-height: 32px;
3327
+ padding: 6px 14px;
3328
+ border: 0;
3329
+ border-radius: 5px;
3330
+ background: transparent;
3331
+ color: var(--ui-text-secondary);
3332
+ font-size: 13px;
3333
+ font-weight: 500;
3334
+ }
3335
+
3336
+ .subnav__item:hover {
3337
+ color: var(--ui-text);
3338
+ }
3339
+
3340
+ .subnav__item--active {
3341
+ border: 0;
3342
+ background: #e1eaff;
3343
+ color: var(--ui-primary);
3344
+ box-shadow: none;
3345
+ }
3346
+
3347
+ .page-grid,
3348
+ .config-grid,
3349
+ .generator-page--ai {
3350
+ gap: 16px;
3351
+ }
3352
+
3353
+ .panel-header {
3354
+ min-width: 0;
3355
+ }
3356
+
3357
+ .panel-header > span,
3358
+ .panel-header__title {
3359
+ color: var(--ui-text);
3360
+ font-weight: 650;
3361
+ }
3362
+
3363
+ .panel-header__actions {
3364
+ align-items: center;
3365
+ }
3366
+
3367
+ .config-model-grid {
3368
+ gap: 32px;
3369
+ }
3370
+
3371
+ .config-model-grid > section {
3372
+ min-width: 0;
3373
+ padding: 0;
3374
+ border: 0;
3375
+ border-radius: 0;
3376
+ }
3377
+
3378
+ .config-model-grid > section + section {
3379
+ padding-left: 32px;
3380
+ border-left: 1px solid var(--ui-border);
3381
+ }
3382
+
3383
+ @media (max-width: 640px) {
3384
+ .config-model-grid > section + section {
3385
+ padding: 24px 0 0;
3386
+ border-left: 0;
3387
+ border-top: 1px solid var(--ui-border);
3388
+ }
3389
+ }
3390
+
3391
+ .config-model-grid > section,
3392
+ .config-page .config-grid > .config-module-card > .el-card__body,
3393
+ .config-appium-card > .el-card__body {
3394
+ background: var(--ui-surface);
3395
+ }
3396
+
3397
+ .model-usage-chart {
3398
+ border-top-color: var(--ui-border);
3399
+ }
3400
+
3401
+ .model-usage-chart__svg {
3402
+ border-color: var(--ui-border);
3403
+ background: #fbfcfe;
3404
+ }
3405
+
3406
+ .model-usage-chart__record {
3407
+ border: 1px solid transparent;
3408
+ background: var(--ui-bg-soft);
3409
+ }
3410
+
3411
+ .model-usage-chart__record:not(.model-usage-chart__record--head):hover {
3412
+ border-color: #b3d3f8;
3413
+ background: #f0f6ff;
3414
+ }
3415
+
3416
+ .model-usage-chart__record--head {
3417
+ background: #eef1f5;
3418
+ color: #374151;
3419
+ }
3420
+
3421
+ .app-preset-row,
3422
+ .script-row,
3423
+ .step-item {
3424
+ border-color: var(--ui-border);
3425
+ border-radius: var(--ui-radius-control);
3426
+ }
3427
+
3428
+ .app-preset-row:hover,
3429
+ .script-row:hover {
3430
+ border-color: #b3d3f8;
3431
+ background: #f0f6ff;
3432
+ }
3433
+
3434
+ .method-guide {
3435
+ border-color: #cce1fa;
3436
+ background: #f0f6ff;
3437
+ }
3438
+
3439
+ .method-guide__summary {
3440
+ color: #305a91;
3441
+ }
3442
+
3443
+ .step-item {
3444
+ background: var(--ui-bg-soft);
3445
+ }
3446
+
3447
+ .code-block,
3448
+ .terminal-block,
3449
+ .generator-code-editor .el-textarea__inner,
3450
+ .code-dialog__editor .el-textarea__inner {
3451
+ background: #111827;
3452
+ }
3453
+
3454
+ .automation-layout,
3455
+ .automation-stage {
3456
+ gap: 16px;
3457
+ }
3458
+
3459
+ .script-row--active {
3460
+ border-color: #80b5f3;
3461
+ background: #e1eaff;
3462
+ }
3463
+
3464
+ .execution-output {
3465
+ border-color: var(--ui-border);
3466
+ border-radius: var(--ui-radius-control);
3467
+ background: var(--ui-surface);
3468
+ }
3469
+
3470
+ .execution-log__output {
3471
+ border-radius: var(--ui-radius-control);
3472
+ background: #111827;
3473
+ }
3474
+
3475
+ .device-preview {
3476
+ border-radius: var(--ui-radius-control);
3477
+ background: #0f172a;
3478
+ }
3479
+
3480
+ .device-preview--empty {
3481
+ border: 1px dashed var(--ui-border-strong);
3482
+ background: #fafafa;
3483
+ }
3484
+
3485
+ .device-action-button {
3486
+ border-radius: var(--ui-radius-control);
3487
+ }
3488
+
3489
+ .device-action-button:hover {
3490
+ background: #e6f0fd;
3491
+ }
3492
+
3493
+ .appium-header-actions {
3494
+ top: 0;
3495
+ }
3496
+
3497
+ .appium-recorder-page {
3498
+ gap: 16px;
3499
+ }
3500
+
3501
+ .appium-recorder-layout {
3502
+ gap: 16px;
3503
+ }
3504
+
3505
+ .appium-workbench-tabs > .el-tabs__header {
3506
+ padding: 0 18px;
3507
+ background: #fbfcfe;
3508
+ }
3509
+
3510
+ .appium-workbench {
3511
+ gap: 18px;
3512
+ padding: 18px;
3513
+ }
3514
+
3515
+ .appium-workbench__section h3 {
3516
+ color: var(--ui-text);
3517
+ font-size: 15px;
3518
+ font-weight: 650;
3519
+ }
3520
+
3521
+ .appium-tree .el-tree-node__content {
3522
+ min-height: 30px;
3523
+ border-radius: 4px;
3524
+ }
3525
+
3526
+ .appium-tree .el-tree-node__content:hover {
3527
+ background: #f0f6ff;
3528
+ }
3529
+
3530
+ .appium-tree .el-tree-node.is-current > .el-tree-node__content {
3531
+ background: #e1eaff;
3532
+ color: #006be6;
3533
+ }
3534
+
3535
+ .appium-current-activity {
3536
+ border-top-color: var(--ui-border);
3537
+ background: #fbfcfe;
3538
+ }
3539
+
3540
+ .appium-current-activity > span {
3541
+ color: var(--ui-text-secondary);
3542
+ font-weight: 500;
3543
+ }
3544
+
3545
+ .appium-side-form {
3546
+ gap: 10px;
3547
+ }
3548
+
3549
+ .appium-script-list__item {
3550
+ border-color: var(--ui-border);
3551
+ border-radius: var(--ui-radius-control);
3552
+ background: var(--ui-surface);
3553
+ }
3554
+
3555
+ .appium-script-list__item:hover {
3556
+ border-color: #b3d3f8;
3557
+ background: #f0f6ff;
3558
+ }
3559
+
3560
+ .appium-script-list__item--active {
3561
+ border-color: #80b5f3;
3562
+ background: #e1eaff;
3563
+ }
3564
+
3565
+ .appium-replay-fab .el-button {
3566
+ box-shadow: 0 8px 24px rgba(0, 107, 230, 0.2);
3567
+ }
3568
+
3569
+ .appium-replay-output--dialog {
3570
+ border-radius: var(--ui-radius-control);
3571
+ background: #111827;
3572
+ }
3573
+
3574
+ .el-button.recorder-panel-tool {
3575
+ --el-button-text-color: #606266;
3576
+ --el-button-border-color: #dcdfe6;
3577
+ --el-button-disabled-text-color: #a8abb2;
3578
+ --el-button-disabled-border-color: #e4e7ed;
3579
+ width: 30px;
3580
+ min-width: 30px;
3581
+ height: 32px;
3582
+ min-height: 32px;
3583
+ padding: 0;
3584
+ margin: 0;
3585
+ border-radius: 3px;
3586
+ font-size: 12px;
3587
+ font-weight: 400;
3588
+ }
3589
+
3590
+ .appium-flow-dialog.el-dialog {
3591
+ display: flex;
3592
+ flex-direction: column;
3593
+ height: 86dvh;
3594
+ max-height: calc(100dvh - 32px);
3595
+ overflow: visible;
3596
+ padding: 16px;
3597
+ border: 0;
3598
+ border-radius: 4px;
3599
+ box-shadow: var(--el-box-shadow);
3600
+ }
3601
+
3602
+ .appium-flow-dialog .el-dialog__header {
3603
+ flex: none;
3604
+ padding: 0 0 16px;
3605
+ border-bottom: 0;
3606
+ }
3607
+
3608
+ .appium-flow-dialog .el-dialog__title {
3609
+ font-size: var(--el-dialog-title-font-size);
3610
+ font-weight: 400;
3611
+ }
3612
+
3613
+ .appium-flow-dialog .el-dialog__body {
3614
+ display: flex;
3615
+ flex-direction: column;
3616
+ flex: 1;
3617
+ min-height: 0;
3618
+ padding: 8px 0 0;
3619
+ }
3620
+
3621
+ .appium-flow-dialog__toolbar { flex: none; }
3622
+
3623
+ /* Keep the canvas within the centered dialog even on short viewports. */
3624
+
3625
+ .appium-flow-dialog .appium-flow-canvas--dialog.appium-flow-canvas--vue {
3626
+ flex: 1;
3627
+ height: auto;
3628
+ min-height: 0;
3629
+ }
3630
+
3631
+ .appium-flow-dialog .el-dialog__footer {
3632
+ padding: 16px 0 0;
3633
+ }
3634
+
3635
+ .appium-recorded-steps-panel .el-button,
3636
+ .appium-flow-dialog .el-button {
3637
+ --el-button-disabled-text-color: #a8abb2;
3638
+ font-weight: 400;
3639
+ }
3640
+
3641
+ .appium-recorded-steps-panel .el-form-item__label,
3642
+ .appium-flow-dialog .el-form-item__label {
3643
+ color: #606266;
3644
+ font-size: 14px;
3645
+ font-weight: 400;
3646
+ }
3647
+
3648
+ .appium-recorded-steps-panel .el-button:not(.is-circle),
3649
+ .appium-flow-dialog .el-button:not(.is-circle) {
3650
+ min-height: var(--el-component-size, 32px);
3651
+ padding-right: 15px;
3652
+ padding-left: 15px;
3653
+ }
3654
+
3655
+ .appium-recorded-steps-panel .el-button--primary:not(.is-disabled):not(.is-plain):not(.is-text):not(.is-link),
3656
+ .appium-flow-dialog .el-button--primary:not(.is-disabled):not(.is-plain):not(.is-text):not(.is-link) {
3657
+ --el-button-text-color: #fff;
3658
+ --el-button-hover-text-color: #fff;
3659
+ --el-button-active-text-color: #fff;
3660
+ box-shadow: none;
3661
+ }
3662
+
3663
+ @media (max-width: 1440px) {
3664
+ .page-body {
3665
+ padding-right: 18px;
3666
+ padding-left: 18px;
3667
+ }
3668
+ }
3669
+
3670
+ .layout--collapsed { grid-template-columns: 64px minmax(0, 1fr); }
3671
+
3672
+ .layout-sidebar__brand { white-space: nowrap; font-size: 18px; font-weight: 650; letter-spacing: -0.4px; }
3673
+
3674
+ .layout-sidebar__brand span { font-weight: 500; }
3675
+
3676
+ .layout-menu.el-menu--collapse { width: 63px; padding-inline: 4px; }
3677
+
3678
+ .layout--collapsed .layout-sidebar__top { padding-inline: 16px; }
3679
+
3680
+ .layout-header__breadcrumb { display: flex; gap: 12px; color: var(--ui-text-secondary); }
3681
+
3682
+ .layout-header__breadcrumb > span { color: var(--ui-border-strong); }
3683
+
3684
+ .layout-collapse.el-button { width: 32px; padding: 0; font-size: 18px; }
3685
+
3686
+ .layout-page-tabs { display: flex; align-items: flex-end; gap: 4px; padding: 4px 16px 0; border-bottom: 1px solid var(--ui-border); background: var(--ui-surface); overflow-x: auto; }
3687
+
3688
+ .layout-page-tab { display: inline-flex; flex: none; align-items: center; height: 35px; border: 0; border-radius: 8px 8px 0 0; background: transparent; color: var(--ui-text); font-size: 13px; cursor: pointer; }
3689
+
3690
+ .layout-page-tab:hover { background: var(--ui-bg); }
3691
+
3692
+ .layout-page-tab.is-active { color: var(--ui-primary); background: #e1eaff; }
3693
+
3694
+ .page-body.page-body--config { padding: 0; overflow: hidden; scrollbar-gutter: auto; }
3695
+
3696
+ button:focus-visible { outline: 2px solid var(--ui-primary); outline-offset: -2px; }
3697
+
3698
+ /* Header controls participate in layout, including on narrow screens. */
3699
+
3700
+ .layout-main { display: flex; flex-direction: column; min-height: 0; }
3701
+
3702
+ .layout-header { flex: none; height: auto; min-height: 56px; flex-wrap: wrap; gap: 12px; padding-top: 10px; padding-bottom: 10px; }
3703
+
3704
+ .layout-header__actions { min-width: 0; max-width: 100%; }
3705
+
3706
+ .appium-header-actions { height: auto; flex-wrap: wrap; gap: 8px; }
3707
+
3708
+ .layout-page-tabs { flex: none; min-height: 40px; }
3709
+
3710
+ .layout-page-tab { padding: 0 6px 0 0; gap: 0; }
3711
+
3712
+ .layout-page-tab__select, .layout-page-tab__close { border: 0; background: transparent; color: inherit; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; }
3713
+
3714
+ .layout-page-tab__select { gap: 8px; padding: 0 10px 0 14px; height: 100%; font: inherit; }
3715
+
3716
+ .layout-page-tab__close { width: 24px; height: 24px; border-radius: 4px; }
3717
+
3718
+ .layout-page-tab__close:hover:not(:disabled) { background: var(--el-color-primary-light-8); }
3719
+
3720
+ .layout-page-tab__close:disabled { opacity: .3; cursor: default; }
3721
+
3722
+ .layout-page-tab button:focus-visible { outline: 2px solid var(--ui-primary); outline-offset: -2px; }
3723
+
3724
+ .page-body { flex: 1; min-height: 0; }
3725
+
3726
+ .connection-status { display: flex; align-items: center; gap: 16px; flex: none; padding: 8px 20px; background: var(--el-color-warning-light-9); color: var(--el-color-warning-dark-2); font-size: 13px; }
3727
+
3728
+ .page-loading { padding: 40px; color: var(--ui-text-secondary); text-align: center; }
3729
+
3730
+ @media (max-width: 1000px) {
3731
+ .layout:not(.layout--collapsed) { grid-template-columns: 180px minmax(0, 1fr); }
3732
+ .layout-sidebar__brand { font-size: 16px; }
3733
+ .layout-header__breadcrumb { display: none; }
3734
+ .appium-header-actions__script { width: 170px; }
3735
+ }