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
package/lib/public/app.js CHANGED
@@ -31,12 +31,11 @@ import { initContextSources, updateTerminalList, updateBrowserTabList, handleCon
31
31
  import { initStickyNotes, handleNotesList, handleNoteCreated, handleNoteUpdated, handleNoteDeleted, openArchive, closeArchive, isArchiveOpen, hideNotes, showNotes, isNotesVisible, createNote } from './modules/sticky-notes.js';
32
32
  import { initTheme, getThemeColor, getComputedVar, onThemeChange, getCurrentTheme, getChatLayout } from './modules/theme.js';
33
33
  import { initTools, resetToolState, saveToolState, restoreToolState, renderAskUserQuestion, markAskUserAnswered, renderPermissionRequest, markPermissionResolved, markPermissionCancelled, renderElicitationRequest, markElicitationResolved, renderPlanBanner, renderPlanCard, handleTodoWrite, handleTaskCreate, handleTaskUpdate, startThinking, appendThinking, stopThinking, resetThinkingGroup, createToolItem, updateToolExecuting, updateToolResult, markAllToolsDone, addTurnMeta, resetTurnMetaCost, enableMainInput, getTools, getPlanContent, setPlanContent, isPlanFilePath, getTodoTools, updateSubagentActivity, addSubagentToolEntry, markSubagentDone, updateSubagentProgress, initSubagentStop, closeToolGroup, removeToolFromGroup } from './modules/tools.js';
34
- import { initServerSettings, updateSettingsStats, updateSettingsModels, updateDaemonConfig, handleSetPinResult, handleKeepAwakeChanged, handleAutoContinueChanged, handleRestartResult, handleShutdownResult, handleSharedEnv, handleSharedEnvSaved, handleGlobalClaudeMdRead, handleGlobalClaudeMdWrite } from './modules/server-settings.js';
34
+ import { initServerSettings, updateSettingsStats, updateDaemonConfig, handleSetPinResult, handleKeepAwakeChanged, handleAutoContinueChanged, handleRestartResult, handleShutdownResult, handleSharedEnv, handleSharedEnvSaved, handleGlobalClaudeMdRead, handleGlobalClaudeMdWrite } from './modules/server-settings.js';
35
35
  import { initProjectSettings, handleInstructionsRead, handleInstructionsWrite, handleProjectEnv, handleProjectEnvSaved, isProjectSettingsOpen, handleProjectSharedEnv, handleProjectSharedEnvSaved, handleProjectOwnerChanged } from './modules/project-settings.js';
36
36
  import { initSkills, handleSkillInstalled, handleSkillUninstalled } from './modules/skills.js';
37
37
  import { initMcp } from './modules/mcp-ui.js';
38
38
  import { initScheduler, resetScheduler, handleLoopRegistryUpdated, handleScheduleRunStarted, handleScheduleRunFinished, handleLoopScheduled, openSchedulerToTab, isSchedulerOpen, closeScheduler, enterCraftingMode, exitCraftingMode, handleLoopRegistryFiles, getUpcomingSchedules } from './modules/scheduler.js';
39
- import { initAsciiLogo, startLogoAnimation, stopLogoAnimation } from './modules/ascii-logo.js';
40
39
  import { initPlaybook, openPlaybook, getPlaybooks, getPlaybookForTip, isCompleted as isPlaybookCompleted } from './modules/playbook.js';
41
40
  import { initSTT } from './modules/stt.js';
42
41
  import { initProfile, getProfileLang } from './modules/profile.js';
@@ -58,7 +57,7 @@ import { getWs as _getWsRef, setWs as _setWsRef } from './modules/ws-ref.js';
58
57
  import { initHomeHub, showHomeHub as _hubShowHomeHub, hideHomeHub as _hubHideHomeHub, handleHubSchedules as _hubHandleHubSchedules, renderHomeHub as _hubRenderHomeHub, isHomeHubVisible } from './modules/app-home-hub.js';
59
58
  import { initRateLimit, handleRateLimitEvent as _rlHandleRateLimitEvent, updateRateLimitUsage as _rlUpdateRateLimitUsage, addScheduledMessageBubble as _rlAddScheduledMessageBubble, removeScheduledMessageBubble as _rlRemoveScheduledMessageBubble, handleFastModeState as _rlHandleFastModeState, getScheduledMsgEl, resetRateLimitState } from './modules/app-rate-limit.js';
60
59
  import { initCursors, handleRemoteCursorMove as _curHandleRemoteCursorMove, handleRemoteCursorLeave as _curHandleRemoteCursorLeave, handleRemoteSelection as _curHandleRemoteSelection, clearRemoteCursors as _curClearRemoteCursors, initCursorToggle } from './modules/app-cursors.js';
61
- import { initFavicon, updateFavicon as _favUpdateFavicon, setSendBtnMode as _favSetSendBtnMode, blinkIO as _favBlinkIO, blinkSessionDot as _favBlinkSessionDot, updateCrossProjectBlink as _favUpdateCrossProjectBlink, startUrgentBlink as _favStartUrgentBlink, stopUrgentBlink as _favStopUrgentBlink, setActivity as _favSetActivity, drawFaviconAnimFrame as _favDrawFaviconAnimFrame } from './modules/app-favicon.js';
60
+ import { initFavicon, updateFavicon as _favUpdateFavicon, setSendBtnMode as _favSetSendBtnMode, blinkIO as _favBlinkIO, blinkSessionDot as _favBlinkSessionDot, updateCrossProjectBlink as _favUpdateCrossProjectBlink, startUrgentBlink as _favStartUrgentBlink, stopUrgentBlink as _favStopUrgentBlink, setActivity as _favSetActivity } from './modules/app-favicon.js';
62
61
  import { initHeader, closeSessionInfoPopover as _hdrCloseSessionInfoPopover, updateHistorySentinel as _hdrUpdateHistorySentinel, requestMoreHistory as _hdrRequestMoreHistory, prependOlderHistory as _hdrPrependOlderHistory } from './modules/app-header.js';
63
62
  import { initSessionActions } from './modules/session-actions.js';
64
63
  import { initMisc, flushPendingExtMessages, showImageModal as _miscShowImageModal, closeImageModal as _miscCloseImageModal, showPasteModal as _miscShowPasteModal, closePasteModal as _miscClosePasteModal, showConfirm as _miscShowConfirm, hideConfirm as _miscHideConfirm, showForceChangePinOverlay as _miscShowForceChangePinOverlay, sendExtensionCommand as _miscSendExtensionCommand, handleExtensionResult as _miscHandleExtensionResult } from './modules/app-misc.js';
@@ -504,13 +503,6 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
504
503
  initSplitView();
505
504
  initPaneBridge();
506
505
 
507
- // --- Connect overlay (animated ASCII logo) ---
508
- var asciiLogoCanvas = $("ascii-logo-canvas");
509
- initAsciiLogo(asciiLogoCanvas);
510
- startLogoAnimation();
511
- function startVerbCycle() { startLogoAnimation(); }
512
- function stopVerbCycle() { stopLogoAnimation(); }
513
-
514
506
  // --- Favicon, IO blink, status/activity -> modules/app-favicon.js
515
507
  function startPixelAnim() {}
516
508
  function stopPixelAnim() {}
Binary file
@@ -0,0 +1,20 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4611 1531" role="img" aria-label="Clay Studio">
2
+ <title>Clay Studio</title>
3
+ <style>
4
+ g { fill: #171717; }
5
+ @media (prefers-color-scheme: dark) { g { fill: #f2f2ef; } }
6
+ </style>
7
+ <metadata>Source Serif 4 v4.005, weight 400, optical size 60, tracking -0.01em, word gap 0.18em. Converted to outlines.</metadata>
8
+ <g fill="#171717" transform="translate(90 1116) scale(1 -1)">
9
+ <path d="M343 -16Q278 -16 224.0 8.5Q170 33 130.0 79.0Q90 125 68.5 190.0Q47 255 47 336Q47 416 69.5 480.5Q92 545 132.5 591.0Q173 637 227.0 661.5Q281 686 344 686Q379 686 423.0 677.5Q467 669 510 639L520 484H504L445 651L491 642L495 616Q455 646 419.5 655.5Q384 665 348 665Q288 665 237.5 626.5Q187 588 157.0 514.0Q127 440 127 334Q127 228 155.5 154.5Q184 81 233.0 43.0Q282 5 345 5Q378 5 418.5 14.0Q459 23 499 55V28L453 20L511 188H528L518 32Q475 4 431.5 -6.0Q388 -16 343 -16Z" transform="translate(0 0)"/>
10
+ <path d="M35 0V16L131 28H150L245 16V0ZM105 0Q107 23 107.5 61.0Q108 99 108.5 139.5Q109 180 109 212V677L31 694V708L172 744L180 736L176 563V212Q176 180 176.5 139.5Q177 99 178.0 61.0Q179 23 180 0Z" transform="translate(562 0)"/>
11
+ <path d="M156 -12Q107 -12 73.0 16.5Q39 45 39 100Q39 128 50.0 153.0Q61 178 92.0 200.5Q123 223 184 243Q199 248 219.0 254.0Q239 260 266.5 267.5Q294 275 329 283V267Q278 252 247.5 242.0Q217 232 203 226Q161 208 141.5 189.0Q122 170 116.0 152.0Q110 134 110 117Q110 74 131.5 55.5Q153 37 185 37Q207 37 226.0 42.0Q245 47 267.0 61.5Q289 76 319 106L327 68H297Q276 40 253.5 22.0Q231 4 206.5 -4.0Q182 -12 156 -12ZM369 -8Q331 -8 311.5 13.5Q292 35 291 75V77V308Q291 357 281.5 385.5Q272 414 252.0 426.0Q232 438 200 438Q181 438 163.0 433.5Q145 429 125 422L153 441L134 361Q130 341 119.0 330.0Q108 319 91 319Q74 319 66.0 329.0Q58 339 56 356Q67 405 114.0 434.5Q161 464 225 464Q271 464 300.5 447.5Q330 431 344.5 396.0Q359 361 359 306V83Q359 52 367.5 40.5Q376 29 390 29Q403 29 412.0 35.0Q421 41 434 55L444 47Q434 23 416.0 7.5Q398 -8 369 -8Z" transform="translate(825 0)"/>
12
+ <path d="M57 -259Q42 -259 27.0 -254.5Q12 -250 1.0 -241.0Q-10 -232 -15 -218Q-13 -201 0.5 -191.5Q14 -182 33 -182Q50 -182 63.5 -188.5Q77 -195 91 -206L115 -224L106 -228L85 -234Q112 -219 132.0 -192.5Q152 -166 170.0 -127.5Q188 -89 207 -40L236 35L237 39L313 246L389 452H417L232 -40Q208 -105 182.5 -154.5Q157 -204 127.0 -231.5Q97 -259 57 -259ZM225 -6 44 452H123L266 70L241 25ZM4 436V452H211V437L111 424H91ZM309 437V452H461V436L397 428H385Z" transform="translate(1245 0)"/>
13
+ <path d="M216 -16Q163 -16 117.5 -1.0Q72 14 40 36L48 188H64L105 12L61 36V52Q90 35 113.0 24.5Q136 14 160.5 9.5Q185 5 216 5Q260 5 294.0 20.0Q328 35 347.5 68.0Q367 101 367 155Q367 194 350.0 220.5Q333 247 304.5 266.0Q276 285 243 300L207 317Q169 336 133.0 359.5Q97 383 74.5 418.5Q52 454 52 508Q52 566 78.5 605.5Q105 645 150.0 665.5Q195 686 249 686Q299 686 336.0 673.5Q373 661 401 638L397 494H381L337 659L384 639L388 613Q354 648 320.5 656.5Q287 665 249 665Q212 665 180.5 652.0Q149 639 129.5 608.5Q110 578 110 527Q110 489 127.0 462.5Q144 436 172.5 417.0Q201 398 234 382L269 365Q309 346 345.5 322.5Q382 299 405.5 263.5Q429 228 429 172Q429 114 404.0 71.5Q379 29 331.5 6.5Q284 -16 216 -16Z" transform="translate(1890 0)"/>
14
+ <path d="M121 428V452H276V428ZM185 -12Q138 -12 110.0 13.5Q82 39 82 89Q82 117 82.0 140.5Q82 164 82 198L84 428H8V444L119 462L83 440L133 604H155L151 440V436V97Q151 58 166.0 41.5Q181 25 207 25Q227 25 244.0 33.5Q261 42 275 58L286 49Q276 30 262.5 16.5Q249 3 230.5 -4.5Q212 -12 185 -12Z" transform="translate(2339 0)"/>
15
+ <path d="M213 -12Q156 -12 124.5 21.5Q93 55 93 129V429L114 399L24 418V432L156 464L164 456L160 330V147Q160 82 179.5 59.5Q199 37 242 37Q266 37 289.0 45.5Q312 54 336.0 71.0Q360 88 385 111L393 95H389Q370 70 342.5 45.0Q315 20 282.5 4.0Q250 -12 213 -12ZM379 -10V90V93V403L306 418V432L442 464L450 456L446 330V25L513 16V0Z" transform="translate(2627 0)"/>
16
+ <path d="M225 -12Q176 -12 135.0 13.5Q94 39 69.0 89.5Q44 140 44 216Q44 295 70.5 350.5Q97 406 141.0 435.0Q185 464 237 464Q264 464 289.5 455.0Q315 446 337.5 426.0Q360 406 378 372H392L385 347Q348 391 318.5 408.5Q289 426 248 426Q212 426 181.5 403.5Q151 381 133.0 335.0Q115 289 115 220Q115 153 132.0 110.0Q149 67 179.5 46.0Q210 25 248 25Q289 25 321.0 51.0Q353 77 381 118L387 89H374Q359 61 337.0 38.0Q315 15 287.0 1.5Q259 -12 225 -12ZM365 -10V85V88V376V384V677L290 694V708L428 744L436 736L432 540V25L501 16V0Z" transform="translate(3153 0)"/>
17
+ <path d="M35 0V16L131 28H150L245 16V0ZM105 0Q107 23 107.5 61.0Q108 99 108.5 139.5Q109 180 109 212V258Q109 300 108.5 329.0Q108 358 106 389L31 406V420L172 464L180 456L176 330V212Q176 180 176.5 139.5Q177 99 178.0 61.0Q179 23 180 0ZM140 569Q118 569 102.5 583.0Q87 597 87 622Q87 646 102.5 660.0Q118 674 140 674Q163 674 178.0 660.0Q193 646 193 622Q193 597 178.0 583.0Q163 569 140 569Z" transform="translate(3672 0)"/>
18
+ <path d="M251 -12Q196 -12 149.0 14.5Q102 41 73.0 93.5Q44 146 44 224Q44 302 73.0 355.5Q102 409 149.0 436.5Q196 464 251 464Q306 464 353.0 437.5Q400 411 429.0 359.0Q458 307 458 228Q458 151 429.0 97.0Q400 43 353.0 15.5Q306 -12 251 -12ZM251 9Q292 9 322.0 34.5Q352 60 368.0 109.0Q384 158 384 228Q384 298 368.0 345.5Q352 393 322.0 418.0Q292 443 251 443Q210 443 179.5 417.5Q149 392 133.0 343.0Q117 294 117 224Q117 155 133.0 107.0Q149 59 179.5 34.0Q210 9 251 9Z" transform="translate(3930 0)"/>
19
+ </g>
20
+ </svg>
@@ -91,73 +91,155 @@ img.emoji {
91
91
  }
92
92
 
93
93
  :root {
94
- --bg: #282a36;
95
- --bg-alt: #363447;
96
- --text: #f0f1f4;
97
- --text-secondary: #f8f8f2;
98
- --text-muted: #9ea8c7;
99
- --text-dimmer: #6272a4;
100
- --accent: #ffb86c;
101
- --accent-hover: #ffc17e;
102
- --accent-bg: rgba(255, 184, 108, 0.12);
103
- --code-bg: #22242e;
104
- --border: #44475a;
105
- --border-subtle: #333644;
106
- --input-bg: #3d3e51;
107
- --user-bubble: #404154;
108
- --error: #ff5555;
109
- --success: #50fa7b;
110
- --warning: #f1fa8c;
111
- --accent-8: rgba(255, 184, 108, 0.08);
112
- --accent-12: rgba(255, 184, 108, 0.12);
113
- --accent-15: rgba(255, 184, 108, 0.15);
114
- --accent-20: rgba(255, 184, 108, 0.20);
115
- --accent-25: rgba(255, 184, 108, 0.25);
116
- --accent-30: rgba(255, 184, 108, 0.30);
117
- --accent2: #80bfff;
118
- --accent2-hover: #8fc7ff;
119
- --accent2-bg: rgba(128, 191, 255, 0.12);
120
- --accent2-8: rgba(128, 191, 255, 0.08);
121
- --accent2-12: rgba(128, 191, 255, 0.12);
122
- --accent2-15: rgba(128, 191, 255, 0.15);
123
- --accent2-20: rgba(128, 191, 255, 0.20);
124
- --accent2-25: rgba(128, 191, 255, 0.25);
125
- --accent2-30: rgba(128, 191, 255, 0.30);
126
- --error-8: rgba(255, 85, 85, 0.08);
127
- --error-12: rgba(255, 85, 85, 0.12);
128
- --error-15: rgba(255, 85, 85, 0.15);
129
- --error-25: rgba(255, 85, 85, 0.25);
130
- --success-8: rgba(80, 250, 123, 0.08);
131
- --success-12: rgba(80, 250, 123, 0.12);
132
- --success-15: rgba(80, 250, 123, 0.15);
133
- --success-25: rgba(80, 250, 123, 0.25);
134
- --warning-bg: rgba(241, 250, 140, 0.12);
94
+ --brand-ink: #171717;
95
+ --brand-paper: #f2f2ef;
96
+ --brand-indigo: #5857fc;
97
+ --brand-green: #07e5a3;
98
+ --font-weight-body: 400;
99
+ --font-weight-ui: 500;
100
+ --font-weight-heading: 600;
101
+ --font-weight-emphasis: 700;
102
+ --bg: #171715;
103
+ --bg-alt: #20201d;
104
+ --text: #e8e8e2;
105
+ --text-secondary: #d1d1ca;
106
+ --text-muted: #a0a098;
107
+ --text-dimmer: #686861;
108
+ --accent: #7776ff;
109
+ --accent-hover: #8786ff;
110
+ --accent-bg: rgba(119, 118, 255, 0.12);
111
+ --link: #7f7ec8;
112
+ --link-hover: #8c8bd0;
113
+ --code-bg: #141412;
114
+ --border: #393934;
115
+ --border-subtle: #252521;
116
+ --input-bg: #2d2d29;
117
+ --ask-mate-bg: #20201d;
118
+ --user-bubble: #32322d;
119
+ --error: #ff7479;
120
+ --success: #07e5a3;
121
+ --warning: #e0b45b;
122
+ --accent-8: rgba(119, 118, 255, 0.08);
123
+ --accent-12: rgba(119, 118, 255, 0.12);
124
+ --accent-15: rgba(119, 118, 255, 0.15);
125
+ --accent-20: rgba(119, 118, 255, 0.20);
126
+ --accent-25: rgba(119, 118, 255, 0.25);
127
+ --accent-30: rgba(119, 118, 255, 0.30);
128
+ --accent2: #07e5a3;
129
+ --accent2-hover: #25e8ae;
130
+ --accent2-bg: rgba(7, 229, 163, 0.12);
131
+ --accent2-8: rgba(7, 229, 163, 0.08);
132
+ --accent2-12: rgba(7, 229, 163, 0.12);
133
+ --accent2-15: rgba(7, 229, 163, 0.15);
134
+ --accent2-20: rgba(7, 229, 163, 0.20);
135
+ --accent2-25: rgba(7, 229, 163, 0.25);
136
+ --accent2-30: rgba(7, 229, 163, 0.30);
137
+ --error-8: rgba(255, 116, 121, 0.08);
138
+ --error-12: rgba(255, 116, 121, 0.12);
139
+ --error-15: rgba(255, 116, 121, 0.15);
140
+ --error-25: rgba(255, 116, 121, 0.25);
141
+ --success-8: rgba(7, 229, 163, 0.08);
142
+ --success-12: rgba(7, 229, 163, 0.12);
143
+ --success-15: rgba(7, 229, 163, 0.15);
144
+ --success-25: rgba(7, 229, 163, 0.25);
145
+ --warning-bg: rgba(224, 180, 91, 0.12);
135
146
  --overlay-rgb: 255,255,255;
136
147
  --shadow-rgb: 0,0,0;
137
- --hl-comment: #6272a4;
138
- --hl-keyword: #ff79c6;
139
- --hl-string: #50fa7b;
140
- --hl-number: #ffb86c;
141
- --hl-function: #80bfff;
142
- --hl-variable: #ff5555;
143
- --hl-type: #f1fa8c;
144
- --hl-constant: #ffb86c;
145
- --hl-tag: #ff5555;
146
- --hl-attr: #80bfff;
147
- --hl-regexp: #8be9fd;
148
- --hl-meta: #bd93f9;
149
- --hl-builtin: #ffb86c;
150
- --hl-symbol: #bd93f9;
151
- --hl-addition: #50fa7b;
152
- --hl-deletion: #ff5555;
153
- --sidebar-bg: #242631;
154
- --sidebar-hover: #2f2f3f;
155
- --sidebar-active: #3d3e51;
148
+ --hl-comment: #686861;
149
+ --hl-keyword: #c39af3;
150
+ --hl-string: #07e5a3;
151
+ --hl-number: #7776ff;
152
+ --hl-function: #8aa7ff;
153
+ --hl-variable: #ff7479;
154
+ --hl-type: #e0b45b;
155
+ --hl-constant: #7776ff;
156
+ --hl-tag: #ff7479;
157
+ --hl-attr: #8aa7ff;
158
+ --hl-regexp: #5fd2c0;
159
+ --hl-meta: #d69a7d;
160
+ --hl-builtin: #7776ff;
161
+ --hl-symbol: #d69a7d;
162
+ --hl-addition: #07e5a3;
163
+ --hl-deletion: #ff7479;
164
+ --sidebar-bg: #151513;
165
+ --sidebar-hover: #1c1c19;
166
+ --sidebar-active: #2d2d29;
167
+ --filebrowser-bg: #20201e;
168
+ --filebrowser-border: #282825;
156
169
  --safe-top: env(safe-area-inset-top, 0px);
157
170
  --safe-bottom: env(safe-area-inset-bottom, 0px);
158
171
  --content-width: 760px;
159
172
  }
160
173
 
174
+ :root.light-theme {
175
+ --bg: #f7f7f3;
176
+ --bg-alt: #eeeeea;
177
+ --text: #252522;
178
+ --text-secondary: #44443f;
179
+ --text-muted: #73736c;
180
+ --text-dimmer: #a2a29b;
181
+ --accent: #5857fc;
182
+ --accent-hover: #4d4dde;
183
+ --accent-bg: rgba(88, 87, 252, 0.12);
184
+ --link: #4948b8;
185
+ --link-hover: #4241a6;
186
+ --code-bg: #f0f0ec;
187
+ --border: #d7d7d0;
188
+ --border-subtle: #eaeae5;
189
+ --input-bg: #edede9;
190
+ --ask-mate-bg: #f8f8f6;
191
+ --user-bubble: #e7e7e3;
192
+ --error: #c84b50;
193
+ --success: #087b59;
194
+ --warning: #956a19;
195
+ --sidebar-bg: #f2f2ee;
196
+ --sidebar-hover: #e8e8e4;
197
+ --sidebar-active: #e2e2de;
198
+ --filebrowser-bg: #f7f7f3;
199
+ --filebrowser-border: #e3e3e0;
200
+ --accent-8: rgba(88, 87, 252, 0.08);
201
+ --accent-12: rgba(88, 87, 252, 0.12);
202
+ --accent-15: rgba(88, 87, 252, 0.15);
203
+ --accent-20: rgba(88, 87, 252, 0.20);
204
+ --accent-25: rgba(88, 87, 252, 0.25);
205
+ --accent-30: rgba(88, 87, 252, 0.30);
206
+ --accent2: #07e5a3;
207
+ --accent2-hover: #06ca8f;
208
+ --accent2-bg: rgba(7, 229, 163, 0.12);
209
+ --accent2-8: rgba(7, 229, 163, 0.08);
210
+ --accent2-12: rgba(7, 229, 163, 0.12);
211
+ --accent2-15: rgba(7, 229, 163, 0.15);
212
+ --accent2-20: rgba(7, 229, 163, 0.20);
213
+ --accent2-25: rgba(7, 229, 163, 0.25);
214
+ --accent2-30: rgba(7, 229, 163, 0.30);
215
+ --error-8: rgba(200, 75, 80, 0.08);
216
+ --error-12: rgba(200, 75, 80, 0.12);
217
+ --error-15: rgba(200, 75, 80, 0.15);
218
+ --error-25: rgba(200, 75, 80, 0.25);
219
+ --success-8: rgba(8, 123, 89, 0.08);
220
+ --success-12: rgba(8, 123, 89, 0.12);
221
+ --success-15: rgba(8, 123, 89, 0.15);
222
+ --success-25: rgba(8, 123, 89, 0.25);
223
+ --warning-bg: rgba(149, 106, 25, 0.12);
224
+ --overlay-rgb: 0,0,0;
225
+ --hl-comment: #a2a29b;
226
+ --hl-keyword: #7a52a8;
227
+ --hl-string: #087b59;
228
+ --hl-number: #5857fc;
229
+ --hl-function: #3f62b4;
230
+ --hl-variable: #c84b50;
231
+ --hl-type: #956a19;
232
+ --hl-constant: #5857fc;
233
+ --hl-tag: #c84b50;
234
+ --hl-attr: #3f62b4;
235
+ --hl-regexp: #187a7c;
236
+ --hl-meta: #9a5a46;
237
+ --hl-builtin: #5857fc;
238
+ --hl-symbol: #9a5a46;
239
+ --hl-addition: #087b59;
240
+ --hl-deletion: #c84b50;
241
+ }
242
+
161
243
  /* PWA standalone: home indicator safe area still applies on notched devices */
162
244
 
163
245
  ::selection {
@@ -170,6 +252,7 @@ html, body {
170
252
  color: var(--text);
171
253
  font-family: "Pretendard", "Twemoji", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
172
254
  font-size: 15px;
255
+ font-weight: var(--font-weight-body);
173
256
  line-height: 1.6;
174
257
  overflow: hidden;
175
258
  overscroll-behavior: none;
@@ -283,4 +366,3 @@ html, body {
283
366
  border-color: var(--warning);
284
367
  color: var(--warning);
285
368
  }
286
-
@@ -960,13 +960,22 @@
960
960
  width: 50%;
961
961
  max-width: 720px;
962
962
  min-width: 360px;
963
- border-left: 1px solid var(--border);
963
+ height: calc(100% - 16px);
964
+ align-self: center;
965
+ margin: 8px 8px 8px 10px;
966
+ border: 1px solid var(--border);
967
+ border-radius: 12px;
964
968
  background: var(--bg);
965
969
  display: flex;
966
970
  flex-direction: column;
967
971
  overflow: hidden;
968
972
  flex-shrink: 0;
969
- transition: max-width 0.2s ease, width 0.2s ease;
973
+ box-shadow:
974
+ 4px 8px 18px rgba(var(--shadow-rgb), 0.14),
975
+ 2px 2px 4px rgba(var(--shadow-rgb), 0.08),
976
+ inset 0 1px 0 rgba(255, 255, 255, 0.04);
977
+ animation: workbench-panel-in 0.18s cubic-bezier(0.2, 0.8, 0.2, 1);
978
+ transition: max-width 0.2s ease, width 0.2s ease, box-shadow 0.2s ease;
970
979
  }
971
980
  #file-viewer.hidden { display: none; }
972
981
  #file-viewer.file-viewer-wide {
@@ -980,13 +989,21 @@
980
989
  height: 100dvh;
981
990
  max-width: none;
982
991
  min-width: 0;
992
+ margin: 0;
983
993
  z-index: 10000;
984
994
  border: 0;
995
+ border-radius: 0;
985
996
  background: var(--bg);
986
997
  box-shadow: none;
998
+ animation: none;
987
999
  }
988
1000
  }
989
1001
 
1002
+ @keyframes workbench-panel-in {
1003
+ from { opacity: 0; transform: translateX(10px) scale(0.995); }
1004
+ to { opacity: 1; transform: translateX(0) scale(1); }
1005
+ }
1006
+
990
1007
  /* Narrow screens: full overlay */
991
1008
  @media (max-width: 1023px) {
992
1009
  #file-viewer {
@@ -1034,22 +1051,29 @@
1034
1051
  .file-viewer-tab:hover .file-viewer-tab-close, .file-viewer-tab.active .file-viewer-tab-close { opacity: 1; }
1035
1052
  .file-viewer-tab-close:hover { background: var(--bg-hover); color: var(--text); }
1036
1053
 
1054
+ .file-viewer-window-actions {
1055
+ display: flex;
1056
+ align-items: center;
1057
+ gap: 1px;
1058
+ flex: 0 0 auto;
1059
+ padding: 0 4px 0 2px;
1060
+ }
1061
+
1037
1062
  .file-viewer-toolbar {
1038
1063
  display: flex;
1039
1064
  align-items: center;
1040
1065
  flex: 0 0 auto;
1041
1066
  gap: 1px;
1042
- padding: 0 6px;
1043
- background: var(--bg-deep);
1044
- border-left: 1px solid var(--border-subtle);
1067
+ margin-left: auto;
1068
+ padding: 0 0 0 8px;
1045
1069
  }
1046
1070
 
1047
1071
  .file-viewer-breadcrumbs {
1048
1072
  display: flex;
1049
1073
  align-items: center;
1050
1074
  gap: 10px;
1051
- min-height: 30px;
1052
- padding: 0 10px;
1075
+ min-height: 34px;
1076
+ padding: 0 6px 0 10px;
1053
1077
  border-bottom: 1px solid var(--border-subtle);
1054
1078
  background: var(--bg);
1055
1079
  }
@@ -1862,19 +1886,41 @@
1862
1886
  width: 50%;
1863
1887
  max-width: 720px;
1864
1888
  min-width: 360px;
1889
+ height: calc(100% - 16px);
1865
1890
  min-height: 0;
1866
- border-left: 1px solid var(--border);
1891
+ align-self: center;
1892
+ margin: 8px 8px 8px 10px;
1893
+ border: 1px solid var(--border);
1894
+ border-radius: 12px;
1867
1895
  background: var(--bg);
1868
1896
  display: flex;
1869
1897
  flex-direction: column;
1870
1898
  overflow: hidden;
1871
1899
  flex-shrink: 0;
1900
+ box-shadow:
1901
+ 4px 8px 18px rgba(var(--shadow-rgb), 0.14),
1902
+ 2px 2px 4px rgba(var(--shadow-rgb), 0.08),
1903
+ inset 0 1px 0 rgba(255, 255, 255, 0.04);
1904
+ animation: workbench-panel-in 0.18s cubic-bezier(0.2, 0.8, 0.2, 1);
1872
1905
  }
1873
1906
  #terminal-container.hidden { display: none; }
1874
1907
  #terminal-container.panel-fullscreen {
1875
1908
  width: 100%;
1876
1909
  max-width: none;
1877
1910
  min-width: 0;
1911
+ height: 100%;
1912
+ margin: 0;
1913
+ border: 0;
1914
+ border-radius: 0;
1915
+ box-shadow: none;
1916
+ animation: none;
1917
+ }
1918
+ }
1919
+
1920
+ @media (prefers-reduced-motion: reduce) {
1921
+ #file-viewer,
1922
+ #terminal-container {
1923
+ animation: none;
1878
1924
  }
1879
1925
  }
