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.
- package/bin/cli.js +16 -4
- package/lib/daemon.js +167 -0
- package/lib/project.js +83 -1
- package/lib/public/app.js +567 -20
- package/lib/public/css/icon-strip.css +308 -5
- package/lib/public/css/menus.css +1 -16
- package/lib/public/css/messages.css +7 -0
- package/lib/public/css/session-search.css +150 -0
- package/lib/public/css/sidebar.css +30 -0
- package/lib/public/css/tooltip.css +20 -0
- package/lib/public/index.html +2 -1
- package/lib/public/modules/notifications.js +1 -58
- package/lib/public/modules/session-search.js +440 -0
- package/lib/public/modules/sidebar.js +576 -148
- package/lib/public/modules/tooltip.js +123 -0
- package/lib/public/style.css +2 -0
- package/lib/server.js +46 -3
- package/lib/sessions.js +37 -0
- package/lib/worktree.js +134 -0
- package/package.json +1 -1
|
@@ -176,11 +176,11 @@
|
|
|
176
176
|
color: #fff;
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
-
/* --- Socket status indicator on icon (
|
|
179
|
+
/* --- Socket status indicator on icon (top-left dot) --- */
|
|
180
180
|
.icon-strip-status {
|
|
181
181
|
position: absolute;
|
|
182
|
-
|
|
183
|
-
|
|
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:
|
|
737
|
-
right:
|
|
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) {
|
package/lib/public/css/menus.css
CHANGED
|
@@ -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; }
|
package/lib/public/index.html
CHANGED
|
@@ -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 () {
|