clay-server 5.2.0-beta.9 → 5.2.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 (104) hide show
  1. package/README.md +0 -4
  2. package/lib/clay-product-control-tools.js +1 -0
  3. package/lib/clay-product-control.js +14 -11
  4. package/lib/clay-vendor-usage.js +44 -0
  5. package/lib/github-star-count.js +147 -0
  6. package/lib/notes-checklist.js +43 -1
  7. package/lib/notes.js +2 -1
  8. package/lib/project-session-notes.js +33 -8
  9. package/lib/project-sessions.js +63 -24
  10. package/lib/project-start-protocol.js +29 -0
  11. package/lib/project-vendor-login.js +2 -0
  12. package/lib/project.js +5 -1
  13. package/lib/public/app.js +27 -18
  14. package/lib/public/css/contextual-clay.css +1 -1
  15. package/lib/public/css/filebrowser.css +1 -1
  16. package/lib/public/css/mate-loading-scene.css +21 -0
  17. package/lib/public/css/overlays.css +64 -256
  18. package/lib/public/css/project-mate-creation.css +5 -6
  19. package/lib/public/css/project-start.css +108 -0
  20. package/lib/public/css/projects-hub.css +53 -14
  21. package/lib/public/css/settings-shell.css +103 -0
  22. package/lib/public/css/sidebar.css +7 -0
  23. package/lib/public/css/title-bar.css +83 -0
  24. package/lib/public/index.html +50 -63
  25. package/lib/public/modules/account-transport-settings.js +8 -2
  26. package/lib/public/modules/admin-settings-email.js +7 -2
  27. package/lib/public/modules/admin-settings-invitations.js +2 -2
  28. package/lib/public/modules/admin-settings-projects.js +2 -2
  29. package/lib/public/modules/admin-settings-ui.js +20 -4
  30. package/lib/public/modules/admin-settings-users.js +4 -4
  31. package/lib/public/modules/app-home-hub.js +2 -1
  32. package/lib/public/modules/app-messages.js +10 -2
  33. package/lib/public/modules/app-projects.js +1 -407
  34. package/lib/public/modules/app-rate-limit.js +12 -1
  35. package/lib/public/modules/clay-tool-presentation.js +1 -0
  36. package/lib/public/modules/contextual-clay.js +3 -1
  37. package/lib/public/modules/github-star.js +66 -0
  38. package/lib/public/modules/home-surface-boot.js +0 -1
  39. package/lib/public/modules/mate-loading-scene.js +17 -0
  40. package/lib/public/modules/pane-appearance-bridge.js +59 -0
  41. package/lib/public/modules/profile.js +11 -3
  42. package/lib/public/modules/project-mate-creation-workspace.js +13 -4
  43. package/lib/public/modules/project-session-visibility-settings.js +19 -16
  44. package/lib/public/modules/project-settings-environment.js +12 -1
  45. package/lib/public/modules/project-settings.js +119 -129
  46. package/lib/public/modules/project-start-dialog.js +130 -0
  47. package/lib/public/modules/project-start-folder-state.js +78 -0
  48. package/lib/public/modules/project-start-folder-view.js +190 -0
  49. package/lib/public/modules/project-start-forms.js +66 -0
  50. package/lib/public/modules/project-start-path.js +60 -0
  51. package/lib/public/modules/project-start-state.js +54 -0
  52. package/lib/public/modules/project-start-submit.js +67 -0
  53. package/lib/public/modules/projects-hub-view.js +32 -44
  54. package/lib/public/modules/projects-hub.js +39 -28
  55. package/lib/public/modules/server-settings.js +36 -91
  56. package/lib/public/modules/settings-project-target.js +56 -0
  57. package/lib/public/modules/settings-select.js +1 -1
  58. package/lib/public/modules/settings-shell-registry.js +88 -0
  59. package/lib/public/modules/settings-shell-view.js +104 -0
  60. package/lib/public/modules/settings-shell.js +342 -0
  61. package/lib/public/modules/sidebar-mobile.js +8 -30
  62. package/lib/public/modules/sidebar-projects.js +2 -1
  63. package/lib/public/modules/theme.js +31 -3
  64. package/lib/public/modules/user-settings-integrations.js +2 -1
  65. package/lib/public/modules/user-settings-layout.js +12 -34
  66. package/lib/public/modules/user-settings-profile.js +1 -1
  67. package/lib/public/modules/user-settings.js +18 -85
  68. package/lib/public/modules/vendor-usage-format.js +93 -0
  69. package/lib/public/modules/vendor-usage-list.js +45 -0
  70. package/lib/public/modules/vendor-usage-model.js +215 -0
  71. package/lib/public/modules/vendor-usage-overview.js +323 -0
  72. package/lib/public/style.css +10 -7
  73. package/lib/public/welcome-art/conversation-desk.png +0 -0
  74. package/lib/public/welcome-art/mate-clay.png +0 -0
  75. package/lib/public/welcome-art/project-clay.png +0 -0
  76. package/lib/sdk-bridge.js +6 -1
  77. package/lib/sdk-message-processor.js +9 -1
  78. package/lib/sdk-quota-snapshot.js +20 -2
  79. package/lib/server-github-stars.js +39 -0
  80. package/lib/server-global-ws.js +21 -17
  81. package/lib/server.js +11 -0
  82. package/lib/session-notes-mcp-server.js +26 -4
  83. package/lib/session-notes-writes.js +88 -0
  84. package/lib/session-visibility.js +20 -8
  85. package/lib/sessions.js +12 -2
  86. package/lib/vendor-usage-acp-readers.js +97 -0
  87. package/lib/vendor-usage-capabilities.js +88 -0
  88. package/lib/vendor-usage-http-readers.js +214 -0
  89. package/lib/vendor-usage-metrics.js +47 -0
  90. package/lib/vendor-usage-native-readers.js +106 -0
  91. package/lib/vendor-usage-overview.js +406 -0
  92. package/lib/vendor-usage-service.js +281 -0
  93. package/lib/ws-schema.js +4 -2
  94. package/lib/yoke/adapters/claude.js +12 -0
  95. package/lib/yoke/adapters/codex-query-contract.js +1 -0
  96. package/lib/yoke/adapters/codex.js +45 -12
  97. package/lib/yoke/claude-hook-installer.js +1 -0
  98. package/lib/yoke/codex-dynamic-tool-names.js +80 -0
  99. package/lib/yoke/codex-model-catalog.js +37 -3
  100. package/lib/yoke/muse-services.js +16 -3
  101. package/lib/yoke/providers/claude-model-descriptions.js +22 -2
  102. package/lib/yoke/vendor-registry.js +6 -2
  103. package/package.json +2 -1
  104. package/lib/public/modules/server-settings-navigation.js +0 -39
