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.
Files changed (58) hide show
  1. package/README.md +54 -196
  2. package/bin/cli.js +7 -42
  3. package/lib/builtin-mates.js +1 -1
  4. package/lib/cli-wordmark.js +32 -0
  5. package/lib/pages.js +47 -35
  6. package/lib/public/app.js +2 -10
  7. package/lib/public/apple-touch-icon.png +0 -0
  8. package/lib/public/clay-studio-favicon-32.png +0 -0
  9. package/lib/public/clay-studio-symbol.png +0 -0
  10. package/lib/public/clay-studio-wordmark.svg +20 -0
  11. package/lib/public/css/base.css +143 -61
  12. package/lib/public/css/filebrowser.css +54 -8
  13. package/lib/public/css/icon-strip.css +33 -19
  14. package/lib/public/css/input.css +15 -5
  15. package/lib/public/css/messages.css +17 -14
  16. package/lib/public/css/mobile-nav.css +5 -5
  17. package/lib/public/css/overlays.css +58 -6
  18. package/lib/public/css/pane.css +0 -1
  19. package/lib/public/css/session-actions.css +9 -3
  20. package/lib/public/css/sidebar.css +104 -161
  21. package/lib/public/css/title-bar.css +51 -18
  22. package/lib/public/css/user-settings.css +114 -8
  23. package/lib/public/icon-192.png +0 -0
  24. package/lib/public/icon-512.png +0 -0
  25. package/lib/public/index.html +32 -76
  26. package/lib/public/manifest.json +1 -6
  27. package/lib/public/modules/app-connection.js +0 -3
  28. package/lib/public/modules/app-favicon.js +22 -29
  29. package/lib/public/modules/app-messages.js +1 -2
  30. package/lib/public/modules/app-notifications.js +3 -3
  31. package/lib/public/modules/command-palette.js +1 -1
  32. package/lib/public/modules/server-settings.js +0 -77
  33. package/lib/public/modules/sidebar-projects.js +1 -1
  34. package/lib/public/modules/sidebar-sessions.js +18 -5
  35. package/lib/public/modules/sidebar.js +2 -2
  36. package/lib/public/modules/theme.js +88 -249
  37. package/lib/public/modules/user-settings.js +2 -3
  38. package/lib/public/style.css +10 -10
  39. package/lib/public/sw.js +4 -2
  40. package/lib/themes/clay-dark.json +11 -0
  41. package/lib/themes/clay-light.json +11 -0
  42. package/package.json +1 -1
  43. package/lib/public/apple-touch-icon-dark.png +0 -0
  44. package/lib/public/clay-logo.png +0 -0
  45. package/lib/public/favicon-banded-32.png +0 -0
  46. package/lib/public/favicon-banded.png +0 -0
  47. package/lib/public/favicon-dark.svg +0 -1
  48. package/lib/public/favicon.svg +0 -1
  49. package/lib/public/icon-192-dark.png +0 -0
  50. package/lib/public/icon-512-dark.png +0 -0
  51. package/lib/public/icon-banded-76.png +0 -0
  52. package/lib/public/icon-banded-96.png +0 -0
  53. package/lib/public/icon-mono.svg +0 -1
  54. package/lib/public/modules/ascii-logo.js +0 -442
  55. package/lib/public/wordmark-banded-20.png +0 -0
  56. package/lib/public/wordmark-banded-32.png +0 -0
  57. package/lib/public/wordmark-banded-64.png +0 -0
  58. 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: 600;
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: 6px;
211
+ gap: 8px;
212
212
  flex: 1;
213
213
  min-width: 0;
214
214
  background: none;
215
215
  border: none;
216
- padding: 4px 8px;
217
- margin: -4px -8px;
218
- border-radius: 6px;
216
+ padding: 4px;
217
+ margin: 0;
218
+ border-radius: 10px;
219
219
  cursor: pointer;
220
- transition: background 0.15s;
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
- background: rgba(var(--overlay-rgb), 0.06);
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
- display: none;
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.has-icon {
236
- display: inline-flex;
237
- align-items: center;
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: 17px;
255
- font-weight: 800;
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: 14px;
265
- height: 14px;
297
+ width: 12px;
298
+ height: 12px;
266
299
  flex-shrink: 0;
267
- color: var(--text-secondary);
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: 800;
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: 700;
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: 700;
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: 700;
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: 700;
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: 700;
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: 600;
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: 700;
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: 700;
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
  }
Binary file
Binary file
@@ -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="#282a36">
15
- <link rel="icon" type="image/png" href="favicon-banded.png">
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=20260826a">
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="icon-banded-76.png" width="38" height="38" alt="Clay">
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
- <div id="main-panels">
402
+ <div id="main-panels">
403
403
  <div id="app">
404
404
  <div id="connect-overlay">
405
- <canvas id="ascii-logo-canvas"></canvas>
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="/icon-banded-76.png" alt="Home" class="mobile-home-icon"></button>
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-toolbar" aria-label="Editor actions">
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">
@@ -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 BAND_COLORS = [[0,235,160],[0,200,220],[30,100,255],[88,50,255],[200,60,180],[255,90,50]];
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 banded favicon image for masking
30
+ // Load the brand symbol for status and attention variants.
31
31
  (function () {
32
32
  faviconImg = new Image();
33
- faviconImg.onload = function () { faviconImgReady = true; };
34
- faviconImg.src = (store.get('basePath') || "") + "favicon-banded.png";
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
- // Simple solid-color favicon for non-animated states
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(16, 16, 14, 0, Math.PI * 2);
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.globalCompositeOperation = "source-over";
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
- // Color flow animation at ~12fps
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 () {