@agent-link/server 0.1.302 → 0.1.304

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 (22) hide show
  1. package/package.json +1 -1
  2. package/web/dist/assets/{cssMode-B2_6v8T2.js → cssMode-D9WAUUpo.js} +1 -1
  3. package/web/dist/assets/{editor.main-B1R1-qE_.js → editor.main-F3YyOFWi.js} +3 -3
  4. package/web/dist/assets/{freemarker2-BRK22ENa.js → freemarker2-fx-zAUwJ.js} +1 -1
  5. package/web/dist/assets/{handlebars-y7VxB2QG.js → handlebars-UNh84M5K.js} +1 -1
  6. package/web/dist/assets/{html-hlbXyl1x.js → html-Bg2uFyFu.js} +1 -1
  7. package/web/dist/assets/{htmlMode-DsqcDJBH.js → htmlMode-tOn2AdMq.js} +1 -1
  8. package/web/dist/assets/{index-CEzkBFyn.js → index-B1CXjQL3.js} +2 -2
  9. package/web/dist/assets/{javascript-BhXmVVca.js → javascript-Bklw5KMQ.js} +1 -1
  10. package/web/dist/assets/{jsonMode-Dscf1Dd1.js → jsonMode-CrP4A4Q8.js} +1 -1
  11. package/web/dist/assets/{liquid-C3IzT1ID.js → liquid-bqEyjPU0.js} +1 -1
  12. package/web/dist/assets/{lspLanguageFeatures-BswCNpbz.js → lspLanguageFeatures-D-fTyDOg.js} +1 -1
  13. package/web/dist/assets/{mdx-DQ74j0JV.js → mdx-DDLDJvE6.js} +1 -1
  14. package/web/dist/assets/{python-B8Kb7lFj.js → python-DleLrWgr.js} +1 -1
  15. package/web/dist/assets/{razor-C9hdZV_v.js → razor-BTaX0m9j.js} +1 -1
  16. package/web/dist/assets/{tsMode-CXnT3dOx.js → tsMode-Cm03KIG0.js} +1 -1
  17. package/web/dist/assets/{typescript-BxMmoCYy.js → typescript-CY9KIjc8.js} +1 -1
  18. package/web/dist/assets/{xml-DD8lgIZd.js → xml-BH2VJb5g.js} +1 -1
  19. package/web/dist/assets/{yaml-pbmxEf4r.js → yaml-KFIqq_w2.js} +1 -1
  20. package/web/dist/index.html +1 -1
  21. package/web/dist/landing.html +245 -848
  22. package/web/dist/landing.zh.html +258 -859
@@ -3,17 +3,17 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>AgenticWorker — Claude Code 开源版远程控制</title>
7
- <meta name="description" content="Claude Code 开源版远程控制。对话、多 Agent 协作、定时任务三大模式,手机或任何浏览器即可操控,端到端加密,无需注册。">
8
- <meta name="keywords" content="Claude Code, Claude Code开源版远程控制, 远程控制, 浏览器 IDE, AI 编程助手, AgenticWorker, 端到端加密, 自建部署, 移动编程, 多Agent协作, 定时任务">
6
+ <title>AgenticWorker — Claude Code 随时随地操控</title>
7
+ <meta name="description" content="Claude Code 随时随地操控。对话、多 Agent 协作、定时任务三大模式,手机或任何浏览器即可操控,端到端加密,无需注册。">
8
+ <meta name="keywords" content="Claude Code, Claude Code随时随地操控, 远程控制, 浏览器 IDE, AI 编程助手, AgenticWorker, 端到端加密, 自建部署, 移动编程, 多Agent协作, 定时任务">
9
9
  <link rel="canonical" href="https://msclaude.ai/zh">
10
10
  <link rel="alternate" hreflang="en" href="https://msclaude.ai/">
11
11
  <link rel="alternate" hreflang="zh" href="https://msclaude.ai/zh">
12
12
  <link rel="alternate" hreflang="x-default" href="https://msclaude.ai/">
13
13
  <!-- Open Graph -->
14
14
  <meta property="og:type" content="website">
15
- <meta property="og:title" content="AgenticWorker — Claude Code 开源版远程控制">
16
- <meta property="og:description" content="Claude Code 开源版远程控制。对话、多 Agent 协作、定时任务三大模式,手机或任何浏览器即可操控,端到端加密,无需注册。">
15
+ <meta property="og:title" content="AgenticWorker — Claude Code 随时随地操控">
16
+ <meta property="og:description" content="Claude Code 随时随地操控。对话、多 Agent 协作、定时任务三大模式,手机或任何浏览器即可操控,端到端加密,无需注册。">
17
17
  <meta property="og:url" content="https://msclaude.ai/zh">
18
18
  <meta property="og:image" content="https://msclaude.ai/iPad.png">
19
19
  <meta property="og:site_name" content="AgenticWorker">
@@ -21,8 +21,8 @@
21
21
  <meta property="og:locale:alternate" content="en_US">
22
22
  <!-- Twitter Card -->
23
23
  <meta name="twitter:card" content="summary_large_image">
24
- <meta name="twitter:title" content="AgenticWorker — Claude Code 开源版远程控制">
25
- <meta name="twitter:description" content="Claude Code 开源版远程控制。对话、多 Agent 协作、定时任务三大模式,手机或任何浏览器即可操控,端到端加密,无需注册。">
24
+ <meta name="twitter:title" content="AgenticWorker — Claude Code 随时随地操控">
25
+ <meta name="twitter:description" content="Claude Code 随时随地操控。对话、多 Agent 协作、定时任务三大模式,手机或任何浏览器即可操控,端到端加密,无需注册。">
26
26
  <meta name="twitter:image" content="https://msclaude.ai/iPad.png">
27
27
  <link rel="icon" type="image/svg+xml" href="/favicon.svg">
28
28
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
@@ -33,7 +33,7 @@
33
33
  "@context": "https://schema.org",
34
34
  "@type": "SoftwareApplication",
35
35
  "name": "AgenticWorker",
36
- "description": "Claude Code 开源版远程控制。对话、多 Agent 协作、定时任务三大模式,手机或任何浏览器即可操控,端到端加密,无需注册。",
36
+ "description": "Claude Code 随时随地操控。对话、多 Agent 协作、定时任务三大模式,手机或任何浏览器即可操控,端到端加密,无需注册。",
37
37
  "url": "https://msclaude.ai/zh",
38
38
  "applicationCategory": "DeveloperApplication",
39
39
  "operatingSystem": "Windows, macOS, Linux",
@@ -42,32 +42,19 @@
42
42
  }
43
43
  </script>
44
44
  <style>
45
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500&family=Noto+Sans+SC:wght@400;500;600;700;800;900&display=swap');
45
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&family=Noto+Sans+SC:wght@400;500;600;700&display=swap');
46
46
 
47
47
  * { margin: 0; padding: 0; box-sizing: border-box; }
48
48
 
49
- html {
50
- overflow-x: hidden;
51
- overscroll-behavior-x: none;
52
- }
53
-
54
49
  :root {
55
- --bg: #06080f;
56
- --surface: rgba(255,255,255,0.03);
57
- --surface-hover: rgba(255,255,255,0.06);
58
- --border: rgba(255,255,255,0.06);
59
- --border-hover: rgba(255,255,255,0.12);
60
- --text: #eaeaea;
61
- --text-dim: rgba(255,255,255,0.45);
62
- --text-mid: rgba(255,255,255,0.65);
63
- --accent: #3b82f6;
64
- --accent-soft: rgba(59,130,246,0.15);
65
- --accent-glow: rgba(59,130,246,0.4);
66
- --rose: #f43f5e;
67
- --amber: #f59e0b;
68
- --cyan: #22d3ee;
69
- --green: #34d399;
70
- --blue: #60a5fa;
50
+ --bg: #ffffff;
51
+ --surface: #f7f8fa;
52
+ --border: #e5e7eb;
53
+ --text: #1a1a1a;
54
+ --text-secondary: #6b7280;
55
+ --accent: #2563eb;
56
+ --accent-light: #eff4ff;
57
+ --code-bg: #1e293b;
71
58
  }
72
59
 
