clay-server 3.5.1 → 3.6.0-beta.2

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 (64) 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/daemon.js +7 -0
  6. package/lib/os-user-diagnostics-worker.js +18 -0
  7. package/lib/os-user-diagnostics.js +312 -0
  8. package/lib/os-users.js +55 -22
  9. package/lib/pages.js +47 -35
  10. package/lib/public/app.js +2 -10
  11. package/lib/public/apple-touch-icon.png +0 -0
  12. package/lib/public/clay-studio-favicon-32.png +0 -0
  13. package/lib/public/clay-studio-symbol.png +0 -0
  14. package/lib/public/clay-studio-wordmark.svg +20 -0
  15. package/lib/public/css/base.css +143 -61
  16. package/lib/public/css/filebrowser.css +132 -22
  17. package/lib/public/css/icon-strip.css +33 -19
  18. package/lib/public/css/input.css +15 -5
  19. package/lib/public/css/messages.css +17 -14
  20. package/lib/public/css/mobile-nav.css +5 -5
  21. package/lib/public/css/overlays.css +58 -6
  22. package/lib/public/css/pane.css +0 -1
  23. package/lib/public/css/session-actions.css +9 -3
  24. package/lib/public/css/sidebar.css +104 -161
  25. package/lib/public/css/title-bar.css +51 -18
  26. package/lib/public/css/user-settings.css +114 -8
  27. package/lib/public/icon-192.png +0 -0
  28. package/lib/public/icon-512.png +0 -0
  29. package/lib/public/index.html +44 -82
  30. package/lib/public/manifest.json +1 -6
  31. package/lib/public/modules/app-connection.js +0 -3
  32. package/lib/public/modules/app-favicon.js +22 -29
  33. package/lib/public/modules/app-messages.js +1 -2
  34. package/lib/public/modules/app-notifications.js +3 -3
  35. package/lib/public/modules/command-palette.js +1 -1
  36. package/lib/public/modules/filebrowser-tabs.js +42 -3
  37. package/lib/public/modules/filebrowser.js +78 -9
  38. package/lib/public/modules/server-settings.js +0 -77
  39. package/lib/public/modules/sidebar-projects.js +1 -1
  40. package/lib/public/modules/sidebar-sessions.js +18 -5
  41. package/lib/public/modules/sidebar.js +2 -2
  42. package/lib/public/modules/theme.js +88 -249
  43. package/lib/public/modules/user-settings.js +2 -3
  44. package/lib/public/style.css +10 -10
  45. package/lib/public/sw.js +4 -2
  46. package/lib/themes/clay-dark.json +11 -0
  47. package/lib/themes/clay-light.json +11 -0
  48. package/package.json +1 -1
  49. package/lib/public/apple-touch-icon-dark.png +0 -0
  50. package/lib/public/clay-logo.png +0 -0
  51. package/lib/public/favicon-banded-32.png +0 -0
  52. package/lib/public/favicon-banded.png +0 -0
  53. package/lib/public/favicon-dark.svg +0 -1
  54. package/lib/public/favicon.svg +0 -1
  55. package/lib/public/icon-192-dark.png +0 -0
  56. package/lib/public/icon-512-dark.png +0 -0
  57. package/lib/public/icon-banded-76.png +0 -0
  58. package/lib/public/icon-banded-96.png +0 -0
  59. package/lib/public/icon-mono.svg +0 -1
  60. package/lib/public/modules/ascii-logo.js +0 -442
  61. package/lib/public/wordmark-banded-20.png +0 -0
  62. package/lib/public/wordmark-banded-32.png +0 -0
  63. package/lib/public/wordmark-banded-64.png +0 -0
  64. package/lib/public/wordmark-banded-80.png +0 -0
@@ -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 {
@@ -1002,32 +1019,81 @@
1002
1019
  }
1003
1020
 