1880
1926
 
@@ -36,29 +36,32 @@
36
36
  position: absolute;
37
37
  width: 38px;
38
38
  height: 38px;
39
+ box-sizing: border-box;
39
40
  border-radius: 12px;
40
41
  background: var(--bg-alt);
41
- transition: background 0.2s ease;
42
+ box-shadow: 0 1px 2px rgba(var(--shadow-rgb), 0.08);
43
+ transition: background 0.2s ease, box-shadow 0.2s ease;
42
44
  z-index: -1;
43
45
  }
44
46
 
45
47
  .icon-strip-home:hover::before {
46
- background: var(--accent);
48
+ background: var(--bg);
49
+ box-shadow: 0 2px 6px rgba(var(--shadow-rgb), 0.14);
47
50
  }
48
51
 
49
52
  .icon-strip-home .icon-strip-logo {
50
53
  width: 38px;
51
54
  height: 38px;
52
- border-radius: 12px;
53
- object-fit: cover;
55
+ object-fit: contain;
54
56
  }
55
57
 
56
58
  .icon-strip-home:hover .icon-strip-logo {
57
- opacity: 0.8;
59
+ opacity: 1;
58
60
  }
59
61
 
60
62
  .icon-strip-home.active::before {
61
- background: var(--accent);
63
+ background: var(--bg);
64
+ box-shadow: 0 1px 3px rgba(var(--shadow-rgb), 0.14);
62
65
  }
