@web-auto/webauto 0.1.3 → 0.1.6

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 (174) hide show
  1. package/apps/desktop-console/default-settings.json +2 -2
  2. package/apps/desktop-console/dist/main/index.mjs +915 -85
  3. package/apps/desktop-console/dist/main/preload.mjs +7 -0
  4. package/apps/desktop-console/dist/renderer/index.html +622 -50
  5. package/apps/desktop-console/dist/renderer/index.js +2415 -470
  6. package/apps/desktop-console/dist/renderer/run.mts +6 -5
  7. package/apps/desktop-console/entry/ui-cli.mjs +672 -0
  8. package/apps/desktop-console/entry/ui-console.mjs +416 -29
  9. package/apps/webauto/entry/account.mjs +89 -53
  10. package/apps/webauto/entry/browser-status.mjs +7 -10
  11. package/apps/webauto/entry/lib/account-detect.mjs +254 -28
  12. package/apps/webauto/entry/lib/account-store.mjs +219 -30
  13. package/apps/webauto/entry/lib/bus-publish.mjs +63 -0
  14. package/apps/webauto/entry/lib/camo-cli.mjs +93 -0
  15. package/apps/webauto/entry/lib/profilepool.mjs +14 -5
  16. package/apps/webauto/entry/lib/quota-status.mjs +23 -0
  17. package/apps/webauto/entry/lib/schedule-store.mjs +1068 -0
  18. package/apps/webauto/entry/profilepool.mjs +106 -17
  19. package/apps/webauto/entry/schedule.mjs +612 -0
  20. package/apps/webauto/entry/weibo-unified.mjs +134 -0
  21. package/apps/webauto/entry/xhs-install.mjs +236 -29
  22. package/apps/webauto/entry/xhs-status.mjs +5 -2
  23. package/apps/webauto/entry/xhs-unified.mjs +631 -98
  24. package/apps/webauto/resources/container-library/weibo/weibo_detail_page/comment_item/container.json +40 -0
  25. package/apps/webauto/resources/container-library/weibo/weibo_detail_page/reply_expand_button/container.json +38 -0
  26. package/apps/webauto/resources/container-library/weibo/weibo_detail_page/reply_list/container.json +37 -0
  27. package/apps/webauto/resources/container-library/weibo/weibo_search_page/container.json +8 -3
  28. package/apps/webauto/resources/container-library/weibo/weibo_search_page/login_anchor/container.json +30 -0
  29. package/apps/webauto/resources/container-library/weibo/weibo_search_page/search_bar/container.json +47 -0
  30. package/apps/webauto/resources/container-library/weibo/weibo_search_page/search_button/container.json +39 -0
  31. package/bin/camoufox-cli.mjs +61 -0
  32. package/bin/webauto.mjs +301 -54
  33. package/dist/modules/camo-backend/src/index.js +49 -1
  34. package/dist/modules/camo-backend/src/internal/BrowserSession.js +572 -3
  35. package/dist/modules/camo-backend/src/internal/SessionManager.js +13 -1
  36. package/dist/modules/camo-backend/src/internal/storage-paths.js +6 -0
  37. package/dist/modules/collection-manager/bloom-filter.js +91 -0
  38. package/dist/modules/collection-manager/date-utils.js +275 -0
  39. package/dist/modules/collection-manager/index.js +258 -0
  40. package/dist/modules/collection-manager/storage.js +195 -0
  41. package/dist/modules/collection-manager/types.js +47 -0
  42. package/dist/modules/logging/src/index.js +1 -1
  43. package/dist/modules/process-registry/index.js +230 -0
  44. package/dist/modules/rate-limiter/index.js +242 -0
  45. package/dist/modules/workflow/blocks/ExecuteWeiboSearchBlock.js +128 -0
  46. package/dist/modules/workflow/blocks/PersistXhsNoteBlock.js +7 -3
  47. package/dist/modules/workflow/blocks/RenderMarkdown.js +4 -1
  48. package/dist/modules/workflow/blocks/WeiboCollectCommentsBlock.js +282 -0
  49. package/dist/modules/workflow/blocks/WeiboCollectFromLinksBlock.js +283 -0
  50. package/dist/modules/workflow/blocks/WeiboCollectSearchLinksBlock.js +208 -0
  51. package/dist/modules/workflow/blocks/WeiboCollectTimelineListBlock.js +128 -0
  52. package/dist/modules/workflow/blocks/WeiboCollectUserPostsListBlock.js +127 -0
  53. package/dist/modules/workflow/blocks/helpers/downloadPaths.js +21 -0
  54. package/dist/modules/workflow/config/workflowRegistry.js +2 -0
  55. package/dist/modules/workflow/definitions/weibo-search-workflow-v1.js +47 -0
  56. package/dist/modules/workflow/src/runner.js +6 -0
  57. package/dist/modules/xiaohongshu/app/src/blocks/Phase34PersistDetailBlock.js +4 -0
  58. package/dist/modules/xiaohongshu/app/src/blocks/Phase3InteractBlock.js +2 -2
  59. package/dist/modules/xiaohongshu/app/src/blocks/helpers/sharding.js +123 -0
  60. package/dist/modules/xiaohongshu/app/src/container-registry/src/index.d.ts +37 -0
  61. package/dist/modules/xiaohongshu/app/src/container-registry/src/index.js +184 -0
  62. package/dist/modules/xiaohongshu/app/src/workflow/blocks/AnchorVerificationBlock.d.ts +31 -0
  63. package/dist/modules/xiaohongshu/app/src/workflow/blocks/AnchorVerificationBlock.js +71 -0
  64. package/dist/modules/xiaohongshu/app/src/workflow/blocks/DetectPageStateBlock.d.ts +48 -0
  65. package/dist/modules/xiaohongshu/app/src/workflow/blocks/DetectPageStateBlock.js +259 -0
  66. package/dist/modules/xiaohongshu/app/src/workflow/blocks/ErrorRecoveryBlock.d.ts +28 -0
  67. package/dist/modules/xiaohongshu/app/src/workflow/blocks/ErrorRecoveryBlock.js +319 -0
  68. package/dist/modules/xiaohongshu/app/src/workflow/blocks/WaitSearchPermitBlock.d.ts +36 -0
  69. package/dist/modules/xiaohongshu/app/src/workflow/blocks/WaitSearchPermitBlock.js +162 -0
  70. package/dist/modules/xiaohongshu/app/src/workflow/blocks/helpers/containerAnchors.d.ts +36 -0
  71. package/dist/modules/xiaohongshu/app/src/workflow/blocks/helpers/containerAnchors.js +301 -0
  72. package/dist/modules/xiaohongshu/app/src/workflow/blocks/helpers/operationLogger.d.ts +29 -0
  73. package/dist/modules/xiaohongshu/app/src/workflow/blocks/helpers/operationLogger.js +195 -0
  74. package/dist/modules/xiaohongshu/app/src/workflow/blocks/helpers/searchPageState.d.ts +25 -0
  75. package/dist/modules/xiaohongshu/app/src/workflow/blocks/helpers/searchPageState.js +164 -0
  76. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/MatchCommentsBlock.d.ts +66 -0
  77. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/MatchCommentsBlock.js +139 -0
  78. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase1EnsureServicesBlock.d.ts +16 -0
  79. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase1EnsureServicesBlock.js +36 -0
  80. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase1MonitorCookieBlock.d.ts +27 -0
  81. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase1MonitorCookieBlock.js +213 -0
  82. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase1StartProfileBlock.d.ts +18 -0
  83. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase1StartProfileBlock.js +121 -0
  84. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase2CollectLinksBlock.d.ts +34 -0
  85. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase2CollectLinksBlock.js +1249 -0
  86. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase2SearchBlock.d.ts +17 -0
  87. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase2SearchBlock.js +703 -0
  88. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34CloseDetailBlock.d.ts +15 -0
  89. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34CloseDetailBlock.js +41 -0
  90. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34CloseTabsBlock.d.ts +26 -0
  91. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34CloseTabsBlock.js +44 -0
  92. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34CollectCommentsBlock.d.ts +29 -0
  93. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34CollectCommentsBlock.js +150 -0
  94. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34ExtractDetailBlock.d.ts +38 -0
  95. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34ExtractDetailBlock.js +117 -0
  96. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34OpenDetailBlock.d.ts +30 -0
  97. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34OpenDetailBlock.js +102 -0
  98. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34OpenTabsBlock.d.ts +23 -0
  99. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34OpenTabsBlock.js +109 -0
  100. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34PersistDetailBlock.d.ts +32 -0
  101. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34PersistDetailBlock.js +117 -0
  102. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34ProcessSingleNoteBlock.d.ts +35 -0
  103. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34ProcessSingleNoteBlock.js +114 -0
  104. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34ValidateLinksBlock.d.ts +34 -0
  105. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase34ValidateLinksBlock.js +90 -0
  106. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase3InteractBlock.d.ts +111 -0
  107. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase3InteractBlock.js +1009 -0
  108. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase4MultiTabHarvestBlock.d.ts +20 -0
  109. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/Phase4MultiTabHarvestBlock.js +233 -0
  110. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/ReplyInteractBlock.d.ts +48 -0
  111. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/ReplyInteractBlock.js +291 -0
  112. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/XhsDiscoverFallbackBlock.d.ts +23 -0
  113. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/XhsDiscoverFallbackBlock.js +240 -0
  114. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/helpers/commentMatchDsl.d.ts +55 -0
  115. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/helpers/commentMatchDsl.js +126 -0
  116. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/helpers/commentMatcher.d.ts +21 -0
  117. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/helpers/commentMatcher.js +99 -0
  118. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/helpers/evidence.d.ts +5 -0
  119. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/helpers/evidence.js +27 -0
  120. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/helpers/sharding.d.ts +37 -0
  121. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/helpers/sharding.js +165 -0
  122. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/helpers/xhsComments.d.ts +33 -0
  123. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/blocks/helpers/xhsComments.js +270 -0
  124. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/index.d.ts +9 -0
  125. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/index.js +9 -0
  126. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/utils/checkpoints.d.ts +50 -0
  127. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/utils/checkpoints.js +222 -0
  128. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/utils/controllerAction.d.ts +10 -0
  129. package/dist/modules/xiaohongshu/app/src/xiaohongshu/app/src/utils/controllerAction.js +43 -0
  130. package/dist/services/shared/serviceProcessLogger.js +1 -1
  131. package/dist/services/unified-api/server.js +105 -11
  132. package/modules/camo-backend/src/index.ts +46 -1
  133. package/modules/camo-backend/src/internal/BrowserSession.ts +619 -3
  134. package/modules/camo-backend/src/internal/SessionManager.ts +12 -1
  135. package/modules/camo-backend/src/internal/storage-paths.ts +5 -0
  136. package/modules/camo-runtime/src/autoscript/action-providers/xhs/comments.mjs +38 -2
  137. package/modules/camo-runtime/src/autoscript/action-providers/xhs/interaction.mjs +47 -2
  138. package/modules/camo-runtime/src/autoscript/action-providers/xhs/search.mjs +94 -11
  139. package/modules/camo-runtime/src/autoscript/action-providers/xhs.mjs +208 -2
  140. package/modules/camo-runtime/src/autoscript/runtime.mjs +7 -1
  141. package/modules/camo-runtime/src/autoscript/xhs-unified-template.mjs +76 -43
  142. package/modules/camo-runtime/src/container/runtime-core/operations/index.mjs +75 -1
  143. package/modules/camo-runtime/src/container/runtime-core/operations/selector-scripts.mjs +71 -4
  144. package/modules/camo-runtime/src/container/runtime-core/operations/tab-pool.mjs +183 -27
  145. package/modules/collection-manager/bloom-filter.ts +112 -0
  146. package/modules/collection-manager/date-utils.ts +316 -0
  147. package/modules/collection-manager/index.ts +309 -0
  148. package/modules/collection-manager/package.json +10 -0
  149. package/modules/collection-manager/storage.ts +174 -0
  150. package/modules/collection-manager/types.ts +156 -0
  151. package/modules/logging/src/index.ts +1 -1
  152. package/modules/process-registry/index.ts +284 -0
  153. package/modules/rate-limiter/index.ts +322 -0
  154. package/modules/state/src/paths.ts +9 -1
  155. package/modules/task-scheduler/index.ts +293 -0
  156. package/modules/workflow/blocks/ExecuteWeiboSearchBlock.ts +167 -0
  157. package/modules/workflow/blocks/PersistXhsNoteBlock.ts +7 -3
  158. package/modules/workflow/blocks/RenderMarkdown.ts +4 -1
  159. package/modules/workflow/blocks/WeiboCollectCommentsBlock.ts +339 -0
  160. package/modules/workflow/blocks/WeiboCollectFromLinksBlock.ts +338 -0
  161. package/modules/workflow/blocks/helpers/downloadPaths.ts +16 -0
  162. package/modules/workflow/config/workflowRegistry.ts +2 -0
  163. package/modules/workflow/definitions/weibo-search-workflow-v1.ts +47 -0
  164. package/modules/workflow/src/runner.ts +6 -0
  165. package/modules/xiaohongshu/app/src/blocks/Phase1StartProfileBlock.ts +1 -1
  166. package/modules/xiaohongshu/app/src/blocks/Phase34PersistDetailBlock.ts +4 -0
  167. package/modules/xiaohongshu/app/src/blocks/Phase3InteractBlock.ts +2 -3
  168. package/modules/xiaohongshu/app/src/blocks/helpers/sharding.ts +152 -0
  169. package/package.json +14 -5
  170. package/scripts/postinstall-resources.mjs +62 -0
  171. package/scripts/test/run-coverage.mjs +76 -0
  172. package/scripts/weibo/search.ts +49 -0
  173. package/services/shared/serviceProcessLogger.ts +1 -1
  174. package/services/unified-api/server.ts +98 -12
