cicy-desktop 2.1.69 → 2.1.71
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.
- package/package.json +7 -7
- package/src/backends/homepage-react/assets/index-BpljolQs.js +365 -0
- package/src/backends/homepage-react/assets/{index-BniEbx_j.css → index-C9AZlTew.css} +1 -1
- package/src/backends/homepage-react/index.html +2 -2
- package/src/backends/local-teams.js +42 -4
- package/src/backends/sidecar-ipc.js +23 -1
- package/src/i18n/locales/en.json +9 -7
- package/src/i18n/locales/zh-CN.json +9 -7
- package/src/sidecar/cicy-code.js +54 -111
- package/src/sidecar/localbin.js +133 -0
- package/src/sidecar/native.js +4 -2
- package/src/sidecar/runtime.js +7 -3
- package/workers/render/src/App.css +156 -10
- package/workers/render/src/App.jsx +254 -39
- package/.env.dev +0 -7
- package/src/backends/homepage-react/assets/index-B8gGhz8B.js +0 -365
- package/workers/render.bak.20260528-2338/DESIGN_v2.md +0 -254
- package/workers/render.bak.20260528-2338/index.html +0 -12
- package/workers/render.bak.20260528-2338/package-lock.json +0 -827
- package/workers/render.bak.20260528-2338/package.json +0 -19
- package/workers/render.bak.20260528-2338/public/_headers +0 -5
- package/workers/render.bak.20260528-2338/public/manifest.json +0 -6
- package/workers/render.bak.20260528-2338/src/App.css +0 -224
- package/workers/render.bak.20260528-2338/src/App.jsx +0 -1028
- package/workers/render.bak.20260528-2338/src/api.js +0 -285
- package/workers/render.bak.20260528-2338/src/cicycode-ops.js +0 -222
- package/workers/render.bak.20260528-2338/src/components/BackendCard.css +0 -299
- package/workers/render.bak.20260528-2338/src/components/BackendCard.jsx +0 -133
- package/workers/render.bak.20260528-2338/src/components/BackendModal.css +0 -161
- package/workers/render.bak.20260528-2338/src/components/BackendModal.jsx +0 -199
- package/workers/render.bak.20260528-2338/src/components/Button.css +0 -72
- package/workers/render.bak.20260528-2338/src/components/Button.jsx +0 -37
- package/workers/render.bak.20260528-2338/src/components/Card.css +0 -42
- package/workers/render.bak.20260528-2338/src/components/Card.jsx +0 -21
- package/workers/render.bak.20260528-2338/src/components/Icon.jsx +0 -30
- package/workers/render.bak.20260528-2338/src/components/Menu.css +0 -55
- package/workers/render.bak.20260528-2338/src/components/Menu.jsx +0 -91
- package/workers/render.bak.20260528-2338/src/components/SidecarBanner.css +0 -79
- package/workers/render.bak.20260528-2338/src/components/SidecarBanner.jsx +0 -84
- package/workers/render.bak.20260528-2338/src/components/StatusChip.css +0 -19
- package/workers/render.bak.20260528-2338/src/components/StatusChip.jsx +0 -31
- package/workers/render.bak.20260528-2338/src/components/Toast.css +0 -31
- package/workers/render.bak.20260528-2338/src/components/Toast.jsx +0 -23
- package/workers/render.bak.20260528-2338/src/components/WslSetupBanner.css +0 -464
- package/workers/render.bak.20260528-2338/src/components/WslSetupBanner.jsx +0 -716
- package/workers/render.bak.20260528-2338/src/dockerInstaller.js +0 -0
- package/workers/render.bak.20260528-2338/src/i18n/en.json +0 -116
- package/workers/render.bak.20260528-2338/src/i18n/fr.json +0 -116
- package/workers/render.bak.20260528-2338/src/i18n/index.js +0 -69
- package/workers/render.bak.20260528-2338/src/i18n/ja.json +0 -116
- package/workers/render.bak.20260528-2338/src/i18n/zh-CN.json +0 -121
- package/workers/render.bak.20260528-2338/src/main.js +0 -475
- package/workers/render.bak.20260528-2338/src/main.jsx +0 -18
- package/workers/render.bak.20260528-2338/src/style.css +0 -275
- package/workers/render.bak.20260528-2338/src/styles/base.css +0 -98
- package/workers/render.bak.20260528-2338/src/styles/tokens.css +0 -90
- package/workers/render.bak.20260528-2338/src/tos.js +0 -72
- package/workers/render.bak.20260528-2338/src/worker.js +0 -40
- package/workers/render.bak.20260528-2338/src/wslInstaller.js +0 -1563
- package/workers/render.bak.20260528-2338/vite.config.js +0 -36
- package/workers/render.bak.20260528-2338/wrangler.toml +0 -17
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
/* CiCy Desktop — Homepage. Loaded inside Electron (homepage-window.js)
|
|
2
|
-
or in a plain browser tab (Vite dev). Same stylesheet for both. */
|
|
3
|
-
|
|
4
|
-
:root {
|
|
5
|
-
--bg: #0f1115;
|
|
6
|
-
--bg-2: #161a21;
|
|
7
|
-
--bg-card: #181c24;
|
|
8
|
-
--bg-card-hover: #1c2230;
|
|
9
|
-
--border: #232938;
|
|
10
|
-
--border-strong: #2e3548;
|
|
11
|
-
--fg: #e6e9ef;
|
|
12
|
-
--fg-dim: #9aa3b2;
|
|
13
|
-
--fg-mute: #5e6678;
|
|
14
|
-
--accent: #5b8df7;
|
|
15
|
-
--accent-2: #3c6fde;
|
|
16
|
-
--green: #4ade80;
|
|
17
|
-
--yellow: #facc15;
|
|
18
|
-
--red: #f87171;
|
|
19
|
-
--gray: #6b7280;
|
|
20
|
-
--radius: 8px;
|
|
21
|
-
--shadow: 0 1px 0 rgba(255,255,255,0.02), 0 8px 24px rgba(0,0,0,0.25);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
* { box-sizing: border-box; }
|
|
25
|
-
html, body { margin: 0; padding: 0; height: 100%; background: var(--bg); color: var(--fg); }
|
|
26
|
-
body {
|
|
27
|
-
font: 13px -apple-system, BlinkMacSystemFont, "SF Pro Text", "Helvetica Neue", system-ui, sans-serif;
|
|
28
|
-
-webkit-font-smoothing: antialiased;
|
|
29
|
-
display: flex; flex-direction: column; min-height: 100vh;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
.topbar {
|
|
33
|
-
-webkit-app-region: drag;
|
|
34
|
-
display: flex; align-items: center; gap: 12px;
|
|
35
|
-
padding: 10px 20px 10px 84px;
|
|
36
|
-
background: var(--bg-2);
|
|
37
|
-
border-bottom: 1px solid var(--border);
|
|
38
|
-
user-select: none;
|
|
39
|
-
}
|
|
40
|
-
.topbar .brand {
|
|
41
|
-
font-weight: 600; font-size: 13px; letter-spacing: 0.2px; color: var(--fg);
|
|
42
|
-
display: flex; align-items: center; gap: 8px;
|
|
43
|
-
}
|
|
44
|
-
.topbar .brand .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 8px var(--accent); }
|
|
45
|
-
.topbar .ver { font-size: 11px; color: var(--fg-mute); margin-left: 4px; }
|
|
46
|
-
.topbar .spacer { flex: 1; }
|
|
47
|
-
.topbar .env-pill {
|
|
48
|
-
-webkit-app-region: no-drag;
|
|
49
|
-
background: rgba(91, 141, 247, 0.12);
|
|
50
|
-
color: var(--accent);
|
|
51
|
-
font-size: 10px; font-weight: 600; letter-spacing: 0.5px;
|
|
52
|
-
padding: 3px 7px; border-radius: 3px;
|
|
53
|
-
}
|
|
54
|
-
.topbar button {
|
|
55
|
-
-webkit-app-region: no-drag;
|
|
56
|
-
background: transparent; border: 1px solid var(--border); color: var(--fg-dim);
|
|
57
|
-
padding: 5px 10px; font: inherit; font-size: 12px;
|
|
58
|
-
border-radius: 5px; cursor: pointer;
|
|
59
|
-
display: inline-flex; align-items: center; gap: 6px;
|
|
60
|
-
}
|
|
61
|
-
.topbar button:hover { color: var(--fg); border-color: var(--border-strong); }
|
|
62
|
-
|
|
63
|
-
main {
|
|
64
|
-
flex: 1; padding: 24px 24px 40px;
|
|
65
|
-
max-width: 920px; width: 100%; margin: 0 auto;
|
|
66
|
-
}
|
|
67
|
-
.section-head {
|
|
68
|
-
display: flex; align-items: center; justify-content: space-between;
|
|
69
|
-
margin: 18px 0 10px;
|
|
70
|
-
}
|
|
71
|
-
.section-head h2 {
|
|
72
|
-
margin: 0;
|
|
73
|
-
font-size: 11px; font-weight: 600; letter-spacing: 1px;
|
|
74
|
-
text-transform: uppercase; color: var(--fg-mute);
|
|
75
|
-
}
|
|
76
|
-
.section-head .actions { display: flex; gap: 8px; }
|
|
77
|
-
.section-head .btn-add {
|
|
78
|
-
-webkit-app-region: no-drag;
|
|
79
|
-
background: transparent; border: 1px dashed var(--border-strong);
|
|
80
|
-
color: var(--fg-dim); padding: 4px 10px; font: inherit; font-size: 11px;
|
|
81
|
-
border-radius: 4px; cursor: pointer;
|
|
82
|
-
}
|
|
83
|
-
.section-head .btn-add:hover { color: var(--fg); border-color: var(--accent); }
|
|
84
|
-
|
|
85
|
-
.card {
|
|
86
|
-
background: var(--bg-card);
|
|
87
|
-
border: 1px solid var(--border);
|
|
88
|
-
border-radius: var(--radius);
|
|
89
|
-
box-shadow: var(--shadow);
|
|
90
|
-
transition: border-color 120ms ease;
|
|
91
|
-
margin-bottom: 10px;
|
|
92
|
-
overflow: hidden;
|
|
93
|
-
}
|
|
94
|
-
.card:hover { border-color: var(--border-strong); }
|
|
95
|
-
.card-row { padding: 14px 16px; display: flex; align-items: center; gap: 12px; }
|
|
96
|
-
.card-row + .card-row { border-top: 1px solid var(--border); }
|
|
97
|
-
.status-dot {
|
|
98
|
-
width: 10px; height: 10px; border-radius: 50%;
|
|
99
|
-
background: var(--gray); flex-shrink: 0;
|
|
100
|
-
box-shadow: 0 0 6px transparent;
|
|
101
|
-
transition: background 120ms, box-shadow 120ms;
|
|
102
|
-
}
|
|
103
|
-
.status-dot.s-up { background: var(--green); box-shadow: 0 0 6px rgba(74, 222, 128, 0.6); }
|
|
104
|
-
.status-dot.s-warn { background: var(--yellow); }
|
|
105
|
-
.status-dot.s-down { background: var(--red); }
|
|
106
|
-
.status-dot.s-unknown { background: var(--gray); }
|
|
107
|
-
|
|
108
|
-
.head-text { flex: 1; min-width: 0; }
|
|
109
|
-
.head-text .name { font-size: 14px; font-weight: 600; color: var(--fg); display: flex; align-items: center; gap: 8px; }
|
|
110
|
-
.head-text .meta { font-size: 11px; color: var(--fg-mute); margin-top: 3px; word-break: break-all; }
|
|
111
|
-
.head-right { display: flex; align-items: center; gap: 10px; font-size: 11px; color: var(--fg-dim); }
|
|
112
|
-
.badge { background: rgba(91, 141, 247, 0.12); color: var(--accent); font-size: 10px; padding: 2px 6px; border-radius: 3px; font-weight: 600; letter-spacing: 0.4px; }
|
|
113
|
-
|
|
114
|
-
.metric-row { padding: 10px 16px; background: rgba(255,255,255,0.012); display: flex; gap: 24px; font-size: 11px; color: var(--fg-dim); flex-wrap: wrap; }
|
|
115
|
-
.metric-row .m { display: flex; align-items: baseline; gap: 6px; }
|
|
116
|
-
.metric-row .m .k { color: var(--fg-mute); font-size: 10px; text-transform: uppercase; letter-spacing: 0.5px; }
|
|
117
|
-
.metric-row .m .v { color: var(--fg); font-weight: 500; font-size: 12px; }
|
|
118
|
-
|
|
119
|
-
.action-row { padding: 10px 12px; display: flex; gap: 6px; flex-wrap: wrap; background: rgba(0,0,0,0.15); }
|
|
120
|
-
.action-row button {
|
|
121
|
-
background: transparent;
|
|
122
|
-
border: 1px solid var(--border-strong);
|
|
123
|
-
color: var(--fg-dim);
|
|
124
|
-
padding: 5px 12px;
|
|
125
|
-
font: inherit; font-size: 12px;
|
|
126
|
-
border-radius: 4px;
|
|
127
|
-
cursor: pointer;
|
|
128
|
-
display: inline-flex; align-items: center; gap: 5px;
|
|
129
|
-
transition: all 120ms;
|
|
130
|
-
}
|
|
131
|
-
.action-row button:hover { color: var(--fg); border-color: var(--accent); background: rgba(91, 141, 247, 0.06); }
|
|
132
|
-
.action-row button.primary { background: var(--accent-2); color: #fff; border-color: var(--accent-2); }
|
|
133
|
-
.action-row button.primary:hover { background: var(--accent); border-color: var(--accent); }
|
|
134
|
-
.action-row button.danger:hover { color: var(--red); border-color: var(--red); background: rgba(248, 113, 113, 0.06); }
|
|
135
|
-
.action-row .grow { flex: 1; }
|
|
136
|
-
.action-row .upd-tip { font-size: 11px; color: var(--yellow); align-self: center; padding: 0 6px; }
|
|
137
|
-
|
|
138
|
-
.recent {
|
|
139
|
-
margin-top: 28px;
|
|
140
|
-
padding-top: 16px;
|
|
141
|
-
border-top: 1px solid var(--border);
|
|
142
|
-
}
|
|
143
|
-
.recent-row {
|
|
144
|
-
display: flex; align-items: center; gap: 12px;
|
|
145
|
-
padding: 8px 4px;
|
|
146
|
-
font-size: 12px;
|
|
147
|
-
color: var(--fg-dim);
|
|
148
|
-
border-bottom: 1px solid rgba(255,255,255,0.02);
|
|
149
|
-
}
|
|
150
|
-
.recent-row .label { flex: 1; }
|
|
151
|
-
.recent-row .label .name { color: var(--fg); font-weight: 500; }
|
|
152
|
-
.recent-row .label .sub { font-size: 11px; color: var(--fg-mute); margin-top: 2px; }
|
|
153
|
-
.recent-row .ago { font-size: 11px; color: var(--fg-mute); margin-right: 8px; }
|
|
154
|
-
.recent-row button { background: transparent; border: 1px solid var(--border-strong); color: var(--fg-dim); padding: 4px 10px; border-radius: 4px; cursor: pointer; font: inherit; font-size: 11px; }
|
|
155
|
-
.recent-row button:hover { color: var(--fg); border-color: var(--accent); }
|
|
156
|
-
|
|
157
|
-
.add-form {
|
|
158
|
-
background: var(--bg-card);
|
|
159
|
-
border: 1px solid var(--border);
|
|
160
|
-
border-radius: var(--radius);
|
|
161
|
-
padding: 14px 16px;
|
|
162
|
-
margin-bottom: 10px;
|
|
163
|
-
display: none;
|
|
164
|
-
}
|
|
165
|
-
.add-form.open { display: block; }
|
|
166
|
-
.add-form .grid {
|
|
167
|
-
display: grid; grid-template-columns: 70px 1fr;
|
|
168
|
-
gap: 8px 12px; align-items: center;
|
|
169
|
-
}
|
|
170
|
-
.add-form label { font-size: 12px; color: var(--fg-mute); }
|
|
171
|
-
.add-form input {
|
|
172
|
-
background: var(--bg);
|
|
173
|
-
color: var(--fg);
|
|
174
|
-
border: 1px solid var(--border-strong);
|
|
175
|
-
border-radius: 4px;
|
|
176
|
-
padding: 6px 9px;
|
|
177
|
-
font: inherit; font-size: 12px;
|
|
178
|
-
}
|
|
179
|
-
.add-form input:focus { outline: none; border-color: var(--accent); }
|
|
180
|
-
.add-form .footer { display: flex; align-items: center; justify-content: space-between; margin-top: 12px; }
|
|
181
|
-
.add-form .status { font-size: 11px; color: var(--fg-mute); }
|
|
182
|
-
.add-form .status.ok { color: var(--green); }
|
|
183
|
-
.add-form .status.err { color: var(--red); }
|
|
184
|
-
.add-form .btns { display: flex; gap: 6px; }
|
|
185
|
-
.add-form button {
|
|
186
|
-
background: var(--accent-2); color: #fff; border: 1px solid var(--accent-2);
|
|
187
|
-
padding: 5px 14px; border-radius: 4px; cursor: pointer; font: inherit; font-size: 12px;
|
|
188
|
-
}
|
|
189
|
-
.add-form button.cancel { background: transparent; border-color: var(--border-strong); color: var(--fg-dim); }
|
|
190
|
-
.add-form button:hover { background: var(--accent); border-color: var(--accent); }
|
|
191
|
-
.add-form button.cancel:hover { background: rgba(255,255,255,0.04); }
|
|
192
|
-
|
|
193
|
-
.empty { text-align: center; color: var(--fg-mute); padding: 20px; font-size: 12px; }
|
|
194
|
-
|
|
195
|
-
.toast {
|
|
196
|
-
position: fixed; bottom: 18px; left: 50%; transform: translateX(-50%);
|
|
197
|
-
background: var(--bg-card); border: 1px solid var(--border-strong);
|
|
198
|
-
padding: 8px 16px; border-radius: 6px;
|
|
199
|
-
color: var(--fg); font-size: 12px;
|
|
200
|
-
box-shadow: var(--shadow);
|
|
201
|
-
opacity: 0; transition: opacity 200ms;
|
|
202
|
-
pointer-events: none;
|
|
203
|
-
}
|
|
204
|
-
.toast.show { opacity: 1; }
|
|
205
|
-
.toast.err { border-color: var(--red); color: var(--red); }
|
|
206
|
-
|
|
207
|
-
/* --- ToS overlay --- */
|
|
208
|
-
.tos-overlay {
|
|
209
|
-
position: fixed; inset: 0;
|
|
210
|
-
background: rgba(15, 17, 21, 0.92);
|
|
211
|
-
backdrop-filter: blur(4px);
|
|
212
|
-
display: flex; align-items: center; justify-content: center;
|
|
213
|
-
z-index: 1000;
|
|
214
|
-
}
|
|
215
|
-
.tos-modal {
|
|
216
|
-
width: min(680px, 92vw); max-height: 86vh;
|
|
217
|
-
background: var(--bg-card);
|
|
218
|
-
border: 1px solid var(--border-strong);
|
|
219
|
-
border-radius: 10px;
|
|
220
|
-
box-shadow: 0 18px 48px rgba(0,0,0,0.5);
|
|
221
|
-
display: flex; flex-direction: column;
|
|
222
|
-
overflow: hidden;
|
|
223
|
-
}
|
|
224
|
-
.tos-header {
|
|
225
|
-
padding: 16px 20px;
|
|
226
|
-
border-bottom: 1px solid var(--border);
|
|
227
|
-
display: flex; align-items: center; gap: 10px;
|
|
228
|
-
}
|
|
229
|
-
.tos-header .icon { font-size: 18px; }
|
|
230
|
-
.tos-header h2 { margin: 0; font-size: 15px; font-weight: 600; color: var(--fg); }
|
|
231
|
-
.tos-header .ver { font-size: 11px; color: var(--fg-mute); margin-left: auto; }
|
|
232
|
-
.tos-body {
|
|
233
|
-
flex: 1; overflow-y: auto;
|
|
234
|
-
padding: 18px 22px;
|
|
235
|
-
font-size: 13px; line-height: 1.65;
|
|
236
|
-
color: var(--fg);
|
|
237
|
-
white-space: pre-wrap;
|
|
238
|
-
font-family: -apple-system, system-ui, sans-serif;
|
|
239
|
-
}
|
|
240
|
-
.tos-body h1, .tos-body h2, .tos-body h3 {
|
|
241
|
-
color: var(--fg);
|
|
242
|
-
margin: 16px 0 8px;
|
|
243
|
-
}
|
|
244
|
-
.tos-body h1 { font-size: 16px; }
|
|
245
|
-
.tos-body h2 { font-size: 14px; font-weight: 600; color: var(--accent); }
|
|
246
|
-
.tos-body strong { color: var(--fg); }
|
|
247
|
-
.tos-body code { font-size: 12px; color: var(--accent); padding: 1px 4px; background: rgba(91,141,247,0.08); border-radius: 3px; }
|
|
248
|
-
.tos-footer {
|
|
249
|
-
padding: 14px 20px;
|
|
250
|
-
border-top: 1px solid var(--border);
|
|
251
|
-
display: flex; align-items: center; gap: 12px;
|
|
252
|
-
background: rgba(0,0,0,0.2);
|
|
253
|
-
}
|
|
254
|
-
.tos-footer label {
|
|
255
|
-
font-size: 12px; color: var(--fg-dim); cursor: pointer;
|
|
256
|
-
display: flex; align-items: center; gap: 8px;
|
|
257
|
-
flex: 1;
|
|
258
|
-
}
|
|
259
|
-
.tos-footer input[type=checkbox] {
|
|
260
|
-
width: 14px; height: 14px; cursor: pointer; accent-color: var(--accent);
|
|
261
|
-
}
|
|
262
|
-
.tos-footer button {
|
|
263
|
-
font: inherit; font-size: 13px; font-weight: 500;
|
|
264
|
-
padding: 8px 18px; border-radius: 5px; cursor: pointer;
|
|
265
|
-
border: 1px solid transparent;
|
|
266
|
-
}
|
|
267
|
-
.tos-footer .decline {
|
|
268
|
-
background: transparent; border-color: var(--border-strong); color: var(--fg-dim);
|
|
269
|
-
}
|
|
270
|
-
.tos-footer .decline:hover { color: var(--red); border-color: var(--red); }
|
|
271
|
-
.tos-footer .accept {
|
|
272
|
-
background: var(--accent-2); color: #fff; border-color: var(--accent-2);
|
|
273
|
-
}
|
|
274
|
-
.tos-footer .accept:disabled { opacity: 0.4; cursor: not-allowed; }
|
|
275
|
-
.tos-footer .accept:not(:disabled):hover { background: var(--accent); border-color: var(--accent); }
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
*, *::before, *::after { box-sizing: border-box; }
|
|
2
|
-
|
|
3
|
-
html, body, #root {
|
|
4
|
-
height: 100%;
|
|
5
|
-
margin: 0;
|
|
6
|
-
padding: 0;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
body {
|
|
10
|
-
font: var(--t-sm)/var(--lh-base) var(--font-sans);
|
|
11
|
-
background: var(--bg);
|
|
12
|
-
color: var(--fg);
|
|
13
|
-
-webkit-font-smoothing: antialiased;
|
|
14
|
-
text-rendering: optimizeLegibility;
|
|
15
|
-
/* App-wide: text is unselectable by default — feels native, prevents
|
|
16
|
-
accidental drag-to-select. Inputs and explicit .selectable get an
|
|
17
|
-
allow-list below. */
|
|
18
|
-
user-select: none;
|
|
19
|
-
-webkit-user-select: none;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/* Allow text selection in inputs and explicitly opted-in elements. */
|
|
23
|
-
input, textarea, [contenteditable], code, kbd, samp, pre, .selectable {
|
|
24
|
-
user-select: text;
|
|
25
|
-
-webkit-user-select: text;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/* Hide scrollbars on app shell — list scrollers manage their own. */
|
|
29
|
-
body { overflow: hidden; }
|
|
30
|
-
#root { overflow: auto; }
|
|
31
|
-
|
|
32
|
-
/* ── App-wide custom scrollbars ───────────────────────────────────────
|
|
33
|
-
Replaces the chunky OS default scrollbar with a thin, semi-transparent
|
|
34
|
-
thumb that fades in on hover. Applies to every scrollable region —
|
|
35
|
-
#root (main page scroll), tab panels, the WSL install log, etc.
|
|
36
|
-
Firefox uses scrollbar-* (limited but native), WebKit/Chromium uses
|
|
37
|
-
the ::-webkit-scrollbar pseudo-elements (full custom). */
|
|
38
|
-
* {
|
|
39
|
-
scrollbar-width: thin;
|
|
40
|
-
scrollbar-color: color-mix(in srgb, var(--fg-3, #8b949e) 30%, transparent) transparent;
|
|
41
|
-
}
|
|
42
|
-
*::-webkit-scrollbar {
|
|
43
|
-
width: 10px;
|
|
44
|
-
height: 10px;
|
|
45
|
-
}
|
|
46
|
-
*::-webkit-scrollbar-track {
|
|
47
|
-
background: transparent;
|
|
48
|
-
}
|
|
49
|
-
*::-webkit-scrollbar-thumb {
|
|
50
|
-
background: color-mix(in srgb, var(--fg-3, #8b949e) 25%, transparent);
|
|
51
|
-
border-radius: 6px;
|
|
52
|
-
border: 2px solid transparent;
|
|
53
|
-
background-clip: padding-box;
|
|
54
|
-
transition: background 0.15s ease;
|
|
55
|
-
}
|
|
56
|
-
*::-webkit-scrollbar-thumb:hover {
|
|
57
|
-
background: color-mix(in srgb, var(--fg-3, #8b949e) 55%, transparent);
|
|
58
|
-
background-clip: padding-box;
|
|
59
|
-
}
|
|
60
|
-
*::-webkit-scrollbar-corner {
|
|
61
|
-
background: transparent;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
button {
|
|
65
|
-
font: inherit;
|
|
66
|
-
cursor: pointer;
|
|
67
|
-
border: 0;
|
|
68
|
-
background: transparent;
|
|
69
|
-
color: inherit;
|
|
70
|
-
padding: 0;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
button:focus { outline: none; }
|
|
74
|
-
button:focus-visible { box-shadow: var(--focus-ring); border-radius: var(--r-sm); }
|
|
75
|
-
|
|
76
|
-
input, textarea, select {
|
|
77
|
-
font: inherit;
|
|
78
|
-
color: inherit;
|
|
79
|
-
background: transparent;
|
|
80
|
-
border: 0;
|
|
81
|
-
outline: none;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
a { color: var(--brand); text-decoration: none; }
|
|
85
|
-
a:hover { text-decoration: underline; }
|
|
86
|
-
|
|
87
|
-
code, kbd, samp { font-family: var(--font-mono); font-size: 0.92em; }
|
|
88
|
-
|
|
89
|
-
/* Drag region (Electron frameless on macOS) */
|
|
90
|
-
.drag { -webkit-app-region: drag; }
|
|
91
|
-
.no-drag { -webkit-app-region: no-drag; }
|
|
92
|
-
|
|
93
|
-
/* Utility: visually hidden but accessible */
|
|
94
|
-
.sr-only {
|
|
95
|
-
position: absolute; width: 1px; height: 1px;
|
|
96
|
-
padding: 0; margin: -1px; overflow: hidden;
|
|
97
|
-
clip: rect(0,0,0,0); white-space: nowrap; border: 0;
|
|
98
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/* Design tokens — single source of truth for spacing, type, colors,
|
|
2
|
-
radius, shadows, motion. Components only reference these vars. */
|
|
3
|
-
|
|
4
|
-
:root {
|
|
5
|
-
/* ── spacing ── 4-pt scale */
|
|
6
|
-
--sp-1: 4px;
|
|
7
|
-
--sp-2: 8px;
|
|
8
|
-
--sp-3: 12px;
|
|
9
|
-
--sp-4: 16px;
|
|
10
|
-
--sp-5: 24px;
|
|
11
|
-
--sp-6: 32px;
|
|
12
|
-
--sp-7: 48px;
|
|
13
|
-
--sp-8: 64px;
|
|
14
|
-
|
|
15
|
-
/* ── type ── 3-step scale */
|
|
16
|
-
--t-xs: 11px; /* meta, hints */
|
|
17
|
-
--t-sm: 13px; /* body */
|
|
18
|
-
--t-md: 15px; /* card titles, primary */
|
|
19
|
-
--t-lg: 18px; /* section headers */
|
|
20
|
-
--t-xl: 22px; /* page title */
|
|
21
|
-
--lh-tight: 1.25;
|
|
22
|
-
--lh-base: 1.5;
|
|
23
|
-
|
|
24
|
-
--font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Helvetica Neue", "Inter", system-ui, sans-serif;
|
|
25
|
-
--font-mono: ui-monospace, "Cascadia Code", "Cascadia Mono", Consolas, SFMono-Regular, "JetBrains Mono", Menlo, "Courier New", monospace;
|
|
26
|
-
|
|
27
|
-
/* ── colors ── single brand, semantic states */
|
|
28
|
-
--bg: #0d1117;
|
|
29
|
-
--bg-elev-1: #141a23;
|
|
30
|
-
--bg-elev-2: #1b222d;
|
|
31
|
-
|
|
32
|
-
--hairline: rgba(255,255,255,0.06);
|
|
33
|
-
--hairline-2: rgba(255,255,255,0.10);
|
|
34
|
-
|
|
35
|
-
--fg: #e7e9ee;
|
|
36
|
-
--fg-2: #a0a6b3;
|
|
37
|
-
--fg-3: #6b727f;
|
|
38
|
-
|
|
39
|
-
--brand: #5b8cff; /* primary action */
|
|
40
|
-
--brand-fg: #ffffff;
|
|
41
|
-
--brand-soft: rgba(91,140,255,0.12);
|
|
42
|
-
--brand-soft-2: rgba(91,140,255,0.20);
|
|
43
|
-
|
|
44
|
-
--success: #4ade80;
|
|
45
|
-
--warn: #fbbf24;
|
|
46
|
-
--danger: #f87171;
|
|
47
|
-
|
|
48
|
-
/* ── aliases (BackendCard etc.) ── */
|
|
49
|
-
--ok: #4ade80;
|
|
50
|
-
--err: #f87171;
|
|
51
|
-
--accent-cloud: #f59e0b;
|
|
52
|
-
--hairline-strong: #2a2f3a;
|
|
53
|
-
|
|
54
|
-
--success-soft: rgba(74,222,128,0.12);
|
|
55
|
-
--warn-soft: rgba(251,191,36,0.12);
|
|
56
|
-
--danger-soft: rgba(248,113,113,0.12);
|
|
57
|
-
|
|
58
|
-
/* ── radius ── 2-step */
|
|
59
|
-
--r-sm: 6px;
|
|
60
|
-
--r-md: 12px;
|
|
61
|
-
--r-lg: 16px;
|
|
62
|
-
--r-pill: 999px;
|
|
63
|
-
|
|
64
|
-
/* ── shadows ── */
|
|
65
|
-
--shadow-1: 0 1px 2px rgba(0,0,0,0.20);
|
|
66
|
-
--shadow-2: 0 4px 12px rgba(0,0,0,0.25);
|
|
67
|
-
--shadow-3: 0 12px 32px rgba(0,0,0,0.40);
|
|
68
|
-
|
|
69
|
-
/* ── motion ── */
|
|
70
|
-
--ease: cubic-bezier(0.2, 0.8, 0.2, 1);
|
|
71
|
-
--dur-fast: 120ms;
|
|
72
|
-
--dur-base: 180ms;
|
|
73
|
-
|
|
74
|
-
/* ── focus ── */
|
|
75
|
-
--focus-ring: 0 0 0 2px var(--brand);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/* light mode override (optional, low priority) */
|
|
79
|
-
@media (prefers-color-scheme: light) {
|
|
80
|
-
:root.auto-theme {
|
|
81
|
-
--bg: #f7f8fa;
|
|
82
|
-
--bg-elev-1: #ffffff;
|
|
83
|
-
--bg-elev-2: #ffffff;
|
|
84
|
-
--hairline: rgba(0,0,0,0.06);
|
|
85
|
-
--hairline-2:rgba(0,0,0,0.10);
|
|
86
|
-
--fg: #15181f;
|
|
87
|
-
--fg-2: #4a5160;
|
|
88
|
-
--fg-3: #8a909d;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
// Terms of Service — shown as a blocking overlay on first launch and any
|
|
2
|
-
// time the version bumps. Replace TOS_TEXT with the canonical legal text
|
|
3
|
-
// once it's lawyer-reviewed; bump TOS_VERSION to re-prompt all users.
|
|
4
|
-
|
|
5
|
-
export const TOS_VERSION = "2026-05-18";
|
|
6
|
-
|
|
7
|
-
export const TOS_TEXT = `# CiCy Desktop 使用条款 / Terms of Service
|
|
8
|
-
|
|
9
|
-
**版本 / Version:** ${"2026-05-18"}
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## 1. 软件能力 / What this software does
|
|
14
|
-
|
|
15
|
-
CiCy Desktop 是一个本地客户端,运行在你自己的电脑上。它会:
|
|
16
|
-
|
|
17
|
-
- 启动并管理一个本地 cicy-code 引擎(npx / Docker)
|
|
18
|
-
- 允许你连接的 cicy-code 后端(本地或云端)向客户端发送指令
|
|
19
|
-
- 通过 Electron 内嵌的 Chrome 实例执行网页自动化
|
|
20
|
-
- 在你明确授权后访问剪贴板、文件、屏幕信息等系统能力
|
|
21
|
-
|
|
22
|
-
CiCy Desktop is a local client that runs on your own device. It runs a
|
|
23
|
-
local cicy-code engine, accepts commands from cicy-code backends you
|
|
24
|
-
have configured, and — with your explicit consent — interacts with your
|
|
25
|
-
operating system (clipboard, files, screen) and a bundled Chrome session.
|
|
26
|
-
|
|
27
|
-
## 2. 你的责任 / Your responsibilities
|
|
28
|
-
|
|
29
|
-
使用本软件,即表示你确认:
|
|
30
|
-
|
|
31
|
-
- 你**对本设备拥有完全控制权或合法授权**
|
|
32
|
-
- 你**仅在自己拥有 / 合法授权的设备上**安装和使用本软件
|
|
33
|
-
- 你**理解并同意** cicy-code 后端在你授权范围内可以读取本设备的剪贴板、屏幕、文件和浏览器状态
|
|
34
|
-
- 你**不会将本软件用于**:监控他人未经同意的设备、入侵他人系统、批量分发到未经授权的终端
|
|
35
|
-
|
|
36
|
-
By using this software you confirm you control or are authorised to
|
|
37
|
-
control this device, that you will only install it on devices you own or
|
|
38
|
-
are licensed to use, and that you will not use it to access devices you
|
|
39
|
-
are not authorised to use.
|
|
40
|
-
|
|
41
|
-
## 3. 数据收集 / Data collection
|
|
42
|
-
|
|
43
|
-
CiCy Desktop 本身不向开发者上传任何使用数据。所有 agent 指令、剪贴板内
|
|
44
|
-
容、屏幕截图都只在你和你配置的后端之间传输。云端 backend 的数据收集
|
|
45
|
-
策略由该后端 (cicy-ai.com 或第三方) 单独披露。
|
|
46
|
-
|
|
47
|
-
CiCy Desktop itself does not phone home. Your interactions are between
|
|
48
|
-
the client and the cicy-code backends you choose to connect to.
|
|
49
|
-
|
|
50
|
-
## 4. 取消授权 / Revocation
|
|
51
|
-
|
|
52
|
-
你可以随时关闭本软件、在 Homepage 上断开任意 backend、或在系统里卸载
|
|
53
|
-
CiCy Desktop。一旦断开 / 退出,该后端不再具备控制能力。
|
|
54
|
-
|
|
55
|
-
You can quit the app, disconnect a backend, or uninstall at any time.
|
|
56
|
-
Disconnection takes effect immediately.
|
|
57
|
-
|
|
58
|
-
## 5. 免责 / Disclaimer
|
|
59
|
-
|
|
60
|
-
本软件按"现状"提供,不作任何明示或默示担保。在适用法律允许的最大范围
|
|
61
|
-
内,开发者不对因使用本软件而产生的任何直接或间接损失负责。
|
|
62
|
-
|
|
63
|
-
This software is provided "AS IS" without warranty of any kind.
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
点击下方 **"我已阅读并接受"** 即表示你同意以上条款。如果你不接受,请关闭
|
|
68
|
-
本软件并卸载。
|
|
69
|
-
|
|
70
|
-
Click "I have read and accept" to agree. If you do not accept, close
|
|
71
|
-
and uninstall the software.
|
|
72
|
-
`;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
// CF Worker entry — overlays a few API endpoints on top of the SPA assets.
|
|
2
|
-
//
|
|
3
|
-
// The Worker keeps the helper-trial token out of the client bundle. Render
|
|
4
|
-
// fetches /api/helper/token at click time; the token lives only as a
|
|
5
|
-
// `wrangler secret` (env.HELPER_TOKEN), never in git or the CDN-cached JS.
|
|
6
|
-
// Renderer writes the returned token into the helper window's localStorage
|
|
7
|
-
// via CDP so the cicy-code SPA picks it up on next reload.
|
|
8
|
-
// CORS headers — Mac/Linux cicy-desktop loads the homepage over file://, so
|
|
9
|
-
// fetches to this Worker carry Origin: null and are cross-origin. Wildcard
|
|
10
|
-
// allow is fine: the only sensitive thing we expose is HELPER_TOKEN which
|
|
11
|
-
// the helper container itself authorizes; if you can read it from here you
|
|
12
|
-
// can already hit the helper directly.
|
|
13
|
-
const CORS = {
|
|
14
|
-
"Access-Control-Allow-Origin": "*",
|
|
15
|
-
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
|
|
16
|
-
"Access-Control-Allow-Headers": "Content-Type, Authorization",
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export default {
|
|
20
|
-
async fetch(request, env, ctx) {
|
|
21
|
-
const url = new URL(request.url);
|
|
22
|
-
|
|
23
|
-
// CORS preflight
|
|
24
|
-
if (request.method === "OPTIONS") {
|
|
25
|
-
return new Response(null, { status: 204, headers: CORS });
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (url.pathname === "/api/helper/token") {
|
|
29
|
-
const token = env.HELPER_TOKEN || "";
|
|
30
|
-
if (!token) {
|
|
31
|
-
return new Response(JSON.stringify({ ok: false, error: "HELPER_TOKEN not configured" }),
|
|
32
|
-
{ status: 503, headers: { ...CORS, "content-type": "application/json" } });
|
|
33
|
-
}
|
|
34
|
-
return new Response(JSON.stringify({ ok: true, token }),
|
|
35
|
-
{ headers: { ...CORS, "content-type": "application/json", "cache-control": "no-store" } });
|
|
36
|
-
}
|
|
37
|
-
// Everything else: fall through to the static-asset binding (SPA).
|
|
38
|
-
return env.ASSETS.fetch(request);
|
|
39
|
-
},
|
|
40
|
-
};
|