63
66
 
64
67
  /* First separator aligns with title bar border (48px line) */
@@ -185,26 +188,32 @@
185
188
  position: absolute;
186
189
  width: 38px;
187
190
  height: 38px;
191
+ box-sizing: border-box;
188
192
  border-radius: 12px;
189
- background: var(--bg-alt);
190
- transition: background 0.2s ease;
193
+ background: var(--bg);
194
+ box-shadow: 0 1px 2px rgba(var(--shadow-rgb), 0.1);
195
+ transition: background 0.2s ease, box-shadow 0.2s ease;
191
196
  z-index: -1;
192
197
  }
193
198
 
194
199
  .icon-strip-item:hover::before {
195
- background: var(--accent);
200
+ background: var(--bg-alt);
201
+ box-shadow: 0 2px 6px rgba(var(--shadow-rgb), 0.14);
196
202
  }
197
203
 
198
204
  .icon-strip-item:hover {
199
- color: #fff;
205
+ color: var(--text);
200
206
  }
201
207
 
202
208
  .icon-strip-item.active::before {
203
- background: var(--accent);
209
+ background: var(--bg);
210
+ box-shadow:
211
+ 0 0 0 1px color-mix(in srgb, var(--link) 62%, var(--border)),
212
+ 0 1px 3px rgba(var(--shadow-rgb), 0.16);
204
213
  }
