android-midscene-automation 0.1.43 → 0.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 (56) hide show
  1. package/{AI_RECOGNITION_GUIDE.md → AI/350/257/206/345/210/253/346/223/215/344/275/234/350/257/264/346/230/216.md} +78 -6
  2. package/CHANGELOG.md +13 -0
  3. package/FAQ.md +8 -8
  4. package/README.md +143 -17
  5. package/USAGE.md +120 -8
  6. package/package.json +3 -2
  7. package/server/analytics.test.ts +46 -0
  8. package/server/analytics.ts +24 -0
  9. package/server/api-safety-analytics.test.ts +57 -0
  10. package/server/appium-auto-save.test.ts +6 -0
  11. package/server/appium-recorder/ai-recognition.test.ts +27 -0
  12. package/server/appium-recorder/ai-recognition.ts +16 -4
  13. package/server/appium-recorder/appium-runner.ts +11 -1
  14. package/server/appium-recorder/appium-version.test.ts +55 -0
  15. package/server/appium-recorder/managed-appium.ts +37 -1
  16. package/server/appium-recorder/repository.ts +6 -2
  17. package/server/appium-recorder/routes.ts +2 -12
  18. package/server/appium-recorder/run-history.ts +11 -0
  19. package/server/config-access.test.ts +27 -0
  20. package/server/config-access.ts +27 -0
  21. package/server/http-api.ts +63 -54
  22. package/server/operations/repository.ts +8 -0
  23. package/server/remote-agents/routes.ts +2 -12
  24. package/server/request-body.test.ts +40 -0
  25. package/server/request-body.ts +48 -0
  26. package/src/App.vue +98 -742
  27. package/src/analytics/summary.ts +75 -0
  28. package/src/api.ts +11 -0
  29. package/src/appium-recorder/AppiumPage.vue +4 -1
  30. package/src/appium-recorder/ai-recognition.ts +7 -0
  31. package/src/appium-recorder/components/AiRecognitionSettings.vue +27 -0
  32. package/src/appium-recorder/flow-labels.ts +1 -1
  33. package/src/appium-recorder/types.ts +2 -1
  34. package/src/components/AppSidebar.vue +31 -0
  35. package/src/components/analytics/AnalysisCharts.vue +189 -0
  36. package/src/components/analytics/ReportAnalysis.vue +78 -0
  37. package/src/components/config/AiPromptPresetsSettings.vue +55 -5
  38. package/src/components/config/AppiumConfigPanel.vue +4 -1
  39. package/src/components/config/AppiumModelSettings.vue +1 -1
  40. package/src/components/config/BaseConfigPanel.vue +6 -2
  41. package/src/components/config/MidsceneConfigPanel.vue +4 -5
  42. package/src/components/help/HelpCenter.vue +185 -0
  43. package/src/components/help/MarkdownDocument.vue +139 -0
  44. package/src/composables/use-device-preview.ts +279 -0
  45. package/src/composables/use-initial-resource.ts +17 -0
  46. package/src/composables/use-script-execution.ts +277 -0
  47. package/src/config/credentials.ts +2 -0
  48. package/src/config/use-appium-auto-save.ts +22 -11
  49. package/src/config/use-model-config.ts +157 -0
  50. package/src/main.ts +2 -2
  51. package/src/pages/AnalysisPage.vue +60 -0
  52. package/src/pages/ConfigPage.vue +36 -5
  53. package/src/style.css +716 -91
  54. package/src/types.ts +7 -1
  55. package//346/265/201/347/250/213/350/212/202/347/202/271/346/223/215/344/275/234/350/257/264/346/230/216.md +408 -0
  56. 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,52 +31,36 @@ 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;
40
37
  }
41
38
 
42
39
  .layout-sidebar {
43
- border-right: 1px solid #e4e7ed;
44
- background: #001529;
40
+ display: flex;
41
+ flex-direction: column;
42
+ min-height: 0;
45
43
  }
46
44
 
47
45
  .layout-sidebar__top {
48
46
  display: flex;
49
47
  align-items: center;
50
- justify-content: center;
51
- height: 60px;
52
- border-bottom: 1px solid rgba(255, 255, 255, 0.08);
53
48
  }
54
49
 
55
50
  .layout-sidebar__logo {
56
51
  display: grid;
57
52
  place-items: center;
58
- width: 36px;
59
- height: 36px;
60
- border-radius: 8px;
61
- background: #1677ff;
62
- color: #fff;
63
53
  font-weight: 700;
64
54
  }