@@ -4,76 +4,398 @@
4
4
  <meta charset="UTF-8" />
5
5
  <title>WebAuto Console</title>
6
6
  <style>
7
+ /* ============================================
8
+ Design System: CSS Variables (Design Tokens)
9
+ ============================================ */
7
10
  * { box-sizing: border-box; }
8
- body { margin: 0; font: 13px/1.45 "Segoe UI", "Microsoft YaHei", system-ui, sans-serif; background: #0f1115; color: #e7e7e7; }
9
- header { height: 44px; display: flex; align-items: center; padding: 0 14px; border-bottom: 1px solid #23262f; }
10
- header .title { font-weight: 700; margin-right: 14px; }
11
- header .tabs { display: flex; gap: 10px; }
12
- header .tab { padding: 6px 10px; border-radius: 8px; cursor: pointer; color: #b9c0d4; }
13
- header .tab.active { background: #1b2233; color: #fff; }
14
- #main { height: calc(100vh - 44px); min-height: 0; display: flex; }
15
- #content { padding: 14px; overflow: auto; flex: 1; min-height: 0; }
16
- .row { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; margin-bottom: 10px; }
11
+
12
+ :root {
13
+ /* Background Layers */
14
+ --bg-base: #0a0c10;
15
+ --bg-elevated: #11141b;
16
+ --bg-overlay: #1a1f29;
17
+ --bg-hover: #232836;
18
+ --bg-active: #2a3040;
19
+
20
+ /* Accent Colors - Modern Indigo/Cyan scheme */
21
+ --accent-primary: #6366f1;
22
+ --accent-primary-hover: #818cf8;
23
+ --accent-primary-active: #4f46e5;
24
+ --accent-success: #22c55e;
25
+ --accent-success-dim: #15803d;
26
+ --accent-warning: #f59e0b;
27
+ --accent-warning-dim: #b45309;
28
+ --accent-danger: #ef4444;
29
+ --accent-danger-dim: #b91c1c;
30
+ --accent-info: #06b6d4;
31
+
32
+ /* Text Hierarchy */
33
+ --text-primary: #f1f5f9;
34
+ --text-secondary: #94a3b8;
35
+ --text-tertiary: #64748b;
36
+ --text-muted: #475569;
37
+
38
+ /* Border Colors */
39
+ --border-subtle: rgba(148, 163, 184, 0.1);
40
+ --border-default: rgba(148, 163, 184, 0.15);
41
+ --border-strong: rgba(148, 163, 184, 0.25);
42
+
43
+ /* Spacing System (8px base) */
44
+ --space-1: 4px;
45
+ --space-2: 8px;
46
+ --space-3: 12px;
47
+ --space-4: 16px;
48
+ --space-5: 24px;
49
+ --space-6: 32px;
50
+ --gap: var(--space-2);
51
+ --gap-sm: 6px;
52
+ --gap-xs: 4px;
53
+
54
+ /* Compact Control Sizes */
55
+ --control-h: 28px;
56
+ --control-h-sm: 24px;
57
+ --input-padding: 6px 10px;
58
+ --btn-padding: 6px 12px;
59
+
60
+ /* Shadows */
61
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
62
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -2px rgba(0, 0, 0, 0.3);
63
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -4px rgba(0, 0, 0, 0.3);
64
+ --shadow-glow: 0 0 20px rgba(99, 102, 241, 0.15);
65
+
66
+ /* Transitions */
67
+ --transition-fast: 150ms ease;
68
+ --transition-base: 200ms ease;
69
+ --transition-slow: 300ms ease;
70
+
71
+ /* Border Radius */
72
+ --radius-sm: 6px;
73
+ --radius-md: 10px;
74
+ --radius-lg: 14px;
75
+ --radius-xl: 20px;
76
+
77
+ /* Typography */
78
+ --font-sans: "Inter", "Segoe UI", "PingFang SC", "Microsoft YaHei", system-ui, sans-serif;
79
+ --font-mono: "JetBrains Mono", "SF Mono", "Fira Code", ui-monospace, monospace;
80
+
81
+ /* Legacy color aliases */
82
+ --warning: var(--accent-warning);
83
+ --danger: var(--accent-danger);
84
+ --text-1: var(--text-primary);
85
+ --text-3: var(--text-secondary);
86
+ --text-4: var(--text-tertiary);
87
+ --border: var(--border-default);
88
+ --accent-light: var(--accent-primary-hover);
89
+ }
90
+
91
+ body {
92
+ margin: 0;
93
+ font: 13px/1.5 var(--font-sans);
94
+ background: var(--bg-base);
95
+ color: var(--text-primary);
96
+ }
97
+
98
+ /* ============================================
99
+ Header & Navigation
100
+ ============================================ */
101
+ header {
102
+ height: 52px;
103
+ display: flex;
104
+ align-items: center;
105
+ padding: 0 var(--space-4);
106
+ border-bottom: 1px solid var(--border-default);
107
+ background: var(--bg-elevated);
108
+ }
109
+ header .title {
110
+ font-weight: 700;
111
+ margin-right: var(--space-4);
112
+ font-size: 15px;
113
+ background: linear-gradient(135deg, var(--accent-primary) 0%, var(--accent-info) 100%);
114
+ -webkit-background-clip: text;
115
+ -webkit-text-fill-color: transparent;
116
+ background-clip: text;
117
+ }
118
+ header .tabs {
119
+ display: flex;
120
+ gap: var(--space-1);
121
+ }
122
+ header .tab {
123
+ padding: 8px 14px;
124
+ border-radius: var(--radius-md);
125
+ cursor: pointer;
126
+ border: 1px solid transparent;
127
+ background: transparent;
128
+ font-family: inherit;
129
+ color: var(--text-secondary);
130
+ font-size: 13px;
131
+ font-weight: 500;
132
+ display: flex;
133
+ align-items: center;
134
+ gap: 6px;
135
+ transition: all var(--transition-fast);
136
+ position: relative;
137
+ }
138
+ header .tab:hover {
139
+ color: var(--text-primary);
140
+ background: var(--bg-hover);
141
+ }
142
+ header .tab.active {
143
+ background: var(--accent-primary);
144
+ color: #fff;
145
+ box-shadow: var(--shadow-sm);
146
+ }
147
+ header .tab:focus-visible {
148
+ outline: 2px solid var(--accent-info);
149
+ outline-offset: 2px;
150
+ }
151
+ header .tab.active::after {
152
+ content: '';
153
+ position: absolute;
154
+ bottom: -14px;
155
+ left: 50%;
156
+ transform: translateX(-50%);
157
+ width: 4px;
158
+ height: 4px;
159
+ background: var(--accent-primary);
160
+ border-radius: 50%;
161
+ }
162
+ header .tab .tab-icon {
163
+ font-size: 14px;
164
+ opacity: 0.8;
165
+ }
166
+
167
+ #main {
168
+ height: calc(100vh - 52px);
169
+ min-height: 0;
170
+ display: flex;
171
+ }
172
+ #content {
173
+ padding: var(--space-4);
174
+ overflow: auto;
175
+ flex: 1;
176
+ min-height: 0;
177
+ }
178
+ #content,
179
+ #content * {
180
+ scrollbar-width: none;
181
+ -ms-overflow-style: none;
182
+ }
183
+ #content::-webkit-scrollbar,
184
+ #content *::-webkit-scrollbar {
185
+ width: 0;
186
+ height: 0;
187
+ }
188
+
189
+ /* ============================================
190
+ Base Components
191
+ ============================================ */
192
+ .row {
193
+ display: flex;
194
+ gap: var(--gap-sm);
195
+ flex-wrap: wrap;
196
+ align-items: center;
197
+ margin-bottom: var(--gap-sm);
198
+ }
17
199
  .row > * { min-width: 0; }