1004
1021
  .file-viewer-header {
1022
+ display: block;
1023
+ padding: 0;
1024
+ flex-shrink: 0;
1025
+ min-height: 0;
1026
+ background: var(--bg);
1027
+ }
1028
+
1029
+ .file-viewer-tabbar {
1005
1030
  display: flex;
1006
- align-items: center;
1007
- gap: 8px;
1008
- padding: 10px 16px;
1031
+ align-items: stretch;
1032
+ height: 36px;
1033
+ min-width: 0;
1034
+ background: var(--bg-deep);
1009
1035
  border-bottom: 1px solid var(--border-subtle);
1010
- flex-shrink: 0;
1011
- min-height: 44px;
1012
1036
  }
1013
1037
 
1014
- .file-viewer-tabs { display: flex; min-width: 0; flex: 1; overflow-x: auto; gap: 2px; }
1015
- .file-viewer-tab { display: inline-flex; align-items: center; gap: 6px; max-width: 170px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; border: 0; border-radius: 5px; padding: 4px 7px; background: transparent; color: var(--text-secondary); font: inherit; font-size: 12px; cursor: pointer; }
1016
- .file-viewer-tab.active { background: var(--sidebar-hover); color: var(--text); }
1017
- .file-viewer-tab-close { font-size: 16px; line-height: 12px; color: var(--text-muted); }
1038
+ .file-viewer-tabs { display: flex; min-width: 0; flex: 1; overflow-x: auto; overflow-y: hidden; gap: 0; scrollbar-width: none; }
1039
+ .file-viewer-tabs::-webkit-scrollbar { display: none; }
1040
+ .file-viewer-tab { position: relative; display: inline-flex; align-items: center; flex: 0 0 auto; gap: 7px; min-width: 108px; max-width: 190px; height: 36px; overflow: hidden; white-space: nowrap; border: 0; border-right: 1px solid var(--border-subtle); border-radius: 0; padding: 0 8px 0 10px; background: var(--bg-alt); color: var(--text-secondary); font: inherit; font-size: 12px; cursor: pointer; }
1041
+ .file-viewer-tab::before { content: ""; position: absolute; inset: 0 0 auto; height: 1px; background: transparent; }
1042
+ .file-viewer-tab:hover { background: var(--bg-hover); color: var(--text); }
1043
+ .file-viewer-tab.active { background: var(--bg); color: var(--text); }
1044
+ .file-viewer-tab.active::before { background: var(--accent); }
1045
+ .file-viewer-tab.preview .file-viewer-tab-label { font-style: italic; }
1046
+ .file-viewer-tab-icon { display: inline-flex; width: 16px; height: 16px; flex: 0 0 16px; }
1047
+ .file-viewer-tab-icon:empty { display: none; }
1048
+ .file-viewer-tab-icon svg { width: 16px; height: 16px; }
1049
+ .file-viewer-tab-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
1050
+ .file-viewer-tab-close { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; margin-left: auto; border-radius: 4px; flex: 0 0 18px; color: var(--text-muted); font-size: 16px; font-style: normal; line-height: 1; opacity: 0; }
1051
+ .file-viewer-tab:hover .file-viewer-tab-close, .file-viewer-tab.active .file-viewer-tab-close { opacity: 1; }
1052
+ .file-viewer-tab-close:hover { background: var(--bg-hover); color: var(--text); }
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
+
1062
+ .file-viewer-toolbar {
1063
+ display: flex;
1064
+ align-items: center;
1065
+ flex: 0 0 auto;
1066
+ gap: 1px;
1067
+ margin-left: auto;
1068
+ padding: 0 0 0 8px;
1069
+ }
1070
+
1071
+ .file-viewer-breadcrumbs {
1072
+ display: flex;
1073
+ align-items: center;
1074
+ gap: 10px;
1075
+ min-height: 34px;
1076
+ padding: 0 6px 0 10px;
1077
+ border-bottom: 1px solid var(--border-subtle);
1078
+ background: var(--bg);
1079
+ }
1018
1080
 