65
55
 
66
56
  .layout-menu {
57
+ flex: 1;
58
+ min-height: 0;
67
59
  border-right: 0;
68
60
  background: transparent;
69
61
  }
70
62
 
71
- .layout-menu.el-menu {
72
- --el-menu-bg-color: #001529;
73
- --el-menu-text-color: rgba(255, 255, 255, 0.85);
74
- --el-menu-hover-bg-color: #0a2540;
75
- --el-menu-active-color: #fff;
76
- }
77
-
78
63
  .layout-main {
79
- display: grid;
80
- grid-template-rows: 60px minmax(0, 1fr);
81
- min-height: 0;
82
64
  overflow: hidden;
83
65
  }
84
66
 
@@ -180,19 +162,11 @@ select {
180
162
  display: flex;
181
163
  align-items: center;
182
164
  justify-content: space-between;
183
- padding: 0 24px;
184
165
  border-bottom: 1px solid #e4e7ed;
185
- background: #fff;
186
- }
187
-
188
- .layout-header__title {
189
- font-size: 18px;
190
- font-weight: 600;
191
166
  }
192
167
 
193
168
  .layout-header__actions {
194
169
  display: flex;
195
- gap: 12px;
196
170
  }
197
171
 
198
172
  .layout-header__button--loading .el-icon {
@@ -201,37 +175,23 @@ select {
201
175
 
202
176
  .page-body {
203
177
  height: 100%;
204
- min-height: 0;
205
178
  overflow: auto;
206
- padding: 24px;
207
179
  }
208
180
 
209
181
  .page-body--fixed {
210
182
  overflow: hidden;
211
183
  }
212
184
 
213
- .page-alert,
214
- .page-section {
215
- margin-bottom: 16px;
216
- }
217
-
218
185
  .appium-recorder-page {
219
186
  display: flex;
220
187
  flex-direction: column;
221
- gap: 12px;
222
188
  height: 100%;
223
189
  min-height: 0;
224
190
  }
225
191
 
226
192
  .appium-header-actions {
227
- position: fixed;
228
- top: 0;
229
- right: 24px;
230
- z-index: 10;
231
193
  display: flex;
232
194
  align-items: center;
233
- gap: 12px;
234
- height: 60px;
235
195
  min-width: 0;
236
196
  }
237
197
 
@@ -243,7 +203,6 @@ select {
243
203
  display: grid;
244
204
  flex: 1 1 auto;
245
205
  grid-template-columns: minmax(320px, 2.8fr) minmax(0, 3fr) minmax(0, 4.2fr);
246
- gap: 12px;
247
206
  align-items: stretch;
248
207
  height: auto;
249
208
  min-height: 0;
@@ -294,7 +253,6 @@ select {
294
253
 
295
254
  .appium-workbench-tabs > .el-tabs__header {
296
255
  margin: 0;
297
- padding: 0 16px;
298
256
  }
299
257
 
300
258
  .appium-workbench-tabs > .el-tabs__content {
@@ -309,8 +267,6 @@ select {
309
267
 
310
268
  .appium-workbench {
311
269
  display: grid;
312
- gap: 16px;
313
- padding: 16px;
314
270
  }
315
271
 
316
272
  .appium-workbench__section {
@@ -319,9 +275,6 @@ select {
319
275
 
320
276
  .appium-workbench__section h3 {
321
277
  margin: 0 0 12px;
322
- color: #303133;
323
- font-size: 16px;
324
- font-weight: 700;
325
278
  }
326
279
 
327
280
  .appium-section-title {
@@ -432,7 +385,6 @@ select {
432
385
 
433
386
  .appium-side-form {
434
387
  display: grid;
435
- gap: 8px;
436
388
  margin-bottom: 12px;
437
389
  }
438
390
 
@@ -461,13 +413,6 @@ select {
461
413
  align-items: center;
462
414
  padding: 10px;
463
415
  border: 1px solid #e4e7ed;
464
- border-radius: 6px;
465
- background: #fff;
466
- }
467
-
468
- .appium-script-list__item--active {
469
- border-color: #409eff;
470
- background: #f5f9ff;
471
416
  }
472
417
 
473
418
  .appium-script-list__main {
@@ -511,9 +456,6 @@ select {
511
456
  }
512
457
 
513
458
  .appium-action-dropdown__group {
514
- padding: 6px 12px 4px;
515
- color: #909399;
516
- font-size: 12px;
517
459
  line-height: 18px;
518
460
  }
519
461
 
@@ -715,7 +657,6 @@ select {
715
657
  gap: 8px;
716
658
  align-content: start;
717
659
  width: max-content;
718
- min-width: max(980px, 100%);
719
660
  min-width: 0;
720
661
  padding: 10px 12px 14px;
721
662
  transform-origin: 0 0;
@@ -1421,7 +1362,6 @@ select {
1421
1362
  .appium-replay-fab .el-button {
1422
1363
  width: 52px;
1423
1364
  height: 52px;
1424
- box-shadow: 0 8px 24px rgba(64, 158, 255, 0.28);
1425
1365
  font-size: 20px;
1426
1366
  }
1427
1367
 
@@ -1480,24 +1420,16 @@ select {
1480
1420
  }
1481
1421
 
1482
1422
  .subnav {
1483
- display: flex;
1484
1423
  gap: 8px;
1485
1424
  margin-bottom: 16px;
1486
1425
  }
1487
1426
 
1488
1427
  .subnav__item {
1489
- padding: 8px 14px;
1490
- border: 1px solid #dcdfe6;
1491
- border-radius: 4px;
1492
- background: #fff;
1493
- color: #606266;
1494
1428
  cursor: pointer;
1495
1429
  }
1496
1430
 
1497
1431
  .subnav__item--active {
1498
1432
  border-color: #409eff;
1499
- color: #409eff;
1500
- background: #ecf5ff;
1501
1433
  }
1502
1434
 
1503
1435
  .page-grid {
@@ -1653,7 +1585,6 @@ select {
1653
1585
  .config-model-grid {
1654
1586
  display: grid;
1655
1587
  grid-template-columns: repeat(2, minmax(0, 1fr));
1656
- gap: 18px;
1657
1588
  }
1658
1589
 
1659
1590
  .app-preset-list {
@@ -1712,13 +1643,11 @@ select {
1712
1643
  margin-bottom: 16px;
1713
1644
  border: 1px solid #ebeef5;
1714
1645
  border-radius: 6px;
1715
- background: #f4f8ff;
1716
1646
  }
1717
1647
 
1718
1648
  .method-guide__summary {
1719
1649
  padding: 12px 16px;
1720
1650
  cursor: pointer;
1721
- color: #303133;
1722
1651
  font-weight: 500;
1723
1652
  user-select: none;
1724
1653
  }
@@ -1821,7 +1750,6 @@ select {
1821
1750
  padding: 16px;
1822
1751
  border: 1px solid #ebeef5;
1823
1752
  border-radius: 6px;
1824
- background: #fafafa;
1825
1753
  }
1826
1754
 
1827
1755
  .step-item--readonly {
@@ -2126,11 +2054,6 @@ select {
2126
2054
  cursor: pointer;
2127
2055
  }
2128
2056
 
2129
- .script-row--active {
2130
- border-color: #409eff;
2131
- background: #ecf5ff;
2132
- }
2133
-
2134
2057
  .script-row__main {
2135
2058
  display: grid;
2136
2059
  gap: 4px;
@@ -2195,15 +2118,10 @@ select {
2195
2118
  display: grid;
2196
2119
  place-items: center;
2197
2120
  flex: 0 0 auto;
2198
- border-radius: 8px;
2199
2121
  position: relative;
2200
2122
  cursor: pointer;
2201
2123
  }
2202
2124
 
2203
- .device-action-button:hover {
2204
- background: #f5f7fb;
2205
- }
2206
-
2207
2125
  .device-action-button:disabled {
2208
2126
  cursor: not-allowed;
2209
2127
  opacity: 0.45;
@@ -2279,12 +2197,10 @@ select {
2279
2197
  overflow: hidden;
2280
2198
  height: clamp(320px, calc(100vh - 300px), 680px);
2281
2199
  min-height: 0;
2282
- background: #fff;
2283
2200
  position: relative;
2284
2201
  display: flex;
2285
2202
  align-items: center;
2286
2203
  justify-content: center;
2287
- border-radius: 0;
2288
2204
  }
2289
2205
 
2290
2206
  .device-preview--image {
@@ -2569,7 +2485,6 @@ select {
2569
2485
  border: 0;
2570
2486
  outline: 0;
2571
2487
  resize: none;
2572
- background: #101722;
2573
2488
  color: #d7e0ea;
2574
2489
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
2575
2490
  font-size: 12px;
@@ -3108,3 +3023,713 @@ select {
3108
3023
  font-weight: 600;
3109
3024
  font-size: 12px;
3110
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
+ }