clew-code 0.2.20 → 0.2.22

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 (66) hide show
  1. package/dist/main.js +1888 -1883
  2. package/docs/architecture.html +91 -148
  3. package/docs/assets/clew-agent-loop.png +0 -0
  4. package/docs/assets/clew-general-architecture.png +0 -0
  5. package/docs/assets/clew-mcp-architecture.png +0 -0
  6. package/docs/assets/clew-p2p-swarm.png +0 -0
  7. package/docs/changelog.html +150 -0
  8. package/docs/cli-reference.html +90 -0
  9. package/docs/commands.html +156 -265
  10. package/docs/configuration.html +85 -147
  11. package/docs/contributing.html +91 -0
  12. package/docs/css/styles.css +425 -425
  13. package/docs/daemon.html +62 -129
  14. package/docs/features/bridge-mode.html +61 -66
  15. package/docs/features/evals.html +57 -149
  16. package/docs/features/searxng-search.html +58 -118
  17. package/docs/features/sentry-setup.html +61 -124
  18. package/docs/index.html +137 -125
  19. package/docs/installation.html +77 -105
  20. package/docs/internals/growthbook-ab-testing.html +69 -91
  21. package/docs/internals/hidden-features.html +81 -143
  22. package/docs/js/main.js +29 -0
  23. package/docs/loop.html +69 -181
  24. package/docs/mcp.html +99 -247
  25. package/docs/models.html +69 -110
  26. package/docs/permission-model.html +86 -102
  27. package/docs/plugins.html +84 -102
  28. package/docs/providers.html +87 -127
  29. package/docs/quick-start.html +81 -93
  30. package/docs/research-memory.html +71 -102
  31. package/docs/security.html +71 -0
  32. package/docs/skills.html +67 -117
  33. package/docs/swarm.html +78 -236
  34. package/docs/tools.html +152 -151
  35. package/docs/troubleshooting.html +86 -106
  36. package/docs/voice-mode.html +79 -0
  37. package/package.json +1 -1
  38. package/docs/architecture.th.html +0 -79
  39. package/docs/clew-code-architecture.html +0 -1126
  40. package/docs/commands.th.html +0 -269
  41. package/docs/configuration.th.html +0 -108
  42. package/docs/daemon.th.html +0 -73
  43. package/docs/features/bridge-mode.th.html +0 -62
  44. package/docs/features/evals.th.html +0 -62
  45. package/docs/features/searxng-search.th.html +0 -67
  46. package/docs/features/sentry-setup.th.html +0 -69
  47. package/docs/features/swarm.html +0 -156
  48. package/docs/generated/providers.html +0 -625
  49. package/docs/generated/tools.html +0 -558
  50. package/docs/index.th.html +0 -292
  51. package/docs/installation.th.html +0 -105
  52. package/docs/internals/growthbook-ab-testing.th.html +0 -60
  53. package/docs/internals/hidden-features.th.html +0 -107
  54. package/docs/loop.th.html +0 -227
  55. package/docs/mcp.th.html +0 -207
  56. package/docs/models.th.html +0 -61
  57. package/docs/permission-model.th.html +0 -67
  58. package/docs/plugins.th.html +0 -79
  59. package/docs/prompts-and-features.html +0 -806
  60. package/docs/providers.th.html +0 -81
  61. package/docs/quick-start.th.html +0 -89
  62. package/docs/research-memory.th.html +0 -72
  63. package/docs/skills.th.html +0 -90
  64. package/docs/swarm.th.html +0 -280
  65. package/docs/tools.th.html +0 -84
  66. package/docs/troubleshooting.th.html +0 -85