73
60
  body {
@@ -75,342 +62,170 @@
75
62
  background: var(--bg);
76
63
  color: var(--text);
77
64
  line-height: 1.6;
78
- min-height: 100vh;
79
- overflow-x: hidden;
80
- overscroll-behavior-x: none;
81
- position: relative;
82
- width: 100%;
83
- }
84
-
85
- /* ── Ambient Background ── */
86
- .ambient {
87
- position: fixed;
88
- top: 0;
89
- left: 0;
90
- width: 100%;
91
- height: 100%;
92
- pointer-events: none;
93
- z-index: 0;
94
- overflow: hidden;
95
- contain: strict;
96
- will-change: transform;
97
- }
98
-
99
- .ambient-orb {
100
- position: absolute;
101
- border-radius: 50%;
102
- filter: blur(120px);
103
- opacity: 0.35;
104
- animation: float 20s ease-in-out infinite;
105
- will-change: transform;
106
- contain: layout style;
107
- }
108
-
109
- .ambient-orb:nth-child(1) {
110
- width: 600px; height: 600px;
111
- background: radial-gradient(circle, var(--accent) 0%, transparent 70%);
112
- top: -10%; left: -5%;
113
- animation-delay: 0s;
114
- animation-duration: 25s;
115
- }
116
-
117
- .ambient-orb:nth-child(2) {
118
- width: 500px; height: 500px;
119
- background: radial-gradient(circle, var(--rose) 0%, transparent 70%);
120
- top: 20%; right: -10%;
121
- animation-delay: -8s;
122
- animation-duration: 22s;
123
- }
124
-
125
- .ambient-orb:nth-child(3) {
126
- width: 400px; height: 400px;
127
- background: radial-gradient(circle, var(--cyan) 0%, transparent 70%);
128
- bottom: 10%; left: 20%;
129
- animation-delay: -15s;
130
- animation-duration: 28s;
131
- }
132
-
133
- @keyframes float {
134
- 0%, 100% { transform: translate(0, 0) scale(1); }
135
- 25% { transform: translate(30px, -40px) scale(1.05); }
136
- 50% { transform: translate(-20px, 20px) scale(0.95); }
137
- 75% { transform: translate(40px, 10px) scale(1.02); }
138
- }
139
-
140
- /* ── Grain overlay ── */
141
- .grain {
142
- position: fixed;
143
- top: 0; left: 0;
144
- width: 100%; height: 100%;
145
- pointer-events: none;
146
- z-index: 1;
147
- opacity: 0.025;
148
- background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
149
- background-repeat: repeat;
150
- background-size: 256px 256px;
151
- will-change: transform;
152
- contain: strict;
153
- }
154
-
155
- /* ── Content wrapper ── */
156
- .content {
157
- position: relative;
158
- z-index: 2;
159
- overflow-x: hidden;
65
+ -webkit-font-smoothing: antialiased;
160
66
  }
161
67
 
162
- /* ── Nav ── */
68
+ /* -- Nav -- */
163
69
  nav {
164
70
  display: flex;
165
71
  align-items: center;
166
72
  justify-content: space-between;
167
- padding: 1.5rem 2.5rem;
168
- max-width: 1200px;
73
+ padding: 1.25rem 2rem;
74
+ max-width: 1080px;
169
75
  margin: 0 auto;
170
76
  }
171
77
 
172
78
  .logo {
173
- font-size: 1.2rem;
174
- font-weight: 700;
175
- letter-spacing: -0.03em;
176
79
  display: flex;
177
80
  align-items: center;
178
81
  gap: 0.5rem;
82
+ font-size: 1.1rem;
83
+ font-weight: 700;
84
+ color: var(--text);
85
+ letter-spacing: -0.02em;
179
86
  }
180
87
 
181
- .logo-mark {
182
- width: 28px; height: 28px;
183
- border-radius: 8px;
184
- box-shadow: 0 0 20px var(--accent-glow);
185
- }
186
-
187
- .logo-text span {
188
- background: linear-gradient(135deg, var(--accent), var(--rose));
189
- -webkit-background-clip: text;
190
- -webkit-text-fill-color: transparent;
191
- background-clip: text;
192
- }
88
+ .logo img { width: 26px; height: 26px; border-radius: 6px; }
193
89
 
194
90
  .nav-links {
195
91
  display: flex;
196
92
  align-items: center;
197
- gap: 2rem;
93
+ gap: 1.5rem;
198
94
  }
199
95
 
200
96
  .nav-links a {
201
- color: var(--text-dim);
97
+ color: var(--text-secondary);
202
98
  text-decoration: none;
203
- font-size: 0.85rem;
99
+ font-size: 0.875rem;
204
100
  font-weight: 500;
205
- transition: color 0.3s;
206
- letter-spacing: 0.02em;
207
101
  }
208
102
 
209
103
  .nav-links a:hover { color: var(--text); }
210
104
 
211
105
  .nav-gh {
212
- display: flex;
106
+ display: inline-flex;
213
107
  align-items: center;
214
- gap: 0.4rem;
215
- background: var(--surface);
108
+ gap: 0.35rem;
216
109
  border: 1px solid var(--border);
217
110
  border-radius: 8px;
218
- padding: 0.45rem 0.85rem;
219
- transition: all 0.3s;
220
- }
221
-
222
- .nav-gh:hover {
223
- background: var(--surface-hover);
224
- border-color: var(--border-hover);
111
+ padding: 0.4rem 0.75rem;
225
112
  }
226
113
 
227
114
  .nav-gh svg { width: 16px; height: 16px; fill: currentColor; }
228
115
 
229
116
  .nav-lang {
230
- font-size: 0.8rem;
231
- color: var(--text-dim);
232
- padding: 0.35rem 0.7rem;
233
117
  border: 1px solid var(--border);
234
118
  border-radius: 6px;
235
- transition: all 0.3s;
236
- }
237
-
238
- .nav-lang:hover {
239
- color: var(--text);
240
- border-color: var(--border-hover);
119
+ padding: 0.3rem 0.6rem;
120
+ font-size: 0.8rem;
241
121
  }
242
122
 
243
- /* ── Hero ── */
123
+ /* -- Hero -- */
244
124
  .hero {
245
125
  text-align: center;
246
- padding: 5rem 2rem 4rem;
247
- max-width: 900px;
126
+ padding: 5rem 2rem 3rem;
127
+ max-width: 720px;
248
128
  margin: 0 auto;
249
- position: relative;
250
129
  }
251
130
 
252
131
  .hero-badge {
253
132
  display: inline-flex;
254
133
  align-items: center;
255
134
  gap: 0.5rem;
256
- background: var(--accent-soft);
257
- border: 1px solid rgba(59,130,246,0.2);
135
+ background: var(--accent-light);
136
+ border: 1px solid #dbeafe;
258
137
  border-radius: 100px;
259
- padding: 0.4rem 1rem 0.4rem 0.5rem;
138
+ padding: 0.35rem 1rem;
260
139
  font-size: 0.8rem;
261
140
  color: var(--accent);
262
141
  font-weight: 500;
263
- margin-bottom: 2.5rem;
264
- letter-spacing: 0.01em;
265
- animation: fadeInUp 0.8s ease-out;
142
+ margin-bottom: 2rem;
266
143
  }
267
144
 
268
145
  .hero-badge-dot {
269
- width: 8px; height: 8px;
146
+ width: 7px; height: 7px;
270
147
  border-radius: 50%;
271
- background: var(--green);
272
- box-shadow: 0 0 8px var(--green);
273
- animation: pulse 2s ease-in-out infinite;
274
- }
275
-
276
- @keyframes pulse {
277
- 0%, 100% { opacity: 1; transform: scale(1); }
278
- 50% { opacity: 0.6; transform: scale(0.85); }
148
+ background: #22c55e;
279
149
  }
280
150
 
281
151
  .hero h1 {
282
- font-size: clamp(2.8rem, 6vw, 4.5rem);
283
- font-weight: 800;
284
- letter-spacing: -0.04em;
285
- line-height: 1.2;
286
- margin-bottom: 1.75rem;
287
- animation: fadeInUp 0.8s ease-out 0.1s both;
288
- }
289
-
290
- .hero h1 .line {
291
- display: block;
152
+ font-size: clamp(2.4rem, 5vw, 3.5rem);
153
+ font-weight: 700;
154
+ letter-spacing: -0.03em;
155
+ line-height: 1.15;
156
+ margin-bottom: 1.5rem;
157
+ color: var(--text);
292
158
  }