@@ -63,6 +63,70 @@
63
63
  height: 10px;
64
64
  }
65
65
 
66
+ /* Vendor usage overview: one compact chip per tracked vendor, details in a popover */
67
+ .vendor-usage-overview { display: inline-flex; align-items: center; gap: 4px; margin-right: 4px; }
68
+ .vendor-usage-item { display: inline-flex; position: relative; }
69
+ .top-bar-actions button.vendor-usage-chip {
70
+ display: inline-flex;
71
+ padding: 2px 8px;
72
+ border-radius: 10px;
73
+ gap: 4px;
74
+ font-size: 11px;
75
+ font-weight: 600;
76
+ line-height: 1;
77
+ }
78
+ .top-bar-actions button.vendor-usage-chip.pill-dim { background: color-mix(in srgb, var(--text-dimmer) 8%, transparent); color: var(--text-dimmer); }
79
+ .top-bar-actions button.vendor-usage-chip.pill-warning { background: color-mix(in srgb, var(--warning) 12%, transparent); color: var(--warning); }
80
+ .vendor-usage-chip.unknown, .vendor-usage-chip.stale { font-weight: 500; }
81
+ .top-bar-actions button.vendor-usage-chip:hover { background: color-mix(in srgb, var(--text-dimmer) 16%, transparent); }
82
+ .vendor-usage-chip:focus-visible, .vendor-usage-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
83
+ .vendor-usage-chip[aria-expanded="true"] { background: color-mix(in srgb, var(--text-dimmer) 18%, transparent); }
84
+ .vendor-usage-popover {
85
+ position: absolute;
86
+ top: calc(100% + 6px);
87
+ right: 0;
88
+ z-index: 200;
89
+ width: 280px;
90
+ max-width: calc(100vw - 16px);
91
+ box-sizing: border-box;
92
+ padding: 10px 12px;
93
+ border-radius: 10px;
94
+ background: var(--bg);
95
+ color: var(--text);
96
+ border: 1px solid var(--border);
97
+ box-shadow: 0 4px 12px rgba(0,0,0,0.12);
98
+ font-size: 12px;
99
+ line-height: 1.4;
100
+ white-space: normal;
101
+ }
102
+ .vendor-usage-popover-title { font-weight: 600; margin-bottom: 6px; }
103
+ .vendor-usage-row { display: flex; justify-content: space-between; gap: 12px; padding: 2px 0; }
104
+ .vendor-usage-row.warning .vendor-usage-row-value { color: var(--warning); }
105
+ .vendor-usage-row-label { color: var(--text-secondary); }
106
+ .vendor-usage-row-value { display: flex; flex-direction: column; align-items: flex-end; text-align: right; }
107
+ .vendor-usage-row-age { color: var(--text-dimmer); font-size: 11px; }
108
+ .vendor-usage-note { margin-top: 6px; color: var(--text-dimmer); }
109
+ .vendor-usage-link { display: inline-flex; align-items: center; gap: 4px; margin-top: 8px; color: var(--accent); text-decoration: none; }
110
+ .vendor-usage-link:hover { text-decoration: underline; }
111
+ .vendor-usage-link .lucide { width: 12px; height: 12px; }
112
+ .vendor-usage-row.stale .vendor-usage-row-value > span:first-child { color: var(--text-dimmer); }
113
+ .vendor-usage-list-popover { width: 340px; }
114
+ .vendor-usage-list-icon { display: inline-flex; }
115
+ .vendor-usage-list-icon .lucide { width: 12px; height: 12px; }
116
+ .vendor-usage-list-row { padding: 5px 0; border-top: 1px solid color-mix(in srgb, var(--border) 60%, transparent); }
117
+ .vendor-usage-list-row:first-child { border-top: 0; padding-top: 0; }
118
+ .vendor-usage-list-top { display: flex; align-items: center; gap: 6px; }
119
+ .vendor-usage-list-name { font-weight: 600; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
120
+ .vendor-usage-list-source { color: var(--text-dimmer); font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em; }
121
+ .vendor-usage-list-value { min-width: 44px; text-align: right; font-weight: 600; }
122
+ .vendor-usage-list-row.warning .vendor-usage-list-value { color: var(--warning); }
123
+ .vendor-usage-list-row.unknown .vendor-usage-list-value, .vendor-usage-list-row.stale .vendor-usage-list-value { color: var(--text-dimmer); font-weight: 500; }
124
+ .vendor-usage-list-detail { margin-top: 1px; color: var(--text-dimmer); font-size: 11px; }
125
+ @media (max-width: 1000px) {
126
+ .vendor-usage-chip.unknown .vendor-usage-chip-text,
127
+ .vendor-usage-chip.stale .vendor-usage-chip-text { display: none; }
128
+ }
129
+
66
130
  /* Clickable pill (update) */
67
131
  button.top-bar-pill {
68
132
  border: none;
@@ -105,14 +169,6 @@ button.top-bar-pill.pill-accent:hover { background: color-mix(in srgb, var(--acc
105
169
  .top-bar-install-btn.hidden { display: none; }
106
170
  .pwa-standalone .top-bar-install-btn { display: none !important; }
107
171
 
108
- /* Share button sits in .top-bar-actions with the bell/settings icons
109
- and inherits their shared icon-button styling. Hide on mobile and
110
- inside PWA standalone (matches previous pill behavior). */
111
- @media (max-width: 768px) {
112
- #share-pill { display: none; }
113
- }
114
- .pwa-standalone #share-pill { display: none !important; }
115
-
116
172
  /* Extension pill button — same style as share/install pills */
117
173
  .ext-pill-wrap {
118
174
  position: relative;
@@ -1076,254 +1132,6 @@ button.top-bar-pill.pill-accent:hover { background: color-mix(in srgb, var(--acc
1076
1132
  .notif-help-url .popover-copy:hover { color: var(--text); border-color: var(--text-dimmer); }
1077
1133
  .notif-help-url .popover-copy.copied { color: var(--success); border-color: var(--success); }
1078
1134
 
1079
- /* --- Add project modal --- */
1080
- #add-project-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
1081
- #add-project-modal.hidden { display: none; }
1082
-
1083
- .add-project-dialog { max-width: 420px; }
1084
-
1085
- .add-project-title {
1086
- font-size: 15px;
1087
- font-weight: 600;
1088
- color: var(--text);
1089
- margin-bottom: 14px;
1090
- }
1091
-
1092
- .add-project-body { margin-bottom: 16px; }
1093
-
1094
- .add-project-input-wrap { position: relative; display: flex; align-items: center; background: var(--input-bg); border: 1px solid var(--border); border-radius: 8px; transition: border-color 0.2s; }
1095
- .add-project-input-wrap:focus-within { border-color: var(--text-dimmer); }
1096
-
1097
- .add-project-prefix {
1098
- flex-shrink: 0;
1099
- padding: 5px 0 5px 8px;
1100
- font-size: 12px;
1101
- font-family: "Roboto Mono", monospace;
1102
- color: var(--accent);
1103
- background: var(--bg-alt);
1104
- border-radius: 5px 0 0 5px;
1105
- white-space: nowrap;
1106
- user-select: none;
1107
- pointer-events: none;
1108
- margin: 4px 0 4px 4px;
1109
- padding: 3px 6px;
1110
- background: color-mix(in srgb, var(--accent) 15%, transparent);
1111
- border-radius: 4px;
1112
- }
1113
- .add-project-prefix.hidden { display: none; }
1114
-
1115
- #add-project-input {
1116
- flex: 1;
1117
- min-width: 0;
1118
- background: transparent;
1119
- border: none;
1120
- color: var(--text);
1121
- font-size: 13px;
1122
- font-family: "Roboto Mono", monospace;
1123
- padding: 10px 12px 10px 6px;
1124
- outline: none;
1125
- }
1126
- .add-project-prefix.hidden + #add-project-input { padding-left: 12px; }
1127
-
1128
- #add-project-input:focus { border-color: transparent; }
1129
- #add-project-input::placeholder { color: var(--text-muted); font-family: var(--font-ui); }
1130
-
1131
- #add-project-suggestions {
1132
- position: absolute;
1133
- top: calc(100% + 4px);
1134
- left: 0;
1135
- right: 0;
1136
- background: var(--bg-alt);
1137
- border: 1px solid var(--border);
1138
- border-radius: 8px;
1139
- max-height: 200px;
1140
- overflow-y: auto;
1141
- z-index: 10;
1142
- box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
1143
- }
1144
-
1145
- #add-project-suggestions.hidden { display: none; }
1146
-
1147
- .add-project-suggestion-item {
1148
- display: flex;
1149
- align-items: center;
1150
- gap: 8px;
1151
- padding: 8px 12px;
1152
- font-size: 13px;
1153
- color: var(--text);
1154
- cursor: pointer;
1155
- transition: background 0.1s;
1156
- }
1157
-
1158
- .add-project-suggestion-item:first-child { border-radius: 8px 8px 0 0; }
1159
- .add-project-suggestion-item:last-child { border-radius: 0 0 8px 8px; }
1160
- .add-project-suggestion-item:only-child { border-radius: 8px; }
1161
- .add-project-suggestion-item:hover,
1162
- .add-project-suggestion-item.active { background: var(--sidebar-hover); }
1163
-
1164
- .add-project-suggestion-item .lucide { width: 14px; height: 14px; color: var(--text-muted); flex-shrink: 0; }
1165
-
1166
- .add-project-suggestion-name {
1167
- flex: 1;
1168
- overflow: hidden;
1169
- text-overflow: ellipsis;
1170
- white-space: nowrap;
1171
- }
1172
-
1173
- .add-project-suggestion-path {
1174
- font-size: 11px;
1175
- color: var(--text-muted);
1176
- overflow: hidden;
1177
- text-overflow: ellipsis;
1178
- white-space: nowrap;
1179
- max-width: 50%;
1180
- }
1181
-
1182
- #add-project-error {
1183
- font-size: 12px;
1184
- color: var(--error);
1185
- margin-top: 8px;
1186
- }
1187
-
1188
- #add-project-error.hidden { display: none; }
1189
-
1190
- /* --- Add project mode selector --- */
1191
- .add-project-modes {
1192
- display: flex;
1193
- gap: 2px;
1194
- margin-bottom: 14px;
1195
- background: var(--input-bg);
1196
- border-radius: 8px;
1197
- padding: 2px;
1198
- border: 1px solid var(--border);
1199
- }
1200
-
1201
- .add-project-mode-btn {
1202
- flex: 1;
1203
- padding: 6px 4px;
1204
- border: 1px solid transparent;
1205
- border-radius: 6px;
1206
- background: none;
1207
- color: var(--text-muted);
1208
- font-size: 12px;
1209
- font-weight: 500;
1210
- font-family: inherit;
1211
- cursor: pointer;
1212
- transition: background 0.15s, color 0.15s, border-color 0.15s;
1213
- white-space: nowrap;
1214
- }
1215
-
1216
- .add-project-mode-btn:hover:not(:disabled) {
1217
- color: var(--text-secondary);
1218
- }
1219
-
1220
- .add-project-mode-btn.active {
1221
- color: var(--accent);
1222
- background: var(--bg);
1223
- border-color: var(--border);
1224
- box-shadow: 0 1px 3px rgba(var(--shadow-rgb), 0.15);
1225
- }
1226
-
1227
- .add-project-mode-btn:disabled {
1228
- opacity: 0.35;
1229
- cursor: not-allowed;
1230
- }
1231
-
1232
- .add-project-panel { display: none; }
1233
- .add-project-panel.active { display: block; }
1234
-
1235
- /* Removed projects list in add project modal */
1236
- #add-project-removed { margin-bottom: 14px; padding-bottom: 14px; border-bottom: 1px solid var(--border); }
1237
- #add-project-removed.hidden { display: none; }
1238
- .add-project-removed-item {
1239
- display: flex;
1240
- align-items: center;
1241
- gap: 10px;
1242
- padding: 7px 8px;
1243
- border-radius: 8px;
1244
- margin-bottom: 2px;
1245
- cursor: pointer;
1246
- transition: background 0.15s;
1247
- }
1248
- .add-project-removed-item:last-child { margin-bottom: 0; }
1249
- .add-project-removed-item:hover { background: var(--sidebar-hover); }
1250
- .add-project-removed-icon {
1251
- flex-shrink: 0;
1252
- width: 28px;
1253
- height: 28px;
1254
- display: flex;
1255
- align-items: center;
1256
- justify-content: center;
1257
- border-radius: 6px;
1258
- background: var(--sidebar-hover);
1259
- font-size: 14px;
1260
- }
1261
- .add-project-removed-info {
1262
- flex: 1;
1263
- min-width: 0;
1264
- overflow: hidden;
1265
- }
1266
- .add-project-removed-name {
1267
- font-weight: 500;
1268
- color: var(--text);
1269
- white-space: nowrap;
1270
- overflow: hidden;
1271
- text-overflow: ellipsis;
1272
- font-size: 13px;
1273
- line-height: 1.3;
1274
- }
1275
- .add-project-removed-path {
1276
- font-size: 11px;
1277
- color: var(--text-muted);
1278
- white-space: nowrap;
1279
- overflow: hidden;
1280
- text-overflow: ellipsis;
1281
- line-height: 1.3;
1282
- }
1283
-
1284
- #add-project-create-input,
1285
- #add-project-clone-input {
1286
- width: 100%;
1287
- background: var(--input-bg);
1288
- border: 1px solid var(--border);
1289
- border-radius: 8px;
1290
- color: var(--text);
1291
- font-size: 13px;
1292
- font-family: "Roboto Mono", monospace;
1293
- padding: 10px 12px;
1294
- outline: none;
1295
- transition: border-color 0.2s;
1296
- }
1297
-
1298
- #add-project-create-input:focus,
1299
- #add-project-clone-input:focus { border-color: var(--text-dimmer); }
1300
-
1301
- #add-project-create-input::placeholder,
1302
- #add-project-clone-input::placeholder {
1303
- color: var(--text-muted);
1304
- font-family: var(--font-ui);
1305
- }
1306
-
1307
- #add-project-clone-progress {
1308
- font-size: 12px;
1309
- color: var(--text-muted);
1310
- margin-top: 8px;
1311
- display: flex;
1312
- align-items: center;
1313
- gap: 8px;
1314
- }
1315
-
1316
- #add-project-clone-progress.hidden { display: none; }
1317
-
1318
- .clone-spinner {
1319
- width: 12px;
1320
- height: 12px;
1321
- border: 2px solid var(--border);
1322
- border-top-color: var(--accent);
1323
- border-radius: 50%;
1324
- animation: spin 0.6s linear infinite;
1325
- }
1326
-
1327
1135
  /* --- Connect overlay --- */
1328
1136
  #connect-overlay {
1329
1137
  position: fixed;
@@ -36,7 +36,7 @@
36
36
 
37
37
  .project-create-choice-option {
38
38
  display: grid;
39
- grid-template-columns: 34px 1fr;
39
+ grid-template-columns: 76px 1fr;
40
40
  align-items: center;
41
41
  gap: 12px;
42
42
  width: 100%;
@@ -52,11 +52,10 @@
52
52
  transition: border-color 180ms, background 180ms, transform 180ms;
53
53
  }
54
54
 
55
- .project-create-choice-option > .lucide {
56
- width: 22px;
57
- height: 22px;
58
- justify-self: center;
59
- color: var(--accent);
55
+ .project-create-choice-option > img {
56
+ width: 76px;
57
+ height: 64px;
58
+ object-fit: contain;
60
59
  }
61
60
 
62
61
  .project-create-choice-option span { display: grid; gap: 2px; }
@@ -0,0 +1,108 @@
1
+ /* --- Project start dialog: one fixed-size surface for every step --- */
2
+ #project-start-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
3
+ #project-start-modal.hidden { display: none; }
4
+ .project-start-backdrop { position: absolute; inset: 0; background: rgba(var(--shadow-rgb), 0.5); }
5
+ .project-start-dialog {
6
+ position: relative; display: flex; flex-direction: column;
7
+ width: min(520px, calc(100vw - 32px)); height: min(400px, calc(100dvh - 48px));
8
+ background: var(--bg-alt); border: 1px solid var(--border); border-radius: 14px;
9
+ box-shadow: 0 8px 32px rgba(var(--shadow-rgb), 0.5); outline: none; overflow: hidden;
10
+ }
11
+ .project-start-header { display: flex; align-items: center; gap: 8px; flex: none; padding: 16px 16px 12px 24px; }
12
+ .project-start-header h2 { flex: 1; min-width: 0; margin: 0; font-size: 16px; font-weight: 600; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
13
+ .project-start-header #project-start-back { margin-left: -12px; }
14
+ .project-start-icon-btn {
15
+ display: inline-flex; align-items: center; justify-content: center; flex: none; width: 30px; height: 30px; padding: 0;
16
+ border: 1px solid transparent; border-radius: 8px; background: transparent; color: var(--text-muted); cursor: pointer;
17
+ }
18
+ .project-start-icon-btn:hover:not(:disabled) { background: var(--sidebar-hover); color: var(--text); }
19
+ .project-start-icon-btn:disabled { opacity: .35; cursor: not-allowed; }
20
+ .project-start-icon-btn[hidden] { display: none; }
21
+ .project-start-icon-btn .lucide { width: 16px; height: 16px; }
22
+ .project-start-subtitle { flex: none; margin: -6px 24px 0; font-size: 12px; line-height: 1.5; color: var(--text-muted); }
23
+ .project-start-subtitle[hidden] { display: none; }
24
+ .project-start-body { flex: 1; min-height: 0; display: flex; flex-direction: column; }
25
+ .project-start-view { flex: 1; min-height: 0; display: flex; flex-direction: column; }
26
+ .project-start-scroll { flex: 1; min-height: 0; overflow-y: auto; padding: 4px 24px 16px; outline: none; }
27
+ .project-start-footer { flex: none; display: flex; align-items: center; justify-content: flex-end; gap: 12px; padding: 14px 24px 20px; border-top: 1px solid var(--border-subtle); }
28
+ .project-start-footer .project-start-error { flex: 1; min-width: 0; margin: 0; }
29
+
30
+ /* Rows */
31
+ .project-start-rows { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
32
+ .project-start-row {
33
+ display: flex; align-items: center; gap: 12px; width: 100%; padding: 10px 12px; border: 1px solid transparent; border-radius: 10px;
34
+ background: transparent; color: var(--text); font: inherit; font-size: 13px; text-align: left; cursor: pointer;
35
+ }
36
+ .project-start-row:hover { background: var(--sidebar-hover); }
37
+ .project-start-row:focus-visible, .project-start-primary:focus-visible, .project-start-secondary:focus-visible,
38
+ .project-start-link-btn:focus-visible, .project-start-icon-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
39
+ .project-start-row .lucide { width: 16px; height: 16px; flex: none; color: var(--text-muted); }
40
+ .project-start-row-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
41
+ .project-start-choices { gap: 8px; padding-top: 4px; }
42
+ /* Centre the three rows as a group; auto margins fall back to top-aligned scrolling when space runs out. */
43
+ [data-view="choices"] > .project-start-scroll { display: flex; flex-direction: column; padding-top: 0; }
44
+ [data-view="choices"] .project-start-choices { margin-block: auto; padding-top: 0; }
45
+ .project-start-choice { padding: 16px; border-color: var(--border); background: var(--bg); gap: 14px; }
46
+ .project-start-choice:hover { background: var(--sidebar-hover); border-color: var(--text-dimmer); }
47
+ .project-start-choice-icon { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 36px; height: 36px; border-radius: 9px; background: var(--input-bg); }
48
+ .project-start-choice-icon .lucide { width: 18px; height: 18px; color: var(--text); }
49
+ .project-start-choice-text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
50
+ .project-start-choice-text strong { font-size: 14px; font-weight: 600; }
51
+ .project-start-choice-text span { font-size: 12px; line-height: 1.4; color: var(--text-muted); }
52
+
53
+ /* Open folder */
54
+ .project-start-location { flex: none; display: flex; align-items: center; gap: 8px; padding: 0 24px 10px; }
55
+ .project-start-crumbs {
56
+ flex: 1; min-width: 0; display: flex; align-items: center; gap: 4px; height: 30px; padding: 0 10px; overflow: hidden; white-space: nowrap;
57
+ background: var(--input-bg); border: 1px solid var(--border); border-radius: 8px; font-size: 12px; font-family: "Roboto Mono", monospace;
58
+ }
59
+ .project-start-crumb, .project-start-crumb-current { overflow: hidden; text-overflow: ellipsis; }
60
+ .project-start-crumb { color: var(--text-muted); flex: 0 1 auto; }
61
+ .project-start-crumb-current { color: var(--text); font-weight: 600; flex: 0 1 auto; }
62
+ .project-start-crumb-sep, .project-start-crumb-muted { color: var(--text-dimmer); flex: none; }
63
+ .project-start-link-btn { flex: none; border: 0; background: transparent; color: var(--text-muted); font: inherit; font-size: 12px; padding: 6px 8px; border-radius: 6px; cursor: pointer; }
64
+ .project-start-link-btn:hover { color: var(--text); background: var(--sidebar-hover); }
65
+ .project-start-pathform { flex: none; display: flex; gap: 8px; padding: 0 24px 10px; }
66
+ .project-start-pathform[hidden] { display: none; }
67
+ .project-start-pathform .project-start-input { flex: 1; min-width: 0; }
68
+ .project-start-open-name { display: inline-block; max-width: 220px; vertical-align: bottom; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
69
+
70
+ /* States */
71
+ .project-start-state { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; min-height: 100%; padding: 24px 12px; text-align: center; font-size: 13px; color: var(--text-muted); }
72
+ .project-start-state strong { font-size: 14px; font-weight: 600; color: var(--text); }
73
+ .project-start-state-error strong { color: var(--error); }
74
+ .project-start-state span { max-width: 360px; line-height: 1.5; overflow-wrap: anywhere; }
75
+ .project-start-state-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; margin-top: 8px; }
76
+ .project-start-spinner { width: 14px; height: 14px; border: 2px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin .6s linear infinite; }
77
+ @media (prefers-reduced-motion: reduce) { .project-start-spinner { animation-duration: 2.4s; } }
78
+
79
+ /* Forms and buttons */
80
+ .project-start-formbody { padding-top: 8px; }
81
+ .project-start-label { display: block; margin-bottom: 8px; font-size: 12px; font-weight: 600; color: var(--text-secondary); }
82
+ .project-start-input {
83
+ width: 100%; box-sizing: border-box; height: 38px; padding: 0 12px; background: var(--input-bg); border: 1px solid var(--border); border-radius: 8px;
84
+ color: var(--text); font-size: 13px; font-family: "Roboto Mono", monospace; outline: none; transition: border-color .2s;
85
+ }
86
+ .project-start-input:focus { border-color: var(--text-dimmer); }
87
+ .project-start-input::placeholder { color: var(--text-muted); font-family: var(--font-ui); }
88
+ .project-start-input[readonly] { opacity: .7; }
89
+ .project-start-hint { margin: 8px 0 0; font-size: 12px; line-height: 1.5; color: var(--text-muted); }
90
+ .project-start-progress { display: flex; align-items: center; gap: 8px; margin: 12px 0 0; font-size: 12px; color: var(--text-muted); }
91
+ .project-start-progress[hidden], .project-start-error[hidden] { display: none; }
92
+ .project-start-error { margin: 12px 0 0; font-size: 12px; line-height: 1.5; color: var(--error); overflow-wrap: anywhere; }
93
+ .project-start-primary, .project-start-secondary { height: 34px; padding: 0 16px; border-radius: 8px; font: inherit; font-size: 13px; font-weight: 500; cursor: pointer; white-space: nowrap; }
94
+ .project-start-primary:focus-visible { outline: 2px solid var(--text); outline-offset: 2px; }
95
+ .project-start-primary { max-width: 100%; border: 1px solid var(--accent); background: var(--accent); color: #fff; }
96
+ .project-start-primary:hover:not(:disabled) { opacity: .9; }
97
+ .project-start-primary:disabled { opacity: .45; cursor: not-allowed; }
98
+ .project-start-secondary { border: 1px solid var(--border); background: var(--bg); color: var(--text); }
99
+ .project-start-secondary:hover { background: var(--sidebar-hover); }
100
+
101
+ @media (max-width: 480px) {
102
+ .project-start-header { padding: 14px 12px 10px 16px; }
103
+ .project-start-subtitle { margin-left: 16px; margin-right: 16px; }
104
+ .project-start-scroll { padding-left: 16px; padding-right: 16px; }
105
+ .project-start-location, .project-start-pathform { padding-left: 16px; padding-right: 16px; }
106
+ .project-start-footer { padding: 12px 16px 16px; }
107
+ .project-start-open-name { max-width: 150px; }
108
+ }
@@ -1,15 +1,26 @@
1
- body.projects-active #top-bar,
2
- body.projects-active #icon-strip,
3
- body.projects-active #sidebar-column,
4
- body.projects-active #mate-sidebar-column,
5
- body.projects-active #sidebar-resize-handle,
6
- body.projects-active #mate-sidebar-resize-handle,
7
- body.projects-active #sidebar-overlay,
8
- body.projects-active #mobile-tab-bar,
9
- body.projects-active .title-bar-content,
10
- body.projects-active #user-island,
1
+ body.projects-active:not(.projects-shell) #top-bar,
2
+ body.projects-active:not(.projects-shell) #icon-strip,
3
+ body.projects-active:not(.projects-shell) #sidebar-column,
4
+ body.projects-active:not(.projects-shell) #mate-sidebar-column,
5
+ body.projects-active:not(.projects-shell) #sidebar-resize-handle,
6
+ body.projects-active:not(.projects-shell) #mate-sidebar-resize-handle,
7
+ body.projects-active:not(.projects-shell) #sidebar-overlay,
8
+ body.projects-active:not(.projects-shell) #mobile-tab-bar,
9
+ body.projects-active:not(.projects-shell) .title-bar-content,
10
+ body.projects-active:not(.projects-shell) #user-island,
11
11
  body.projects-active #main-area > :not(#projects-hub) { display: none !important; }
12
- body.projects-active #main-area { border: 0; margin: 0; border-radius: 0; }
12
+ body.projects-active:not(.projects-shell) #main-area { border: 0; margin: 0; border-radius: 0; }
13
+ /* Zero-project welcome: the app shell (top bar, icon strip, user island) stays; only the empty session columns step aside. */
14
+ body.projects-shell #sidebar-column,
15
+ body.projects-shell #mate-sidebar-column,
16
+ body.projects-shell #sidebar-resize-handle,
17
+ body.projects-shell #mate-sidebar-resize-handle,
18
+ body.projects-shell .title-bar-content { display: none !important; }
19
+ body.projects-shell .projects-main { padding-top: 40px; }
20
+ @media (max-width: 600px) {
21
+ body.projects-shell .projects-main { padding-top: 64px; }
22
+ body.projects-shell .projects-footer { padding-left: 64px; padding-bottom: 24px; }
23
+ }
13
24
  #projects-hub { position: absolute; inset: 0; overflow-y: auto; background: var(--bg); color: var(--text); padding: env(safe-area-inset-top) 0 env(safe-area-inset-bottom); }
14
25
  #projects-hub.hidden { display: none; }
15
26
  .projects-header { display: flex; align-items: center; justify-content: space-between; max-width: 1200px; margin: auto; padding: 24px 40px; gap: 20px; }
@@ -19,7 +30,6 @@ body.projects-active #main-area { border: 0; margin: 0; border-radius: 0; }
19
30
  .projects-main { width: min(100%, 1040px); margin: auto; padding: 48px 40px 64px; }
20
31
  .projects-eyebrow { font-size: 11px; font-weight: 600; letter-spacing: 1.8px; color: var(--brand-clay); margin-bottom: 22px; }
21
32
  #projects-title { font-size: clamp(32px, 4vw, 48px); letter-spacing: -1.7px; line-height: 1.1; font-weight: 500; outline: none; }
22
- .projects-welcome #projects-title { font-size: clamp(44px, 6.5vw, 76px); letter-spacing: -3px; line-height: 1.02; }
23
33
  .projects-lead { margin-top: 20px; font-size: 16px; line-height: 1.7; color: var(--text-muted); }
24
34
  .projects-intro-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; border-top: 1px solid var(--border); margin: 42px 0 32px; padding-top: 24px; max-width: 760px; }
25
35
  .projects-intro-grid span { font-size: 10px; font-weight: 600; letter-spacing: 1.3px; color: var(--text-dimmer); }
@@ -31,6 +41,28 @@ body.projects-active #main-area { border: 0; margin: 0; border-radius: 0; }
31
41
  .projects-button-primary { background: var(--text); color: var(--bg); border-color: var(--text); }
32
42
  .projects-button-primary:hover { background: var(--text-secondary); }
33
43
  .projects-button-quiet { background: transparent; border-color: transparent; color: var(--text-muted); }
44
+ /* Official Clay Studio wordmark (same bold SVG mask as the top bar and connect screen), tinted by theme. */
45
+ .projects-wordmark { display: block; width: min(420px, 100%); aspect-ratio: 4742 / 1156; margin: 0 auto; background: var(--text); -webkit-mask: url("../clay-studio-wordmark-bold.svg") center / contain no-repeat; mask: url("../clay-studio-wordmark-bold.svg") center / contain no-repeat; }
46
+ .projects-welcome #projects-title { line-height: 1; }
47
+ .projects-button-secondary { background: transparent; border-color: var(--border); }
48
+ .projects-button-secondary:hover:not(:disabled) { background: var(--bg-alt); }
49
+ /* Quiet canvas, generous identity, and two tactile invitations to begin. */
50
+ .projects-welcome { display: flex; flex-direction: column; align-items: center; text-align: center; padding: 14px 0 8px; }
51
+ .projects-welcome > .projects-eyebrow { color: var(--text-muted); font-size: 10px; letter-spacing: 2.8px; margin-bottom: 12px; }
52
+ .projects-welcome #projects-title { width: min(420px, 100%); }
53
+ .projects-welcome .projects-lead { max-width: 520px; margin-top: 8px; font-size: 17px; letter-spacing: -.2px; }
54
+ .projects-welcome .projects-intro-grid { width: 100%; max-width: 880px; margin: 30px auto 0; padding-top: 0; border: 0; gap: 64px; }
55
+ .projects-intro-card { display: flex; flex-direction: column; align-items: center; min-width: 0; }
56
+ .projects-intro-art { width: 100%; height: 190px; display: flex; align-items: center; justify-content: center; margin-bottom: 16px; }
57
+ .projects-intro-art img { display: block; width: 250px; max-width: 100%; height: 100%; object-fit: contain; }
58
+ .projects-intro-card .projects-intro-label { font-size: 10px; letter-spacing: 1.8px; color: var(--text-muted); }
59
+ .projects-intro-card h2 { font-size: 22px; line-height: 1.25; letter-spacing: -.65px; margin: 12px 0 10px; }
60
+ .projects-intro-card p { margin: 0 auto; max-width: 320px; font-size: 14px; line-height: 1.65; text-wrap: pretty; }
61
+ .projects-intro-action { margin-top: auto; padding-top: 22px; }
62
+ .projects-intro-action .projects-button { min-width: 176px; height: 40px; padding: 0 16px; }
63
+ .projects-welcome .projects-button-primary { background: var(--brand-indigo); border-color: var(--brand-indigo); color: #fff; }
64
+ .projects-welcome .projects-button-primary:hover:not(:disabled) { filter: brightness(1.08); }
65
+ .projects-welcome .projects-footnote { margin-top: 36px; }
34
66
  .projects-welcome-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; }
35
67
  .projects-footnote { font-size: 11px; color: var(--text-dimmer); margin-top: 18px; }
36
68
  .projects-heading { display: flex; justify-content: space-between; align-items: flex-start; gap: 24px; margin-bottom: 32px; }
@@ -60,8 +92,16 @@ body.projects-active #main-area { border: 0; margin: 0; border-radius: 0; }
60
92
  .projects-brand { font-size: 14px; }
61
93
  .projects-header .projects-button { padding: 9px; }
62
94
  .projects-main { padding: 28px 22px 40px; }
63
- .projects-welcome #projects-title { letter-spacing: -2px; }
64
95
  .projects-intro-grid { grid-template-columns: 1fr; gap: 24px; margin-top: 30px; }
96
+ .projects-welcome { padding-top: 0; }
97
+ .projects-welcome #projects-title { width: min(320px, 100%); }
98
+ .projects-welcome .projects-lead { font-size: 15px; }
99
+ .projects-welcome .projects-intro-grid { gap: 36px; margin-top: 28px; }
100
+ .projects-intro-art { height: 160px; margin-bottom: 10px; }
101
+ .projects-intro-card h2 { font-size: 21px; }
102
+ .projects-intro-card + .projects-intro-card { border-top: 1px solid var(--border-subtle); padding-top: 30px; }
103
+ .projects-intro-action { padding-top: 16px; }
104
+ .projects-intro-action .projects-button { min-width: min(100%, 240px); }
65
105
  .projects-heading { flex-direction: column; gap: 12px; }
66
106
  .projects-heading > .projects-button { padding-left: 0; }
67
107
  .projects-list { grid-template-columns: 1fr; }
@@ -70,6 +110,5 @@ body.projects-active #main-area { border: 0; margin: 0; border-radius: 0; }
70
110
  }
71
111
  @media (min-width: 601px) and (max-height: 760px) {
72
112
  .projects-main { padding-top: 24px; }
73
- .projects-welcome #projects-title { font-size: 60px; }
74
113
  .projects-intro-grid { margin-top: 28px; margin-bottom: 24px; }
75
114
  }