@@ -1,425 +1,425 @@
1
- /* ============================================================
2
- Clew Docs — Minimal White + Purple Theme
3
- ============================================================ */
4
- *,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
5
-
6
- :root {
7
- --bg: #ffffff;
8
- --bg-card: #f9f8fc;
9
- --bg-code: #f5f3ff;
10
- --bg-hover: #ede9fe;
11
- --text: #1a1a2e;
12
- --text-dim: #6b6580;
13
- --text-faint:#9994b0;
14
- --accent: #7c3aed;
15
- --accent2: #a78bfa;
16
- --border: #e8e5f0;
17
- --border2: #d4cff0;
18
- --shadow: rgba(124,58,237,.06);
19
-
20
- --font: 'DM Sans', system-ui, -apple-system, sans-serif;
21
- --mono: 'JetBrains Mono', 'SF Mono', monospace;
22
-
23
- --header-h: 52px;
24
- --max-w: 880px;
25
- --sidebar-w: 220px;
26
- }
27
-
28
- @media(prefers-color-scheme:dark){
29
- :root {
30
- --bg: #12121a;
31
- --bg-card: #1a1a28;
32
- --bg-code: #1e1e30;
33
- --bg-hover: #2a2a40;
34
- --text: #e4e4f0;
35
- --text-dim: #9a96b0;
36
- --text-faint:#6b6880;
37
- --accent: #a78bfa;
38
- --accent2: #7c3aed;
39
- --border: #2a2a3e;
40
- --border2: #3a3a54;
41
- --shadow: rgba(0,0,0,.3);
42
- }
43
- .header{background:rgba(18,18,26,.92)}
44
- .term{box-shadow:0 12px 40px rgba(0,0,0,.2)}
45
- img{opacity:.9}
46
- }
47
-
48
- html{scroll-behavior:smooth}
49
- body{
50
- font-family:var(--font);
51
- font-size:15px;
52
- line-height:1.7;
53
- color:var(--text);
54
- background:var(--bg);
55
- -webkit-font-smoothing:antialiased;
56
- }
57
- ::selection{background:var(--accent);color:#fff}
58
- a{color:var(--accent);text-decoration:none;transition:.12s}
59
- a:hover{color:#6d28d9;text-decoration:underline}
60
- @media(prefers-color-scheme:dark){a:hover{color:#c4b5fd}}
61
- code{
62
- font-family:var(--mono);
63
- font-size:.85em;
64
- background:var(--bg-code);
65
- color:var(--accent);
66
- padding:.12em .4em;
67
- border-radius:4px;
68
- }
69
- pre code{background:none;padding:0;color:inherit}
70
-
71
- /* ── header ── */
72
- .header{
73
- position:fixed;top:0;left:0;right:0;height:var(--header-h);
74
- background:rgba(255,255,255,.88);backdrop-filter:blur(16px) saturate(180%);
75
- -webkit-backdrop-filter:blur(16px) saturate(180%);
76
- border-bottom:1px solid var(--border);z-index:100;
77
- box-shadow:0 1px 3px rgba(0,0,0,.04);
78
- }
79
- @media(prefers-color-scheme:dark){
80
- .header{
81
- background:rgba(18,18,26,.88);
82
- box-shadow:0 1px 3px rgba(0,0,0,.2);
83
- }
84
- }
85
- .header-inner{
86
- max-width:var(--max-w);margin:0 auto;padding:0 24px;
87
- height:100%;display:flex;align-items:center;gap:12px;
88
- }
89
- .logo{
90
- font-family:var(--mono);font-weight:700;font-size:14px;
91
- color:var(--text);display:flex;align-items:center;gap:8px;
92
- white-space:nowrap;flex-shrink:0;
93
- }
94
- .logo:hover{opacity:.85;text-decoration:none}
95
- .logo-mark{
96
- width:26px;height:26px;border-radius:6px;
97
- background:linear-gradient(135deg,#7c3aed,#a78bfa);
98
- color:#fff;display:flex;align-items:center;justify-content:center;
99
- font-size:12px;font-weight:700;box-shadow:0 2px 8px rgba(124,58,237,.25);
100
- }
101
-
102
- /* ── breadcrumbs ── */
103
- .header-breadcrumbs{
104
- display:flex;align-items:center;gap:4px;font-size:12px;
105
- color:var(--text-faint);margin-left:4px;overflow:hidden;
106
- white-space:nowrap;text-overflow:ellipsis;flex-shrink:1;min-width:0;
107
- }
108
- .header-breadcrumbs a{color:var(--text-faint)}
109
- .header-breadcrumbs a:hover{color:var(--accent);text-decoration:none}
110
- .header-breadcrumbs .sep{color:var(--border2);margin:0 2px}
111
- .header-breadcrumbs .current{color:var(--text-dim);font-weight:500}
112
-
113
- /* ── search ── */
114
- .header-search{
115
- position:relative;margin-left:auto;flex-shrink:0;
116
- }
117
- .header-search input{
118
- width:180px;height:30px;padding:0 32px 0 10px;
119
- border:1px solid var(--border);border-radius:6px;
120
- background:var(--bg);color:var(--text);
121
- font-family:var(--font);font-size:12px;
122
- outline:none;transition:.15s;
123
- }
124
- .header-search input:focus{
125
- border-color:var(--accent2);box-shadow:0 0 0 3px rgba(124,58,237,.1);
126
- width:220px;
127
- }
128
- .header-search input::placeholder{color:var(--text-faint)}
129
- .header-search .search-icon{
130
- position:absolute;right:8px;top:50%;transform:translateY(-50%);
131
- font-size:12px;color:var(--text-faint);pointer-events:none;
132
- }
133
- .header-search .search-results{
134
- display:none;position:absolute;top:100%;right:0;width:320px;max-height:280px;
135
- overflow-y:auto;margin-top:6px;background:var(--bg);
136
- border:1px solid var(--border);border-radius:8px;
137
- box-shadow:0 8px 24px rgba(0,0,0,.08);z-index:300;
138
- }
139
- .header-search .search-results.open{display:block}
140
- .header-search .search-result{
141
- display:block;padding:8px 12px;font-size:12px;color:var(--text-dim);
142
- border-bottom:1px solid var(--border);
143
- transition:.08s;
144
- }
145
- .header-search .search-result:last-child{border:none}
146
- .header-search .search-result:hover{background:var(--bg-hover);color:var(--text);text-decoration:none}
147
- .header-search .search-result mark{background:rgba(124,58,237,.15);color:var(--accent)}
148
- .header-search .search-empty{
149
- padding:12px;font-size:12px;color:var(--text-faint);text-align:center;
150
- }
151
-
152
- /* ── header nav ── */
153
- .header-nav{display:flex;gap:2px;align-items:center;flex-shrink:0}
154
- .header-nav a{
155
- padding:5px 10px;border-radius:5px;font-size:12px;font-weight:500;
156
- color:var(--text-dim);white-space:nowrap;
157
- }
158
- .header-nav a:hover{background:var(--bg-hover);color:var(--text);text-decoration:none}
159
- .header-nav a.active{color:var(--accent);background:var(--bg-code)}
160
-
161
- /* ── language toggle ── */
162
- .lang-toggle{
163
- display:flex;align-items:center;padding:4px 8px;border-radius:5px;
164
- background:none;border:1px solid var(--border);cursor:pointer;
165
- font-size:11px;color:var(--text-dim);font-family:var(--font);gap:4px;
166
- transition:.1s;flex-shrink:0;
167
- }
168
- .lang-toggle:hover{background:var(--bg-hover);border-color:var(--border2)}
169
- .menu-btn{display:none;width:32px;height:32px;border:1px solid var(--border);border-radius:6px;background:none;cursor:pointer;flex-direction:column;justify-content:center;align-items:center;gap:4px;flex-shrink:0}
170
- .menu-btn span{display:block;width:16px;height:2px;background:var(--text-dim);border-radius:2px;transition:.15s}
171
- .menu-btn.open span:nth-child(1){transform:rotate(45deg) translate(4px,4px)}
172
- .menu-btn.open span:nth-child(2){opacity:0}
173
- .menu-btn.open span:nth-child(3){transform:rotate(-45deg) translate(4px,-4px)}
174
- .sidebar-overlay{display:none}
175
-
176
- /* ── page layout (index) ── */
177
- .page{
178
- max-width:var(--max-w);margin:calc(var(--header-h) + 40px) auto 60px;
179
- padding:0 24px;
180
- }
181
-
182
- /* ── doc layout (sub-pages) ── */
183
- .app{display:flex;max-width:var(--max-w);margin:0 auto;padding:0 24px;gap:0}
184
- .sidebar{
185
- position:fixed;top:var(--header-h);left:0;bottom:0;
186
- width:var(--sidebar-w);overflow-y:auto;padding:24px 12px 40px;
187
- border-right:1px solid var(--border);
188
- background:var(--bg);
189
- z-index:50;
190
- }
191
- .sidebar-section{margin-bottom:24px}
192
- .sidebar-label{
193
- font-family:var(--mono);font-size:10px;font-weight:600;text-transform:uppercase;
194
- color:var(--text-faint);letter-spacing:.05em;margin-bottom:6px;padding:0 8px;
195
- }
196
- .sidebar-link{
197
- display:block;padding:3px 8px;border-radius:4px;
198
- font-size:13px;color:var(--text-dim);transition:.1s;
199
- }
200
- .sidebar-link:hover{background:var(--bg-hover);color:var(--text);text-decoration:none}
201
- .sidebar-link.active{color:var(--accent);background:var(--bg-code);font-weight:500}
202
- .sidebar-link .link-icon{display:inline-block;width:4px;height:4px;border-radius:50%;background:var(--border2);margin-right:6px;vertical-align:middle;transition:.1s}
203
- .sidebar-link:hover .link-icon{background:var(--accent2)}
204
- .sidebar-link.active .link-icon{background:var(--accent)}
205
-
206
- .content-wrap{flex:1;margin-left:var(--sidebar-w);min-width:0}
207
- .content{
208
- max-width:var(--max-w);padding:calc(var(--header-h) + 24px) 32px 60px;
209
- }
210
-
211
- /* ── TOC sidebar ── */
212
- .toc-sidebar{
213
- display:none;
214
- }
215
- @media(min-width:1200px){
216
- .toc-sidebar{
217
- display:block;position:sticky;top:calc(var(--header-h) + 24px);
218
- width:180px;min-width:180px;max-height:calc(100vh - var(--header-h) - 48px);
219
- overflow-y:auto;padding:calc(var(--header-h) + 24px) 0 40px 20px;
220
- margin-left:24px;border-left:1px solid var(--border);
221
- }
222
- .content-wrap{display:flex;flex-direction:row}
223
- .content{flex:1;min-width:0}
224
- }
225
- .toc-label{
226
- font-family:var(--mono);font-size:10px;font-weight:600;text-transform:uppercase;
227
- color:var(--text-faint);letter-spacing:.05em;margin-bottom:8px;
228
- }
229
- .toc-link{
230
- display:block;padding:2px 0 2px 12px;border-left:2px solid transparent;
231
- font-size:12px;color:var(--text-faint);line-height:1.6;transition:.1s;
232
- }
233
- .toc-link:hover{color:var(--accent);border-color:var(--accent2);text-decoration:none}
234
- .toc-link.active{color:var(--accent);border-color:var(--accent)}
235
- .toc-h3{padding-left:20px;font-size:11px}
236
-
237
- /* ── breadcrumbs ── */
238
- .breadcrumbs{
239
- font-size:13px;color:var(--text-faint);margin-bottom:24px;
240
- }
241
- .breadcrumbs a{color:var(--text-faint)}
242
- .breadcrumbs a:hover{color:var(--accent)}
243
- .breadcrumbs .sep{margin:0 6px}
244
-
245
- /* ── headings ── */
246
- h1{
247
- font-family:var(--mono);font-size:28px;font-weight:700;
248
- margin-bottom:8px;color:var(--text);
249
- }
250
- h2{
251
- font-family:var(--mono);font-size:18px;font-weight:600;
252
- margin:40px 0 16px;color:var(--text);
253
- padding-bottom:6px;border-bottom:1px solid var(--border);
254
- }
255
- h3{font-size:15px;font-weight:600;margin:24px 0 8px;color:var(--text)}
256
- p{color:var(--text-dim);margin-bottom:12px;line-height:1.7}
257
- .sub{color:var(--text-dim);margin-bottom:24px}
258
-
259
- /* ── hero ── */
260
- .hero{padding:48px 0 32px;text-align:center}
261
- .hero h1{font-size:36px;margin-bottom:12px}
262
- .hero .hl{background:linear-gradient(135deg,#7c3aed,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
263
- .hero p{max-width:560px;margin:0 auto 20px;font-size:16px}
264
- .hero-actions{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
265
-
266
- .badge{
267
- display:inline-flex;align-items:center;gap:6px;
268
- padding:3px 12px;border-radius:100px;
269
- font-family:var(--mono);font-size:11px;font-weight:500;
270
- color:var(--accent);background:var(--bg-code);
271
- border:1px solid var(--border2);margin-bottom:20px;
272
- }
273
- .badge .dot{width:5px;height:5px;border-radius:50%;background:var(--accent)}
274
-
275
- .btn{
276
- display:inline-flex;align-items:center;gap:6px;
277
- padding:8px 18px;border-radius:6px;
278
- font-family:var(--mono);font-size:12px;font-weight:600;
279
- border:1px solid var(--border);
280
- background:var(--bg);color:var(--text);
281
- cursor:pointer;transition:.15s;
282
- }
283
- .btn:hover{text-decoration:none;border-color:var(--border2)}
284
- .btn-p{
285
- background:var(--accent);color:#fff;border-color:var(--accent);
286
- box-shadow:0 3px 12px rgba(124,58,237,.2);
287
- }
288
- .btn-p:hover{background:#6d28d9;color:#fff;border-color:#6d28d9;box-shadow:0 5px 18px rgba(124,58,237,.3);transform:translateY(-1px)}
289
- .btn-ghost{color:var(--text-dim);border-color:var(--border)}
290
- .btn-ghost:hover{color:var(--accent);border-color:var(--border2);background:var(--bg-code)}
291
-
292
- /* ── stat cards ── */
293
- .stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:32px 0}
294
- .stat{
295
- text-align:center;padding:16px 8px;border-radius:8px;
296
- background:var(--bg-card);border:1px solid var(--border);
297
- }
298
- .stat-num{
299
- font-family:var(--mono);font-size:24px;font-weight:700;
300
- background:linear-gradient(135deg,#7c3aed,#a78bfa);
301
- -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;
302
- line-height:1.2;
303
- }
304
- .stat-lbl{font-size:12px;color:var(--text-faint);font-weight:500;margin-top:2px}
305
-
306
- /* ── grid cards ── */
307
- .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;margin:24px 0}
308
- .card{
309
- padding:20px;border-radius:8px;
310
- background:var(--bg-card);border:1px solid var(--border);
311
- transition:.15s;
312
- }
313
- .card:hover{border-color:var(--border2);box-shadow:0 4px 16px var(--shadow)}
314
- .card h3{font-family:var(--mono);font-size:13px;margin-bottom:6px;color:var(--accent)}
315
- .card p{font-size:13px}
316
- .card .tag{
317
- display:inline-block;font-family:var(--mono);font-size:10px;
318
- padding:1px 7px;border-radius:3px;
319
- background:var(--bg-code);color:var(--accent);
320
- border:1px solid var(--border2);margin:6px 2px 0 0;
321
- }
322
-
323
- /* ── terminal mock ── */
324
- .term{
325
- background:var(--bg-code);border:1px solid var(--border2);
326
- border-radius:8px;overflow:hidden;margin:32px auto;
327
- max-width:660px;box-shadow:0 12px 40px var(--shadow);
328
- }
329
- .term-bar{
330
- display:flex;align-items:center;gap:6px;
331
- padding:10px 14px;background:rgba(124,58,237,.03);
332
- border-bottom:1px solid var(--border2);
333
- }
334
- .term-dot{width:8px;height:8px;border-radius:50%;background:#ddd}
335
- .term-dot:nth-child(1){background:#ff5f56}
336
- .term-dot:nth-child(2){background:#ffbd2e}
337
- .term-dot:nth-child(3){background:#27c93f}
338
- .term-title{font-family:var(--mono);font-size:11px;color:var(--text-faint);margin-left:6px}
339
- .term-body{
340
- padding:14px;font-family:var(--mono);font-size:12px;line-height:1.7;
341
- color:var(--text);overflow-x:auto;white-space:pre;
342
- }
343
- .term-body .p{color:var(--accent);font-weight:600}
344
- .term-body .d{color:var(--text-faint)}
345
- .term-body .h{color:var(--accent)}
346
-
347
- /* ── table ── */
348
- .table-wrap{overflow-x:auto;margin:16px 0;border-radius:6px;border:1px solid var(--border)}
349
- table{width:100%;border-collapse:collapse;font-size:13px}
350
- th{
351
- font-family:var(--mono);font-size:10px;font-weight:600;text-transform:uppercase;
352
- text-align:left;padding:8px 12px;letter-spacing:.05em;
353
- color:var(--accent);background:var(--bg-code);
354
- border-bottom:1px solid var(--border);
355
- }
356
- td{padding:7px 12px;border-bottom:1px solid var(--border);color:var(--text-dim);vertical-align:top}
357
- tr:last-child td{border:none}
358
- tr:hover td{background:rgba(124,58,237,.02)}
359
-
360
- /* ── code blocks ── */
361
- .code-block-wrap{margin:16px 0;border-radius:6px;border:1px solid var(--border);overflow:hidden}
362
- .code-block-header{
363
- display:flex;justify-content:space-between;align-items:center;
364
- padding:6px 10px;background:var(--bg-card);
365
- border-bottom:1px solid var(--border);font-size:11px;color:var(--text-faint);
366
- font-family:var(--mono);
367
- }
368
- .code-block-wrap pre{margin:0;border:none;border-radius:0}
369
- .copy-btn{
370
- background:none;border:1px solid var(--border);border-radius:4px;
371
- color:var(--text-faint);font-size:10px;padding:2px 8px;cursor:pointer;font-family:var(--mono);transition:.1s;
372
- }
373
- .copy-btn:hover{background:var(--bg-hover);color:var(--accent);border-color:var(--accent2)}
374
- .copy-btn.copied{background:var(--bg-code);color:var(--accent);border-color:var(--accent)}
375
-
376
- /* ── language toggle (kept for backward compat) ── */
377
- .lang-select{display:none}
378
-
379
- /* ── misc ── */
380
- hr{border:none;border-top:1px solid var(--border);margin:40px 0}
381
- .footer{
382
- margin-top:60px;padding-top:20px;border-top:1px solid var(--border);
383
- display:flex;justify-content:space-between;align-items:center;gap:16px;
384
- font-size:12px;color:var(--text-faint);flex-wrap:wrap;
385
- }
386
- .footer-links{display:flex;gap:16px}
387
- .footer-links a{color:var(--text-faint);font-size:12px}
388
- .footer-links a:hover{color:var(--accent)}
389
-
390
- .menu-btn{display:none;width:32px;height:32px;border:1px solid var(--border);border-radius:5px;background:none;cursor:pointer;flex-direction:column;justify-content:center;align-items:center;gap:4px;margin-left:auto}
391
- .menu-btn span{display:block;width:16px;height:2px;background:var(--text-dim);border-radius:2px}
392
- .sidebar-overlay{display:none}
393
-
394
- /* ── responsive ── */
395
- @media(max-width:900px){
396
- .sidebar{display:none}
397
- .content-wrap{margin-left:0}
398
- .content{padding:calc(var(--header-h) + 16px) 20px 40px}
399
- .header-nav,.header-search,.header-breadcrumbs,.lang-toggle{display:none}
400
- .menu-btn{display:flex}
401
- .stats{grid-template-columns:repeat(2,1fr)}
402
- .grid{grid-template-columns:1fr}
403
- .hero h1{font-size:26px}
404
-
405
- .sidebar.open{
406
- display:block;position:fixed;top:var(--header-h);left:0;right:0;bottom:0;
407
- width:auto;z-index:200;background:var(--bg);padding:24px;
408
- border-right:none;animation:slideIn .15s ease-out;
409
- }
410
- .sidebar.open .header-search{
411
- display:block;margin:0 0 16px;position:static;
412
- }
413
- .sidebar.open .header-search input{width:100%}
414
- .sidebar.open .header-nav{display:flex;flex-direction:column;gap:2px}
415
- .sidebar-overlay.open{display:block;position:fixed;inset:0;background:rgba(0,0,0,.3);z-index:199}
416
- }
417
-
418
- @media(max-width:1200px){
419
- .toc-sidebar{display:none !important}
420
- }
421
-
422
- @keyframes slideIn{
423
- from{transform:translateX(-100%)}
424
- to{transform:translateX(0)}
425
- }
1
+ /* ============================================================
2
+ Clew Docs — Minimal White + Purple Theme
3
+ ============================================================ */
4
+ *,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
5
+
6
+ :root {
7
+ --bg: #ffffff;
8
+ --bg-card: #f9f8fc;
9
+ --bg-code: #f5f3ff;
10
+ --bg-hover: #ede9fe;
11
+ --text: #1a1a2e;
12
+ --text-dim: #6b6580;
13
+ --text-faint:#9994b0;
14
+ --accent: #7c3aed;
15
+ --accent2: #a78bfa;
16
+ --border: #e8e5f0;
17
+ --border2: #d4cff0;
18
+ --shadow: rgba(124,58,237,.06);
19
+
20
+ --font: 'DM Sans', system-ui, -apple-system, sans-serif;
21
+ --mono: 'JetBrains Mono', 'SF Mono', monospace;
22
+
23
+ --header-h: 52px;
24
+ --max-w: 880px;
25
+ --sidebar-w: 220px;
26
+ }
27
+
28
+ @media(prefers-color-scheme:dark){
29
+ :root {
30
+ --bg: #12121a;
31
+ --bg-card: #1a1a28;
32
+ --bg-code: #1e1e30;
33
+ --bg-hover: #2a2a40;
34
+ --text: #e4e4f0;
35
+ --text-dim: #9a96b0;
36
+ --text-faint:#6b6880;
37
+ --accent: #a78bfa;
38
+ --accent2: #7c3aed;
39
+ --border: #2a2a3e;
40
+ --border2: #3a3a54;
41
+ --shadow: rgba(0,0,0,.3);
42
+ }
43
+ .header{background:rgba(18,18,26,.92)}
44
+ .term{box-shadow:0 12px 40px rgba(0,0,0,.2)}
45
+ img{opacity:.9}
46
+ }
47
+
48
+ html{scroll-behavior:smooth}
49
+ body{
50
+ font-family:var(--font);
51
+ font-size:15px;
52
+ line-height:1.7;
53
+ color:var(--text);
54
+ background:var(--bg);
55
+ -webkit-font-smoothing:antialiased;
56
+ }
57
+ ::selection{background:var(--accent);color:#fff}
58
+ a{color:var(--accent);text-decoration:none;transition:.12s}
59
+ a:hover{color:#6d28d9;text-decoration:underline}
60
+ @media(prefers-color-scheme:dark){a:hover{color:#c4b5fd}}
61
+ code{
62
+ font-family:var(--mono);
63
+ font-size:.85em;
64
+ background:var(--bg-code);
65
+ color:var(--accent);
66
+ padding:.12em .4em;
67
+ border-radius:4px;
68
+ }
69
+ pre code{background:none;padding:0;color:inherit}
70
+
71
+ /* ── header ── */
72
+ .header{
73
+ position:fixed;top:0;left:0;right:0;height:var(--header-h);
74
+ background:rgba(255,255,255,.88);backdrop-filter:blur(16px) saturate(180%);
75
+ -webkit-backdrop-filter:blur(16px) saturate(180%);
76
+ border-bottom:1px solid var(--border);z-index:100;
77
+ box-shadow:0 1px 3px rgba(0,0,0,.04);
78
+ }
79
+ @media(prefers-color-scheme:dark){
80
+ .header{
81
+ background:rgba(18,18,26,.88);
82
+ box-shadow:0 1px 3px rgba(0,0,0,.2);
83
+ }
84
+ }
85
+ .header-inner{
86
+ max-width:var(--max-w);margin:0 auto;padding:0 24px;
87
+ height:100%;display:flex;align-items:center;gap:12px;
88
+ }
89
+ .logo{
90
+ font-family:var(--mono);font-weight:700;font-size:14px;
91
+ color:var(--text);display:flex;align-items:center;gap:8px;
92
+ white-space:nowrap;flex-shrink:0;
93
+ }
94
+ .logo:hover{opacity:.85;text-decoration:none}
95
+ .logo-mark{
96
+ width:26px;height:26px;border-radius:6px;
97
+ background:linear-gradient(135deg,#7c3aed,#a78bfa);
98
+ color:#fff;display:flex;align-items:center;justify-content:center;
99
+ font-size:12px;font-weight:700;box-shadow:0 2px 8px rgba(124,58,237,.25);
100
+ }
101
+
102
+ /* ── breadcrumbs ── */
103
+ .header-breadcrumbs{
104
+ display:flex;align-items:center;gap:4px;font-size:12px;
105
+ color:var(--text-faint);margin-left:4px;overflow:hidden;
106
+ white-space:nowrap;text-overflow:ellipsis;flex-shrink:1;min-width:0;
107
+ }
108
+ .header-breadcrumbs a{color:var(--text-faint)}
109
+ .header-breadcrumbs a:hover{color:var(--accent);text-decoration:none}
110
+ .header-breadcrumbs .sep{color:var(--border2);margin:0 2px}
111
+ .header-breadcrumbs .current{color:var(--text-dim);font-weight:500}
112
+
113
+ /* ── search ── */
114
+ .header-search{
115
+ position:relative;margin-left:auto;flex-shrink:0;
116
+ }
117
+ .header-search input{
118
+ width:180px;height:30px;padding:0 32px 0 10px;
119
+ border:1px solid var(--border);border-radius:6px;
120
+ background:var(--bg);color:var(--text);
121
+ font-family:var(--font);font-size:12px;
122
+ outline:none;transition:.15s;
123
+ }
124
+ .header-search input:focus{
125
+ border-color:var(--accent2);box-shadow:0 0 0 3px rgba(124,58,237,.1);
126
+ width:220px;
127
+ }
128
+ .header-search input::placeholder{color:var(--text-faint)}
129
+ .header-search .search-icon{
130
+ position:absolute;right:8px;top:50%;transform:translateY(-50%);
131
+ font-size:12px;color:var(--text-faint);pointer-events:none;
132
+ }
133
+ .header-search .search-results{
134
+ display:none;position:absolute;top:100%;right:0;width:320px;max-height:280px;
135
+ overflow-y:auto;margin-top:6px;background:var(--bg);
136
+ border:1px solid var(--border);border-radius:8px;
137
+ box-shadow:0 8px 24px rgba(0,0,0,.08);z-index:300;
138
+ }
139
+ .header-search .search-results.open{display:block}
140
+ .header-search .search-result{
141
+ display:block;padding:8px 12px;font-size:12px;color:var(--text-dim);
142
+ border-bottom:1px solid var(--border);
143
+ transition:.08s;
144
+ }
145
+ .header-search .search-result:last-child{border:none}
146
+ .header-search .search-result:hover{background:var(--bg-hover);color:var(--text);text-decoration:none}
147
+ .header-search .search-result mark{background:rgba(124,58,237,.15);color:var(--accent)}
148
+ .header-search .search-empty{
149
+ padding:12px;font-size:12px;color:var(--text-faint);text-align:center;
150
+ }
151
+
152
+ /* ── header nav ── */
153
+ .header-nav{display:flex;gap:2px;align-items:center;flex-shrink:0}
154
+ .header-nav a{
155
+ padding:5px 10px;border-radius:5px;font-size:12px;font-weight:500;
156
+ color:var(--text-dim);white-space:nowrap;
157
+ }
158
+ .header-nav a:hover{background:var(--bg-hover);color:var(--text);text-decoration:none}
159
+ .header-nav a.active{color:var(--accent);background:var(--bg-code)}
160
+
161
+ /* ── language toggle ── */
162
+ .lang-toggle{
163
+ display:flex;align-items:center;padding:4px 8px;border-radius:5px;
164
+ background:none;border:1px solid var(--border);cursor:pointer;
165
+ font-size:11px;color:var(--text-dim);font-family:var(--font);gap:4px;
166
+ transition:.1s;flex-shrink:0;
167
+ }
168
+ .lang-toggle:hover{background:var(--bg-hover);border-color:var(--border2)}
169
+ .menu-btn{display:none;width:32px;height:32px;border:1px solid var(--border);border-radius:6px;background:none;cursor:pointer;flex-direction:column;justify-content:center;align-items:center;gap:4px;flex-shrink:0}
170
+ .menu-btn span{display:block;width:16px;height:2px;background:var(--text-dim);border-radius:2px;transition:.15s}
171
+ .menu-btn.open span:nth-child(1){transform:rotate(45deg) translate(4px,4px)}
172
+ .menu-btn.open span:nth-child(2){opacity:0}
173
+ .menu-btn.open span:nth-child(3){transform:rotate(-45deg) translate(4px,-4px)}
174
+ .sidebar-overlay{display:none}
175
+
176
+ /* ── page layout (index) ── */
177
+ .page{
178
+ max-width:var(--max-w);margin:calc(var(--header-h) + 40px) auto 60px;
179
+ padding:0 24px;
180
+ }
181
+
182
+ /* ── doc layout (sub-pages) ── */
183
+ .app{display:flex;max-width:var(--max-w);margin:0 auto;padding:0 24px;gap:0}
184
+ .sidebar{
185
+ position:fixed;top:var(--header-h);left:0;bottom:0;
186
+ width:var(--sidebar-w);overflow-y:auto;padding:24px 12px 40px;
187
+ border-right:1px solid var(--border);
188
+ background:var(--bg);
189
+ z-index:50;
190
+ }
191
+ .sidebar-section{margin-bottom:24px}
192
+ .sidebar-label{
193
+ font-family:var(--mono);font-size:10px;font-weight:600;text-transform:uppercase;
194
+ color:var(--text-faint);letter-spacing:.05em;margin-bottom:6px;padding:0 8px;
195
+ }
196
+ .sidebar-link{
197
+ display:block;padding:3px 8px;border-radius:4px;
198
+ font-size:13px;color:var(--text-dim);transition:.1s;
199
+ }
200
+ .sidebar-link:hover{background:var(--bg-hover);color:var(--text);text-decoration:none}
201
+ .sidebar-link.active{color:var(--accent);background:var(--bg-code);font-weight:500}
202
+ .sidebar-link .link-icon{display:inline-block;width:4px;height:4px;border-radius:50%;background:var(--border2);margin-right:6px;vertical-align:middle;transition:.1s}
203
+ .sidebar-link:hover .link-icon{background:var(--accent2)}
204
+ .sidebar-link.active .link-icon{background:var(--accent)}
205
+
206
+ .content-wrap{flex:1;margin-left:var(--sidebar-w);min-width:0}
207
+ .content{
208
+ max-width:var(--max-w);padding:calc(var(--header-h) + 24px) 32px 60px;
209
+ }
210
+
211
+ /* ── TOC sidebar ── */
212
+ .toc-sidebar{
213
+ display:none;
214
+ }
215
+ @media(min-width:1200px){
216
+ .toc-sidebar{
217
+ display:block;position:sticky;top:calc(var(--header-h) + 24px);
218
+ width:180px;min-width:180px;max-height:calc(100vh - var(--header-h) - 48px);
219
+ overflow-y:auto;padding:calc(var(--header-h) + 24px) 0 40px 20px;
220
+ margin-left:24px;border-left:1px solid var(--border);
221
+ }
222
+ .content-wrap{display:flex;flex-direction:row}
223
+ .content{flex:1;min-width:0}
224
+ }
225
+ .toc-label{
226
+ font-family:var(--mono);font-size:10px;font-weight:600;text-transform:uppercase;
227
+ color:var(--text-faint);letter-spacing:.05em;margin-bottom:8px;
228
+ }
229
+ .toc-link{
230
+ display:block;padding:2px 0 2px 12px;border-left:2px solid transparent;
231
+ font-size:12px;color:var(--text-faint);line-height:1.6;transition:.1s;
232
+ }
233
+ .toc-link:hover{color:var(--accent);border-color:var(--accent2);text-decoration:none}
234
+ .toc-link.active{color:var(--accent);border-color:var(--accent)}
235
+ .toc-h3{padding-left:20px;font-size:11px}
236
+
237
+ /* ── breadcrumbs ── */
238
+ .breadcrumbs{
239
+ font-size:13px;color:var(--text-faint);margin-bottom:24px;
240
+ }
241
+ .breadcrumbs a{color:var(--text-faint)}
242
+ .breadcrumbs a:hover{color:var(--accent)}
243
+ .breadcrumbs .sep{margin:0 6px}
244
+
245
+ /* ── headings ── */
246
+ h1{
247
+ font-family:var(--mono);font-size:28px;font-weight:700;
248
+ margin-bottom:8px;color:var(--text);
249
+ }
250
+ h2{
251
+ font-family:var(--mono);font-size:18px;font-weight:600;
252
+ margin:40px 0 16px;color:var(--text);
253
+ padding-bottom:6px;border-bottom:1px solid var(--border);
254
+ }
255
+ h3{font-size:15px;font-weight:600;margin:24px 0 8px;color:var(--text)}
256
+ p{color:var(--text-dim);margin-bottom:12px;line-height:1.7}
257
+ .sub{color:var(--text-dim);margin-bottom:24px}
258
+
259
+ /* ── hero ── */
260
+ .hero{padding:48px 0 32px;text-align:center}
261
+ .hero h1{font-size:36px;margin-bottom:12px}
262
+ .hero .hl{background:linear-gradient(135deg,#7c3aed,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
263
+ .hero p{max-width:560px;margin:0 auto 20px;font-size:16px}
264
+ .hero-actions{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
265
+
266
+ .badge{
267
+ display:inline-flex;align-items:center;gap:6px;
268
+ padding:3px 12px;border-radius:100px;
269
+ font-family:var(--mono);font-size:11px;font-weight:500;
270
+ color:var(--accent);background:var(--bg-code);
271
+ border:1px solid var(--border2);margin-bottom:20px;
272
+ }
273
+ .badge .dot{width:5px;height:5px;border-radius:50%;background:var(--accent)}
274
+
275
+ .btn{
276
+ display:inline-flex;align-items:center;gap:6px;
277
+ padding:8px 18px;border-radius:6px;
278
+ font-family:var(--mono);font-size:12px;font-weight:600;
279
+ border:1px solid var(--border);
280
+ background:var(--bg);color:var(--text);
281
+ cursor:pointer;transition:.15s;
282
+ }
283
+ .btn:hover{text-decoration:none;border-color:var(--border2)}
284
+ .btn-p{
285
+ background:var(--accent);color:#fff;border-color:var(--accent);
286
+ box-shadow:0 3px 12px rgba(124,58,237,.2);
287
+ }
288
+ .btn-p:hover{background:#6d28d9;color:#fff;border-color:#6d28d9;box-shadow:0 5px 18px rgba(124,58,237,.3);transform:translateY(-1px)}
289
+ .btn-ghost{color:var(--text-dim);border-color:var(--border)}
290
+ .btn-ghost:hover{color:var(--accent);border-color:var(--border2);background:var(--bg-code)}
291
+
292
+ /* ── stat cards ── */
293
+ .stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:32px 0}
294
+ .stat{
295
+ text-align:center;padding:16px 8px;border-radius:8px;
296
+ background:var(--bg-card);border:1px solid var(--border);
297
+ }
298
+ .stat-num{
299
+ font-family:var(--mono);font-size:24px;font-weight:700;
300
+ background:linear-gradient(135deg,#7c3aed,#a78bfa);
301
+ -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;
302
+ line-height:1.2;
303
+ }
304
+ .stat-lbl{font-size:12px;color:var(--text-faint);font-weight:500;margin-top:2px}
305
+
306
+ /* ── grid cards ── */
307
+ .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;margin:24px 0}
308
+ .card{
309
+ padding:20px;border-radius:8px;
310
+ background:var(--bg-card);border:1px solid var(--border);
311
+ transition:.15s;
312
+ }
313
+ .card:hover{border-color:var(--border2);box-shadow:0 4px 16px var(--shadow)}
314
+ .card h3{font-family:var(--mono);font-size:13px;margin-bottom:6px;color:var(--accent)}
315
+ .card p{font-size:13px}
316
+ .card .tag{
317
+ display:inline-block;font-family:var(--mono);font-size:10px;
318
+ padding:1px 7px;border-radius:3px;
319
+ background:var(--bg-code);color:var(--accent);
320
+ border:1px solid var(--border2);margin:6px 2px 0 0;
321
+ }
322
+
323
+ /* ── terminal mock ── */
324
+ .term{
325
+ background:var(--bg-code);border:1px solid var(--border2);
326
+ border-radius:8px;overflow:hidden;margin:32px auto;
327
+ max-width:660px;box-shadow:0 12px 40px var(--shadow);
328
+ }
329
+ .term-bar{
330
+ display:flex;align-items:center;gap:6px;
331
+ padding:10px 14px;background:rgba(124,58,237,.03);
332
+ border-bottom:1px solid var(--border2);
333
+ }
334
+ .term-dot{width:8px;height:8px;border-radius:50%;background:#ddd}
335
+ .term-dot:nth-child(1){background:#ff5f56}
336
+ .term-dot:nth-child(2){background:#ffbd2e}
337
+ .term-dot:nth-child(3){background:#27c93f}
338
+ .term-title{font-family:var(--mono);font-size:11px;color:var(--text-faint);margin-left:6px}
339
+ .term-body{
340
+ padding:14px;font-family:var(--mono);font-size:12px;line-height:1.7;
341
+ color:var(--text);overflow-x:auto;white-space:pre;
342
+ }
343
+ .term-body .p{color:var(--accent);font-weight:600}
344
+ .term-body .d{color:var(--text-faint)}
345
+ .term-body .h{color:var(--accent)}
346
+
347
+ /* ── table ── */
348
+ .table-wrap{overflow-x:auto;margin:16px 0;border-radius:6px;border:1px solid var(--border)}
349
+ table{width:100%;border-collapse:collapse;font-size:13px}
350
+ th{
351
+ font-family:var(--mono);font-size:10px;font-weight:600;text-transform:uppercase;
352
+ text-align:left;padding:8px 12px;letter-spacing:.05em;
353
+ color:var(--accent);background:var(--bg-code);
354
+ border-bottom:1px solid var(--border);
355
+ }
356
+ td{padding:7px 12px;border-bottom:1px solid var(--border);color:var(--text-dim);vertical-align:top}
357
+ tr:last-child td{border:none}
358
+ tr:hover td{background:rgba(124,58,237,.02)}
359
+
360
+ /* ── code blocks ── */
361
+ .code-block-wrap{margin:16px 0;border-radius:6px;border:1px solid var(--border);overflow:hidden}
362
+ .code-block-header{
363
+ display:flex;justify-content:space-between;align-items:center;
364
+ padding:6px 10px;background:var(--bg-card);
365
+ border-bottom:1px solid var(--border);font-size:11px;color:var(--text-faint);
366
+ font-family:var(--mono);
367
+ }
368
+ .code-block-wrap pre{margin:0;border:none;border-radius:0}
369
+ .copy-btn{
370
+ background:none;border:1px solid var(--border);border-radius:4px;
371
+ color:var(--text-faint);font-size:10px;padding:2px 8px;cursor:pointer;font-family:var(--mono);transition:.1s;
372
+ }
373
+ .copy-btn:hover{background:var(--bg-hover);color:var(--accent);border-color:var(--accent2)}
374
+ .copy-btn.copied{background:var(--bg-code);color:var(--accent);border-color:var(--accent)}
375
+
376
+ /* ── language toggle (kept for backward compat) ── */
377
+ .lang-select{display:none}
378
+
379
+ /* ── misc ── */
380
+ hr{border:none;border-top:1px solid var(--border);margin:40px 0}
381
+ .footer{
382
+ margin-top:60px;padding-top:20px;border-top:1px solid var(--border);
383
+ display:flex;justify-content:space-between;align-items:center;gap:16px;
384
+ font-size:12px;color:var(--text-faint);flex-wrap:wrap;
385
+ }
386
+ .footer-links{display:flex;gap:16px}
387
+ .footer-links a{color:var(--text-faint);font-size:12px}
388
+ .footer-links a:hover{color:var(--accent)}
389
+
390
+ .menu-btn{display:none;width:32px;height:32px;border:1px solid var(--border);border-radius:5px;background:none;cursor:pointer;flex-direction:column;justify-content:center;align-items:center;gap:4px;margin-left:auto}
391
+ .menu-btn span{display:block;width:16px;height:2px;background:var(--text-dim);border-radius:2px}
392
+ .sidebar-overlay{display:none}
393
+
394
+ /* ── responsive ── */
395
+ @media(max-width:900px){
396
+ .sidebar{display:none}
397
+ .content-wrap{margin-left:0}
398
+ .content{padding:calc(var(--header-h) + 16px) 20px 40px}
399
+ .header-nav,.header-search,.header-breadcrumbs,.lang-toggle{display:none}
400
+ .menu-btn{display:flex}
401
+ .stats{grid-template-columns:repeat(2,1fr)}
402
+ .grid{grid-template-columns:1fr}
403
+ .hero h1{font-size:26px}
404
+
405
+ .sidebar.open{
406
+ display:block;position:fixed;top:var(--header-h);left:0;right:0;bottom:0;
407
+ width:auto;z-index:200;background:var(--bg);padding:24px;
408
+ border-right:none;animation:slideIn .15s ease-out;
409
+ }
410
+ .sidebar.open .header-search{
411
+ display:block;margin:0 0 16px;position:static;
412
+ }
413
+ .sidebar.open .header-search input{width:100%}
414
+ .sidebar.open .header-nav{display:flex;flex-direction:column;gap:2px}
415
+ .sidebar-overlay.open{display:block;position:fixed;inset:0;background:rgba(0,0,0,.3);z-index:199}
416
+ }
417
+
418
+ @media(max-width:1200px){
419
+ .toc-sidebar{display:none !important}
420
+ }
421
+
422
+ @keyframes slideIn{
423
+ from{transform:translateX(-100%)}
424
+ to{transform:translateX(0)}
425
+ }