293
159
 
294
160
  .hero h1 em {
295
161
  font-style: normal;
296
- position: relative;
297
- background: linear-gradient(135deg, var(--accent), #60a5fa, var(--rose));
298
- background-size: 200% 200%;
299
- -webkit-background-clip: text;
300
- -webkit-text-fill-color: transparent;
301
- background-clip: text;
302
- animation: shimmer 6s ease-in-out infinite;
303
- }
304
-
305
- @keyframes shimmer {
306
- 0%, 100% { background-position: 0% 50%; }
307
- 50% { background-position: 100% 50%; }
308
- }
309
-
310
- .hero-sub {
311
- font-size: 1.2rem;
312
- color: var(--text-mid);
313
- max-width: 600px;
314
- margin: 0 auto 3rem;
315
- font-weight: 400;
316
- line-height: 1.8;
317
- animation: fadeInUp 0.8s ease-out 0.2s both;
318
- }
319
-
320
- .hero-sub strong {
321
- color: var(--text);
322
- font-weight: 500;
323
- }
324
-
325
- @keyframes fadeInUp {
326
- from { opacity: 0; transform: translateY(20px); }
327
- to { opacity: 1; transform: translateY(0); }
162
+ color: var(--accent);
328
163
  }
329
164
 
330
- /* ── CTA Group ── */
165
+ /* -- CTA -- */
331
166
  .cta-group {
332
167
  display: flex;
333
168
  align-items: center;
334
169
  justify-content: center;
335
- gap: 1rem;
336
- margin-bottom: 1.5rem;
337
- animation: fadeInUp 0.8s ease-out 0.3s both;
170
+ gap: 0.75rem;
171
+ margin-bottom: 2rem;
338
172
  }
339
173
 
340
174
  .cta-primary {
341
175
  display: inline-flex;
342
176
  align-items: center;
343
- gap: 0.5rem;
344
- background: linear-gradient(135deg, var(--accent), #60a5fa);
177
+ gap: 0.4rem;
178
+ background: var(--accent);
345
179
  color: #fff;
346
180
  font-weight: 600;
347
- font-size: 0.95rem;
348
- padding: 0.8rem 1.75rem;
349
- border-radius: 12px;
350
- text-decoration: none;
351
- transition: all 0.3s;
352
- box-shadow: 0 0 30px rgba(59,130,246,0.3), 0 4px 15px rgba(0,0,0,0.3);
181
+ font-size: 0.9rem;
182
+ padding: 0.7rem 1.5rem;
183
+ border-radius: 10px;
353
184
  border: none;
354
185
  cursor: pointer;
355
186
  font-family: inherit;
356
187
  }
357
188
 
358
- .cta-primary:hover {
359
- transform: translateY(-2px);
360
- box-shadow: 0 0 40px rgba(59,130,246,0.45), 0 8px 25px rgba(0,0,0,0.4);
361
- }
189
+ .cta-primary:hover { background: #1d4ed8; }
362
190
 
363
191
  .cta-secondary {
364
192
  display: inline-flex;
365
193
  align-items: center;
366
- gap: 0.5rem;
367
- background: var(--surface);
194
+ gap: 0.4rem;
195
+ background: var(--bg);
368
196
  border: 1px solid var(--border);
369
197
  color: var(--text);
370
198
  font-weight: 500;
371
- font-size: 0.95rem;
372
- padding: 0.8rem 1.75rem;
373
- border-radius: 12px;
199
+ font-size: 0.9rem;
200
+ padding: 0.7rem 1.5rem;
201
+ border-radius: 10px;
374
202
  text-decoration: none;
375
- transition: all 0.3s;
376
203
  cursor: pointer;
377
204
  font-family: inherit;
378
205
  }
379
206
 
380
- .cta-secondary:hover {
381
- background: var(--surface-hover);
382
- border-color: var(--border-hover);
383
- transform: translateY(-2px);
384
- }
385
-
386
- .cta-secondary svg { width: 18px; height: 18px; fill: currentColor; }
207
+ .cta-secondary:hover { background: var(--surface); }
208
+ .cta-secondary svg { width: 16px; height: 16px; fill: currentColor; }
387
209
 
388
- /* ── Terminal Install ── */
210
+ /* -- Terminal -- */
389
211
  .terminal {
390
- max-width: 520px;
212
+ max-width: 500px;
391
213
  margin: 0 auto;
392
- background: rgba(10,10,20,0.92);
393
- border: 1px solid var(--border);
394
- border-radius: 14px;
214
+ background: var(--code-bg);
215
+ border-radius: 12px;
395
216
  overflow: hidden;
396
- animation: fadeInUp 0.8s ease-out 0.4s both;
397
- box-shadow: 0 20px 60px rgba(0,0,0,0.4);
217
+ box-shadow: 0 4px 24px rgba(0,0,0,0.08);
398
218
  }
399
219
 
400
220
  .terminal-bar {
401
221
  display: flex;
402
222
  align-items: center;
403
223
  gap: 6px;
404
- padding: 0.75rem 1rem;
405
- background: rgba(255,255,255,0.03);
406
- border-bottom: 1px solid var(--border);
407
- }
408
-
409
- .terminal-dot {
410
- width: 10px; height: 10px;
411
- border-radius: 50%;
224
+ padding: 0.7rem 1rem;
225
+ background: rgba(255,255,255,0.06);
412
226
  }
413
227
 
228
+ .terminal-dot { width: 10px; height: 10px; border-radius: 50%; }
414
229
  .terminal-dot:nth-child(1) { background: #ff5f57; }
415
230
  .terminal-dot:nth-child(2) { background: #ffbd2e; }
416
231
  .terminal-dot:nth-child(3) { background: #28c840; }
@@ -418,17 +233,17 @@
418
233
  .terminal-title {
419
234
  flex: 1;
420
235
  text-align: center;
421
- font-size: 0.72rem;
422
- color: var(--text-dim);
236
+ font-size: 0.7rem;
237
+ color: rgba(255,255,255,0.4);
423
238
  font-weight: 500;
424
- letter-spacing: 0.03em;
425
239
  }
426
240
 
427
241
  .terminal-body {
428
- padding: 1.25rem 1.5rem;
429
- font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace;
430
- font-size: 0.85rem;
242
+ padding: 1rem 1.25rem;
243
+ font-family: 'JetBrains Mono', monospace;
244
+ font-size: 0.82rem;
431
245
  line-height: 1.8;
246
+ color: #e2e8f0;
432
247
  }
433
248
 
434
249
  .terminal-line {
@@ -436,35 +251,31 @@
436
251
  align-items: center;
437
252
  gap: 0.5rem;
438
253
  cursor: pointer;
439
- padding: 0.15rem 0.35rem;
440
- margin: 0 -0.35rem;
441
- border-radius: 6px;
442
- transition: background 0.2s;
254
+ padding: 0.1rem 0.3rem;
255
+ margin: 0 -0.3rem;
256
+ border-radius: 4px;
443
257
  }
444
258
 
445
- .terminal-line:hover { background: rgba(255,255,255,0.04); }
259
+ .terminal-line:hover { background: rgba(255,255,255,0.05); }
446
260
 
447
- .terminal-prompt { color: var(--accent); user-select: none; }
448
- .terminal-cmd { color: var(--green); }
261
+ .terminal-prompt { color: #60a5fa; user-select: none; }
262
+ .terminal-cmd { color: #86efac; }
449
263
 
450
264
  .terminal-output {
451
- color: var(--text-dim);
452
- font-size: 0.8rem;
453
- padding-left: 1.1rem;
454
- margin-top: 0.15rem;
265
+ color: rgba(255,255,255,0.45);
266
+ font-size: 0.78rem;
267
+ padding-left: 1rem;
268
+ margin-top: 0.1rem;
455
269
  }
456
270
 
457
- .terminal-output a {
458
- color: var(--cyan);
459
- text-decoration: none;
460
- }
271
+ .terminal-output a { color: #67e8f9; text-decoration: none; }
461
272
 
462
273
  .terminal-copy-toast {
463
274
  position: fixed;
464
275
  bottom: 2rem;
465
276
  left: 50%;
466
277
  transform: translateX(-50%) translateY(20px);
467
- background: var(--accent);
278
+ background: var(--text);
468
279
  color: #fff;
469
280
  padding: 0.5rem 1.25rem;
470
281
  border-radius: 8px;
@@ -482,120 +293,38 @@
482
293
  transform: translateX(-50%) translateY(0);
483
294
  }
484
295
 
485
- /* ── Showcase ── */
296
+ /* -- Showcase -- */
486
297
  .showcase {
487
- max-width: 1000px;
488
- margin: 6rem auto 0;
298
+ max-width: 960px;
299
+ margin: 4rem auto 0;
489
300
  padding: 0 2rem;
490
- position: relative;
491
301
  display: grid;
492
302
  grid-template-columns: 5fr 2fr;
493
303
  align-items: end;
494
- gap: 2rem;
495
- animation: fadeInUp 1s ease-out 0.6s both;
496
- overflow: hidden;
497
- }
498
-
499
- .showcase::before {
500
- content: '';
501
- position: absolute;
502
- top: 50%;
503
- left: 50%;
504
- transform: translate(-50%, -50%);
505
- width: 100%;
506
- height: 100%;
507
- background:
508
- radial-gradient(ellipse at 35% 50%, rgba(59,130,246,0.12) 0%, transparent 55%),
509
- radial-gradient(ellipse at 65% 50%, rgba(245,158,11,0.08) 0%, transparent 55%);
510
- pointer-events: none;
511
- z-index: 0;
512
- filter: blur(60px);
513
- will-change: transform;
514
- }
515
-
516
- .showcase::after {
517
- content: '';
518
- position: absolute;
519
- top: 50%;
520
- left: 50%;
521
- transform: translate(-50%, -50%);
522
- width: 1px;
523
- height: 35%;
524
- background: linear-gradient(180deg, transparent, rgba(59,130,246,0.2), rgba(245,158,11,0.2), transparent);
525
- pointer-events: none;
526
- z-index: 0;
527
- }
528
-
529
- .device {
530
- position: relative;
531
- transition: transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94);
532
- }
533
-
534
- .device:hover {
535
- transform: translateY(-8px);
536
- }
537
-
538
- .device img, .device picture { display: block; width: 100%; height: auto; }
539
-
540
- .device-ipad {
541
- width: 100%;
542
- z-index: 1;
543
- transform: rotate(-1deg);
544
- }
545
-
546
- .device-ipad:hover {
547
- transform: rotate(-1deg) translateY(-8px);
548
- }
549
-
550
- .device-ipad img {
551
- border-radius: 0;
552
- box-shadow: none;
553
- }
554
-
555
- .device-iphone {
556
- width: 90%;
557
- z-index: 2;
558
- justify-self: center;
559
- align-self: center;
560
- transform: rotate(2deg);
304
+ gap: 1.5rem;
561
305
  }
562
306
 
563
- .device-iphone:hover {
564
- transform: rotate(2deg) translateY(-8px);
565
- }
307
+ .device img { display: block; width: 100%; height: auto; }
566
308
 
567
- .device-iphone img {
568
- border-radius: 12%;
569
- box-shadow:
570
- 0 45px 100px rgba(0,0,0,0.55),
571
- 0 15px 50px rgba(0,0,0,0.35),
572
- 0 0 80px rgba(245,158,11,0.08);
573
- }
309
+ .device-ipad { z-index: 1; }
574
310
 
575
- /* ── iPad Carousel ── */
576
311
  .ipad-carousel {
577
312
  position: relative;
578
313
  width: 100%;
579
314
  overflow: hidden;
580
315
  border-radius: 4.2%;
581
- box-shadow:
582
- 0 40px 100px rgba(0,0,0,0.5),
583
- 0 15px 50px rgba(0,0,0,0.3),
584
- 0 0 80px rgba(59,130,246,0.08);
316
+ box-shadow: 0 8px 40px rgba(0,0,0,0.1);
317
+ border: 1px solid var(--border);
585
318
  }
586
319
 
587
- .carousel-track {
588
- position: relative;
589
- width: 100%;
590
- }
320
+ .carousel-track { position: relative; width: 100%; }
591
321
 
592
322
  .carousel-slide {
593
323
  position: absolute;
594
- top: 0;
595
- left: 0;
324
+ top: 0; left: 0;
596
325
  width: 100%;
597
326
  opacity: 0;
598
- transition: opacity 0.6s ease;
327
+ transition: opacity 0.5s ease;
599
328
  pointer-events: none;
600
329
  }
601
330
 
@@ -605,469 +334,223 @@
605
334
  pointer-events: auto;
606
335
  }
607
336
 
608
- .carousel-slide img {
609
- display: block;
610
- width: 100%;
611
- height: auto;
612
- border-radius: 0;
613
- box-shadow: none;
614
- }
337
+ .carousel-slide img { display: block; width: 100%; height: auto; }
615
338
 
616
339
  .carousel-dots {
617
340
  position: absolute;
618
- bottom: 12px;
341
+ bottom: 10px;
619
342
  left: 50%;
620
343
  transform: translateX(-50%);
621
344
  display: flex;
622
- gap: 8px;
345
+ gap: 6px;
623
346
  z-index: 5;
624
347
  }
625
348
 
626
349
  .carousel-dot {
627
- width: 8px;
628
- height: 8px;
350
+ width: 7px; height: 7px;
629
351
  border-radius: 50%;
630
352
  border: none;
631
- background: rgba(255,255,255,0.4);
353
+ background: rgba(255,255,255,0.45);
632
354
  cursor: pointer;
633
355
  padding: 0;
634
- transition: background 0.3s ease, transform 0.3s ease;
635
- }
636
-
637
- .carousel-dot.active {
638
- background: rgba(255,255,255,0.9);
639
- transform: scale(1.2);
640
356
  }
641
357
 
642
- .carousel-dot:hover {
643
- background: rgba(255,255,255,0.7);
644
- }
358
+ .carousel-dot.active { background: rgba(255,255,255,0.9); }
645
359
 
646
360
  .carousel-label {
647
361
  position: absolute;
648
- top: 16px;
649
- left: 16px;
362
+ top: 12px; left: 12px;
650
363
  display: flex;
651
364
  flex-direction: column;
652
- gap: 2px;
653
- background: rgba(0,0,0,0.75);
654
- padding: 8px 14px;
655
- border-radius: 10px;
365
+ gap: 1px;
366
+ background: rgba(0,0,0,0.65);
367
+ padding: 6px 12px;
368
+ border-radius: 8px;
656
369
  z-index: 4;
657
370
  pointer-events: none;
658
371
  }
659
372
 
660
- .carousel-label-title {
661
- font-size: 0.95rem;
662
- font-weight: 700;
663
- color: #fff;
664
- letter-spacing: 0.02em;
373
+ .carousel-label-title { font-size: 0.85rem; font-weight: 700; color: #fff; }
374
+ .carousel-label-desc { font-size: 0.65rem; color: rgba(255,255,255,0.7); }
375
+
376
+ .device-iphone {
377
+ width: 90%;
378
+ z-index: 2;
379
+ justify-self: center;
380
+ align-self: center;
665
381
  }
666
382
 
667
- .carousel-label-desc {
668
- font-size: 0.72rem;
669
- color: rgba(255,255,255,0.75);
670
- font-weight: 400;
383
+ .device-iphone img {
384
+ border-radius: 12%;
385
+ box-shadow: 0 8px 40px rgba(0,0,0,0.12);
671
386
  }
672
387
 
673
- /* ── Divider ── */
674
- .section-divider {
675
- max-width: 200px;
676
- margin: 6rem auto;
388
+ /* -- Divider -- */
389
+ .divider {
390
+ max-width: 80px;
391
+ margin: 5rem auto;
677
392
  height: 1px;
678
- background: linear-gradient(90deg, transparent, var(--border-hover), transparent);
393
+ background: var(--border);
679
394
  }
680
395
 
681
- /* ── Bento Grid ── */
682
- .bento {
683
- max-width: 1000px;
684
- margin: 6rem auto;
396
+ /* -- Features -- */
397
+ .features {
398
+ max-width: 960px;
399
+ margin: 0 auto;
685
400
  padding: 0 2rem;
686
401
  display: grid;
687
402
  grid-template-columns: repeat(3, 1fr);
688
- grid-auto-rows: minmax(200px, auto);
689
- gap: 1rem;
403
+ gap: 1.5rem;
690
404
  }
691
405
 
692
- .bento-card {
406
+ .feature-card {
693
407
  background: var(--surface);
694
408
  border: 1px solid var(--border);
695
- border-radius: 20px;
696
- padding: 2rem;
697
- position: relative;
698
- overflow: hidden;
699
- transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
700
- display: flex;
701
- flex-direction: column;
702
- justify-content: flex-end;
703
- }
704
-
705
- .bento-card:hover {
706
- border-color: var(--border-hover);
707
- background: var(--surface-hover);
708
- transform: translateY(-4px);
709
- box-shadow: 0 20px 60px rgba(0,0,0,0.3);
409
+ border-radius: 14px;
410
+ padding: 1.75rem;
710
411
  }
711
412
 
712
- .bento-card.wide { grid-column: span 2; }
713
- .bento-card.tall { grid-row: span 2; }
413
+ .feature-card.wide { grid-column: span 2; }
714
414
 
715
- .bento-visual {
716
- flex: 1;
717
- display: flex;
718
- align-items: center;
719
- justify-content: center;
720
- margin-bottom: 1.5rem;
721
- position: relative;
722
- }
723
-
724
- .bento-icon {
725
- width: 56px; height: 56px;
726
- border-radius: 16px;
415
+ .feature-icon {
416
+ width: 40px; height: 40px;
417
+ border-radius: 10px;
727
418
  display: flex;
728
419
  align-items: center;
729
420
  justify-content: center;
730
- font-size: 1.5rem;
421
+ margin-bottom: 1rem;
422
+ background: var(--accent-light);
423
+ color: var(--accent);
731
424
  }
732
425
 
733
- .bento-icon.purple { background: linear-gradient(135deg, rgba(59,130,246,0.2), rgba(59,130,246,0.05)); color: var(--accent); }
734
- .bento-icon.rose { background: linear-gradient(135deg, rgba(244,63,94,0.2), rgba(244,63,94,0.05)); color: var(--rose); }
735
- .bento-icon.cyan { background: linear-gradient(135deg, rgba(34,211,238,0.2), rgba(34,211,238,0.05)); color: var(--cyan); }
736
- .bento-icon.green { background: linear-gradient(135deg, rgba(52,211,153,0.2), rgba(52,211,153,0.05)); color: var(--green); }
737
- .bento-icon.amber { background: linear-gradient(135deg, rgba(245,158,11,0.2), rgba(245,158,11,0.05)); color: var(--amber); }
738
- .bento-icon.blue { background: linear-gradient(135deg, rgba(96,165,250,0.2), rgba(96,165,250,0.05)); color: var(--blue); }
426
+ .feature-icon svg { width: 20px; height: 20px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
739
427
 
740
- /* Mode toggle visual */
741
- .mode-toggle {
742
- display: flex;
743
- gap: 0;
744
- background: rgba(255,255,255,0.04);
745
- border: 1px solid var(--border);
746
- border-radius: 12px;
747
- overflow: hidden;
748
- }
428
+ .feature-icon.green { background: #f0fdf4; color: #16a34a; }
429
+ .feature-icon.cyan { background: #ecfeff; color: #0891b2; }
430
+ .feature-icon.amber { background: #fffbeb; color: #d97706; }
749
431
 
750
- .mode-toggle-item {
751
- flex: 1;
752
- text-align: center;
753
- padding: 0.7rem 1rem;
754
- position: relative;
755
- transition: all 0.3s;
432
+ .feature-card h3 {
433
+ font-size: 0.95rem;
434
+ font-weight: 600;
435
+ margin-bottom: 0.3rem;
756
436
  }
757
437
 
758
- .mode-toggle-item:not(:last-child) {
759
- border-right: 1px solid var(--border);
438
+ .feature-card p {
439
+ font-size: 0.85rem;
440
+ color: var(--text-secondary);
441
+ line-height: 1.55;
760
442
  }
761
443
 
762
- .mode-toggle-item.active {
763
- background: rgba(59,130,246,0.12);
444
+ /* Mode visual for wide card */
445
+ .mode-pills {
446
+ display: flex;
447
+ gap: 0.5rem;
448
+ margin-bottom: 1rem;
764
449
  }
765
450
 
766
- .mode-toggle-item .mode-icon {
767
- width: 32px; height: 32px;
768
- margin: 0 auto 0.4rem;
769
- border-radius: 8px;
451
+ .mode-pill {
770
452
  display: flex;
771
453
  align-items: center;
772
- justify-content: center;
773
- }
774
-
775
- .mode-toggle-item .mode-icon svg { width: 18px; height: 18px; }
776
-
777
- .mode-toggle-item .mode-icon.chat-icon { background: rgba(59,130,246,0.15); color: var(--accent); }
778
- .mode-toggle-item .mode-icon.team-icon { background: rgba(96,165,250,0.15); color: var(--blue); }
779
- .mode-toggle-item .mode-icon.loop-icon { background: rgba(52,211,153,0.15); color: var(--green); }
780
-
781
- .mode-toggle-item .mode-name {
782
- font-size: 0.8rem;
783
- font-weight: 600;
784
- margin-bottom: 0.2rem;
454
+ gap: 0.35rem;
455
+ padding: 0.4rem 0.75rem;
456
+ border-radius: 8px;
457
+ font-size: 0.78rem;
458
+ font-weight: 500;
459
+ background: #fff;
460
+ border: 1px solid var(--border);
785
461
  color: var(--text);
786
462
  }
787
463
 
788
- .mode-toggle-item .mode-desc {
789
- font-size: 0.68rem;
790
- color: var(--text-dim);
791
- line-height: 1.4;
792
- }
464
+ .mode-pill svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 2; }
465
+ .mode-pill.active { background: var(--accent-light); border-color: #bfdbfe; color: var(--accent); }
793
466
 
794
- /* Encryption visual */
467
+ /* Encrypt visual */
795
468
  .encrypt-visual {
796
469
  display: flex;
797
470
  align-items: center;
798
- gap: 0.75rem;
471
+ gap: 0.5rem;
799
472
  font-family: 'JetBrains Mono', monospace;
800
473
  font-size: 0.72rem;
801
- color: var(--text-dim);
474
+ color: var(--text-secondary);
475
+ margin-bottom: 1rem;
802
476
  }
803
477
 
804
478
  .encrypt-block {
805
- padding: 0.4rem 0.7rem;
806
- border-radius: 8px;
807
- background: rgba(255,255,255,0.04);
808
- border: 1px solid var(--border);
809
- white-space: nowrap;
810
- }
811
-
812
- .encrypt-arrow { color: var(--accent); font-size: 1rem; }
813
-
814
- .encrypt-block.locked {
815
- color: var(--green);
816
- border-color: rgba(52,211,153,0.2);
817
- background: rgba(52,211,153,0.05);
818
- }
819
-
820
- /* Device flow visual */
821
- .device-flow {
822
- display: flex;
823
- align-items: center;
824
- gap: 1rem;
825
- }
826
-
827
- .device-pill {
828
- display: flex;
829
- align-items: center;
830
- gap: 0.4rem;
831
- padding: 0.5rem 0.8rem;
832
- border-radius: 10px;
833
- background: rgba(255,255,255,0.04);
834
- border: 1px solid var(--border);
835
- font-size: 0.75rem;
836
- color: var(--text-mid);
837
- }
838
-
839
- .device-pill svg { width: 14px; height: 14px; fill: currentColor; opacity: 0.6; }
840
-
841
- .flow-line {
842
- flex: 1;
843
- height: 1px;
844
- background: linear-gradient(90deg, var(--border-hover), transparent);
845
- position: relative;
846
- }
847
-
848
- .flow-line::after {
849
- content: '';
850
- position: absolute;
851
- right: 0; top: -2px;
852
- width: 5px; height: 5px;
853
- border-radius: 50%;
854
- background: var(--accent);
855
- box-shadow: 0 0 8px var(--accent-glow);
856
- animation: flowPulse 2s ease-in-out infinite;
857
- }
858
-
859
- @keyframes flowPulse {
860
- 0%, 100% { opacity: 0.4; }
861
- 50% { opacity: 1; }
862
- }
863
-
864
- .bento-card h3 {
865
- font-size: 1.05rem;
866
- font-weight: 600;
867
- margin-bottom: 0.4rem;
868
- letter-spacing: -0.01em;
869
- }
870
-
871
- .bento-card p {
872
- font-size: 0.85rem;
873
- color: var(--text-dim);
874
- line-height: 1.65;
875
- }
876
-
877
- /* ── How It Works ── */
878
- .workflow {
879
- max-width: 700px;
880
- margin: 0 auto 6rem;
881
- padding: 0 2rem;
882
- }
883
-
884
- .workflow-label {
885
- font-size: 0.7rem;
886
- font-weight: 600;
887
- letter-spacing: 0.15em;
888
- text-transform: uppercase;
889
- color: var(--accent);
890
- text-align: center;
891
- margin-bottom: 1.5rem;
892
- }
893
-
894
- .workflow h2 {
895
- font-size: clamp(1.6rem, 3.5vw, 2.2rem);
896
- font-weight: 700;
897
- text-align: center;
898
- letter-spacing: -0.03em;
899
- margin-bottom: 3rem;
900
- }
901
-
902
- .workflow-steps {
903
- position: relative;
904
- display: flex;
905
- flex-direction: column;
906
- gap: 0;
907
- }
908
-
909
- .workflow-steps::before {
910
- content: '';
911
- position: absolute;
912
- left: 23px;
913
- top: 48px;
914
- bottom: 48px;
915
- width: 1px;
916
- background: linear-gradient(180deg, var(--accent), var(--cyan), var(--green));
917
- opacity: 0.3;
918
- }
919
-
920
- .workflow-step {
921
- display: flex;
922
- align-items: flex-start;
923
- gap: 1.5rem;
924
- padding: 1.5rem 0;
925
- position: relative;
926
- }
927
-
928
- .step-marker {
929
- width: 48px; height: 48px;
930
- border-radius: 14px;
931
- display: flex;
932
- align-items: center;
933
- justify-content: center;
934
- flex-shrink: 0;
935
- font-size: 1.1rem;
936
- background: var(--surface);
479
+ padding: 0.3rem 0.6rem;
480
+ border-radius: 6px;
481
+ background: #fff;
937
482
  border: 1px solid var(--border);
938
- position: relative;
939
- z-index: 1;
940
- }
941
-
942
- .workflow-step:nth-child(1) .step-marker { border-color: rgba(59,130,246,0.3); }
943
- .workflow-step:nth-child(2) .step-marker { border-color: rgba(34,211,238,0.3); }
944
- .workflow-step:nth-child(3) .step-marker { border-color: rgba(52,211,153,0.3); }
945
-
946
- .step-content h3 {
947
- font-size: 1rem;
948
- font-weight: 600;
949
- margin-bottom: 0.35rem;
950
- letter-spacing: -0.01em;
951
483
  }
952
484
 
953
- .step-content p {
954
- font-size: 0.88rem;
955
- color: var(--text-dim);
956
- line-height: 1.7;
957
- }
485
+ .encrypt-arrow { color: var(--accent); }
486
+ .encrypt-block.locked { color: #16a34a; border-color: #bbf7d0; background: #f0fdf4; }
958
487
 
959
- .step-content code {
960
- font-family: 'JetBrains Mono', monospace;
961
- font-size: 0.8rem;
962
- color: var(--green);
963
- background: rgba(52,211,153,0.08);
964
- padding: 0.15rem 0.45rem;
965
- border-radius: 5px;
966
- border: 1px solid rgba(52,211,153,0.12);
967
- }
968
-
969
- /* ── Footer ── */
488
+ /* -- Footer -- */
970
489
  footer {
971
490
  text-align: center;
972
491
  padding: 3rem 2rem;
973
- color: var(--text-dim);
492
+ color: var(--text-secondary);
974
493
  font-size: 0.8rem;
975
- position: relative;
976
- }
977
-
978
- footer::before {
979
- content: '';
980
- display: block;
981
- max-width: 200px;
982
- margin: 0 auto 2rem;
983
- height: 1px;
984
- background: linear-gradient(90deg, transparent, var(--border-hover), transparent);
494
+ border-top: 1px solid var(--border);
495
+ margin-top: 5rem;
985
496
  }
986
497
 
987
- footer a {
988
- color: var(--text-mid);
989
- text-decoration: none;
990
- transition: color 0.3s;
991
- }
992
-
993
- footer a:hover { color: var(--text); }
994
-
995
498
  .footer-links {
996
499
  display: flex;
997
500
  align-items: center;
998
501
  justify-content: center;
999
502
  gap: 1.5rem;
1000
- margin-bottom: 1rem;
503
+ margin-bottom: 0.75rem;
1001
504
  }
1002
505
 
1003
- .footer-brand {
1004
- font-weight: 600;
1005
- letter-spacing: -0.02em;
506
+ .footer-brand { font-weight: 600; color: var(--text); }
507
+
508
+ footer a {
509
+ color: var(--text-secondary);
510
+ text-decoration: none;
1006
511
  }
1007
512
 
1008
- /* ── Responsive ── */
513
+ footer a:hover { color: var(--text); }
514
+
515
+ /* -- Responsive -- */
1009
516
  @media (max-width: 768px) {
1010
- .bento {
1011
- grid-template-columns: 1fr;
1012
- }
1013
- .bento-card.wide { grid-column: span 1; }
1014
- .bento-card.tall { grid-row: span 1; }
1015
- .hero { padding: 5rem 1.5rem 3rem; }
517
+ .features { grid-template-columns: 1fr; }
518
+ .feature-card.wide { grid-column: span 1; }
519
+ .hero { padding: 4rem 1.5rem 2rem; }
1016
520
  .cta-group { flex-direction: column; }
1017
- .nav-links { gap: 1rem; }
521
+ .nav-links { gap: 0.75rem; }
1018
522
  .nav-links a:not(.nav-gh):not(.nav-lang) { display: none; }
1019
- .encrypt-visual { flex-wrap: wrap; justify-content: center; gap: 0.5rem; }
523
+ .encrypt-visual { flex-wrap: wrap; justify-content: flex-start; gap: 0.4rem; }
1020
524
  .encrypt-visual .encrypt-arrow { display: none; }
1021
- .encrypt-block { font-size: 0.65rem; }
1022
- .device-flow { flex-wrap: wrap; justify-content: center; gap: 0.6rem; }
1023
- .device-flow .flow-line { display: none; }
1024
- .device-pill { font-size: 0.7rem; }
525
+ .mode-pills { flex-wrap: wrap; }
1025
526
  }
1026
527
 
1027
528
  @media (max-width: 640px) {
1028
529
  nav { padding: 1rem 1.25rem; }
1029
530
  .showcase {
1030
- margin-top: 3rem;
1031
531
  display: flex;
1032
532
  justify-content: center;
1033
533
  align-items: flex-end;
1034
534
  gap: 0;
535
+ margin-top: 3rem;
1035
536
  }
1036
- .showcase::after { display: none; }
1037
- .device-ipad {
1038
- width: 78%;
1039
- transform: rotate(0deg);
1040
- flex-shrink: 0;
1041
- }
1042
- .device-ipad:hover { transform: translateY(-8px); }
537
+ .device-ipad { width: 78%; flex-shrink: 0; }
1043
538
  .device-iphone {
1044
539
  width: 28%;
1045
- transform: rotate(0deg) translateY(5%);
540
+ transform: translateY(5%);
1046
541
  margin-left: -12%;
1047
542
  flex-shrink: 0;
1048
- justify-self: auto;
1049
- align-self: auto;
1050
543
  }
1051
- .device-iphone:hover { transform: translateY(-3%); }
1052
- .carousel-dots { bottom: 8px; gap: 6px; }
544
+ .carousel-dots { bottom: 6px; gap: 5px; }
1053
545
  .carousel-dot { width: 6px; height: 6px; }
1054
- .carousel-label { top: 8px; left: 8px; padding: 5px 10px; border-radius: 8px; }
1055
- .carousel-label-title { font-size: 0.8rem; }
1056
- .carousel-label-desc { font-size: 0.62rem; }
1057
- .terminal { margin: 0 1rem; max-width: calc(100vw - 2rem); }
1058
- .terminal-body { padding: 1rem; font-size: 0.75rem; overflow-x: auto; }
1059
- .terminal-line { gap: 0.4rem; white-space: nowrap; }
1060
- .terminal-output { font-size: 0.7rem; padding-left: 0.9rem; }
1061
- .section-divider { margin: 4rem auto; }
1062
- .bento { padding: 0 1rem; margin: 4rem auto; }
1063
- .bento-card { padding: 1.5rem; border-radius: 16px; overflow: visible; }
1064
- .encrypt-visual { gap: 0.4rem; }
1065
- .encrypt-block { padding: 0.3rem 0.5rem; font-size: 0.6rem; }
1066
- .device-flow { gap: 0.5rem; }
1067
- .device-pill { padding: 0.4rem 0.6rem; font-size: 0.65rem; }
1068
- .workflow-step { gap: 1rem; }
1069
- .step-marker { width: 40px; height: 40px; border-radius: 12px; font-size: 1rem; }
1070
- .workflow-steps::before { left: 19px; }
546
+ .carousel-label { top: 8px; left: 8px; padding: 4px 8px; }
547
+ .carousel-label-title { font-size: 0.75rem; }
548
+ .carousel-label-desc { font-size: 0.58rem; }
549
+ .terminal { margin: 0 1rem; }
550
+ .terminal-body { padding: 0.75rem 1rem; font-size: 0.75rem; overflow-x: auto; }
551
+ .features { padding: 0 1rem; }
552
+ .feature-card { padding: 1.25rem; }
553
+ .divider { margin: 3.5rem auto; }
1071
554
  }
1072
555
 
1073
556
  .sr-only {
@@ -1083,26 +566,14 @@
1083
566
  </head>
1084
567
  <body>
1085
568
 
1086
- <!-- Ambient background -->
1087
- <div class="ambient" aria-hidden="true">
1088
- <div class="ambient-orb"></div>
1089
- <div class="ambient-orb"></div>
1090
- <div class="ambient-orb"></div>
1091
- </div>
1092
- <div class="grain" aria-hidden="true"></div>
1093
-
1094
- <div class="content">
1095
-
1096
- <!-- Nav -->
1097
569
  <header>
1098
570
  <nav>
1099
571
  <div class="logo">
1100
- <img class="logo-mark" src="/favicon.svg" alt="AgenticWorker">
1101
- <div class="logo-text">Agentic<span>Worker</span></div>
572
+ <img src="/favicon.svg" alt="AgenticWorker">
573
+ <span>AgenticWorker</span>
1102
574
  </div>
1103
575
  <div class="nav-links">
1104
576
  <a href="#features">功能</a>
1105
- <a href="#how-it-works">使用方式</a>
1106
577
  <a href="/" class="nav-lang">EN</a>
1107
578
  <a href="https://github.com/kailunshi_microsoft/AgenticWorker" target="_blank" rel="noopener" class="nav-gh">
1108
579
  <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
@@ -1120,17 +591,10 @@
1120
591
  <div class="hero-badge-dot"></div>
1121
592
  开源免费 &middot; 端到端加密
1122
593
  </div>
1123
- <h1>
1124
- <span class="line">Claude Code</span>
1125
- <span class="line"><em>开源版远程控制。</em></span>
1126
- </h1>
1127
- <p class="hero-sub">
1128
- 在开发机器上启动 Agent,出门遛弯期间用<strong>手机对话、组建 Agent 团队、或跑定时任务</strong> &mdash;
1129
- 不用装 App,不用注册账号,打开浏览器就能用。
1130
- </p>
594
+ <h1>Claude Code<br><em>随时随地操控。</em></h1>
1131
595
  <div class="cta-group">
1132
596
  <button class="cta-primary" onclick="copyInstall()">
1133
- <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"></polyline><line x1="12" y1="19" x2="20" y2="19"></line></svg>
597
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"></polyline><line x1="12" y1="19" x2="20" y2="19"></line></svg>
1134
598
  一键安装
1135
599
  </button>
1136
600
  <a href="https://github.com/kailunshi_microsoft/AgenticWorker" target="_blank" rel="noopener" class="cta-secondary">
@@ -1139,7 +603,6 @@
1139
603
  </a>
1140
604
  </div>
1141
605
 
1142
- <!-- Terminal -->
1143
606
  <div class="terminal">
1144
607
  <div class="terminal-bar">
1145
608
  <div class="terminal-dot"></div>
@@ -1202,154 +665,94 @@
1202
665
  </div>
1203
666
  </section>
1204
667
 
1205
- <div class="section-divider"></div>
668
+ <div class="divider"></div>
1206
669
 
1207
- <!-- Bento Features -->
1208
- <section class="bento" id="features">
670
+ <!-- Features -->
671
+ <section class="features" id="features">
1209
672
  <h2 class="sr-only">功能</h2>
1210
673
 
1211
- <!-- Row 1: Chat | Team | Loop (wide) + Any Device -->
1212
- <div class="bento-card wide">
1213
- <div class="bento-visual">
1214
- <div class="mode-toggle">
1215
- <div class="mode-toggle-item active">
1216
- <div class="mode-icon chat-icon">
1217
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg>
1218
- </div>
1219
- <div class="mode-name">Chat</div>
1220
- <div class="mode-desc">交互式编程对话</div>
1221
- </div>
1222
- <div class="mode-toggle-item">
1223
- <div class="mode-icon team-icon">
1224
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87"></path><path d="M16 3.13a4 4 0 0 1 0 7.75"></path></svg>
1225
- </div>
1226
- <div class="mode-name">Team</div>
1227
- <div class="mode-desc">并行子 Agent 协作</div>
1228
- </div>
1229
- <div class="mode-toggle-item">
1230
- <div class="mode-icon loop-icon">
1231
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 4 23 10 17 10"></polyline><polyline points="1 20 1 14 7 14"></polyline><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"></path></svg>
1232
- </div>
1233
- <div class="mode-name">Loop</div>
1234
- <div class="mode-desc">定时 Cron 任务</div>
1235
- </div>
1236
- </div>
674
+ <div class="feature-card wide">
675
+ <div class="mode-pills">
676
+ <span class="mode-pill active">
677
+ <svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg>
678
+ Chat
679
+ </span>
680
+ <span class="mode-pill">
681
+ <svg viewBox="0 0 24 24"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87"></path><path d="M16 3.13a4 4 0 0 1 0 7.75"></path></svg>
682
+ Team
683
+ </span>
684
+ <span class="mode-pill">
685
+ <svg viewBox="0 0 24 24"><polyline points="23 4 23 10 17 10"></polyline><polyline points="1 20 1 14 7 14"></polyline><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"></path></svg>
686
+ Loop
687
+ </span>
1237
688
  </div>
1238
689
  <h3>三大模式,一个界面</h3>
1239
690
  <p>和 Claude 交互对话、启动 Agent 团队处理复杂任务、或用 Cron 调度定时 Loop 任务 &mdash; 全在同一个浏览器标签页里。</p>
1240
691
  </div>
1241
692
 
1242
- <div class="bento-card">
1243
- <div class="bento-visual">
1244
- <div class="bento-icon cyan">
1245
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="2" width="14" height="20" rx="2" ry="2"></rect><line x1="12" y1="18" x2="12.01" y2="18"></line></svg>
1246
- </div>
693
+ <div class="feature-card">
694
+ <div class="feature-icon cyan">
695
+ <svg viewBox="0 0 24 24"><rect x="5" y="2" width="14" height="20" rx="2" ry="2"></rect><line x1="12" y1="18" x2="12.01" y2="18"></line></svg>
1247
696
  </div>
1248
697
  <h3>任何设备</h3>
1249
698
  <p>手机、平板、笔记本 &mdash; 有浏览器就行,随时切到你的 Claude。</p>
1250
699
  </div>
1251
700
 
1252
- <!-- Row 2: E2E Encryption (wide) + Self-Hostable -->
1253
- <div class="bento-card wide">
1254
- <div class="bento-visual">
1255
- <div class="encrypt-visual">
1256
- <div class="encrypt-block">你的代码</div>
1257
- <div class="encrypt-arrow">&rarr;</div>
1258
- <div class="encrypt-block locked">x9f#k2$mQ...</div>
1259
- <div class="encrypt-arrow">&rarr;</div>
1260
- <div class="encrypt-block">你的代码</div>
1261
- </div>
701
+ <div class="feature-card wide">
702
+ <div class="encrypt-visual">
703
+ <div class="encrypt-block">你的代码</div>
704
+ <div class="encrypt-arrow">&rarr;</div>
705
+ <div class="encrypt-block locked">x9f#k2$mQ...</div>
706
+ <div class="encrypt-arrow">&rarr;</div>
707
+ <div class="encrypt-block">你的代码</div>
1262
708
  </div>
1263
709
  <h3>端到端加密</h3>
1264
710
  <p>XSalsa20-Poly1305 加密。中继服务器只是个盲转发器 &mdash; 看不到你的代码、提示词或任何数据。</p>
1265
711
  </div>
1266
712
 
1267
- <div class="bento-card">
1268
- <div class="bento-visual">
1269
- <div class="bento-icon green">
1270
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="8" rx="2" ry="2"></rect><rect x="2" y="14" width="20" height="8" rx="2" ry="2"></rect><line x1="6" y1="6" x2="6.01" y2="6"></line><line x1="6" y1="18" x2="6.01" y2="18"></line></svg>
1271
- </div>
713
+ <div class="feature-card">
714
+ <div class="feature-icon green">
715
+ <svg viewBox="0 0 24 24"><rect x="2" y="2" width="20" height="8" rx="2" ry="2"></rect><rect x="2" y="14" width="20" height="8" rx="2" ry="2"></rect><line x1="6" y1="6" x2="6.01" y2="6"></line><line x1="6" y1="18" x2="6.01" y2="18"></line></svg>
1272
716
  </div>
1273
717
  <h3>可自建部署</h3>
1274
718
  <p>一条命令启动你自己的中继服务器。你的基础设施,你的规则。</p>
1275
719
  </div>
1276
720
 
1277
- <!-- Row 3: Multi-Agent Teams + Multi Session + Zero Config -->
1278
- <div class="bento-card">
1279
- <div class="bento-visual">
1280
- <div class="bento-icon blue">
1281
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87"></path><path d="M16 3.13a4 4 0 0 1 0 7.75"></path></svg>
1282
- </div>
721
+ <div class="feature-card">
722
+ <div class="feature-icon">
723
+ <svg viewBox="0 0 24 24"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87"></path><path d="M16 3.13a4 4 0 0 1 0 7.75"></path></svg>
1283
724
  </div>
1284
725
  <h3>多 Agent 协作</h3>
1285
726
  <p>启动多个 Claude 子 Agent 并行处理复杂任务,实时看板面板、活动动态、团队历史记录。</p>
1286
727
  </div>
1287
728
 
1288
- <div class="bento-card">
1289
- <div class="bento-visual">
1290
- <div class="bento-icon blue">
1291
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="8" height="8" rx="1.5"></rect><rect x="14" y="3" width="8" height="8" rx="1.5"></rect><rect x="2" y="13" width="8" height="8" rx="1.5"></rect><rect x="14" y="13" width="8" height="8" rx="1.5"></rect></svg>
1292
- </div>
729
+ <div class="feature-card">
730
+ <div class="feature-icon">
731
+ <svg viewBox="0 0 24 24"><rect x="2" y="3" width="8" height="8" rx="1.5"></rect><rect x="14" y="3" width="8" height="8" rx="1.5"></rect><rect x="2" y="13" width="8" height="8" rx="1.5"></rect><rect x="14" y="13" width="8" height="8" rx="1.5"></rect></svg>
1293
732
  </div>
1294
733
  <h3>多会话并行</h3>
1295
734
  <p>同时跑多个对话,自由切换,互不干扰。</p>
1296
735
  </div>
1297
736
 
1298
- <div class="bento-card">
1299
- <div class="bento-visual">
1300
- <div class="bento-icon purple">
1301
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"></polygon></svg>
1302
- </div>
737
+ <div class="feature-card">
738
+ <div class="feature-icon amber">
739
+ <svg viewBox="0 0 24 24"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"></polygon></svg>
1303
740
  </div>
1304
741
  <h3>开箱即用</h3>
1305
742
  <p>不用注册账号,不用配置环境。安装、启动、打开链接,三步搞定。</p>
1306
743
  </div>
1307
744
  </section>
1308
745
 
1309
- <div class="section-divider"></div>
1310
-
1311
- <!-- How It Works -->
1312
- <section class="workflow" id="how-it-works">
1313
- <div class="workflow-label">使用方式</div>
1314
- <h2>三步,就这么简单。</h2>
1315
- <div class="workflow-steps">
1316
- <div class="workflow-step">
1317
- <div class="step-marker">01</div>
1318
- <div class="step-content">
1319
- <h3>启动 Agent</h3>
1320
- <p>在项目目录下运行 <code>agentlink-client start -D</code>,终端会打印一个会话链接。</p>
1321
- </div>
1322
- </div>
1323
- <div class="workflow-step">
1324
- <div class="step-marker">02</div>
1325
- <div class="step-content">
1326
- <h3>在任意设备打开链接</h3>
1327
- <p>手机、平板、别人的电脑 &mdash; 只要有浏览器就行。所有通信自动端到端加密,中继服务器看不到任何内容。</p>
1328
- </div>
1329
- </div>
1330
- <div class="workflow-step">
1331
- <div class="step-marker">03</div>
1332
- <div class="step-content">
1333
- <h3>对话、协作、自动化</h3>
1334
- <p>交互式编程、启动 Agent 团队处理复杂任务、或设置定时 Loop 任务 &mdash; 同一个链接,完整历史随时恢复。</p>
1335
- </div>
1336
- </div>
1337
- </div>
1338
- </section>
1339
-
1340
746
  </main>
1341
747
 
1342
748
  <footer>
1343
749
  <div class="footer-links">
1344
750
  <span class="footer-brand">AgenticWorker</span>
1345
751
  <a href="https://github.com/kailunshi_microsoft/AgenticWorker" rel="noopener">GitHub</a>
752
+ <a href="https://www.linkedin.com/in/shikailun/" rel="noopener">LinkedIn</a>
1346
753
  </div>
1347
- <p>开源免费,永远免费。为随时随地写代码的开发者而生。</p>
1348
754
  </footer>
1349
755
 
1350
- </div>
1351
-
1352
- <!-- Toast for copy -->
1353
756
  <div class="terminal-copy-toast" id="copyToast">已复制到剪贴板</div>
1354
757
 
1355
758
  <script>
@@ -1401,13 +804,11 @@ function showToast() {
1401
804
  });
1402
805
  });
1403
806
 
1404
- // Touch/swipe support
1405
807
  const track = document.querySelector('.ipad-carousel');
1406
- let startX = 0, startY = 0, dragging = false;
808
+ let startX = 0, dragging = false;
1407
809
 
1408
810
  track.addEventListener('touchstart', e => {
1409
811
  startX = e.touches[0].clientX;
1410
- startY = e.touches[0].clientY;
1411
812
  dragging = true;
1412
813
  }, { passive: true });
1413
814
 
@@ -1415,14 +816,12 @@ function showToast() {
1415
816
  if (!dragging) return;
1416
817
  dragging = false;
1417
818
  const dx = e.changedTouches[0].clientX - startX;
1418
- const dy = e.changedTouches[0].clientY - startY;
1419
- if (Math.abs(dx) > 50 && Math.abs(dx) > Math.abs(dy)) {
819
+ if (Math.abs(dx) > 50) {
1420
820
  goTo(dx < 0 ? current + 1 : current - 1);
1421
821
  resetAuto();
1422
822
  }
1423
823
  }, { passive: true });
1424
824
 
1425
- // Mouse drag support for desktop
1426
825
  track.addEventListener('mousedown', e => {
1427
826
  startX = e.clientX;
1428
827
  dragging = true;