clay-server 2.11.0 → 2.12.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.
@@ -176,11 +176,11 @@
176
176
  color: #fff;
177
177
  }
178
178
 
179
- /* --- Socket status indicator on icon (bottom-right dot) --- */
179
+ /* --- Socket status indicator on icon (top-left dot) --- */
180
180
  .icon-strip-status {
181
181
  position: absolute;
182
- bottom: 3px;
183
- right: 3px;
182
+ top: 3px;
183
+ left: 3px;
184
184
  width: 10px;
185
185
  height: 10px;
186
186
  border-radius: 50%;
@@ -192,6 +192,7 @@
192
192
 
193
193
  /* Show dot only on active item or when processing */
194
194
  .icon-strip-item.active .icon-strip-status,
195
+ .icon-strip-wt-item.active .icon-strip-status,
195
196
  .icon-strip-status.processing {
196
197
  opacity: 1;
197
198
  }
@@ -733,8 +734,8 @@
733
734
  /* Project unread badge */
734
735
  .icon-strip-project-badge {
735
736
  position: absolute;
736
- top: -2px;
737
- right: -2px;
737
+ top: 1px;
738
+ right: 1px;
738
739
  min-width: 18px;
739
740
  height: 18px;
740
741
  border-radius: 9px;
@@ -888,6 +889,308 @@
888
889
  text-align: center;
889
890
  }
890
891
 
892
+ /* --- Worktree folder groups --- */
893
+ .icon-strip-group {
894
+ display: flex;
895
+ flex-direction: column;
896
+ align-items: center;
897
+ position: relative;
898
+ }
899
+
900
+ .icon-strip-group .folder-header {
901
+ position: relative;
902
+ }
903
+
904
+ .icon-strip-group-chevron {
905
+ position: absolute;
906
+ bottom: 2px;
907
+ right: 2px;
908
+ width: 16px;
909
+ height: 16px;
910
+ border-radius: 50%;
911
+ background: var(--bg-alt);
912
+ border: 1px solid var(--border);
913
+ display: flex;
914
+ align-items: center;
915
+ justify-content: center;
916
+ color: var(--text-dimmer);
917
+ pointer-events: auto;
918
+ cursor: pointer;
919
+ transition: transform 0.15s ease, background 0.15s, border-color 0.15s;
920
+ z-index: 2;
921
+ line-height: 1;
922
+ }
923
+
924
+ .icon-strip-group-chevron i,
925
+ .icon-strip-group-chevron svg {
926
+ width: 10px;
927
+ height: 10px;
928
+ }
929
+
930
+ .icon-strip-group-chevron:hover {
931
+ background: var(--bg-hover, var(--bg-alt));
932
+ border-color: var(--text-dimmer);
933
+ color: var(--text-secondary);
934
+ }
935
+
936
+ .icon-strip-group.collapsed .icon-strip-group-chevron {
937
+ background: var(--border);
938
+ }
939
+
940
+ .icon-strip-group-items {
941
+ display: flex;
942
+ flex-direction: column;
943
+ align-items: center;
944
+ overflow: hidden;
945
+ transition: max-height 0.2s ease;
946
+ max-height: 500px;
947
+ border-left: 2px solid var(--border);
948
+ margin-left: 0;
949
+ padding-left: 0;
950
+ }
951
+
952
+ .icon-strip-group.collapsed .icon-strip-group-items {
953
+ max-height: 0;
954
+ }
955
+
956
+ /* Worktree items (smaller than regular project icons) */
957
+ .icon-strip-wt-item {
958
+ width: 48px;
959
+ height: 40px;
960
+ display: flex;
961
+ align-items: center;
962
+ justify-content: center;
963
+ cursor: pointer;
964
+ position: relative;
965
+ text-decoration: none;
966
+ color: var(--text-secondary);
967
+ transition: background 0.15s;
968
+ }
969
+
970
+ .icon-strip-wt-item::before {
971
+ content: "";
972
+ position: absolute;
973
+ width: 30px;
974
+ height: 30px;
975
+ border-radius: 8px;
976
+ background: var(--bg-alt);
977
+ opacity: 0.7;
978
+ transition: opacity 0.15s, background 0.15s;
979
+ }
980
+
981
+ .icon-strip-wt-item:hover::before {
982
+ opacity: 1;
983
+ }
984
+
985
+ .icon-strip-wt-item.active::before {
986
+ background: var(--accent);
987
+ opacity: 1;
988
+ }
989
+
990
+ .icon-strip-wt-item.active {
991
+ color: #fff;
992
+ }
993
+
994
+ .icon-strip-wt-item .wt-branch-abbrev {
995
+ font-size: 11px;
996
+ font-weight: 600;
997
+ letter-spacing: -0.5px;
998
+ pointer-events: none;
999
+ position: relative;
1000
+ z-index: 1;
1001
+ }
1002
+
1003
+ /* Disabled/inaccessible worktree */
1004
+ .icon-strip-wt-item.wt-disabled {
1005
+ opacity: 0.35;
1006
+ cursor: not-allowed;
1007
+ }
1008
+
1009
+ .icon-strip-wt-item.wt-disabled::after {
1010
+ content: "\1F6AB";
1011
+ position: absolute;
1012
+ font-size: 14px;
1013
+ z-index: 3;
1014
+ filter: grayscale(0.3);
1015
+ }
1016
+
1017
+ /* Group add button */
1018
+ .icon-strip-group-add {
1019
+ width: 30px;
1020
+ height: 30px;
1021
+ border-radius: 8px;
1022
+ border: 1.5px dashed var(--border);
1023
+ background: transparent;
1024
+ color: var(--text-dimmer);
1025
+ font-size: 16px;
1026
+ font-weight: 400;
1027
+ cursor: pointer;
1028
+ display: flex;
1029
+ align-items: center;
1030
+ justify-content: center;
1031
+ margin: 2px 0 4px 0;
1032
+ transition: border-color 0.15s, color 0.15s, background 0.15s;
1033
+ }
1034
+
1035
+ .icon-strip-group-add:hover {
1036
+ border-color: var(--accent);
1037
+ color: var(--accent);
1038
+ background: rgba(var(--accent-rgb, 124, 58, 237), 0.08);
1039
+ }
1040
+
1041
+ /* --- Worktree creation modal --- */
1042
+ .wt-modal-overlay {
1043
+ position: fixed;
1044
+ inset: 0;
1045
+ background: rgba(0, 0, 0, 0.5);
1046
+ z-index: 9998;
1047
+ }
1048
+
1049
+ .wt-modal {
1050
+ position: fixed;
1051
+ top: 50%;
1052
+ left: 50%;
1053
+ transform: translate(-50%, -50%);
1054
+ z-index: 9999;
1055
+ min-width: 340px;
1056
+ max-width: 420px;
1057
+ background: var(--bg);
1058
+ border: 1px solid var(--border);
1059
+ border-radius: 12px;
1060
+ padding: 20px;
1061
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
1062
+ }
1063
+
1064
+ .wt-modal-title {
1065
+ font-size: 15px;
1066
+ font-weight: 600;
1067
+ color: var(--text-primary);
1068
+ margin-bottom: 16px;
1069
+ }
1070
+
1071
+ .wt-modal-label {
1072
+ display: block;
1073
+ font-size: 12px;
1074
+ font-weight: 600;
1075
+ color: var(--text-secondary);
1076
+ margin: 10px 0 4px 0;
1077
+ }
1078
+
1079
+ .wt-modal-label:first-of-type {
1080
+ margin-top: 0;
1081
+ }
1082
+
1083
+ .wt-modal-input {
1084
+ width: 100%;
1085
+ padding: 8px 10px;
1086
+ border: 1px solid var(--border);
1087
+ border-radius: 6px;
1088
+ background: var(--bg-alt);
1089
+ color: var(--text-primary);
1090
+ font-size: 14px;
1091
+ font-family: inherit;
1092
+ outline: none;
1093
+ box-sizing: border-box;
1094
+ }
1095
+
1096
+ .wt-modal-input:focus {
1097
+ border-color: var(--accent);
1098
+ }
1099
+
1100
+ select.wt-modal-input {
1101
+ appearance: auto;
1102
+ cursor: pointer;
1103
+ }
1104
+
1105
+ .wt-modal-error {
1106
+ color: var(--error, #ef4444);
1107
+ font-size: 12px;
1108
+ margin-top: 8px;
1109
+ display: none;
1110
+ }
1111
+
1112
+ .wt-modal-error.visible {
1113
+ display: block;
1114
+ }
1115
+
1116
+ .wt-modal-actions {
1117
+ display: flex;
1118
+ justify-content: flex-end;
1119
+ gap: 8px;
1120
+ margin-top: 16px;
1121
+ }
1122
+
1123
+ .wt-modal-btn {
1124
+ padding: 7px 16px;
1125
+ border-radius: 6px;
1126
+ font-size: 13px;
1127
+ font-weight: 500;
1128
+ cursor: pointer;
1129
+ border: 1px solid var(--border);
1130
+ background: var(--bg-alt);
1131
+ color: var(--text-primary);
1132
+ font-family: inherit;
1133
+ transition: background 0.15s, border-color 0.15s;
1134
+ }
1135
+
1136
+ .wt-modal-btn:hover {
1137
+ background: var(--bg-hover, var(--bg-alt));
1138
+ }
1139
+
1140
+ .wt-modal-btn.primary {
1141
+ background: var(--accent);
1142
+ color: #fff;
1143
+ border-color: var(--accent);
1144
+ }
1145
+
1146
+ .wt-modal-btn.primary:hover {
1147
+ opacity: 0.9;
1148
+ }
1149
+
1150
+ .wt-modal-btn:disabled {
1151
+ opacity: 0.5;
1152
+ cursor: not-allowed;
1153
+ }
1154
+
1155
+ /* --- Mobile worktree folder --- */
1156
+ .mobile-project-folder {
1157
+ display: flex;
1158
+ flex-direction: column;
1159
+ }
1160
+
1161
+ .mobile-project-item.wt-item {
1162
+ padding-left: 28px;
1163
+ opacity: 0.85;
1164
+ }
1165
+
1166
+ .mobile-project-item.wt-disabled {
1167
+ opacity: 0.35;
1168
+ cursor: not-allowed;
1169
+ }
1170
+
1171
+ .mobile-folder-chevron {
1172
+ font-size: 8px;
1173
+ color: var(--text-dimmer);
1174
+ margin-left: auto;
1175
+ cursor: pointer;
1176
+ transition: transform 0.15s ease;
1177
+ padding: 4px;
1178
+ }
1179
+
1180
+ .mobile-project-folder.collapsed .mobile-folder-chevron {
1181
+ transform: rotate(-90deg);
1182
+ }
1183
+
1184
+ .mobile-folder-items {
1185
+ overflow: hidden;
1186
+ transition: max-height 0.2s ease;
1187
+ max-height: 500px;
1188
+ }
1189
+
1190
+ .mobile-project-folder.collapsed .mobile-folder-items {
1191
+ max-height: 0;
1192
+ }
1193
+
891
1194
  /* --- Per-project presence avatars --- */
892
1195
  /* --- Mobile: hide icon strip --- */
893
1196
  @media (max-width: 768px) {
@@ -426,22 +426,7 @@
426
426
  filter: brightness(1.3);
427
427
  }
428
428
 
429
- .tooltip {
430
- position: fixed;
431
- background: var(--code-bg);
432
- border: 1px solid var(--border);
433
- border-radius: 8px;
434
- padding: 6px 12px;
435
- font-size: 12px;
436
- color: var(--text-secondary);
437
- white-space: nowrap;
438
- pointer-events: none;
439
- opacity: 0;
440
- transition: opacity 0.15s;
441
- z-index: 200;
442
- }
443
-
444
- .tooltip.visible { opacity: 1; }
429
+ /* .tooltip styles moved to css/tooltip.css */
445
430
 
446
431
  /* --- Config chip (inline in input bottom bar) --- */
447
432
  #config-chip-wrap {
@@ -8,6 +8,13 @@
8
8
  -webkit-overflow-scrolling: touch;
9
9
  overscroll-behavior-y: contain;
10
10
  padding: 20px 0 12px;
11
+ position: relative;
12
+ }
13
+
14
+ /* --- Remote cursors (Figma-style) --- */
15
+ .remote-cursor {
16
+ pointer-events: none;
17
+ z-index: 9999;
11
18
  }
12
19
 
13
20
  /* --- Sticky todo (inline in title bar) --- */
@@ -0,0 +1,150 @@
1
+ /* ==========================================================================
2
+ In-session search (Cmd+F / Ctrl+F)
3
+ ========================================================================== */
4
+
5
+ /* --- Toggle button (in title bar, matches sticky-notes / terminal buttons) --- */
6
+ #find-in-session-btn {
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ background: none;
11
+ border: 1px solid transparent;
12
+ border-radius: 8px;
13
+ color: var(--text-dimmer);
14
+ cursor: pointer;
15
+ padding: 4px;
16
+ transition: color 0.15s, background 0.15s, border-color 0.15s;
17
+ position: relative;
18
+ }
19
+
20
+ #find-in-session-btn .lucide { width: 15px; height: 15px; }
21
+ #find-in-session-btn:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.04); border-color: var(--border); }
22
+ #find-in-session-btn.active { color: var(--text); background: rgba(var(--overlay-rgb),0.06); border-color: var(--border); }
23
+
24
+ /* --- Floating search bar --- */
25
+ .session-search-bar {
26
+ position: absolute;
27
+ top: 0;
28
+ right: 16px;
29
+ z-index: 50;
30
+ animation: sessionSearchSlideDown 0.15s ease-out;
31
+ }
32
+
33
+ .session-search-bar.hidden {
34
+ display: none;
35
+ }
36
+
37
+ .session-search-inner {
38
+ display: flex;
39
+ align-items: center;
40
+ gap: 4px;
41
+ background: var(--bg-alt);
42
+ border: 1px solid var(--border);
43
+ border-top: none;
44
+ border-radius: 0 0 10px 10px;
45
+ padding: 6px 8px;
46
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
47
+ }
48
+
49
+ #find-in-session-input {
50
+ width: 200px;
51
+ padding: 4px 8px;
52
+ border: 1px solid var(--border-subtle);
53
+ border-radius: 6px;
54
+ background: var(--bg);
55
+ color: var(--text);
56
+ font-size: 13px;
57
+ outline: none;
58
+ font-family: inherit;
59
+ }
60
+
61
+ #find-in-session-input:focus {
62
+ border-color: var(--accent);
63
+ }
64
+
65
+ #find-in-session-input::placeholder {
66
+ color: var(--text-muted);
67
+ }
68
+
69
+ .session-search-count {
70
+ font-size: 11px;
71
+ color: var(--text-muted);
72
+ min-width: 60px;
73
+ text-align: center;
74
+ white-space: nowrap;
75
+ }
76
+
77
+ .session-search-btn {
78
+ display: flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ width: 26px;
82
+ height: 26px;
83
+ border: none;
84
+ background: transparent;
85
+ color: var(--text-muted);
86
+ border-radius: 5px;
87
+ cursor: pointer;
88
+ transition: background 0.15s, color 0.15s;
89
+ }
90
+
91
+ .session-search-btn:hover {
92
+ background: var(--hover);
93
+ color: var(--text);
94
+ }
95
+
96
+ /* Highlight marks */
97
+ mark.session-search-highlight {
98
+ background: var(--accent-30, rgba(255, 165, 0, 0.3));
99
+ color: inherit;
100
+ border-radius: 2px;
101
+ padding: 0 1px;
102
+ }
103
+
104
+ mark.session-search-highlight-active {
105
+ background: var(--accent, #f59e0b);
106
+ color: var(--bg, #fff);
107
+ border-radius: 2px;
108
+ padding: 0 1px;
109
+ }
110
+
111
+ @keyframes sessionSearchSlideDown {
112
+ from {
113
+ opacity: 0;
114
+ transform: translateY(-8px);
115
+ }
116
+ to {
117
+ opacity: 1;
118
+ transform: translateY(0);
119
+ }
120
+ }
121
+
122
+ /* Timeline (scroll map) - reuses rewind-timeline styles */
123
+ .find-in-session-timeline {
124
+ position: absolute;
125
+ right: 8px;
126
+ z-index: 10;
127
+ pointer-events: none;
128
+ }
129
+
130
+ /* Mobile */
131
+ @media (max-width: 768px) {
132
+ #find-in-session-btn {
133
+ display: none;
134
+ }
135
+
136
+ .session-search-bar {
137
+ right: 8px;
138
+ left: 8px;
139
+ }
140
+
141
+ #find-in-session-input {
142
+ flex: 1;
143
+ width: auto;
144
+ min-width: 0;
145
+ }
146
+
147
+ .session-search-inner {
148
+ padding: 4px 6px;
149
+ }
150
+ }
@@ -1001,6 +1001,36 @@
1001
1001
  color: var(--text-secondary);
