clay-server 3.6.0-beta.1 → 3.6.0
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/README.md +54 -196
- package/bin/cli.js +7 -42
- package/lib/builtin-mates.js +1 -1
- package/lib/cli-wordmark.js +32 -0
- package/lib/pages.js +47 -35
- package/lib/public/app.js +2 -10
- package/lib/public/apple-touch-icon.png +0 -0
- package/lib/public/clay-studio-favicon-32.png +0 -0
- package/lib/public/clay-studio-symbol.png +0 -0
- package/lib/public/clay-studio-wordmark.svg +20 -0
- package/lib/public/css/base.css +143 -61
- package/lib/public/css/filebrowser.css +54 -8
- package/lib/public/css/icon-strip.css +33 -19
- package/lib/public/css/input.css +15 -5
- package/lib/public/css/messages.css +17 -14
- package/lib/public/css/mobile-nav.css +5 -5
- package/lib/public/css/overlays.css +58 -6
- package/lib/public/css/pane.css +0 -1
- package/lib/public/css/session-actions.css +9 -3
- package/lib/public/css/sidebar.css +104 -161
- package/lib/public/css/title-bar.css +51 -18
- package/lib/public/css/user-settings.css +114 -8
- package/lib/public/icon-192.png +0 -0
- package/lib/public/icon-512.png +0 -0
- package/lib/public/index.html +32 -76
- package/lib/public/manifest.json +1 -6
- package/lib/public/modules/app-connection.js +0 -3
- package/lib/public/modules/app-favicon.js +22 -29
- package/lib/public/modules/app-messages.js +1 -2
- package/lib/public/modules/app-notifications.js +3 -3
- package/lib/public/modules/command-palette.js +1 -1
- package/lib/public/modules/server-settings.js +0 -77
- package/lib/public/modules/sidebar-projects.js +1 -1
- package/lib/public/modules/sidebar-sessions.js +18 -5
- package/lib/public/modules/sidebar.js +2 -2
- package/lib/public/modules/theme.js +88 -249
- package/lib/public/modules/user-settings.js +2 -3
- package/lib/public/style.css +10 -10
- package/lib/public/sw.js +4 -2
- package/lib/themes/clay-dark.json +11 -0
- package/lib/themes/clay-light.json +11 -0
- package/package.json +1 -1
- package/lib/public/apple-touch-icon-dark.png +0 -0
- package/lib/public/clay-logo.png +0 -0
- package/lib/public/favicon-banded-32.png +0 -0
- package/lib/public/favicon-banded.png +0 -0
- package/lib/public/favicon-dark.svg +0 -1
- package/lib/public/favicon.svg +0 -1
- package/lib/public/icon-192-dark.png +0 -0
- package/lib/public/icon-512-dark.png +0 -0
- package/lib/public/icon-banded-76.png +0 -0
- package/lib/public/icon-banded-96.png +0 -0
- package/lib/public/icon-mono.svg +0 -1
- package/lib/public/modules/ascii-logo.js +0 -442
- package/lib/public/wordmark-banded-20.png +0 -0
- package/lib/public/wordmark-banded-32.png +0 -0
- package/lib/public/wordmark-banded-64.png +0 -0
- package/lib/public/wordmark-banded-80.png +0 -0
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
padding: 2px 10px;
|
|
31
31
|
font-family: inherit;
|
|
32
32
|
font-size: 11px;
|
|
33
|
-
font-weight:
|
|
33
|
+
font-weight: var(--font-weight-ui);
|
|
34
34
|
cursor: pointer;
|
|
35
35
|
white-space: nowrap;
|
|
36
36
|
line-height: 1;
|
|
@@ -208,33 +208,65 @@
|
|
|
208
208
|
.title-bar-project-dropdown {
|
|
209
209
|
display: flex;
|
|
210
210
|
align-items: center;
|
|
211
|
-
gap:
|
|
211
|
+
gap: 8px;
|
|
212
212
|
flex: 1;
|
|
213
213
|
min-width: 0;
|
|
214
214
|
background: none;
|
|
215
215
|
border: none;
|
|
216
|
-
padding: 4px
|
|
217
|
-
margin:
|
|
218
|
-
border-radius:
|
|
216
|
+
padding: 4px;
|
|
217
|
+
margin: 0;
|
|
218
|
+
border-radius: 10px;
|
|
219
219
|
cursor: pointer;
|
|
220
|
-
|
|
220
|
+
text-align: left;
|
|
221
|
+
transition: background 0.15s, box-shadow 0.15s;
|
|
221
222
|
font-family: inherit;
|
|
222
223
|
}
|
|
223
224
|
|
|
224
|
-
.title-bar-project-dropdown:hover
|
|
225
|
-
|
|
225
|
+
.title-bar-project-dropdown:hover,
|
|
226
|
+
.title-bar-project-dropdown.open {
|
|
227
|
+
background: rgba(var(--overlay-rgb), 0.035);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.title-bar-project-dropdown:focus { outline: none; }
|
|
231
|
+
.title-bar-project-dropdown:focus-visible {
|
|
232
|
+
box-shadow: 0 0 0 2px color-mix(in srgb, var(--link) 18%, transparent);
|
|
226
233
|
}
|
|
227
234
|
|
|
228
235
|
.title-bar-project-icon {
|
|
229
|
-
|
|
236
|
+
position: relative;
|
|
237
|
+
display: inline-flex;
|
|
238
|
+
align-items: center;
|
|
239
|
+
justify-content: center;
|
|
240
|
+
width: 28px;
|
|
241
|
+
height: 28px;
|
|
242
|
+
border-radius: 9px;
|
|
243
|
+
background: var(--bg);
|
|
244
|
+
color: var(--text-muted);
|
|
245
|
+
box-shadow: 0 1px 3px rgba(var(--shadow-rgb), 0.1);
|
|
230
246
|
font-size: 18px;
|
|
231
247
|
line-height: 1;
|
|
232
248
|
flex-shrink: 0;
|
|
249
|
+
transition: background 0.15s, box-shadow 0.15s, transform 0.15s;
|
|
233
250
|
}
|
|
234
251
|
|
|
235
|
-
.title-bar-project-icon
|
|
236
|
-
|
|
237
|
-
|
|
252
|
+
.title-bar-project-icon::before {
|
|
253
|
+
content: "";
|
|
254
|
+
width: 15px;
|
|
255
|
+
height: 15px;
|
|
256
|
+
background: currentColor;
|
|
257
|
+
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 6a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z'/%3E%3C/svg%3E") center / contain no-repeat;
|
|
258
|
+
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 6a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z'/%3E%3C/svg%3E") center / contain no-repeat;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.title-bar-project-icon.has-icon::before {
|
|
262
|
+
display: none;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.title-bar-project-dropdown:hover .title-bar-project-icon,
|
|
266
|
+
.title-bar-project-dropdown.open .title-bar-project-icon {
|
|
267
|
+
background: var(--bg-alt);
|
|
268
|
+
box-shadow: 0 3px 8px rgba(var(--shadow-rgb), 0.14);
|
|
269
|
+
transform: translateY(-1px);
|
|
238
270
|
}
|
|
239
271
|
|
|
240
272
|
.title-bar-project-icon .emoji {
|
|
@@ -251,9 +283,10 @@
|
|
|
251
283
|
|
|
252
284
|
.title-bar-project-name {
|
|
253
285
|
font-family: "Pretendard", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
|
|
254
|
-
font-size:
|
|
255
|
-
font-weight:
|
|
286
|
+
font-size: 14px;
|
|
287
|
+
font-weight: var(--font-weight-heading);
|
|
256
288
|
color: var(--text);
|
|
289
|
+
flex: 0 1 auto;
|
|
257
290
|
overflow: hidden;
|
|
258
291
|
text-overflow: ellipsis;
|
|
259
292
|
white-space: nowrap;
|
|
@@ -261,10 +294,10 @@
|
|
|
261
294
|
}
|
|
262
295
|
|
|
263
296
|
.title-bar-chevron {
|
|
264
|
-
width:
|
|
265
|
-
height:
|
|
297
|
+
width: 12px;
|
|
298
|
+
height: 12px;
|
|
266
299
|
flex-shrink: 0;
|
|
267
|
-
color: var(--text-
|
|
300
|
+
color: var(--text-muted);
|
|
268
301
|
transition: transform 0.2s;
|
|
269
302
|
}
|
|
270
303
|
|
|
@@ -276,7 +309,7 @@
|
|
|
276
309
|
width: 100%;
|
|
277
310
|
font-family: "Pretendard", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
|
|
278
311
|
font-size: 17px;
|
|
279
|
-
font-weight:
|
|
312
|
+
font-weight: var(--font-weight-heading);
|
|
280
313
|
color: var(--text);
|
|
281
314
|
background: var(--bg-alt);
|
|
282
315
|
border: 1px solid var(--accent);
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
|
|
60
60
|
.us-modal-title {
|
|
61
61
|
font-size: 15px;
|
|
62
|
-
font-weight:
|
|
62
|
+
font-weight: var(--font-weight-heading);
|
|
63
63
|
color: var(--text);
|
|
64
64
|
letter-spacing: 0.01em;
|
|
65
65
|
}
|
|
@@ -196,7 +196,7 @@
|
|
|
196
196
|
.us-section h2 {
|
|
197
197
|
margin: 0 0 14px;
|
|
198
198
|
font-size: 18px;
|
|
199
|
-
font-weight:
|
|
199
|
+
font-weight: var(--font-weight-heading);
|
|
200
200
|
color: var(--text);
|
|
201
201
|
letter-spacing: -0.01em;
|
|
202
202
|
}
|
|
@@ -204,7 +204,7 @@
|
|
|
204
204
|
.us-section h3 {
|
|
205
205
|
margin: 22px 0 10px;
|
|
206
206
|
font-size: 12px;
|
|
207
|
-
font-weight:
|
|
207
|
+
font-weight: var(--font-weight-heading);
|
|
208
208
|
color: var(--text-secondary);
|
|
209
209
|
text-transform: uppercase;
|
|
210
210
|
letter-spacing: 0.08em;
|
|
@@ -228,6 +228,108 @@
|
|
|
228
228
|
padding: 14px;
|
|
229
229
|
}
|
|
230
230
|
|
|
231
|
+
#user-settings .settings-theme-card .settings-field {
|
|
232
|
+
padding: 14px;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
#user-settings .settings-theme-picker {
|
|
236
|
+
margin-top: 14px;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
#user-settings .theme-picker {
|
|
240
|
+
display: grid;
|
|
241
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
242
|
+
gap: 12px;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
#user-settings .theme-picker-group {
|
|
246
|
+
min-width: 0;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
#user-settings .theme-picker-header {
|
|
250
|
+
padding: 0 2px 8px;
|
|
251
|
+
font-size: 11px;
|
|
252
|
+
font-weight: var(--font-weight-heading);
|
|
253
|
+
color: var(--text-dimmer);
|
|
254
|
+
text-transform: uppercase;
|
|
255
|
+
letter-spacing: 0.08em;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
#user-settings .theme-picker-section {
|
|
259
|
+
display: flex;
|
|
260
|
+
flex-direction: column;
|
|
261
|
+
gap: 4px;
|
|
262
|
+
min-width: 0;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
#user-settings .theme-picker-item {
|
|
266
|
+
display: flex;
|
|
267
|
+
align-items: center;
|
|
268
|
+
gap: 10px;
|
|
269
|
+
width: 100%;
|
|
270
|
+
min-height: 42px;
|
|
271
|
+
padding: 8px 10px;
|
|
272
|
+
border: 1px solid transparent;
|
|
273
|
+
border-radius: 10px;
|
|
274
|
+
background: var(--bg);
|
|
275
|
+
color: var(--text-secondary);
|
|
276
|
+
font-family: inherit;
|
|
277
|
+
font-size: 13px;
|
|
278
|
+
cursor: pointer;
|
|
279
|
+
transition: border-color 0.15s, background 0.15s, color 0.15s;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
#user-settings .theme-picker-item:hover {
|
|
283
|
+
border-color: var(--border);
|
|
284
|
+
color: var(--text);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
#user-settings .theme-picker-item.active {
|
|
288
|
+
border-color: var(--accent);
|
|
289
|
+
background: var(--accent-8);
|
|
290
|
+
color: var(--text);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
#user-settings .theme-swatches {
|
|
294
|
+
display: flex;
|
|
295
|
+
gap: 2px;
|
|
296
|
+
flex-shrink: 0;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
#user-settings .theme-swatch {
|
|
300
|
+
width: 10px;
|
|
301
|
+
height: 16px;
|
|
302
|
+
border: 1px solid rgba(var(--overlay-rgb), 0.1);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
#user-settings .theme-swatch:first-child {
|
|
306
|
+
border-radius: 4px 0 0 4px;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
#user-settings .theme-swatch:last-child {
|
|
310
|
+
border-radius: 0 4px 4px 0;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
#user-settings .theme-picker-label {
|
|
314
|
+
flex: 1;
|
|
315
|
+
min-width: 0;
|
|
316
|
+
overflow: hidden;
|
|
317
|
+
text-align: left;
|
|
318
|
+
text-overflow: ellipsis;
|
|
319
|
+
white-space: nowrap;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
#user-settings .theme-picker-check {
|
|
323
|
+
flex-shrink: 0;
|
|
324
|
+
color: var(--accent);
|
|
325
|
+
font-size: 14px;
|
|
326
|
+
opacity: 0;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
#user-settings .theme-picker-item.active .theme-picker-check {
|
|
330
|
+
opacity: 1;
|
|
331
|
+
}
|
|
332
|
+
|
|
231
333
|
#user-settings .us-account-hero {
|
|
232
334
|
display: flex;
|
|
233
335
|
align-items: center;
|
|
@@ -282,7 +384,7 @@
|
|
|
282
384
|
|
|
283
385
|
#user-settings .us-account-name {
|
|
284
386
|
font-size: 17px;
|
|
285
|
-
font-weight:
|
|
387
|
+
font-weight: var(--font-weight-heading);
|
|
286
388
|
color: var(--text);
|
|
287
389
|
line-height: 1.2;
|
|
288
390
|
letter-spacing: -0.01em;
|
|
@@ -337,7 +439,7 @@
|
|
|
337
439
|
display: block;
|
|
338
440
|
margin-bottom: 4px;
|
|
339
441
|
font-size: 13px;
|
|
340
|
-
font-weight:
|
|
442
|
+
font-weight: var(--font-weight-ui);
|
|
341
443
|
color: var(--text-secondary);
|
|
342
444
|
}
|
|
343
445
|
|
|
@@ -518,7 +620,7 @@
|
|
|
518
620
|
background: var(--accent);
|
|
519
621
|
color: #fff;
|
|
520
622
|
font-size: 13px;
|
|
521
|
-
font-weight:
|
|
623
|
+
font-weight: var(--font-weight-ui);
|
|
522
624
|
cursor: pointer;
|
|
523
625
|
}
|
|
524
626
|
|
|
@@ -580,7 +682,7 @@
|
|
|
580
682
|
#user-settings .settings-pin-form-title {
|
|
581
683
|
margin-bottom: 8px;
|
|
582
684
|
font-size: 12px;
|
|
583
|
-
font-weight:
|
|
685
|
+
font-weight: var(--font-weight-heading);
|
|
584
686
|
color: var(--text-secondary);
|
|
585
687
|
text-transform: uppercase;
|
|
586
688
|
letter-spacing: 0.08em;
|
|
@@ -673,7 +775,7 @@
|
|
|
673
775
|
|
|
674
776
|
#user-settings .layout-option-label {
|
|
675
777
|
font-size: 14px;
|
|
676
|
-
font-weight:
|
|
778
|
+
font-weight: var(--font-weight-heading);
|
|
677
779
|
color: var(--text);
|
|
678
780
|
}
|
|
679
781
|
|
|
@@ -836,6 +938,10 @@
|
|
|
836
938
|
grid-template-columns: 1fr;
|
|
837
939
|
}
|
|
838
940
|
|
|
941
|
+
#user-settings .theme-picker {
|
|
942
|
+
grid-template-columns: 1fr;
|
|
943
|
+
}
|
|
944
|
+
|
|
839
945
|
#user-settings .us-account-hero {
|
|
840
946
|
align-items: flex-start;
|
|
841
947
|
}
|
package/lib/public/icon-192.png
CHANGED
|
Binary file
|
package/lib/public/icon-512.png
CHANGED
|
Binary file
|
package/lib/public/index.html
CHANGED
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
if(!isIOS){var l=document.createElement("link");l.rel="manifest";l.href="/manifest.json";document.head.appendChild(l)}
|
|
12
12
|
})();
|
|
13
13
|
</script>
|
|
14
|
-
<meta name="theme-color" content="#
|
|
15
|
-
<link rel="icon" type="image/png" href="favicon-
|
|
14
|
+
<meta name="theme-color" content="#171715">
|
|
15
|
+
<link rel="icon" type="image/png" sizes="32x32" href="clay-studio-favicon-32.png">
|
|
16
16
|
<link rel="apple-touch-icon" href="apple-touch-icon.png">
|
|
17
|
-
<title>Clay</title>
|
|
17
|
+
<title>Clay Studio</title>
|
|
18
18
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
19
19
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
20
20
|
<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@400;500;700&family=Nunito:wght@700;800&display=swap" rel="stylesheet">
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
(function(){try{var k="clay-theme-vars",v=localStorage.getItem(k),r=document.documentElement;if(v){var o=JSON.parse(v),p;for(p in o)r.style.setProperty(p,o[p]);var vt=localStorage.getItem(k.replace("-vars","-variant"));if(vt==="light"){r.classList.add("light-theme");r.classList.remove("dark-theme")}else{r.classList.add("dark-theme");r.classList.remove("light-theme")}var m=document.querySelector('meta[name="theme-color"]');if(m&&o["--bg"])m.setAttribute("content",o["--bg"])}else{var sl=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches;if(sl){r.classList.add("light-theme");r.classList.remove("dark-theme")}}}catch(e){}})();
|
|
31
31
|
</script>
|
|
32
32
|
<script>if(window.navigator.standalone||window.matchMedia("(display-mode:standalone)").matches){document.documentElement.classList.add("pwa-standalone")}</script>
|
|
33
|
-
<link rel="stylesheet" href="style.css?v=
|
|
33
|
+
<link rel="stylesheet" href="style.css?v=20260828-clay-theme1">
|
|
34
34
|
<style>
|
|
35
35
|
@media(max-width:768px){
|
|
36
36
|
/* User messages: vertical stack, avatar on top, right-aligned */
|
|
@@ -101,9 +101,9 @@
|
|
|
101
101
|
|
|
102
102
|
<!-- === Icon Strip === -->
|
|
103
103
|
<div id="icon-strip">
|
|
104
|
-
<div class="icon-strip-home" title="Clay">
|
|
104
|
+
<div class="icon-strip-home" title="Clay Studio">
|
|
105
105
|
<span class="icon-strip-pill"></span>
|
|
106
|
-
<img class="icon-strip-logo" src="
|
|
106
|
+
<img class="icon-strip-logo" src="clay-studio-symbol.png" width="38" height="38" alt="Clay Studio">
|
|
107
107
|
</div>
|
|
108
108
|
<div class="icon-strip-separator"></div>
|
|
109
109
|
<button type="button" class="icon-strip-hint" id="icon-strip-hint-project" data-switcher-mode="project" aria-label="Switch project"></button>
|
|
@@ -206,7 +206,7 @@
|
|
|
206
206
|
<div id="sidebar-column">
|
|
207
207
|
<div class="title-bar-sidebar">
|
|
208
208
|
<button class="title-bar-project-dropdown" id="title-bar-project-dropdown">
|
|
209
|
-
<span class="title-bar-project-icon" id="title-bar-project-icon"></span>
|
|
209
|
+
<span class="title-bar-project-icon" id="title-bar-project-icon" aria-hidden="true"></span>
|
|
210
210
|
<span class="title-bar-project-name" id="title-bar-project-name"></span>
|
|
211
211
|
<i data-lucide="chevron-down" class="title-bar-chevron"></i>
|
|
212
212
|
</button>
|
|
@@ -399,10 +399,13 @@
|
|
|
399
399
|
<button id="terminal-toggle-btn" title="Terminal"><i data-lucide="square-terminal"></i><span id="terminal-count" class="hidden"></span></button>
|
|
400
400
|
</div>
|
|
401
401
|
</div>
|
|
402
|
-
|
|
402
|
+
<div id="main-panels">
|
|
403
403
|
<div id="app">
|
|
404
404
|
<div id="connect-overlay">
|
|
405
|
-
<
|
|
405
|
+
<div class="connect-brand">
|
|
406
|
+
<img class="connect-symbol" src="clay-studio-symbol.png" alt="">
|
|
407
|
+
<div class="connect-wordmark" role="img" aria-label="Clay Studio"></div>
|
|
408
|
+
</div>
|
|
406
409
|
<p id="connect-overlay-msg">Connecting…</p>
|
|
407
410
|
</div>
|
|
408
411
|
<div id="sticky-notes-container" class="hidden"></div>
|
|
@@ -673,7 +676,7 @@
|
|
|
673
676
|
<div id="mobile-tab-bar">
|
|
674
677
|
<button class="mobile-tab" data-tab="chat" id="mob-tab-chat"><i data-lucide="message-square"></i><span class="mobile-tab-label">Chat</span></button>
|
|
675
678
|
<button class="mobile-tab" data-tab="search" id="mob-tab-search"><i data-lucide="search"></i><span class="mobile-tab-label">Search</span></button>
|
|
676
|
-
<button class="mobile-tab-home" id="mobile-home-btn"><img src="/
|
|
679
|
+
<button class="mobile-tab-home" id="mobile-home-btn"><img src="/clay-studio-symbol.png" alt="Clay Studio home" class="mobile-home-icon"></button>
|
|
677
680
|
<button class="mobile-tab" data-tab="tools" id="mob-tab-tools"><i data-lucide="wrench"></i><span class="mobile-tab-label">Tools</span></button>
|
|
678
681
|
<button class="mobile-tab" data-tab="settings" id="mob-tab-settings"><i data-lucide="settings"></i><span class="mobile-tab-label">Settings</span></button>
|
|
679
682
|
</div>
|
|
@@ -682,7 +685,18 @@
|
|
|
682
685
|
<div class="file-viewer-header">
|
|
683
686
|
<div class="file-viewer-tabbar">
|
|
684
687
|
<div class="file-viewer-tabs" id="file-viewer-tabs" role="tablist"></div>
|
|
685
|
-
<div class="file-viewer-
|
|
688
|
+
<div class="file-viewer-window-actions" aria-label="Document viewer controls">
|
|
689
|
+
<button class="file-viewer-btn" id="file-viewer-fullscreen" title="Toggle fullscreen" aria-label="Toggle document viewer fullscreen"><i data-lucide="maximize-2"></i></button>
|
|
690
|
+
<button class="file-viewer-btn" id="file-viewer-close" title="Close viewer" aria-label="Close document viewer"><i data-lucide="x"></i></button>
|
|
691
|
+
</div>
|
|
692
|
+
</div>
|
|
693
|
+
<div class="file-viewer-breadcrumbs">
|
|
694
|
+
<div class="file-viewer-path" id="file-viewer-path" aria-label="Current file path"></div>
|
|
695
|
+
<span class="file-viewer-live-status hidden" id="file-viewer-live-status" aria-live="polite">
|
|
696
|
+
<span class="file-viewer-live-dot"></span>
|
|
697
|
+
<span class="file-viewer-live-label">Editing</span>
|
|
698
|
+
</span>
|
|
699
|
+
<div class="file-viewer-toolbar" aria-label="Current file actions">
|
|
686
700
|
<button class="file-viewer-btn hidden" id="file-viewer-render" title="Toggle rendered view"><i data-lucide="book-open"></i></button>
|
|
687
701
|
<button class="file-viewer-btn hidden" id="file-viewer-pdf" title="Export PDF"><i data-lucide="file-down"></i></button>
|
|
688
702
|
<button class="file-viewer-btn hidden" id="file-viewer-slides" title="Present as slides" aria-label="Present Markdown as slides" aria-pressed="false"><i data-lucide="presentation"></i></button>
|
|
@@ -691,17 +705,8 @@
|
|
|
691
705
|
<button class="file-viewer-btn" id="file-viewer-refresh" title="Refresh"><i data-lucide="refresh-cw"></i></button>
|
|
692
706
|
<button class="file-viewer-btn" id="file-viewer-copy" title="Copy contents" aria-label="Copy contents"><i data-lucide="copy"></i></button>
|
|
693
707
|
<button class="file-viewer-btn hidden" id="file-viewer-copy-formatted" title="Copy Markdown formatting" aria-label="Copy Markdown formatting"><i data-lucide="clipboard-copy"></i></button>
|
|
694
|
-
<button class="file-viewer-btn" id="file-viewer-fullscreen" title="Toggle fullscreen"><i data-lucide="maximize-2"></i></button>
|
|
695
|
-
<button class="file-viewer-btn" id="file-viewer-close" title="Close"><i data-lucide="x"></i></button>
|
|
696
708
|
</div>
|
|
697
709
|
</div>
|
|
698
|
-
<div class="file-viewer-breadcrumbs">
|
|
699
|
-
<div class="file-viewer-path" id="file-viewer-path" aria-label="Current file path"></div>
|
|
700
|
-
<span class="file-viewer-live-status hidden" id="file-viewer-live-status" aria-live="polite">
|
|
701
|
-
<span class="file-viewer-live-dot"></span>
|
|
702
|
-
<span class="file-viewer-live-label">Editing</span>
|
|
703
|
-
</span>
|
|
704
|
-
</div>
|
|
705
710
|
</div>
|
|
706
711
|
<div class="file-viewer-body" id="file-viewer-body"></div>
|
|
707
712
|
</div>
|
|
@@ -957,7 +962,6 @@
|
|
|
957
962
|
</div>
|
|
958
963
|
</div>
|
|
959
964
|
<div class="user-island-actions">
|
|
960
|
-
<button id="user-theme-toggle-btn" title="Themes" aria-label="Themes"><i data-lucide="palette"></i></button>
|
|
961
965
|
<button id="user-settings-btn" title="User settings"><i data-lucide="settings"></i></button>
|
|
962
966
|
</div>
|
|
963
967
|
</div>
|
|
@@ -1079,6 +1083,13 @@
|
|
|
1079
1083
|
<!-- Appearance section -->
|
|
1080
1084
|
<div class="us-section" data-section="us-appearance">
|
|
1081
1085
|
<h2>Appearance</h2>
|
|
1086
|
+
<div class="settings-card settings-theme-card">
|
|
1087
|
+
<div class="settings-field">
|
|
1088
|
+
<div class="settings-label">Theme</div>
|
|
1089
|
+
<div class="settings-hint">Choose the color palette used across Clay Studio.</div>
|
|
1090
|
+
<div id="us-theme-picker" class="settings-theme-picker" aria-label="Theme selection"></div>
|
|
1091
|
+
</div>
|
|
1092
|
+
</div>
|
|
1082
1093
|
<div class="settings-card">
|
|
1083
1094
|
<div class="settings-label" style="margin-bottom:10px;">Chat layout</div>
|
|
1084
1095
|
<div class="layout-switcher" id="us-layout-switcher">
|
|
@@ -1203,9 +1214,6 @@
|
|
|
1203
1214
|
<option value="notifications">Notifications</option>
|
|
1204
1215
|
<option value="security">Security</option>
|
|
1205
1216
|
</optgroup>
|
|
1206
|
-
<optgroup label="Defaults">
|
|
1207
|
-
<option value="models">Model</option>
|
|
1208
|
-
</optgroup>
|
|
1209
1217
|
<optgroup label="Config">
|
|
1210
1218
|
<option value="claudemd">Instructions</option>
|
|
1211
1219
|
<option value="environment">Environment</option>
|
|
@@ -1229,9 +1237,6 @@
|
|
|
1229
1237
|
<button class="settings-nav-item" data-section="notifications"><span>Notifications</span></button>
|
|
1230
1238
|
<button class="settings-nav-item" data-section="security"><span>Security</span></button>
|
|
1231
1239
|
<div class="settings-nav-separator"></div>
|
|
1232
|
-
<div class="settings-nav-category">Defaults</div>
|
|
1233
|
-
<button class="settings-nav-item" data-section="models"><span>Model</span></button>
|
|
1234
|
-
<div class="settings-nav-separator"></div>
|
|
1235
1240
|
<div class="settings-nav-category">Config</div>
|
|
1236
1241
|
<button class="settings-nav-item" data-section="claudemd"><span>Instructions</span></button>
|
|
1237
1242
|
<button class="settings-nav-item" data-section="environment"><span>Environment</span></button>
|
|
@@ -1328,55 +1333,6 @@
|
|
|
1328
1333
|
</div>
|
|
1329
1334
|
</div>
|
|
1330
1335
|
</div>
|
|
1331
|
-
<div class="server-settings-section" data-section="models">
|
|
1332
|
-
<h2>Model</h2>
|
|
1333
|
-
<p class="settings-hint" style="margin-bottom: 20px;">Configure which model to use and how Claude behaves during sessions.</p>
|
|
1334
|
-
<div class="settings-card">
|
|
1335
|
-
<div class="settings-field">
|
|
1336
|
-
<label class="settings-label">Model</label>
|
|
1337
|
-
<div class="settings-hint">Choose the Claude model to use. Larger models are slower but more capable.</div>
|
|
1338
|
-
<div id="ss-model-list" class="settings-model-list"></div>
|
|
1339
|
-
</div>
|
|
1340
|
-
</div>
|
|
1341
|
-
<div class="settings-card" id="ss-beta-card" style="display:none">
|
|
1342
|
-
<div class="settings-field">
|
|
1343
|
-
<label class="settings-label">Extended Context (Beta)</label>
|
|
1344
|
-
<div class="settings-hint">Enable 1M token context window for Sonnet models. Allows processing much larger codebases and files, but may increase latency.</div>
|
|
1345
|
-
<label class="settings-toggle-row ss-beta-toggle-row">
|
|
1346
|
-
<div>
|
|
1347
|
-
<span class="settings-label">1M Context</span>
|
|
1348
|
-
</div>
|
|
1349
|
-
<input type="checkbox" id="ss-beta-1m">
|
|
1350
|
-
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
|
1351
|
-
</label>
|
|
1352
|
-
</div>
|
|
1353
|
-
</div>
|
|
1354
|
-
<div class="settings-card">
|
|
1355
|
-
<div class="settings-field">
|
|
1356
|
-
<label class="settings-label">Mode</label>
|
|
1357
|
-
<div class="settings-hint">Controls how Claude handles tool use and file edits.</div>
|
|
1358
|
-
<div id="ss-mode-list" class="settings-model-list"></div>
|
|
1359
|
-
</div>
|
|
1360
|
-
</div>
|
|
1361
|
-
<div class="settings-card" id="ss-effort-card">
|
|
1362
|
-
<div class="settings-field">
|
|
1363
|
-
<label class="settings-label">Effort</label>
|
|
1364
|
-
<div class="settings-hint">Controls how much thinking effort Claude puts into responses. Higher effort means longer, more thorough responses.</div>
|
|
1365
|
-
<div class="settings-btn-group" id="ss-effort-bar"></div>
|
|
1366
|
-
</div>
|
|
1367
|
-
</div>
|
|
1368
|
-
<div class="settings-card" id="ss-thinking-card">
|
|
1369
|
-
<div class="settings-field">
|
|
1370
|
-
<label class="settings-label">Thinking</label>
|
|
1371
|
-
<div class="settings-hint">Controls whether Claude shows its reasoning process. Budget mode lets you set a token limit.</div>
|
|
1372
|
-
<div class="settings-btn-group" id="ss-thinking-bar"></div>
|
|
1373
|
-
<div id="ss-thinking-budget-row" class="settings-budget-row" style="display:none">
|
|
1374
|
-
<label class="settings-budget-label">Budget tokens</label>
|
|
1375
|
-
<input id="ss-thinking-budget" type="number" class="settings-budget-input" min="1024" max="128000" step="1024" value="10000">
|
|
1376
|
-
</div>
|
|
1377
|
-
</div>
|
|
1378
|
-
</div>
|
|
1379
|
-
</div>
|
|
1380
1336
|
<div class="server-settings-section" data-section="security">
|
|
1381
1337
|
<h2>Security</h2>
|
|
1382
1338
|
<div class="settings-card">
|
package/lib/public/manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "Clay",
|
|
2
|
+
"name": "Clay Studio",
|
|
3
3
|
"short_name": "Clay",
|
|
4
4
|
"id": "/",
|
|
5
5
|
"start_url": "/",
|
|
@@ -17,11 +17,6 @@
|
|
|
17
17
|
"src": "icon-512.png",
|
|
18
18
|
"sizes": "512x512",
|
|
19
19
|
"type": "image/png"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"src": "icon-mono.svg",
|
|
23
|
-
"sizes": "any",
|
|
24
|
-
"type": "image/svg+xml"
|
|
25
20
|
}
|
|
26
21
|
]
|
|
27
22
|
}
|
|
@@ -5,7 +5,6 @@ import { store } from './store.js';
|
|
|
5
5
|
import { getWs, setWs } from './ws-ref.js';
|
|
6
6
|
import { getStatusDot, getSendBtn } from './dom-refs.js';
|
|
7
7
|
import { setSendBtnMode, blinkIO, setActivity } from './app-favicon.js';
|
|
8
|
-
import { startLogoAnimation, stopLogoAnimation } from './ascii-logo.js';
|
|
9
8
|
import { hasSendableContent } from './input.js';
|
|
10
9
|
import { processMessage } from './app-messages.js';
|
|
11
10
|
import { flushPendingExtMessages } from './app-misc.js';
|
|
@@ -45,7 +44,6 @@ export function initConnection() {
|
|
|
45
44
|
if (connectOverlay) connectOverlay.classList.add("hidden");
|
|
46
45
|
var updPill = document.getElementById("update-pill-wrap");
|
|
47
46
|
if (updPill) updPill.classList.add("hidden");
|
|
48
|
-
stopLogoAnimation();
|
|
49
47
|
} else {
|
|
50
48
|
if (sendBtn) sendBtn.disabled = true;
|
|
51
49
|
if (hasConnectedOnce && connectOverlay) {
|
|
@@ -53,7 +51,6 @@ export function initConnection() {
|
|
|
53
51
|
if (overlayMessage) overlayMessage.textContent = "Reconnecting to server…";
|
|
54
52
|
}
|
|
55
53
|
if (connectOverlay) connectOverlay.classList.remove("hidden");
|
|
56
|
-
startLogoAnimation();
|
|
57
54
|
}
|
|
58
55
|
}
|
|
59
56
|
|
|
@@ -10,7 +10,7 @@ import { escapeHtml } from './utils.js';
|
|
|
10
10
|
|
|
11
11
|
// --- Module-owned state ---
|
|
12
12
|
var faviconLink, faviconOrigHref, faviconCanvas, faviconCtx, faviconImg, faviconImgReady;
|
|
13
|
-
var
|
|
13
|
+
var pendingFaviconColor = null;
|
|
14
14
|
var faviconAnimTimer = null, faviconAnimFrame = 0;
|
|
15
15
|
var urgentBlinkTimer = null, urgentTitleTimer = null, savedTitle = null;
|
|
16
16
|
var ioTimer = null;
|
|
@@ -27,11 +27,18 @@ export function initFavicon() {
|
|
|
27
27
|
faviconImg = null;
|
|
28
28
|
faviconImgReady = false;
|
|
29
29
|
|
|
30
|
-
// Load the
|
|
30
|
+
// Load the brand symbol for status and attention variants.
|
|
31
31
|
(function () {
|
|
32
32
|
faviconImg = new Image();
|
|
33
|
-
faviconImg.onload = function () {
|
|
34
|
-
|
|
33
|
+
faviconImg.onload = function () {
|
|
34
|
+
faviconImgReady = true;
|
|
35
|
+
if (pendingFaviconColor) {
|
|
36
|
+
var color = pendingFaviconColor;
|
|
37
|
+
pendingFaviconColor = null;
|
|
38
|
+
updateFavicon(color);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
faviconImg.src = (store.get('basePath') || "") + "clay-studio-symbol.png";
|
|
35
42
|
})();
|
|
36
43
|
|
|
37
44
|
// Reset cached favicon href on theme change
|
|
@@ -46,17 +53,16 @@ export function updateFavicon(bgColor) {
|
|
|
46
53
|
return;
|
|
47
54
|
}
|
|
48
55
|
if (!faviconOrigHref) faviconOrigHref = faviconLink.href;
|
|
49
|
-
|
|
56
|
+
if (!faviconImgReady) {
|
|
57
|
+
pendingFaviconColor = bgColor;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
50
60
|
faviconCtx.clearRect(0, 0, 32, 32);
|
|
61
|
+
faviconCtx.drawImage(faviconImg, 0, 0, 32, 32);
|
|
51
62
|
faviconCtx.fillStyle = bgColor;
|
|
52
63
|
faviconCtx.beginPath();
|
|
53
|
-
faviconCtx.arc(
|
|
64
|
+
faviconCtx.arc(25, 25, 5, 0, Math.PI * 2);
|
|
54
65
|
faviconCtx.fill();
|
|
55
|
-
faviconCtx.fillStyle = "#fff";
|
|
56
|
-
faviconCtx.font = "bold 22px Nunito, sans-serif";
|
|
57
|
-
faviconCtx.textAlign = "center";
|
|
58
|
-
faviconCtx.textBaseline = "middle";
|
|
59
|
-
faviconCtx.fillText("C", 16, 17);
|
|
60
66
|
faviconLink.href = faviconCanvas.toDataURL("image/png");
|
|
61
67
|
}
|
|
62
68
|
|
|
@@ -64,24 +70,12 @@ export function drawFaviconAnimFrame() {
|
|
|
64
70
|
if (store.get('paneMode')) return;
|
|
65
71
|
if (!faviconImgReady) return;
|
|
66
72
|
var S = 32;
|
|
67
|
-
var bands = BAND_COLORS.length;
|
|
68
|
-
var totalFrames = bands * 2;
|
|
69
|
-
var offset = faviconAnimFrame % totalFrames;
|
|
70
|
-
|
|
71
|
-
// Draw flowing color bands as background
|
|
72
73
|
faviconCtx.clearRect(0, 0, S, S);
|
|
73
|
-
var bandH = Math.ceil(S / bands);
|
|
74
|
-
for (var i = 0; i < bands + totalFrames; i++) {
|
|
75
|
-
var ci = ((i + offset) % bands + bands) % bands;
|
|
76
|
-
var c = BAND_COLORS[ci];
|
|
77
|
-
faviconCtx.fillStyle = "rgb(" + c[0] + "," + c[1] + "," + c[2] + ")";
|
|
78
|
-
faviconCtx.fillRect(0, (i - offset) * bandH, S, bandH);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Use the banded C image as a mask -- draw it on top with destination-in
|
|
82
|
-
faviconCtx.globalCompositeOperation = "destination-in";
|
|
83
74
|
faviconCtx.drawImage(faviconImg, 0, 0, S, S);
|
|
84
|
-
faviconCtx.
|
|
75
|
+
faviconCtx.fillStyle = faviconAnimFrame % 2 === 0 ? "#07e5a3" : "#5857fc";
|
|
76
|
+
faviconCtx.beginPath();
|
|
77
|
+
faviconCtx.arc(25, 7, 5, 0, Math.PI * 2);
|
|
78
|
+
faviconCtx.fill();
|
|
85
79
|
|
|
86
80
|
faviconLink.href = faviconCanvas.toDataURL("image/png");
|
|
87
81
|
faviconAnimFrame++;
|
|
@@ -177,8 +171,7 @@ export function startUrgentBlink() {
|
|
|
177
171
|
savedTitle = document.title;
|
|
178
172
|
if (!faviconOrigHref && faviconLink) faviconOrigHref = faviconLink.href;
|
|
179
173
|
faviconAnimFrame = 0;
|
|
180
|
-
|
|
181
|
-
urgentBlinkTimer = setInterval(drawFaviconAnimFrame, 83);
|
|
174
|
+
urgentBlinkTimer = setInterval(drawFaviconAnimFrame, 500);
|
|
182
175
|
// Title blink separately
|
|
183
176
|
var titleTick = 0;
|
|
184
177
|
urgentTitleTimer = setInterval(function () {
|