1019
1081
  .file-viewer-path {
1082
+ display: flex;
1083
+ align-items: center;
1084
+ gap: 3px;
1085
+ min-width: 0;
1020
1086
  flex: 1;
1021
- font-family: "Roboto Mono", monospace;
1022
- font-size: 13px;
1023
- color: var(--text-secondary);
1087
+ font-size: 12px;
1088
+ color: var(--text-muted);
1024
1089
  overflow: hidden;
1025
- text-overflow: ellipsis;
1026
1090
  white-space: nowrap;
1027
- direction: rtl;
1028
- text-align: left;
1029
1091
  }
1030
1092
 
1093
+ .file-viewer-path-segment { flex: 0 0 auto; }
1094
+ .file-viewer-path-segment.current { color: var(--text-secondary); }
1095
+ .file-viewer-path-separator { color: var(--text-dimmer); font-size: 15px; line-height: 1; }
1096
+
1031
1097
  .file-viewer-btn {
1032
1098
  display: flex;
1033
1099
  align-items: center;
@@ -1179,10 +1245,10 @@
1179
1245
  color: var(--text);
1180
1246
  }
1181
1247
 
1182
- #file-viewer.panel-fullscreen .file-viewer-header {
1183
- padding-left: clamp(18px, 3vw, 48px);
1184
- padding-right: clamp(18px, 3vw, 48px);
1185
- background: var(--bg);
1248
+ #file-viewer.panel-fullscreen .file-viewer-breadcrumbs { padding-left: clamp(18px, 3vw, 48px); padding-right: clamp(18px, 3vw, 48px); }
1249
+
1250
+ @media (hover: none) {
1251
+ .file-viewer-tab-close { opacity: 1; }
1186
1252
  }
1187
1253
 
1188
1254
  #file-viewer.panel-fullscreen .file-viewer-body {
@@ -1652,6 +1718,28 @@
1652
1718
  border: 1px solid var(--border-subtle);
1653
1719
  }
1654
1720
 
1721
+ .file-viewer-svg-preview {
1722
+ display: grid;
1723
+ place-items: center;
1724
+ min-height: 100%;
1725
+ padding: clamp(24px, 5vw, 56px);
1726
+ background-color: var(--bg);
1727
+ background-image:
1728
+ linear-gradient(45deg, var(--bg-alt) 25%, transparent 25%),
1729
+ linear-gradient(-45deg, var(--bg-alt) 25%, transparent 25%),
1730
+ linear-gradient(45deg, transparent 75%, var(--bg-alt) 75%),
1731
+ linear-gradient(-45deg, transparent 75%, var(--bg-alt) 75%);
1732
+ background-position: 0 0, 0 10px, 10px -10px, -10px 0;
1733
+ background-size: 20px 20px;
1734
+ }
1735
+
1736
+ .file-viewer-svg-preview img {
1737
+ display: block;
1738
+ max-width: 100%;
1739
+ max-height: calc(100dvh - 150px);
1740
+ filter: drop-shadow(0 8px 24px rgba(var(--shadow-rgb), 0.18));
1741
+ }
1742
+
1655
1743
  /* --- Web Terminal --- */
1656
1744
 
1657
1745
  /* Terminal header with tabs */
@@ -1798,19 +1886,41 @@
1798
1886
  width: 50%;
1799
1887
  max-width: 720px;
1800
1888
  min-width: 360px;
1889
+ height: calc(100% - 16px);
1801
1890
  min-height: 0;
1802
- 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;
1803
1895
  background: var(--bg);
1804
1896
  display: flex;
1805
1897
  flex-direction: column;
1806
1898
  overflow: hidden;
1807
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);
1808
1905
  }
1809
1906
  #terminal-container.hidden { display: none; }
1810
1907
  #terminal-container.panel-fullscreen {
1811
1908
  width: 100%;
1812
1909
  max-width: none;
1813
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;
1814
1924
  }
1815
1925
  }
1816
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 {