18
- .card { border: 1px solid #23262f; background: #121622; border-radius: 12px; padding: 12px; margin-bottom: 12px; }
19
- label { color: #9aa4bd; }
20
- input, select, textarea { background: #0b0d12; color: #fff; border: 1px solid #23262f; padding: 8px 10px; border-radius: 10px; }
21
- input:focus, select:focus, textarea:focus { outline: 2px solid #facc15; outline-offset: 1px; box-shadow: 0 0 0 2px rgba(250, 204, 21, 0.25); }
22
- button { background: #2b67ff; color: #fff; border: none; padding: 8px 12px; border-radius: 10px; cursor: pointer; }
23
- button.secondary { background: #1b2233; color: #e7e7e7; border: 1px solid #23262f; }
24
- button.danger { background: #c0392b; }
25
- .muted { color: #8b93a6; }
26
- .split { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
27
- .list { max-height: 260px; overflow: auto; border: 1px solid #23262f; border-radius: 10px; }
28
- /* Prevent horizontal scrollbars; long columns should truncate instead. */
29
- .list { overflow-x: hidden; }
30
- .list .item { padding: 8px 10px; border-bottom: 1px solid #23262f; cursor: pointer; }
31
- .list .item:hover { background: #121622; }
32
- .list .item button { padding: 4px 8px; font-size: 11px; border: 1px solid #444; border-radius: 6px; }
33
- .list .item button.secondary { background: #1b2233; color: #e7e7e7; border: 1px solid #444; }
34
- .list .item button.danger { background: #c0392b; border: 1px solid #444; }
35
- .img-preview { max-width: 100%; border-radius: 10px; border: 1px solid #23262f; }
200
+
201
+ .card {
202
+ border: 1px solid var(--border-default);
203
+ background: var(--bg-elevated);
204
+ border-radius: var(--radius-lg);
205
+ padding: var(--gap);
206
+ margin-bottom: var(--gap-sm);
207
+ box-shadow: var(--shadow-sm);
208
+ }
209
+
210
+ label {
211
+ color: var(--text-secondary);
212
+ font-size: 12px;
213
+ font-weight: 500;
214
+ text-transform: uppercase;
215
+ letter-spacing: 0.03em;
216
+ }
217
+
218
+ /* Form Elements */
219
+ input, select, textarea {
220
+ background: var(--bg-base);
221
+ color: var(--text-primary);
222
+ border: 1px solid var(--border-default);
223
+ padding: var(--input-padding);
224
+ border-radius: var(--radius-md);
225
+ font-size: 12px;
226
+ height: var(--control-h);
227
+ transition: all var(--transition-fast);
228
+ }
229
+ input:hover, select:hover, textarea:hover {
230
+ border-color: var(--border-strong);
231
+ }
232
+ input:focus, select:focus, textarea:focus {
233
+ outline: none;
234
+ border-color: var(--accent-primary);
235
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);
236
+ }
237
+
238
+ /* Buttons */
239
+ button {
240
+ background: var(--accent-primary);
241
+ color: #fff;
242
+ border: none;
243
+ padding: var(--btn-padding);
244
+ border-radius: var(--radius-md);
245
+ cursor: pointer;
246
+ font-size: 12px;
247
+ height: var(--control-h);
248
+ font-weight: 500;
249
+ transition: all var(--transition-fast);
250
+ display: inline-flex;
251
+ align-items: center;
252
+ justify-content: center;
253
+ gap: 6px;
254
+ }
255
+ button:hover {
256
+ background: var(--accent-primary-hover);
257
+ transform: translateY(-1px);
258
+ box-shadow: var(--shadow-md);
259
+ }
260
+ button:active {
261
+ background: var(--accent-primary-active);
262
+ transform: translateY(0);
263
+ }
264
+ button:disabled {
265
+ opacity: 0.5;
266
+ cursor: not-allowed;
267
+ transform: none;
268
+ box-shadow: none;
269
+ }
270
+ button.secondary {
271
+ background: transparent;
272
+ color: var(--text-secondary);
273
+ border: 1px solid var(--border-default);
274
+ }
275
+ button.secondary:hover {
276
+ background: var(--bg-hover);
277
+ color: var(--text-primary);
278
+ border-color: var(--border-strong);
279
+ }
280
+ button.danger {
281
+ background: var(--accent-danger);
282
+ }
283
+ button.danger:hover {
284
+ background: #f87171;
285
+ }
286
+ button.success {
287
+ background: var(--accent-success);
288
+ }
289
+ button.success:hover {
290
+ background: #4ade80;
291
+ }
292
+
293
+ /* Button with loading state */
294
+ button.loading {
295
+ position: relative;
296
+ color: transparent;
297
+ }
298
+ button.loading::after {
299
+ content: '';
300
+ position: absolute;
301
+ width: 16px;
302
+ height: 16px;
303
+ border: 2px solid rgba(255,255,255,0.3);
304
+ border-top-color: #fff;
305
+ border-radius: 50%;
306
+ animation: spin 0.8s linear infinite;
307
+ }
308
+ @keyframes spin {
309
+ to { transform: rotate(360deg); }
310
+ }
311
+
312
+ .muted { color: var(--text-tertiary); }
313
+ .split { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3); }
314
+
315
+ /* Lists */
316
+ .list {
317
+ border: 1px solid var(--border-default);
318
+ border-radius: var(--radius-md);
319
+ background: var(--bg-base);
320
+ }
321
+ .list .item {
322
+ padding: 10px 12px;
323
+ border-bottom: 1px solid var(--border-subtle);
324
+ cursor: pointer;
325
+ transition: background var(--transition-fast);
326
+ }
327
+ .list .item:hover {
328
+ background: var(--bg-hover);
329
+ }
330
+ .list .item:last-child {
331
+ border-bottom: none;
332
+ }
333
+ .list .item button {
334
+ padding: 4px 10px;
335
+ font-size: 11px;
336
+ border-radius: var(--radius-sm);
337
+ }
338
+
339
+ .img-preview {
340
+ max-width: 100%;
341
+ border-radius: var(--radius-md);
342
+ border: 1px solid var(--border-default);
343
+ }
36
344
 
345
+ /* ============================================
346
+ Runtime Components
347
+ ============================================ */
37
348
  .runtime-list { display: flex; flex-direction: column; gap: 10px; }
38
- .runtime-item { display: flex; align-items: stretch; justify-content: space-between; gap: 12px; padding: 10px 12px; border: 1px solid #23262f; border-radius: 12px; background: rgba(255,255,255,0.02); }
349
+ .runtime-item { display: flex; align-items: stretch; justify-content: space-between; gap: 12px; padding: 10px 12px; border: 1px solid var(--border-default); border-radius: var(--radius-lg); background: var(--bg-overlay); }
39
350
  .runtime-head { display: flex; gap: 10px; min-width: 0; }
40
351
  .runtime-badge { width: 10px; border-radius: 8px; flex: 0 0 10px; opacity: 0.95; }
41
352
  .runtime-name { font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 520px; }
42
353
  .runtime-controls { display: flex; align-items: center; gap: 8px; flex-wrap: nowrap; }
43
- .runtime-controls input[type="color"] { width: 36px; height: 26px; padding: 0; border: 1px solid #23262f; background: transparent; border-radius: 6px; }
354
+ .runtime-controls input[type="color"] { width: 36px; height: 26px; padding: 0; border: 1px solid var(--border-default); background: transparent; border-radius: var(--radius-sm); }
44
355
 
45
- .xhs-nav-strip { border:1px solid #26437a; background:#0c1830; border-radius:10px; padding:10px; margin-bottom:10px; }
356
+ /* ============================================
357
+ Xiaohongshu Components
358
+ ============================================ */
359
+ .xhs-nav-strip { border:1px solid rgba(99, 102, 241, 0.3); background: var(--bg-overlay); border-radius: var(--radius-md); padding: 10px; margin-bottom: 10px; }
46
360
  .xhs-nav-actions { display:flex; gap:8px; flex-wrap:wrap; align-items:center; }
47
- .xhs-compact-card { border:1px solid #263147; border-radius:8px; padding:8px; background:#101a2a; }
48
- .xhs-account-list { max-height:230px; overflow:auto; border:1px solid #263147; border-radius:8px; }
49
- .xhs-account-row { display:flex; justify-content:space-between; gap:8px; border-bottom:1px solid #263147; padding:6px 8px; }
361
+ .xhs-compact-card { border:1px solid var(--border-default); border-radius: var(--radius-sm); padding:8px; background: var(--bg-elevated); }
362
+ .xhs-account-list { max-height:230px; overflow:auto; border:1px solid var(--border-default); border-radius: var(--radius-sm); }
363
+ .xhs-account-row { display:flex; justify-content:space-between; gap:8px; border-bottom:1px solid var(--border-subtle); padding:6px 8px; }
50
364
 
51
365
  .xhs-tile-lane {
52
366
  display: grid;
53
367
  grid-template-columns: repeat(12, minmax(0, 1fr));
54
- gap: 12px;
368
+ gap: var(--space-3);
55
369
  align-items: start;
56
370
  }
57
371
  .xhs-tile {
58
372
  grid-column: span 12;
59
- border: 1px solid #263147;
60
- border-radius: 12px;
61
- background: linear-gradient(180deg, #0f1729 0%, #101a2f 100%);
373
+ border: 1px solid var(--border-default);
374
+ border-radius: var(--radius-lg);
375
+ background: linear-gradient(180deg, var(--bg-overlay) 0%, var(--bg-elevated) 100%);
62
376
  box-shadow: inset 0 1px 0 rgba(148, 163, 184, 0.12);
63
377
  overflow: hidden;
378
+ transition: all var(--transition-base);
379
+ }
380
+ .xhs-tile:hover {
381
+ border-color: var(--border-strong);
64
382
  }
65
383
  .xhs-tile.active {
66
- border-color: #3b82f6;
384
+ border-color: var(--accent-primary);
67
385
  box-shadow:
68
- 0 0 0 1px rgba(59, 130, 246, 0.32),
69
- 0 12px 30px rgba(2, 6, 23, 0.35);
386
+ 0 0 0 1px rgba(99, 102, 241, 0.32),
387
+ 0 12px 30px rgba(2, 6, 23, 0.35),
388
+ var(--shadow-glow);
70
389
  }
71
390
  .xhs-tile-head {
72
391
  padding: 10px 12px;
73
- border-bottom: 1px solid #263147;
392
+ border-bottom: 1px solid var(--border-default);
74
393
  font-size: 13px;
75
394
  font-weight: 700;
76
- color: #dbeafe;
395
+ color: var(--text-primary);
396
+ display: flex;
397
+ align-items: center;
398
+ justify-content: space-between;
77
399
  }
78
400
  .xhs-tile-body {
79
401
  display: grid;
@@ -87,19 +409,24 @@
87
409
  align-items: start;
88
410
  }
89
411
  .xhs-bento-card {
90
- border: 1px solid #2a3959;
91
- border-radius: 10px;
92
- background: #0e182b;
412
+ border: 1px solid var(--border-default);
413
+ border-radius: var(--radius-md);
414
+ background: var(--bg-elevated);
93
415
  padding: 10px;
94
416
  min-width: 0;
417
+ transition: all var(--transition-fast);
418
+ }
419
+ .xhs-bento-card:hover {
420
+ border-color: var(--border-strong);
421
+ background: var(--bg-overlay);
95
422
  }
96
423
  .xhs-bento-card .row:last-child { margin-bottom: 0; }
97
424
  .xhs-bento-grid--tight { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
98
425
  .xhs-guide-grid {
99
426
  display: grid;
100
427
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
101
- gap: 8px;
102
- margin-bottom: 8px;
428
+ gap: var(--space-2);
429
+ margin-bottom: var(--space-2);
103
430
  }
104
431
  .xhs-guide-step {
105
432
  display: flex;
@@ -107,9 +434,14 @@
107
434
  gap: 6px;
108
435
  padding: 8px 10px;
109
436
  min-height: 44px;
110
- border-radius: 8px;
111
- border: 1px solid #1f2f4f;
112
- background: #0f1419;
437
+ border-radius: var(--radius-sm);
438
+ border: 1px solid var(--border-default);
439
+ background: var(--bg-base);
440
+ transition: all var(--transition-fast);
441
+ }
442
+ .xhs-guide-step:hover {
443
+ border-color: var(--accent-primary);
444
+ background: var(--bg-overlay);
113
445
  }
114
446
  .xhs-guide-step--full { grid-column: 1 / -1; }
115
447
 
@@ -125,6 +457,246 @@
125
457
  .xhs-tile--like { grid-column: span 6; }
126
458
  .xhs-tile--board { grid-column: span 12; }
127
459
  }
460
+
461
+ /* ============================================
462
+ Bento Grid System
463
+ ============================================ */
464
+ .bento-grid {
465
+ display: grid;
466
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
467
+ gap: var(--gap);
468
+ max-width: 1400px;
469
+ }
470
+
471
+ .bento-sidebar {
472
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
473
+ }
474
+
475
+ .bento-aside {
476
+ grid-template-columns: minmax(300px, 1fr) minmax(300px, 1fr);
477
+ }
478
+
479
+ .bento-4 {
480
+ grid-template-columns: repeat(4, minmax(150px, 1fr));
481
+ }
482
+
483
+ .bento-cell {
484
+ border: 1px solid var(--border-default);
485
+ border-radius: var(--radius-lg);
486
+ background: var(--bg-elevated);
487
+ padding: var(--gap);
488
+ box-shadow: var(--shadow-sm);
489
+ transition: all var(--transition-base);
490
+ }
491
+
492
+ .bento-cell:hover {
493
+ border-color: var(--border-strong);
494
+ }
495
+
496
+ .bento-cell.highlight {
497
+ border-color: var(--accent-primary);
498
+ background: linear-gradient(135deg, var(--bg-elevated) 0%, rgba(99, 102, 241, 0.05) 100%);
499
+ box-shadow: var(--shadow-sm), var(--shadow-glow);
500
+ }
501
+
502
+ .bento-title {
503
+ font-size: 13px;
504
+ font-weight: 700;
505
+ color: var(--text-primary);
506
+ margin-bottom: var(--gap-sm);
507
+ display: flex;
508
+ align-items: center;
509
+ gap: 8px;
510
+ }
511
+
512
+ /* ============================================
513
+ Stat Cards (Dashboard)
514
+ ============================================ */
515
+ .stat-card {
516
+ border-radius: var(--radius-lg);
517
+ padding: var(--space-4);
518
+ background: var(--bg-elevated);
519
+ border: 1px solid var(--border-default);
520
+ text-align: center;
521
+ transition: all var(--transition-fast);
522
+ }
523
+ .stat-card:hover {
524
+ transform: translateY(-2px);
525
+ box-shadow: var(--shadow-md);
526
+ }
527
+ .stat-card.info {
528
+ border-color: rgba(99, 102, 241, 0.3);
529
+ background: linear-gradient(135deg, var(--bg-elevated) 0%, rgba(99, 102, 241, 0.08) 100%);
530
+ }
531
+ .stat-card.success {
532
+ border-color: rgba(34, 197, 94, 0.3);
533
+ background: linear-gradient(135deg, var(--bg-elevated) 0%, rgba(34, 197, 94, 0.08) 100%);
534
+ }
535
+ .stat-card.danger {
536
+ border-color: rgba(239, 68, 68, 0.3);
537
+ background: linear-gradient(135deg, var(--bg-elevated) 0%, rgba(239, 68, 68, 0.08) 100%);
538
+ }
539
+ .stat-card.warning {
540
+ border-color: rgba(245, 158, 11, 0.3);
541
+ background: linear-gradient(135deg, var(--bg-elevated) 0%, rgba(245, 158, 11, 0.08) 100%);
542
+ }
543
+ .stat-value {
544
+ font-size: 28px;
545
+ font-weight: 700;
546
+ color: var(--text-primary);
547
+ font-family: var(--font-mono);
548
+ line-height: 1.2;
549
+ }
550
+ .stat-label {
551
+ font-size: 12px;
552
+ color: var(--text-tertiary);
553
+ margin-top: 4px;
554
+ text-transform: uppercase;
555
+ letter-spacing: 0.05em;
556
+ }
557
+
558
+ /* ============================================
559
+ Progress Bar
560
+ ============================================ */
561
+ .progress-bar-container {
562
+ height: 8px;
563
+ background: var(--bg-base);
564
+ border-radius: var(--radius-sm);
565
+ overflow: hidden;
566
+ }
567
+ .progress-bar {
568
+ height: 100%;
569
+ background: linear-gradient(90deg, var(--accent-primary) 0%, var(--accent-info) 100%);
570
+ border-radius: var(--radius-sm);
571
+ transition: width var(--transition-base);
572
+ }
573
+
574
+ /* ============================================
575
+ Log Container
576
+ ============================================ */
577
+ .log-container {
578
+ font-family: var(--font-mono);
579
+ font-size: 12px;
580
+ line-height: 1.6;
581
+ background: var(--bg-base);
582
+ border: 1px solid var(--border-default);
583
+ border-radius: var(--radius-md);
584
+ padding: var(--space-3);
585
+ overflow: auto;
586
+ }
587
+ .log-line {
588
+ padding: 2px 0;
589
+ white-space: pre-wrap;
590
+ word-break: break-all;
591
+ }
592
+ .log-time {
593
+ color: var(--text-tertiary);
594
+ }
595
+ .log-info { color: var(--text-primary); }
596
+ .log-success { color: var(--accent-success); }
597
+ .log-warn { color: var(--accent-warning); }
598
+ .log-error { color: var(--accent-danger); }
599
+
600
+ /* ============================================
601
+ Page Indicator
602
+ ============================================ */
603
+ .page-indicator {
604
+ font-size: 12px;
605
+ color: var(--text-tertiary);
606
+ margin-bottom: var(--space-3);
607
+ padding: var(--space-2) var(--space-3);
608
+ background: var(--bg-overlay);
609
+ border-radius: var(--radius-sm);
610
+ display: inline-flex;
611
+ align-items: center;
612
+ gap: 8px;
613
+ }
614
+ .page-indicator span {
615
+ color: var(--accent-primary);
616
+ font-weight: 500;
617
+ }
618
+
619
+ /* ============================================
620
+ Environment Status
621
+ ============================================ */
622
+ .env-status-grid {
623
+ display: flex;
624
+ flex-direction: column;
625
+ gap: var(--space-2);
626
+ }
627
+ .env-item {
628
+ display: flex;
629
+ align-items: center;
630
+ justify-content: space-between;
631
+ padding: var(--space-3);
632
+ background: var(--bg-base);
633
+ border-radius: var(--radius-sm);
634
+ border: 1px solid var(--border-subtle);
635
+ transition: all var(--transition-fast);
636
+ }
637
+ .env-item:hover {
638
+ border-color: var(--border-default);
639
+ background: var(--bg-hover);
640
+ }
641
+ .env-item .icon {
642
+ font-size: 14px;
643
+ }
644
+ .env-item .env-label {
645
+ font-size: 13px;
646
+ color: var(--text-primary);
647
+ }
648
+
649
+ /* ============================================
650
+ Button Group
651
+ ============================================ */
652
+ .btn-group {
653
+ display: flex;
654
+ gap: var(--space-2);
655
+ }
656
+
657
+ /* ============================================
658
+ Animations
659
+ ============================================ */
660
+ @keyframes fadeIn {
661
+ from { opacity: 0; transform: translateY(10px); }
662
+ to { opacity: 1; transform: translateY(0); }
663
+ }
664
+ @keyframes pulse {
665
+ 0%, 100% { opacity: 1; }
666
+ 50% { opacity: 0.5; }
667
+ }
668
+ @keyframes slideIn {
669
+ from { transform: translateX(-10px); opacity: 0; }
670
+ to { transform: translateX(0); opacity: 1; }
671
+ }
672
+
673
+ .animate-fade-in {
674
+ animation: fadeIn var(--transition-base) ease-out;
675
+ }
676
+ .animate-pulse {
677
+ animation: pulse 2s ease-in-out infinite;
678
+ }
679
+ .animate-slide-in {
680
+ animation: slideIn var(--transition-base) ease-out;
681
+ }
682
+
683
+ /* ============================================
684
+ Phase Indicator
685
+ ============================================ */
686
+ .phase-indicator {
687
+ padding: var(--space-3);
688
+ background: var(--bg-overlay);
689
+ border-radius: var(--radius-md);
690
+ border: 1px solid var(--border-subtle);
691
+ }
692
+
693
+ @media (prefers-reduced-motion: reduce) {
694
+ *, *::before, *::after {
695
+ animation: none !important;
696
+ transition: none !important;
697
+ scroll-behavior: auto !important;
698
+ }
699
+ }
128
700
  </style>
129
701
  </head>
130
702
  <body>