205
214
 
206
215
  .icon-strip-item.active {
207
- color: #fff;
216
+ color: var(--text);
208
217
  }
209
218
 
210
219
  /* --- Socket status indicator on icon (top-left dot) --- */
@@ -486,6 +495,8 @@
486
495
  .icon-strip-item .project-emoji {
487
496
  width: 22px;
488
497
  height: 22px;
498
+ position: relative;
499
+ z-index: 1;
489
500
  pointer-events: none;
490
501
  }
491
502
 
@@ -1230,22 +1241,25 @@
1230
1241
  width: 30px;
1231
1242
  height: 30px;
1232
1243
  border-radius: 8px;
1233
- background: var(--bg-alt);
1234
- opacity: 0.7;
1235
- transition: opacity 0.15s, background 0.15s;
1244
+ background: var(--bg);
1245
+ box-shadow: 0 1px 2px rgba(var(--shadow-rgb), 0.1);
1246
+ transition: background 0.15s, box-shadow 0.15s;
1236
1247
  }
1237
1248
 
1238
1249
  .icon-strip-wt-item:hover::before {
1239
- opacity: 1;
1250
+ background: var(--bg-alt);
1251
+ box-shadow: 0 2px 5px rgba(var(--shadow-rgb), 0.14);
1240
1252
  }