1002
1002
  }
1003
1003
 
1004
+ /* Cursor sharing toggle */
1005
+ .cursor-share-btn {
1006
+ position: relative;
1007
+ }
1008
+ .cursor-share-btn.on {
1009
+ color: var(--accent, #0ACF83);
1010
+ }
1011
+ .cursor-share-btn.off {
1012
+ color: var(--text-muted);
1013
+ opacity: 0.5;
1014
+ }
1015
+ .cursor-share-btn.off::after {
1016
+ content: "";
1017
+ position: absolute;
1018
+ top: 50%;
1019
+ left: 50%;
1020
+ width: 22px;
1021
+ height: 2px;
1022
+ background: var(--danger, #F24822);
1023
+ transform: translate(-50%, -50%) rotate(-45deg);
1024
+ border-radius: 1px;
1025
+ pointer-events: none;
1026
+ }
1027
+ .cursor-share-btn.on:hover {
1028
+ color: var(--accent, #0ACF83);
1029
+ }
1030
+ .cursor-share-btn.off:hover {
1031
+ opacity: 0.7;
1032
+ }
1033
+
1004
1034
  #layout.sidebar-collapsed #user-island .user-island-info,
1005
1035
  #layout.sidebar-collapsed #user-island .user-island-actions {
1006
1036
  display: none;
@@ -0,0 +1,20 @@
1
+ /* ==========================================================================
2
+ Global JS Tooltip (unified)
3
+ ========================================================================== */
4
+
5
+ .tooltip {
6
+ position: fixed;
7
+ background: var(--code-bg);
8
+ border: 1px solid var(--border);
9
+ border-radius: 8px;
10
+ padding: 6px 12px;
11
+ font-size: 12px;
12
+ color: var(--text-secondary);
13
+ white-space: nowrap;
14
+ pointer-events: none;
15
+ opacity: 0;
16
+ transition: opacity 0.15s;
17
+ z-index: 10000;
18
+ }
19
+
20
+ .tooltip.visible { opacity: 1; }
@@ -200,7 +200,7 @@
200
200
  <div class="title-bar-content">
201
201
  <div id="header-left">
202
202
  <button id="sidebar-expand-btn" title="Open sidebar"><i data-lucide="panel-left-open"></i></button>
203
- <button id="hamburger-btn" aria-label="Toggle sidebar"><i data-lucide="menu"></i></button>
203
+ <button id="hamburger-btn" aria-label="Toggle sidebar" title="Toggle sidebar"><i data-lucide="menu"></i></button>
204
204
  <span class="header-title" id="header-title">Connecting...</span>
205
205
  <button id="header-info-btn" type="button" title="Session info"><i data-lucide="info"></i></button>
206
206
  <button id="header-rename-btn" type="button" title="Rename session"><i data-lucide="pencil"></i></button>
@@ -208,6 +208,7 @@
208
208
  <div id="todo-sticky" class="hidden"></div>
209
209
  <div id="ralph-sticky" class="hidden"></div>
210
210
  <div class="status">
211
+ <button id="find-in-session-btn" title="Search in session (Ctrl+F)"><i data-lucide="search"></i></button>
211
212
  <button id="sticky-notes-toggle-btn" title="Sticky notes"><i data-lucide="sticky-note"></i><span class="sticky-notes-count hidden"></span></button>
212
213
  <button id="terminal-toggle-btn" title="Terminal"><i data-lucide="square-terminal"></i><span id="terminal-count" class="hidden"></span></button>
213
214
  </div>
@@ -190,64 +190,7 @@ export function initNotifications(_ctx) {
190
190
  })();
191
191
 
192
192
  // Onboarding pill removed — install flow handled by PWA install button
193
-
194
- // --- Tooltip ---
195
- var tooltipEl = document.createElement("div");
196
- tooltipEl.className = "tooltip";
197
- document.body.appendChild(tooltipEl);
198
- var tooltipTimer = null;
199
-
200
- function showTooltipAt(target) {
201
- tooltipEl.textContent = target.dataset.tip;
202
- tooltipEl.style.top = "-9999px";
203
- tooltipEl.style.left = "0";
204
- tooltipEl.style.right = "";
205
- tooltipEl.style.transform = "";
206
- tooltipEl.classList.add("visible");
207
- var tipW = tooltipEl.offsetWidth;
208
- var rect = target.getBoundingClientRect();
209
- var centerX = rect.left + rect.width / 2;
210
- var leftPos = centerX - tipW / 2;
211
- tooltipEl.style.top = (rect.bottom + 8) + "px";
212
- if (leftPos + tipW > window.innerWidth - 8) {
213
- tooltipEl.style.left = "";
214
- tooltipEl.style.right = "8px";
215
- } else {
216
- tooltipEl.style.left = Math.max(8, leftPos) + "px";
217
- tooltipEl.style.right = "";
218
- }
219
- }
220
-
221
- function hideTooltip() {
222
- tooltipEl.classList.remove("visible");
223
- clearTimeout(tooltipTimer);
224
- }
225
-
226
- document.addEventListener("click", function (e) {
227
- var target = e.target.closest("[data-tip]");
228
- if (target) {
229
- showTooltipAt(target);
230
- clearTimeout(tooltipTimer);
231
- tooltipTimer = setTimeout(hideTooltip, 2000);
232
- } else {
233
- hideTooltip();
234
- }
235
- });
236
-
237
- document.addEventListener("mouseover", function (e) {
238
- var target = e.target.closest("[data-tip]");
239
- if (target) {
240
- clearTimeout(tooltipTimer);
241
- showTooltipAt(target);
242
- }
243
- });
244
-
245
- document.addEventListener("mouseout", function (e) {
246
- var target = e.target.closest("[data-tip]");
247
- if (target) {
248
- hideTooltip();
249
- }
250
- });
193
+ // Tooltip system moved to modules/tooltip.js
251
194
 
252
195
  // --- iOS Safari detection ---
253
196
  var isIOSSafari = (function () {