1241
1253
 
1242
1254
  .icon-strip-wt-item.active::before {
1243
- background: var(--accent);
1244
- opacity: 1;
1255
+ background: var(--bg);
1256
+ box-shadow:
1257
+ 0 0 0 1px color-mix(in srgb, var(--link) 58%, var(--border)),
1258
+ 0 1px 3px rgba(var(--shadow-rgb), 0.16);
1245
1259
  }
1246
1260
 
1247
1261
  .icon-strip-wt-item.active {
1248
- color: #fff;
1262
+ color: var(--text);
1249
1263
  }
1250
1264
 
1251
1265
  .icon-strip-wt-item .wt-branch-abbrev {
@@ -401,7 +401,7 @@
401
401
 
402
402
  .context-picker-section-label {
403
403
  font-size: 10px;
404
- font-weight: 600;
404
+ font-weight: var(--font-weight-ui);
405
405
  color: var(--text-dimmer);
406
406
  text-transform: uppercase;
407
407
  letter-spacing: 0.5px;
@@ -535,7 +535,7 @@
535
535
  .email-setup-title {
536
536
  margin: 0 0 16px;
537
537
  font-size: 16px;
538
- font-weight: 600;
538
+ font-weight: var(--font-weight-heading);
539
539
  color: var(--text);
540
540
  }
541
541
  .email-setup-field {
@@ -628,7 +628,7 @@
628
628
  border: none;
629
629
  background: var(--accent);
630
630
  color: #fff;
631
- font-weight: 600;
631
+ font-weight: var(--font-weight-ui);
632
632
  }
633
633
  .email-setup-btn-primary:hover {
634
634
  background: var(--accent-hover);
@@ -718,11 +718,21 @@
718
718
  border: none;
719
719
  border-radius: 8px;
720
720
  padding: 7px;
721
- transition: box-shadow 0.2s;
721
+ transition: box-shadow 0.18s ease, transform 0.18s ease, background 0.18s ease;
722
722
  }
723
723
 
724
724
  #input-row:focus-within {
725
- box-shadow: 0 0 0 1px var(--border);
725
+ background: color-mix(in srgb, var(--input-bg) 96%, white);
726
+ box-shadow:
727
+ 0 0 0 1px color-mix(in srgb, var(--accent) 22%, var(--border)),
728
+ 0 8px 22px rgba(var(--shadow-rgb), 0.14),
729
+ 0 2px 6px rgba(var(--shadow-rgb), 0.08);
730
+ transform: translateY(-1px);
731
+ }
732
+
733
+ @media (prefers-reduced-motion: reduce) {
734
+ #input-row { transition: box-shadow 0.01ms; }
735
+ #input-row:focus-within { transform: none; }
726
736
  }
727
737
 
728
738
  #input-textarea-wrap {