@unity-china/codely-cli 1.0.0-beta.51 → 1.0.0-rc.1

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.
@@ -104,7 +104,7 @@ textarea {
104
104
  background: rgba(255, 255, 255, 0.03);
105
105
  color: var(--text);
106
106
  cursor: pointer;
107
- font-size: 12px;
107
+ font-size: 13px;
108
108
  }
109
109
  .btn:hover {
110
110
  background: rgba(255, 255, 255, 0.06);
@@ -143,6 +143,20 @@ textarea {
143
143
  margin-bottom: 12px;
144
144
  }
145
145
 
146
+ .session-notice {
147
+ position: sticky;
148
+ top: 0;
149
+ z-index: 4;
150
+ padding: 10px 12px;
151
+ border: 1px solid rgba(224, 175, 104, 0.3);
152
+ border-radius: var(--radius-md);
153
+ background: rgba(224, 175, 104, 0.08);
154
+ color: var(--warn);
155
+ white-space: pre-wrap;
156
+ line-height: 1.45;
157
+ backdrop-filter: blur(18px);
158
+ }
159
+
146
160
  .user-message {
147
161
  padding: 4px 0;
148
162
  color: var(--text);
@@ -154,7 +168,7 @@ textarea {
154
168
  }
155
169
 
156
170
  .md {
157
- font-size: 13px;
171
+ font-size: 14px;
158
172
  line-height: 1.55;
159
173
  color: var(--text);
160
174
  }
@@ -170,16 +184,16 @@ textarea {
170
184
  line-height: 1.25;
171
185
  }
172
186
  .md h1 {
173
- font-size: 18px;
187
+ font-size: 20px;
174
188
  }
175
189
  .md h2 {
176
- font-size: 16px;
190
+ font-size: 17px;
177
191
  }
178
192
  .md h3 {
179
- font-size: 14px;
193
+ font-size: 15px;
180
194
  }
181
195
  .md h4 {
182
- font-size: 13px;
196
+ font-size: 14px;
183
197
  color: rgba(255, 255, 255, 0.86);
184
198
  }
185
199
  .md ul,
@@ -193,7 +207,7 @@ textarea {
193
207
  }
194
208
  .md code.inline {
195
209
  font-family: var(--mono);
196
- font-size: 12px;
210
+ font-size: 13px;
197
211
  padding: 2px 6px;
198
212
  border-radius: 8px;
199
213
  border: 1px solid var(--border);
@@ -208,7 +222,7 @@ textarea {
208
222
  background: rgba(0, 0, 0, 0.3);
209
223
  overflow: auto;
210
224
  font-family: var(--mono);
211
- font-size: 12px;
225
+ font-size: 13px;
212
226
  line-height: 1.5;
213
227
  }
214
228
  .md pre code {
@@ -935,75 +949,27 @@ textarea {
935
949
  }
936
950
  }
937
951
 
938
- @media (max-width: 768px) {
939
- .cp-header {
940
- flex-direction: column;
941
- align-items: flex-start;
942
- }
943
- .cp-header-actions {
944
- width: 100%;
945
- justify-content: space-between;
946
- }
947
-
948
- .cp-broadcast-header {
949
- flex-direction: column;
950
- align-items: flex-start;
951
- }
952
- .cp-broadcast-actions {
953
- width: 100%;
954
- justify-content: flex-start;
955
- margin-top: 8px;
956
- }
957
-
958
- .cp-worker-grid {
959
- grid-template-columns: 1fr;
960
- padding: 12px;
961
- }
962
-
963
- .cp-task-header {
964
- flex-direction: column;
965
- align-items: stretch;
966
- }
967
- .cp-task-actions {
968
- flex-direction: row;
969
- justify-content: flex-end;
970
- margin-top: 8px;
971
- }
972
-
973
- /* Drawer mobile styles */
974
- .cp-drawer {
975
- inset: 0;
976
- width: 100%;
977
- max-width: none;
978
- border-radius: 0;
979
- border: none;
980
- }
981
- .cp-drawer.open {
982
- width: 100%;
983
- }
984
-
985
- .cp-row {
986
- flex-direction: column;
987
- }
988
- .cp-actions {
989
- margin-top: 8px;
990
- justify-content: flex-end;
991
- }
992
- }
952
+ /* =============================================
953
+ Control Plane — shared base styles
954
+ ============================================= */
993
955
 
994
- /* Control plane */
995
956
  .control-plane {
996
957
  display: flex;
958
+ flex-direction: column;
997
959
  gap: 0;
960
+ height: 100%;
961
+ min-height: 0;
998
962
  }
999
963
 
964
+ /* Top header bar */
1000
965
  .cp-header {
1001
966
  display: flex;
1002
967
  align-items: center;
1003
968
  justify-content: space-between;
1004
969
  gap: 12px;
1005
- padding: 14px 18px;
970
+ padding: 12px 16px;
1006
971
  border-bottom: 1px solid var(--border);
972
+ flex-shrink: 0;
1007
973
  }
1008
974
 
1009
975
  .cp-header h1 {
@@ -1017,303 +983,343 @@ textarea {
1017
983
  }
1018
984
 
1019
985
  .cp-subtitle {
1020
- font-size: 12px;
986
+ font-size: 13px;
1021
987
  color: var(--muted);
1022
- margin-top: 4px;
988
+ margin-top: 3px;
1023
989
  }
1024
990
 
1025
- /* Drawer */
1026
- .cp-drawer {
1027
- position: fixed;
1028
- top: 0;
1029
- right: 0;
1030
- bottom: 0;
1031
- width: 600px;
1032
- max-width: 100%;
1033
- z-index: 100;
1034
- background: var(--panel-2);
1035
- border-left: 1px solid var(--border);
1036
- box-shadow: -4px 0 20px rgba(0, 0, 0, 0.5);
1037
- transform: translateX(100%);
1038
- transition: transform 0.2s ease;
991
+ /* Body area below header — sidebar + main */
992
+ .cp-body {
1039
993
  display: flex;
1040
- flex-direction: column;
994
+ flex: 1;
995
+ min-height: 0;
996
+ overflow: hidden;
1041
997
  }
1042
998
 
1043
- .cp-drawer.open {
1044
- transform: translateX(0);
1045
- }
999
+ /* =============================================
1000
+ PC Sidebar
1001
+ ============================================= */
1046
1002
 
1047
- .cp-drawer-backdrop {
1048
- position: fixed;
1049
- inset: 0;
1050
- background: rgba(0, 0, 0, 0.5);
1051
- z-index: 90;
1052
- backdrop-filter: blur(2px);
1003
+ .cp-sidebar {
1004
+ width: 260px;
1005
+ flex-shrink: 0;
1006
+ border-right: 1px solid var(--border);
1007
+ display: flex;
1008
+ flex-direction: column;
1009
+ overflow: hidden;
1010
+ background: var(--panel-2);
1053
1011
  }
1054
1012
 
1055
- .cp-drawer-header {
1013
+ .cp-sidebar-section-label {
1014
+ padding: 10px 12px 6px;
1015
+ font-size: 11px;
1016
+ font-weight: 700;
1017
+ color: var(--muted);
1018
+ text-transform: uppercase;
1019
+ letter-spacing: 0.08em;
1020
+ flex-shrink: 0;
1056
1021
  display: flex;
1057
1022
  align-items: center;
1058
- justify-content: space-between;
1059
- gap: 12px;
1060
- padding: 14px 16px;
1061
- border-bottom: 1px solid var(--border);
1023
+ gap: 6px;
1062
1024
  }
1063
1025
 
1064
- .cp-drawer-header h2 {
1065
- margin: 0;
1066
- font-size: 14px;
1026
+ .cp-sidebar-workers-label {
1027
+ border-top: 1px solid var(--border);
1067
1028
  }
1068
1029
 
1069
- .cp-drawer-toolbar {
1030
+ .cp-sidebar-workers-count {
1031
+ background: rgba(255, 255, 255, 0.08);
1032
+ border-radius: 999px;
1033
+ padding: 1px 7px;
1034
+ font-size: 11px;
1035
+ font-weight: 600;
1036
+ color: var(--muted);
1037
+ }
1038
+
1039
+ /* Broadcast summary section in sidebar */
1040
+ .cp-sidebar-broadcast-section {
1041
+ padding: 10px 12px 12px;
1042
+ border-bottom: 1px solid var(--border);
1043
+ flex-shrink: 0;
1070
1044
  display: flex;
1071
1045
  flex-direction: column;
1072
1046
  gap: 8px;
1073
- padding: 12px 16px;
1074
- border-bottom: 1px solid var(--border);
1075
- }
1076
-
1077
- .cp-drawer-content {
1078
- flex: 1;
1079
- overflow: auto;
1080
- padding: 12px 16px;
1081
1047
  }
1082
1048
 
1083
- .cp-input,
1084
- .cp-select {
1085
- background: rgba(255, 255, 255, 0.03);
1086
- border: 1px solid var(--border);
1087
- color: var(--text);
1088
- border-radius: var(--radius-sm);
1089
- padding: 8px 10px;
1049
+ .cp-sidebar-broadcast-target {
1090
1050
  font-size: 12px;
1091
- width: 100%;
1051
+ color: var(--muted);
1092
1052
  }
1093
1053
 
1094
- .cp-select {
1095
- min-width: 100px;
1054
+ .cp-sidebar-broadcast-btn {
1055
+ width: 100%;
1056
+ justify-content: center;
1096
1057
  }
1097
1058
 
1098
- .cp-content {
1099
- padding: 12px 18px;
1100
- overflow: auto;
1059
+ /* Worker nav list inside sidebar */
1060
+ .cp-sidebar-workers {
1101
1061
  flex: 1;
1062
+ overflow-y: auto;
1063
+ padding: 4px 0 8px;
1102
1064
  }
1103
1065
 
1104
- .cp-list {
1066
+ .cp-sidebar-worker-item {
1105
1067
  display: flex;
1106
- flex-direction: column;
1107
- gap: 12px;
1068
+ align-items: flex-start;
1069
+ gap: 8px;
1070
+ padding: 8px 12px;
1071
+ cursor: pointer;
1072
+ transition: background 0.12s;
1073
+ border-left: 2px solid transparent;
1108
1074
  }
1109
1075
 
1110
- .cp-row {
1111
- display: flex;
1112
- justify-content: space-between;
1113
- gap: 12px;
1114
- padding: 12px;
1115
- border: 1px solid var(--border);
1116
- border-radius: var(--radius);
1117
- background: rgba(255, 255, 255, 0.03);
1076
+ .cp-sidebar-worker-item:hover {
1077
+ background: rgba(255, 255, 255, 0.04);
1118
1078
  }
1119
1079
 
1120
- .cp-select-box {
1121
- display: flex;
1122
- align-items: flex-start;
1123
- padding-top: 4px;
1080
+ .cp-sidebar-worker-item.active {
1081
+ background: rgba(122, 162, 247, 0.08);
1082
+ border-left-color: var(--accent);
1124
1083
  }
1125
1084
 
1126
- .cp-select-box input {
1127
- width: 16px;
1128
- height: 16px;
1085
+ .cp-sidebar-worker-item input[type='checkbox'] {
1086
+ width: 14px;
1087
+ height: 14px;
1088
+ flex-shrink: 0;
1089
+ cursor: pointer;
1090
+ margin-top: 3px;
1129
1091
  }
1130
1092
 
1131
- .cp-row-main {
1093
+ .cp-sidebar-worker-info {
1132
1094
  flex: 1;
1133
1095
  min-width: 0;
1134
- }
1135
-
1136
- .cp-row-title {
1137
1096
  display: flex;
1138
1097
  flex-direction: column;
1139
- gap: 4px;
1098
+ gap: 2px;
1140
1099
  }
1141
1100
 
1142
- .cp-name {
1143
- font-weight: 600;
1101
+ .cp-sidebar-worker-name {
1102
+ font-size: 13px;
1103
+ font-weight: 500;
1104
+ line-height: 1.4;
1105
+ word-break: break-word;
1144
1106
  }
1145
1107
 
1146
- .cp-url {
1108
+ .cp-sidebar-worker-url {
1147
1109
  font-family: var(--mono);
1148
1110
  font-size: 11px;
1149
1111
  color: var(--muted);
1150
1112
  word-break: break-all;
1113
+ line-height: 1.4;
1151
1114
  }
1152
1115
 
1153
- .cp-row-meta {
1154
- display: flex;
1155
- align-items: center;
1156
- gap: 10px;
1157
- flex-wrap: wrap;
1158
- margin-top: 6px;
1159
- }
1160
-
1161
- .cp-tags {
1162
- display: flex;
1163
- gap: 6px;
1164
- flex-wrap: wrap;
1116
+ .cp-sidebar-worker-tags {
1117
+ font-size: 11px;
1118
+ color: rgba(187, 154, 247, 0.7);
1119
+ line-height: 1.4;
1165
1120
  }
1166
1121
 
1167
- .cp-tag {
1168
- padding: 2px 6px;
1169
- border: 1px solid var(--border);
1170
- border-radius: 6px;
1171
- font-size: 10px;
1172
- color: var(--muted);
1122
+ .cp-sidebar-worker-status {
1123
+ flex-shrink: 0;
1124
+ margin-top: 2px;
1173
1125
  }
1174
1126
 
1175
- .cp-tag.muted {
1176
- opacity: 0.6;
1177
- }
1127
+ /* =============================================
1128
+ PC Broadcast Modal
1129
+ ============================================= */
1178
1130
 
1179
- .cp-actions {
1131
+ .cp-broadcast-modal-backdrop {
1132
+ position: fixed;
1133
+ inset: 0;
1134
+ background: rgba(0, 0, 0, 0.6);
1135
+ z-index: 300;
1180
1136
  display: flex;
1181
- gap: 6px;
1182
1137
  align-items: center;
1138
+ justify-content: center;
1139
+ padding: 20px;
1140
+ backdrop-filter: blur(3px);
1183
1141
  }
1184
1142
 
1185
- .cp-health {
1186
- font-size: 11px;
1187
- padding: 2px 6px;
1188
- border-radius: 6px;
1143
+ .cp-broadcast-modal {
1144
+ width: min(860px, 96vw);
1145
+ max-height: 88vh;
1146
+ background: rgba(16, 21, 33, 0.98);
1189
1147
  border: 1px solid var(--border);
1190
- color: var(--muted);
1148
+ border-radius: 16px;
1149
+ box-shadow: var(--shadow);
1150
+ display: flex;
1151
+ flex-direction: column;
1152
+ overflow: hidden;
1191
1153
  }
1192
1154
 
1193
- .cp-health.ok {
1194
- color: var(--ok);
1195
- border-color: rgba(158, 206, 106, 0.4);
1155
+ .cp-broadcast-modal-header {
1156
+ display: flex;
1157
+ align-items: center;
1158
+ justify-content: space-between;
1159
+ padding: 14px 18px;
1160
+ border-bottom: 1px solid var(--border);
1161
+ flex-shrink: 0;
1196
1162
  }
1197
1163
 
1198
- .cp-health.err {
1199
- color: var(--err);
1200
- border-color: rgba(247, 118, 142, 0.4);
1164
+ .cp-broadcast-modal-title {
1165
+ font-size: 15px;
1166
+ font-weight: 650;
1201
1167
  }
1202
1168
 
1203
- .cp-health.pending {
1169
+ .cp-broadcast-modal-close {
1170
+ background: none;
1171
+ border: none;
1204
1172
  color: var(--muted);
1173
+ font-size: 16px;
1174
+ cursor: pointer;
1175
+ padding: 4px 8px;
1176
+ border-radius: 6px;
1177
+ line-height: 1;
1205
1178
  }
1206
1179
 
1207
- .cp-health-ms {
1208
- margin-left: 6px;
1209
- color: var(--muted);
1210
- font-size: 10px;
1180
+ .cp-broadcast-modal-close:hover {
1181
+ background: rgba(255, 255, 255, 0.06);
1182
+ color: var(--text);
1211
1183
  }
1212
1184
 
1213
- .cp-pagination {
1185
+ .cp-broadcast-modal-body {
1186
+ display: grid;
1187
+ grid-template-columns: 1fr 320px;
1188
+ gap: 0;
1189
+ flex: 1;
1190
+ min-height: 0;
1191
+ overflow: hidden;
1192
+ }
1193
+
1194
+ .cp-broadcast-modal-left {
1214
1195
  display: flex;
1215
- align-items: center;
1216
- justify-content: space-between;
1196
+ flex-direction: column;
1197
+ padding: 14px 18px;
1217
1198
  gap: 10px;
1218
- padding: 12px 18px;
1219
- border-top: 1px solid var(--border);
1199
+ border-right: 1px solid var(--border);
1200
+ min-height: 0;
1220
1201
  }
1221
1202
 
1222
- .cp-page-info,
1223
- .cp-page-number {
1224
- font-size: 12px;
1225
- color: var(--muted);
1203
+ .cp-broadcast-modal-right {
1204
+ display: flex;
1205
+ flex-direction: column;
1206
+ min-height: 0;
1207
+ overflow: hidden;
1226
1208
  }
1227
1209
 
1228
- .cp-page-controls {
1210
+ .cp-broadcast-modal-label {
1211
+ font-size: 11px;
1212
+ font-weight: 700;
1213
+ color: var(--muted);
1214
+ text-transform: uppercase;
1215
+ letter-spacing: 0.08em;
1229
1216
  display: flex;
1230
1217
  align-items: center;
1218
+ justify-content: space-between;
1231
1219
  gap: 8px;
1220
+ flex-shrink: 0;
1232
1221
  }
1233
1222
 
1234
- .cp-modal-body {
1223
+ .cp-broadcast-modal-node-actions {
1235
1224
  display: flex;
1236
- flex-direction: column;
1237
- gap: 10px;
1238
- padding: 12px;
1225
+ gap: 6px;
1239
1226
  }
1240
1227
 
1241
- .cp-label {
1228
+ .cp-broadcast-modal-textarea {
1229
+ flex: 1;
1230
+ min-height: 160px;
1231
+ resize: none;
1232
+ border: 1px solid var(--border);
1233
+ border-radius: var(--radius-sm);
1234
+ background: rgba(255, 255, 255, 0.03);
1235
+ color: var(--text);
1236
+ padding: 10px 12px;
1237
+ font-size: 14px;
1238
+ line-height: 1.5;
1239
+ }
1240
+
1241
+ .cp-broadcast-modal-textarea:focus {
1242
+ outline: none;
1243
+ border-color: rgba(122, 162, 247, 0.5);
1244
+ box-shadow: 0 0 0 3px rgba(122, 162, 247, 0.1);
1245
+ }
1246
+
1247
+ .cp-broadcast-modal-footer {
1242
1248
  display: flex;
1243
- flex-direction: column;
1244
- gap: 6px;
1249
+ align-items: center;
1250
+ justify-content: space-between;
1251
+ gap: 10px;
1252
+ flex-shrink: 0;
1253
+ }
1254
+
1255
+ .cp-broadcast-modal-target {
1245
1256
  font-size: 12px;
1246
1257
  color: var(--muted);
1247
1258
  }
1248
1259
 
1249
- .cp-modal-actions {
1250
- display: flex;
1251
- gap: 8px;
1260
+ .cp-broadcast-modal-node-list {
1261
+ flex: 1;
1262
+ overflow-y: auto;
1263
+ padding: 8px 0;
1252
1264
  }
1253
1265
 
1254
- .cp-error {
1255
- color: var(--err);
1256
- font-size: 12px;
1257
- margin-top: 6px;
1266
+ .cp-broadcast-modal-node-item {
1267
+ display: flex;
1268
+ align-items: flex-start;
1269
+ gap: 10px;
1270
+ padding: 8px 16px;
1271
+ cursor: pointer;
1272
+ transition: background 0.1s;
1258
1273
  }
1259
1274
 
1260
- .cp-loading,
1261
- .cp-empty {
1262
- color: var(--muted);
1263
- font-size: 12px;
1264
- padding: 10px 0;
1275
+ .cp-broadcast-modal-node-item:hover {
1276
+ background: rgba(255, 255, 255, 0.04);
1265
1277
  }
1266
1278
 
1267
- .cp-broadcast {
1268
- border: 1px solid var(--border);
1269
- border-radius: var(--radius);
1270
- padding: 12px;
1271
- background: rgba(255, 255, 255, 0.02);
1272
- margin: 12px 18px;
1279
+ .cp-broadcast-modal-node-item input[type='checkbox'] {
1280
+ width: 15px;
1281
+ height: 15px;
1282
+ flex-shrink: 0;
1283
+ cursor: pointer;
1284
+ margin-top: 2px;
1273
1285
  }
1274
1286
 
1275
- .cp-broadcast-header {
1287
+ .cp-broadcast-modal-node-info {
1276
1288
  display: flex;
1277
- align-items: center;
1278
- justify-content: space-between;
1279
- gap: 10px;
1280
- margin-bottom: 8px;
1289
+ flex-direction: column;
1290
+ gap: 2px;
1291
+ min-width: 0;
1281
1292
  }
1282
1293
 
1283
- .cp-broadcast-title {
1294
+ .cp-broadcast-modal-node-name {
1284
1295
  font-size: 13px;
1285
- font-weight: 600;
1296
+ font-weight: 500;
1297
+ line-height: 1.4;
1298
+ word-break: break-word;
1286
1299
  }
1287
1300
 
1288
- .cp-broadcast-subtitle {
1301
+ .cp-broadcast-modal-node-url {
1302
+ font-family: var(--mono);
1289
1303
  font-size: 11px;
1290
1304
  color: var(--muted);
1291
- margin-top: 4px;
1305
+ word-break: break-all;
1292
1306
  }
1293
1307
 
1294
- .cp-broadcast-actions {
1295
- display: flex;
1296
- gap: 8px;
1308
+ .cp-broadcast-modal-node-tags {
1309
+ font-size: 11px;
1310
+ color: rgba(187, 154, 247, 0.7);
1297
1311
  }
1298
1312
 
1299
- .cp-textarea {
1300
- width: 100%;
1301
- min-height: 70px;
1302
- max-height: 160px;
1303
- resize: vertical;
1304
- border: 1px solid var(--border);
1305
- border-radius: var(--radius-sm);
1306
- background: rgba(255, 255, 255, 0.03);
1307
- color: var(--text);
1308
- padding: 10px;
1309
- font-size: 12px;
1310
- line-height: 1.4;
1311
- }
1313
+ /* =============================================
1314
+ PC Main area — worker grid
1315
+ ============================================= */
1312
1316
 
1313
- .cp-broadcast-footer {
1317
+ .cp-main {
1318
+ flex: 1;
1319
+ min-width: 0;
1314
1320
  display: flex;
1315
- justify-content: flex-end;
1316
- margin-top: 8px;
1321
+ flex-direction: column;
1322
+ overflow: hidden;
1317
1323
  }
1318
1324
 
1319
1325
  .cp-workers {
@@ -1324,20 +1330,36 @@ textarea {
1324
1330
  }
1325
1331
 
1326
1332
  .cp-workers-header {
1327
- padding: 12px 18px 0;
1328
- font-size: 12px;
1333
+ padding: 12px 16px 0;
1334
+ font-size: 11px;
1329
1335
  color: var(--muted);
1330
1336
  text-transform: uppercase;
1331
1337
  letter-spacing: 0.08em;
1338
+ flex-shrink: 0;
1339
+ display: flex;
1340
+ align-items: center;
1341
+ justify-content: space-between;
1342
+ }
1343
+
1344
+ .cp-workers-header .btn {
1345
+ text-transform: none;
1346
+ letter-spacing: normal;
1347
+ font-size: 11px;
1348
+ padding: 2px 8px;
1332
1349
  }
1333
1350
 
1334
1351
  .cp-worker-grid {
1335
1352
  display: grid;
1336
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1353
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1337
1354
  gap: 12px;
1338
- padding: 12px 18px 18px;
1355
+ padding: 12px 16px 16px;
1356
+ align-content: start;
1339
1357
  }
1340
1358
 
1359
+ /* =============================================
1360
+ Worker task cards
1361
+ ============================================= */
1362
+
1341
1363
  .cp-task-card {
1342
1364
  border: 2px solid var(--border);
1343
1365
  border-radius: var(--radius);
@@ -1347,6 +1369,8 @@ textarea {
1347
1369
  flex-direction: column;
1348
1370
  cursor: pointer;
1349
1371
  transition: border-color 0.15s ease;
1372
+ max-height: 30vh;
1373
+ min-height: 180px;
1350
1374
  }
1351
1375
 
1352
1376
  .cp-task-card:hover {
@@ -1366,31 +1390,68 @@ textarea {
1366
1390
  }
1367
1391
 
1368
1392
  .cp-task-header {
1393
+ display: flex;
1394
+ flex-direction: column;
1395
+ gap: 6px;
1396
+ padding: 8px 10px;
1397
+ border-bottom: 1px solid var(--border);
1398
+ flex-shrink: 0;
1399
+ }
1400
+
1401
+ .cp-task-header-top {
1369
1402
  display: flex;
1370
1403
  align-items: flex-start;
1371
1404
  justify-content: space-between;
1372
- gap: 12px;
1373
- padding: 10px 12px;
1374
- border-bottom: 1px solid var(--border);
1405
+ gap: 8px;
1406
+ }
1407
+
1408
+ .cp-task-header-left {
1409
+ display: flex;
1410
+ align-items: flex-start;
1411
+ gap: 8px;
1412
+ min-width: 0;
1413
+ flex: 1;
1414
+ }
1415
+
1416
+ .cp-task-header-info {
1417
+ min-width: 0;
1418
+ flex: 1;
1419
+ display: flex;
1420
+ flex-direction: column;
1421
+ gap: 2px;
1422
+ /* Keep title + URL as two explicit lines; do not clip the link row away */
1423
+ overflow: visible;
1375
1424
  }
1376
1425
 
1377
1426
  .cp-task-name {
1378
1427
  font-weight: 600;
1379
1428
  font-size: 13px;
1429
+ line-height: 1.35;
1430
+ /* Line 1: title only; URL is always the next sibling on line 2 */
1431
+ overflow: hidden;
1432
+ text-overflow: ellipsis;
1433
+ white-space: nowrap;
1380
1434
  }
1381
1435
 
1382
1436
  .cp-task-url {
1383
1437
  font-size: 11px;
1384
1438
  color: var(--muted);
1439
+ display: block;
1440
+ line-height: 1.35;
1385
1441
  word-break: break-all;
1442
+ /* Second line dedicated to link; wrap instead of single-line ellipsis */
1443
+ overflow-wrap: anywhere;
1386
1444
  }
1387
1445
 
1388
1446
  .cp-task-meta {
1389
1447
  display: flex;
1390
- flex-direction: column;
1391
- gap: 4px;
1448
+ flex-direction: row;
1449
+ align-items: center;
1450
+ gap: 6px;
1392
1451
  font-size: 11px;
1393
1452
  color: var(--muted);
1453
+ flex-shrink: 0;
1454
+ margin-left: auto;
1394
1455
  }
1395
1456
 
1396
1457
  .cp-conn {
@@ -1414,28 +1475,58 @@ textarea {
1414
1475
 
1415
1476
  .cp-queue,
1416
1477
  .cp-activity {
1417
- font-size: 10px;
1478
+ font-size: 11px;
1479
+ }
1480
+
1481
+ /* One row: Cancel / Refresh / Retry + idle activity timestamp */
1482
+ .cp-task-actions-row {
1483
+ display: flex;
1484
+ flex-direction: row;
1485
+ flex-wrap: wrap;
1486
+ align-items: center;
1487
+ gap: 8px;
1418
1488
  }
1419
1489
 
1420
1490
  .cp-task-actions {
1421
1491
  display: flex;
1422
- flex-direction: column;
1492
+ flex-direction: row;
1423
1493
  gap: 6px;
1494
+ flex-shrink: 0;
1495
+ flex-wrap: wrap;
1496
+ }
1497
+
1498
+ .cp-task-actions-time {
1499
+ flex-shrink: 0;
1500
+ }
1501
+
1502
+ .cp-task-actions .btn {
1503
+ padding: 2px 8px;
1504
+ font-size: 11px;
1424
1505
  }
1425
1506
 
1426
1507
  .cp-task-error {
1427
1508
  padding: 6px 12px;
1428
- font-size: 11px;
1509
+ font-size: 12px;
1429
1510
  color: var(--err);
1430
1511
  border-bottom: 1px solid var(--border);
1512
+ flex-shrink: 0;
1513
+ }
1514
+
1515
+ .cp-task-notice {
1516
+ padding: 6px 12px;
1517
+ font-size: 12px;
1518
+ color: var(--warn);
1519
+ border-bottom: 1px solid var(--border);
1520
+ background: rgba(224, 175, 104, 0.06);
1521
+ white-space: pre-wrap;
1522
+ flex-shrink: 0;
1431
1523
  }
1432
1524
 
1433
1525
  .cp-task-body {
1434
1526
  padding: 10px 12px;
1435
1527
  overflow: auto;
1436
1528
  flex: 1;
1437
- min-height: 120px;
1438
- max-height: 320px;
1529
+ min-height: 60px;
1439
1530
  }
1440
1531
 
1441
1532
  .cp-task-message,
@@ -1449,6 +1540,7 @@ textarea {
1449
1540
  padding: 10px 12px;
1450
1541
  border-top: 1px solid var(--border);
1451
1542
  background: rgba(0, 0, 0, 0.1);
1543
+ flex-shrink: 0;
1452
1544
  }
1453
1545
 
1454
1546
  .cp-task-textarea {
@@ -1461,10 +1553,1308 @@ textarea {
1461
1553
  background: rgba(255, 255, 255, 0.03);
1462
1554
  color: var(--text);
1463
1555
  padding: 8px 10px;
1464
- font-size: 12px;
1556
+ font-size: 13px;
1465
1557
  line-height: 1.4;
1466
1558
  }
1467
1559
 
1468
1560
  .cp-task-input .btn {
1469
1561
  align-self: flex-end;
1470
1562
  }
1563
+
1564
+ /* =============================================
1565
+ Endpoint registry Drawer (right side)
1566
+ ============================================= */
1567
+
1568
+ .cp-drawer {
1569
+ position: fixed;
1570
+ top: 0;
1571
+ right: 0;
1572
+ bottom: 0;
1573
+ width: 600px;
1574
+ max-width: 100%;
1575
+ z-index: 100;
1576
+ background: var(--panel-2);
1577
+ border-left: 1px solid var(--border);
1578
+ box-shadow: -4px 0 20px rgba(0, 0, 0, 0.5);
1579
+ transform: translateX(100%);
1580
+ transition: transform 0.2s ease;
1581
+ display: flex;
1582
+ flex-direction: column;
1583
+ }
1584
+
1585
+ .cp-drawer.open {
1586
+ transform: translateX(0);
1587
+ }
1588
+
1589
+ .cp-drawer-backdrop {
1590
+ position: fixed;
1591
+ inset: 0;
1592
+ background: rgba(0, 0, 0, 0.5);
1593
+ z-index: 90;
1594
+ backdrop-filter: blur(2px);
1595
+ }
1596
+
1597
+ .cp-drawer-header {
1598
+ display: flex;
1599
+ align-items: center;
1600
+ justify-content: space-between;
1601
+ gap: 12px;
1602
+ padding: 14px 16px;
1603
+ border-bottom: 1px solid var(--border);
1604
+ position: sticky;
1605
+ top: 0;
1606
+ background: var(--panel-2);
1607
+ z-index: 10;
1608
+ }
1609
+
1610
+ .cp-drawer-header h2 {
1611
+ margin: 0;
1612
+ font-size: 14px;
1613
+ }
1614
+
1615
+ .cp-drawer-toolbar {
1616
+ display: flex;
1617
+ flex-direction: column;
1618
+ gap: 8px;
1619
+ padding: 12px 16px;
1620
+ border-bottom: 1px solid var(--border);
1621
+ }
1622
+
1623
+ .cp-drawer-content {
1624
+ flex: 1;
1625
+ overflow: auto;
1626
+ padding: 12px 16px;
1627
+ }
1628
+
1629
+ /* =============================================
1630
+ Shared form elements
1631
+ ============================================= */
1632
+
1633
+ .cp-input,
1634
+ .cp-select {
1635
+ background: rgba(255, 255, 255, 0.03);
1636
+ border: 1px solid var(--border);
1637
+ color: var(--text);
1638
+ border-radius: var(--radius-sm);
1639
+ padding: 8px 10px;
1640
+ font-size: 13px;
1641
+ width: 100%;
1642
+ }
1643
+
1644
+ .cp-select {
1645
+ min-width: 100px;
1646
+ }
1647
+
1648
+ .cp-content {
1649
+ padding: 12px 16px;
1650
+ overflow: auto;
1651
+ flex: 1;
1652
+ }
1653
+
1654
+ .cp-list {
1655
+ display: flex;
1656
+ flex-direction: column;
1657
+ gap: 10px;
1658
+ }
1659
+
1660
+ .cp-row {
1661
+ display: flex;
1662
+ justify-content: space-between;
1663
+ gap: 12px;
1664
+ padding: 10px 12px;
1665
+ border: 1px solid var(--border);
1666
+ border-radius: var(--radius);
1667
+ background: rgba(255, 255, 255, 0.03);
1668
+ }
1669
+
1670
+ .cp-select-box {
1671
+ display: flex;
1672
+ align-items: flex-start;
1673
+ padding-top: 3px;
1674
+ }
1675
+
1676
+ .cp-select-box input {
1677
+ width: 15px;
1678
+ height: 15px;
1679
+ }
1680
+
1681
+ .cp-row-main {
1682
+ flex: 1;
1683
+ min-width: 0;
1684
+ }
1685
+
1686
+ .cp-row-title {
1687
+ display: flex;
1688
+ flex-direction: column;
1689
+ gap: 3px;
1690
+ }
1691
+
1692
+ .cp-name {
1693
+ font-weight: 600;
1694
+ font-size: 13px;
1695
+ }
1696
+
1697
+ .cp-url {
1698
+ font-family: var(--mono);
1699
+ font-size: 11px;
1700
+ color: var(--muted);
1701
+ word-break: break-all;
1702
+ }
1703
+
1704
+ .cp-row-meta {
1705
+ display: flex;
1706
+ align-items: center;
1707
+ gap: 10px;
1708
+ flex-wrap: wrap;
1709
+ margin-top: 6px;
1710
+ }
1711
+
1712
+ .cp-tags {
1713
+ display: flex;
1714
+ gap: 6px;
1715
+ flex-wrap: wrap;
1716
+ }
1717
+
1718
+ .cp-tag {
1719
+ padding: 2px 6px;
1720
+ border: 1px solid var(--border);
1721
+ border-radius: 6px;
1722
+ font-size: 11px;
1723
+ color: var(--muted);
1724
+ }
1725
+
1726
+ .cp-tag.muted {
1727
+ opacity: 0.6;
1728
+ }
1729
+
1730
+ .cp-actions {
1731
+ display: flex;
1732
+ gap: 6px;
1733
+ align-items: center;
1734
+ }
1735
+
1736
+ .cp-health {
1737
+ font-size: 11px;
1738
+ padding: 2px 6px;
1739
+ border-radius: 6px;
1740
+ border: 1px solid var(--border);
1741
+ color: var(--muted);
1742
+ }
1743
+
1744
+ .cp-health.ok {
1745
+ color: var(--ok);
1746
+ border-color: rgba(158, 206, 106, 0.4);
1747
+ }
1748
+
1749
+ .cp-health.err {
1750
+ color: var(--err);
1751
+ border-color: rgba(247, 118, 142, 0.4);
1752
+ }
1753
+
1754
+ .cp-health.pending {
1755
+ color: var(--muted);
1756
+ }
1757
+
1758
+ .cp-health-ms {
1759
+ margin-left: 6px;
1760
+ color: var(--muted);
1761
+ font-size: 11px;
1762
+ }
1763
+
1764
+ .cp-pagination {
1765
+ display: flex;
1766
+ align-items: center;
1767
+ justify-content: space-between;
1768
+ gap: 10px;
1769
+ padding: 10px 16px;
1770
+ border-top: 1px solid var(--border);
1771
+ }
1772
+
1773
+ .cp-page-info,
1774
+ .cp-page-number {
1775
+ font-size: 12px;
1776
+ color: var(--muted);
1777
+ }
1778
+
1779
+ .cp-page-controls {
1780
+ display: flex;
1781
+ align-items: center;
1782
+ gap: 8px;
1783
+ }
1784
+
1785
+ .cp-modal-body {
1786
+ display: flex;
1787
+ flex-direction: column;
1788
+ gap: 10px;
1789
+ padding: 12px;
1790
+ }
1791
+
1792
+ .cp-label {
1793
+ display: flex;
1794
+ flex-direction: column;
1795
+ gap: 6px;
1796
+ font-size: 13px;
1797
+ color: var(--muted);
1798
+ }
1799
+
1800
+ .cp-modal-actions {
1801
+ display: flex;
1802
+ gap: 8px;
1803
+ }
1804
+
1805
+ .cp-error {
1806
+ color: var(--err);
1807
+ font-size: 13px;
1808
+ margin-top: 6px;
1809
+ }
1810
+
1811
+ .cp-loading,
1812
+ .cp-empty {
1813
+ color: var(--muted);
1814
+ font-size: 13px;
1815
+ padding: 10px 0;
1816
+ }
1817
+
1818
+ /* =============================================
1819
+ Mobile — Worker compact list card
1820
+ ============================================= */
1821
+
1822
+ .cp-task-card-compact {
1823
+ display: flex;
1824
+ align-items: center;
1825
+ gap: 10px;
1826
+ padding: 12px 14px;
1827
+ border: 1px solid var(--border);
1828
+ border-radius: var(--radius);
1829
+ background: rgba(255, 255, 255, 0.02);
1830
+ cursor: pointer;
1831
+ transition: background 0.12s;
1832
+ -webkit-tap-highlight-color: transparent;
1833
+ }
1834
+
1835
+ .cp-task-card-compact:active {
1836
+ background: rgba(255, 255, 255, 0.05);
1837
+ }
1838
+
1839
+ .cp-task-card-compact.error {
1840
+ border-color: rgba(247, 118, 142, 0.35);
1841
+ }
1842
+
1843
+ .cp-task-card-compact input[type='checkbox'] {
1844
+ width: 18px;
1845
+ height: 18px;
1846
+ flex-shrink: 0;
1847
+ cursor: pointer;
1848
+ }
1849
+
1850
+ .cp-task-card-compact-body {
1851
+ flex: 1;
1852
+ min-width: 0;
1853
+ }
1854
+
1855
+ .cp-task-card-compact-top {
1856
+ display: flex;
1857
+ align-items: center;
1858
+ gap: 8px;
1859
+ margin-bottom: 4px;
1860
+ }
1861
+
1862
+ .cp-task-card-compact-name {
1863
+ font-size: 14px;
1864
+ font-weight: 600;
1865
+ flex: 1;
1866
+ min-width: 0;
1867
+ overflow: hidden;
1868
+ text-overflow: ellipsis;
1869
+ white-space: nowrap;
1870
+ }
1871
+
1872
+ .cp-task-card-compact-meta {
1873
+ font-size: 11px;
1874
+ color: var(--muted);
1875
+ display: flex;
1876
+ gap: 8px;
1877
+ }
1878
+
1879
+ .cp-task-card-compact-preview {
1880
+ font-size: 12px;
1881
+ color: var(--muted);
1882
+ overflow: hidden;
1883
+ text-overflow: ellipsis;
1884
+ white-space: nowrap;
1885
+ }
1886
+
1887
+ .cp-task-card-compact-chevron {
1888
+ color: var(--muted);
1889
+ flex-shrink: 0;
1890
+ font-size: 16px;
1891
+ opacity: 0.5;
1892
+ }
1893
+
1894
+ /* =============================================
1895
+ Mobile — Detail view
1896
+ ============================================= */
1897
+
1898
+ .cp-mobile-detail {
1899
+ display: flex;
1900
+ flex-direction: column;
1901
+ flex: 1;
1902
+ min-height: 0;
1903
+ overflow: hidden;
1904
+ }
1905
+
1906
+ .cp-mobile-header-title {
1907
+ font-size: 16px;
1908
+ font-weight: 700;
1909
+ margin: 0;
1910
+ }
1911
+
1912
+ .cp-mobile-back-btn {
1913
+ display: flex;
1914
+ align-items: center;
1915
+ gap: 4px;
1916
+ background: none;
1917
+ border: none;
1918
+ color: var(--accent);
1919
+ font-size: 15px;
1920
+ cursor: pointer;
1921
+ padding: 4px 0;
1922
+ flex-shrink: 0;
1923
+ }
1924
+
1925
+ .cp-mobile-detail-title {
1926
+ font-size: 15px;
1927
+ font-weight: 600;
1928
+ overflow: hidden;
1929
+ text-overflow: ellipsis;
1930
+ white-space: nowrap;
1931
+ }
1932
+
1933
+ .cp-mobile-detail-feed {
1934
+ flex: 1;
1935
+ overflow: auto;
1936
+ padding: 10px 14px;
1937
+ min-height: 0;
1938
+ }
1939
+
1940
+ .cp-mobile-detail-input {
1941
+ display: flex;
1942
+ gap: 8px;
1943
+ padding: 10px 14px;
1944
+ border-top: 1px solid var(--border);
1945
+ background: rgba(0, 0, 0, 0.1);
1946
+ flex-shrink: 0;
1947
+ }
1948
+
1949
+ .cp-mobile-detail-textarea {
1950
+ flex: 1;
1951
+ min-height: 44px;
1952
+ max-height: 120px;
1953
+ resize: none;
1954
+ border: 1px solid var(--border);
1955
+ border-radius: var(--radius-sm);
1956
+ background: rgba(255, 255, 255, 0.03);
1957
+ color: var(--text);
1958
+ padding: 10px 12px;
1959
+ font-size: 14px;
1960
+ line-height: 1.4;
1961
+ }
1962
+
1963
+ .cp-mobile-detail-send {
1964
+ align-self: flex-end;
1965
+ min-height: 44px;
1966
+ padding: 0 18px;
1967
+ }
1968
+
1969
+ /* =============================================
1970
+ Mobile — Bottom Tab Bar
1971
+ ============================================= */
1972
+
1973
+ .cp-mobile-tab-bar {
1974
+ display: none;
1975
+ flex-shrink: 0;
1976
+ border-top: 1px solid var(--border);
1977
+ background: var(--panel-2);
1978
+ padding-bottom: env(safe-area-inset-bottom, 0px);
1979
+ }
1980
+
1981
+ .cp-mobile-tab {
1982
+ flex: 1;
1983
+ display: flex;
1984
+ flex-direction: column;
1985
+ align-items: center;
1986
+ justify-content: center;
1987
+ gap: 4px;
1988
+ padding: 10px 4px;
1989
+ background: none;
1990
+ border: none;
1991
+ color: var(--muted);
1992
+ font-size: 11px;
1993
+ cursor: pointer;
1994
+ position: relative;
1995
+ -webkit-tap-highlight-color: transparent;
1996
+ transition: color 0.12s;
1997
+ }
1998
+
1999
+ .cp-mobile-tab.active {
2000
+ color: var(--accent);
2001
+ }
2002
+
2003
+ .cp-mobile-tab svg {
2004
+ flex-shrink: 0;
2005
+ }
2006
+
2007
+ .cp-mobile-tab-broadcast {
2008
+ color: var(--muted);
2009
+ }
2010
+
2011
+ .cp-mobile-tab-badge {
2012
+ position: absolute;
2013
+ top: 6px;
2014
+ right: calc(50% - 18px);
2015
+ background: var(--accent);
2016
+ color: #0f111a;
2017
+ font-size: 10px;
2018
+ font-weight: 700;
2019
+ border-radius: 999px;
2020
+ padding: 1px 5px;
2021
+ min-width: 16px;
2022
+ text-align: center;
2023
+ line-height: 1.4;
2024
+ }
2025
+
2026
+ /* =============================================
2027
+ Mobile — Broadcast tab (inline, full height)
2028
+ ============================================= */
2029
+
2030
+ .cp-mobile-broadcast-tab {
2031
+ flex: 1;
2032
+ display: flex;
2033
+ flex-direction: column;
2034
+ overflow: hidden;
2035
+ min-height: 0;
2036
+ }
2037
+
2038
+ .cp-broadcast-sheet-nodes {
2039
+ border-bottom: 1px solid var(--border);
2040
+ overflow: hidden;
2041
+ flex: 1;
2042
+ display: flex;
2043
+ flex-direction: column;
2044
+ min-height: 0;
2045
+ }
2046
+
2047
+ .cp-broadcast-sheet-nodes-header {
2048
+ display: flex;
2049
+ align-items: center;
2050
+ justify-content: space-between;
2051
+ gap: 8px;
2052
+ padding: 10px 16px;
2053
+ border-bottom: 1px solid var(--border);
2054
+ background: rgba(255, 255, 255, 0.02);
2055
+ flex-shrink: 0;
2056
+ }
2057
+
2058
+ .cp-broadcast-sheet-subtitle {
2059
+ font-size: 13px;
2060
+ color: var(--muted);
2061
+ }
2062
+
2063
+ .cp-broadcast-sheet-node-list {
2064
+ overflow-y: auto;
2065
+ flex: 1;
2066
+ }
2067
+
2068
+ .cp-broadcast-sheet-node-item {
2069
+ display: flex;
2070
+ align-items: flex-start;
2071
+ gap: 12px;
2072
+ padding: 12px 16px;
2073
+ cursor: pointer;
2074
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
2075
+ -webkit-tap-highlight-color: transparent;
2076
+ }
2077
+
2078
+ .cp-broadcast-sheet-node-item:active {
2079
+ background: rgba(255, 255, 255, 0.04);
2080
+ }
2081
+
2082
+ .cp-broadcast-sheet-node-item:last-child {
2083
+ border-bottom: none;
2084
+ }
2085
+
2086
+ .cp-broadcast-sheet-node-item input[type='checkbox'] {
2087
+ width: 18px;
2088
+ height: 18px;
2089
+ flex-shrink: 0;
2090
+ margin-top: 2px;
2091
+ cursor: pointer;
2092
+ }
2093
+
2094
+ .cp-broadcast-sheet-node-info {
2095
+ display: flex;
2096
+ flex-direction: column;
2097
+ gap: 3px;
2098
+ min-width: 0;
2099
+ }
2100
+
2101
+ .cp-broadcast-sheet-node-name {
2102
+ font-size: 14px;
2103
+ font-weight: 500;
2104
+ word-break: break-word;
2105
+ line-height: 1.4;
2106
+ }
2107
+
2108
+ .cp-broadcast-sheet-node-url {
2109
+ font-family: var(--mono);
2110
+ font-size: 12px;
2111
+ color: var(--muted);
2112
+ word-break: break-all;
2113
+ }
2114
+
2115
+ .cp-broadcast-sheet-compose {
2116
+ padding: 12px 16px;
2117
+ border-top: 1px solid var(--border);
2118
+ display: flex;
2119
+ flex-direction: column;
2120
+ gap: 10px;
2121
+ flex-shrink: 0;
2122
+ padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
2123
+ }
2124
+
2125
+ .cp-broadcast-sheet-textarea {
2126
+ width: 100%;
2127
+ min-height: 80px;
2128
+ max-height: 160px;
2129
+ resize: none;
2130
+ border: 1px solid var(--border);
2131
+ border-radius: var(--radius-sm);
2132
+ background: rgba(255, 255, 255, 0.03);
2133
+ color: var(--text);
2134
+ padding: 10px 12px;
2135
+ font-size: 14px;
2136
+ line-height: 1.4;
2137
+ }
2138
+
2139
+ .cp-broadcast-sheet-footer {
2140
+ display: flex;
2141
+ gap: 10px;
2142
+ }
2143
+
2144
+ .cp-broadcast-sheet-footer .btn {
2145
+ flex: 1;
2146
+ min-height: 44px;
2147
+ font-size: 14px;
2148
+ }
2149
+
2150
+ /* =============================================
2151
+ Mobile — Worker list view
2152
+ ============================================= */
2153
+
2154
+ .cp-mobile-list {
2155
+ flex: 1;
2156
+ overflow-y: auto;
2157
+ padding: 10px 12px;
2158
+ display: flex;
2159
+ flex-direction: column;
2160
+ gap: 8px;
2161
+ }
2162
+
2163
+ /* =============================================
2164
+ Mobile — Endpoints tab
2165
+ ============================================= */
2166
+
2167
+ .cp-mobile-endpoints-tab {
2168
+ flex: 1;
2169
+ display: flex;
2170
+ flex-direction: column;
2171
+ overflow: hidden;
2172
+ min-height: 0;
2173
+ }
2174
+
2175
+ .cp-mobile-endpoints-toolbar {
2176
+ padding: 10px 14px;
2177
+ border-bottom: 1px solid var(--border);
2178
+ flex-shrink: 0;
2179
+ }
2180
+
2181
+ /* =============================================
2182
+ Responsive breakpoints
2183
+ ============================================= */
2184
+
2185
+ /* Desktop: sidebar + broadcast modal, no mobile elements */
2186
+ @media (min-width: 769px) {
2187
+ .cp-sidebar {
2188
+ display: flex;
2189
+ }
2190
+ .cp-header-mobile,
2191
+ .cp-mobile-list,
2192
+ .cp-mobile-detail,
2193
+ .cp-mobile-tab-bar,
2194
+ .cp-mobile-endpoints-tab,
2195
+ .cp-mobile-broadcast-tab {
2196
+ display: none !important;
2197
+ }
2198
+ .cp-header-pc {
2199
+ display: flex;
2200
+ }
2201
+ }
2202
+
2203
+ /* Mobile: bottom tabs, no sidebar */
2204
+ @media (max-width: 768px) {
2205
+ .app {
2206
+ padding: 0;
2207
+ }
2208
+
2209
+ .cp-header-pc {
2210
+ display: none !important;
2211
+ }
2212
+
2213
+ .cp-header-mobile {
2214
+ display: flex;
2215
+ }
2216
+
2217
+ .cp-sidebar {
2218
+ display: none;
2219
+ }
2220
+
2221
+ .cp-main {
2222
+ display: none;
2223
+ }
2224
+
2225
+ .cp-mobile-tab-bar {
2226
+ display: flex;
2227
+ }
2228
+
2229
+ /* Body fills between header and tab bar */
2230
+ .cp-body {
2231
+ flex: 1;
2232
+ min-height: 0;
2233
+ overflow: hidden;
2234
+ position: relative;
2235
+ }
2236
+
2237
+ /* Drawer goes full screen on mobile */
2238
+ .cp-drawer {
2239
+ inset: 0;
2240
+ width: 100%;
2241
+ max-width: none;
2242
+ border-radius: 0;
2243
+ border: none;
2244
+ }
2245
+ .cp-drawer.open {
2246
+ width: 100%;
2247
+ }
2248
+
2249
+ /* Endpoint list rows stack vertically */
2250
+ .cp-row {
2251
+ flex-direction: column;
2252
+ gap: 8px;
2253
+ }
2254
+ .cp-actions {
2255
+ margin-top: 0;
2256
+ justify-content: flex-start;
2257
+ flex-wrap: wrap;
2258
+ gap: 8px;
2259
+ }
2260
+ .cp-actions .btn {
2261
+ min-height: 40px;
2262
+ flex: 1;
2263
+ }
2264
+
2265
+ .cp-input,
2266
+ .cp-select {
2267
+ min-height: 40px;
2268
+ font-size: 14px;
2269
+ }
2270
+
2271
+ .btn {
2272
+ min-height: 38px;
2273
+ }
2274
+
2275
+ /* Broadcast modal hidden on mobile (use sheet instead) */
2276
+ .cp-broadcast-modal-backdrop {
2277
+ display: none !important;
2278
+ }
2279
+ }
2280
+
2281
+ /* ─── Rollout Page ──────────────────────────────────────────────────────────── */
2282
+
2283
+ .rollout-app {
2284
+ display: flex;
2285
+ flex-direction: column;
2286
+ height: 100%;
2287
+ background: var(--bg);
2288
+ }
2289
+
2290
+ .rollout-stats {
2291
+ display: flex;
2292
+ gap: 20px;
2293
+ padding: 14px 24px;
2294
+ border-bottom: 1px solid var(--border);
2295
+ background: var(--panel);
2296
+ }
2297
+ .rollout-stat {
2298
+ text-align: center;
2299
+ min-width: 72px;
2300
+ }
2301
+ .rollout-stat-value {
2302
+ font-size: 22px;
2303
+ font-weight: 700;
2304
+ font-variant-numeric: tabular-nums;
2305
+ color: var(--text);
2306
+ }
2307
+ .rollout-stat-label {
2308
+ font-size: 11px;
2309
+ color: var(--muted);
2310
+ text-transform: uppercase;
2311
+ letter-spacing: 0.5px;
2312
+ margin-top: 2px;
2313
+ }
2314
+ .rollout-running {
2315
+ color: var(--accent);
2316
+ }
2317
+ .rollout-queued {
2318
+ color: var(--warn);
2319
+ }
2320
+ .rollout-completed {
2321
+ color: var(--ok);
2322
+ }
2323
+ .rollout-failed {
2324
+ color: var(--err);
2325
+ }
2326
+
2327
+ .rollout-body {
2328
+ display: flex;
2329
+ flex: 1;
2330
+ min-height: 0;
2331
+ overflow: hidden;
2332
+ }
2333
+
2334
+ .rollout-sidebar {
2335
+ width: 320px;
2336
+ border-right: 1px solid var(--border);
2337
+ background: var(--panel);
2338
+ display: flex;
2339
+ flex-direction: column;
2340
+ overflow-y: auto;
2341
+ }
2342
+ .rollout-sidebar-section {
2343
+ padding: 14px 16px;
2344
+ border-bottom: 1px solid var(--border);
2345
+ }
2346
+ .rollout-sidebar-queue {
2347
+ flex: 1;
2348
+ min-height: 0;
2349
+ display: flex;
2350
+ flex-direction: column;
2351
+ padding: 10px 16px;
2352
+ }
2353
+ .rollout-label {
2354
+ display: block;
2355
+ font-size: 12px;
2356
+ color: var(--muted);
2357
+ margin-bottom: 8px;
2358
+ text-transform: uppercase;
2359
+ letter-spacing: 0.5px;
2360
+ }
2361
+ .rollout-row {
2362
+ display: flex;
2363
+ gap: 8px;
2364
+ align-items: center;
2365
+ }
2366
+ .rollout-input,
2367
+ .rollout-textarea,
2368
+ .rollout-select {
2369
+ background: var(--panel-2);
2370
+ border: 1px solid var(--border);
2371
+ color: var(--text);
2372
+ padding: 7px 10px;
2373
+ border-radius: var(--radius-sm);
2374
+ font-size: 13px;
2375
+ font-family: var(--sans);
2376
+ outline: none;
2377
+ width: 100%;
2378
+ }
2379
+ .rollout-input:focus,
2380
+ .rollout-textarea:focus {
2381
+ border-color: var(--accent);
2382
+ }
2383
+ .rollout-input-sm {
2384
+ width: 70px;
2385
+ flex: 0 0 auto;
2386
+ }
2387
+ .rollout-textarea {
2388
+ resize: vertical;
2389
+ min-height: 80px;
2390
+ }
2391
+ .rollout-select {
2392
+ cursor: pointer;
2393
+ }
2394
+ .rollout-add-form {
2395
+ display: flex;
2396
+ flex-direction: column;
2397
+ gap: 8px;
2398
+ }
2399
+ .rollout-badge {
2400
+ background: var(--subtle);
2401
+ padding: 1px 7px;
2402
+ border-radius: 10px;
2403
+ font-size: 11px;
2404
+ font-weight: 600;
2405
+ }
2406
+ .rollout-queue-list {
2407
+ flex: 1;
2408
+ overflow-y: auto;
2409
+ display: flex;
2410
+ flex-direction: column;
2411
+ gap: 6px;
2412
+ }
2413
+ .rollout-queue-empty {
2414
+ color: var(--muted);
2415
+ font-size: 12px;
2416
+ padding: 8px 0;
2417
+ }
2418
+ .rollout-queue-item {
2419
+ background: var(--panel-2);
2420
+ border: 1px solid var(--border);
2421
+ border-radius: var(--radius-sm);
2422
+ padding: 8px 10px;
2423
+ }
2424
+ .rollout-queue-item-header {
2425
+ display: flex;
2426
+ justify-content: space-between;
2427
+ align-items: center;
2428
+ }
2429
+ .rollout-queue-item-prompt {
2430
+ font-size: 12px;
2431
+ color: var(--muted);
2432
+ margin-top: 4px;
2433
+ overflow: hidden;
2434
+ text-overflow: ellipsis;
2435
+ white-space: nowrap;
2436
+ }
2437
+
2438
+ .rollout-main {
2439
+ flex: 1;
2440
+ display: flex;
2441
+ flex-direction: column;
2442
+ min-width: 0;
2443
+ overflow: hidden;
2444
+ }
2445
+ .rollout-main-header {
2446
+ display: flex;
2447
+ align-items: center;
2448
+ justify-content: space-between;
2449
+ padding: 12px 20px;
2450
+ border-bottom: 1px solid var(--border);
2451
+ }
2452
+ .rollout-main-title {
2453
+ font-size: 15px;
2454
+ font-weight: 600;
2455
+ }
2456
+ .rollout-main-controls {
2457
+ display: flex;
2458
+ gap: 8px;
2459
+ align-items: center;
2460
+ }
2461
+ .rollout-main-controls .rollout-select {
2462
+ width: auto;
2463
+ min-width: 100px;
2464
+ }
2465
+ .rollout-task-list {
2466
+ flex: 1;
2467
+ overflow-y: auto;
2468
+ padding: 16px 20px;
2469
+ display: flex;
2470
+ flex-direction: column;
2471
+ gap: 12px;
2472
+ }
2473
+ .rollout-empty {
2474
+ text-align: center;
2475
+ padding: 40px;
2476
+ color: var(--muted);
2477
+ }
2478
+ .rollout-task-card {
2479
+ background: var(--panel);
2480
+ border: 1px solid var(--border);
2481
+ border-radius: var(--radius);
2482
+ padding: 14px 16px;
2483
+ transition: border-color 0.15s;
2484
+ }
2485
+ .rollout-task-card:hover {
2486
+ border-color: var(--muted);
2487
+ }
2488
+ .rollout-task-card-header {
2489
+ display: flex;
2490
+ align-items: center;
2491
+ justify-content: space-between;
2492
+ margin-bottom: 8px;
2493
+ }
2494
+ .rollout-task-card-left {
2495
+ display: flex;
2496
+ gap: 8px;
2497
+ align-items: center;
2498
+ flex-wrap: wrap;
2499
+ }
2500
+ .rollout-task-id {
2501
+ font-family: var(--mono);
2502
+ font-size: 12px;
2503
+ color: var(--muted);
2504
+ }
2505
+ .rollout-task-model {
2506
+ font-size: 11px;
2507
+ padding: 2px 8px;
2508
+ border-radius: 10px;
2509
+ background: var(--subtle);
2510
+ color: var(--muted);
2511
+ }
2512
+ .rollout-task-tags {
2513
+ font-size: 11px;
2514
+ color: var(--accent-2);
2515
+ }
2516
+ .rollout-task-status {
2517
+ font-size: 12px;
2518
+ font-weight: 600;
2519
+ padding: 2px 10px;
2520
+ border-radius: 10px;
2521
+ }
2522
+ .rollout-task-status.queued {
2523
+ background: rgba(224, 175, 104, 0.15);
2524
+ color: var(--warn);
2525
+ }
2526
+ .rollout-task-status.running {
2527
+ background: rgba(122, 162, 247, 0.15);
2528
+ color: var(--accent);
2529
+ }
2530
+ .rollout-task-status.completed {
2531
+ background: rgba(158, 206, 106, 0.15);
2532
+ color: var(--ok);
2533
+ }
2534
+ .rollout-task-status.failed,
2535
+ .rollout-task-status.stopped {
2536
+ background: rgba(247, 118, 142, 0.15);
2537
+ color: var(--err);
2538
+ }
2539
+ .rollout-task-status.cancelled {
2540
+ background: var(--subtle);
2541
+ color: var(--muted);
2542
+ }
2543
+
2544
+ .rollout-task-prompt {
2545
+ font-size: 13px;
2546
+ line-height: 1.5;
2547
+ color: var(--text);
2548
+ margin-bottom: 4px;
2549
+ word-break: break-word;
2550
+ }
2551
+ .rollout-task-command {
2552
+ font-family: var(--mono);
2553
+ font-size: 11px;
2554
+ line-height: 1.4;
2555
+ color: var(--muted);
2556
+ background: var(--subtle);
2557
+ padding: 3px 8px;
2558
+ border-radius: 4px;
2559
+ margin-bottom: 8px;
2560
+ word-break: break-all;
2561
+ white-space: nowrap;
2562
+ overflow: hidden;
2563
+ text-overflow: ellipsis;
2564
+ }
2565
+ .rollout-task-meta {
2566
+ display: flex;
2567
+ gap: 12px;
2568
+ align-items: center;
2569
+ font-size: 11px;
2570
+ color: var(--muted);
2571
+ }
2572
+ .rollout-task-actions {
2573
+ display: flex;
2574
+ gap: 6px;
2575
+ margin-top: 10px;
2576
+ }
2577
+ .rollout-btn-sm {
2578
+ font-size: 12px !important;
2579
+ padding: 4px 10px !important;
2580
+ }
2581
+ .rollout-btn-xs {
2582
+ font-size: 11px !important;
2583
+ padding: 2px 8px !important;
2584
+ }
2585
+
2586
+ /* Tabs */
2587
+ .rollout-tabs {
2588
+ display: flex;
2589
+ gap: 0;
2590
+ align-items: center;
2591
+ padding: 0 20px;
2592
+ border-bottom: 1px solid var(--border);
2593
+ background: var(--panel);
2594
+ }
2595
+ .rollout-tab {
2596
+ background: none;
2597
+ border: none;
2598
+ border-bottom: 2px solid transparent;
2599
+ padding: 10px 18px;
2600
+ font-size: 13px;
2601
+ font-weight: 500;
2602
+ color: var(--muted);
2603
+ cursor: pointer;
2604
+ transition: all 0.15s;
2605
+ }
2606
+ .rollout-tab:hover {
2607
+ color: var(--text);
2608
+ }
2609
+ .rollout-tab.active {
2610
+ color: var(--accent);
2611
+ border-bottom-color: var(--accent);
2612
+ }
2613
+ .rollout-hint {
2614
+ font-size: 12px;
2615
+ color: var(--muted);
2616
+ font-weight: 400;
2617
+ }
2618
+ .rollout-task-card.is-running {
2619
+ border-left: 3px solid var(--accent);
2620
+ }
2621
+
2622
+ /* Detail / Log panel */
2623
+ .rollout-log-backdrop {
2624
+ position: fixed;
2625
+ inset: 0;
2626
+ background: rgba(0, 0, 0, 0.5);
2627
+ z-index: 99;
2628
+ }
2629
+ .rollout-log-panel {
2630
+ position: fixed;
2631
+ right: 0;
2632
+ top: 0;
2633
+ width: 55vw;
2634
+ min-width: 500px;
2635
+ height: 100vh;
2636
+ background: var(--panel);
2637
+ border-left: 1px solid var(--border);
2638
+ display: flex;
2639
+ flex-direction: column;
2640
+ z-index: 100;
2641
+ animation: rollout-slide-in 0.2s ease;
2642
+ }
2643
+ @keyframes rollout-slide-in {
2644
+ from {
2645
+ transform: translateX(100%);
2646
+ }
2647
+ to {
2648
+ transform: translateX(0);
2649
+ }
2650
+ }
2651
+ .rollout-log-header {
2652
+ display: flex;
2653
+ align-items: center;
2654
+ justify-content: space-between;
2655
+ padding: 14px 16px;
2656
+ border-bottom: 1px solid var(--border);
2657
+ }
2658
+ .rollout-log-header h3 {
2659
+ font-size: 14px;
2660
+ margin: 0;
2661
+ white-space: nowrap;
2662
+ overflow: hidden;
2663
+ text-overflow: ellipsis;
2664
+ max-width: 60%;
2665
+ }
2666
+ .rollout-detail-tabs {
2667
+ display: flex;
2668
+ border-bottom: 1px solid var(--border);
2669
+ padding: 0 16px;
2670
+ }
2671
+ .rollout-detail-tab {
2672
+ background: none;
2673
+ border: none;
2674
+ border-bottom: 2px solid transparent;
2675
+ padding: 8px 14px;
2676
+ font-size: 12px;
2677
+ font-weight: 500;
2678
+ color: var(--muted);
2679
+ cursor: pointer;
2680
+ }
2681
+ .rollout-detail-tab:hover {
2682
+ color: var(--text);
2683
+ }
2684
+ .rollout-detail-tab.active {
2685
+ color: var(--accent);
2686
+ border-bottom-color: var(--accent);
2687
+ }
2688
+ .rollout-log-content {
2689
+ flex: 1;
2690
+ overflow-y: auto;
2691
+ padding: 16px;
2692
+ margin: 0;
2693
+ font-family: var(--mono);
2694
+ font-size: 12px;
2695
+ line-height: 1.6;
2696
+ white-space: pre-wrap;
2697
+ color: var(--muted);
2698
+ }
2699
+ .rollout-log-content.loading {
2700
+ opacity: 0.5;
2701
+ }
2702
+ .rollout-live-dot {
2703
+ color: var(--ok);
2704
+ font-size: 11px;
2705
+ font-weight: 600;
2706
+ animation: rollout-blink 1s infinite;
2707
+ }
2708
+ @keyframes rollout-blink {
2709
+ 0%,
2710
+ 100% {
2711
+ opacity: 1;
2712
+ }
2713
+ 50% {
2714
+ opacity: 0.3;
2715
+ }
2716
+ }
2717
+
2718
+ /* Artifacts list */
2719
+ .rollout-artifact-list {
2720
+ flex: 1;
2721
+ overflow-y: auto;
2722
+ padding: 12px 16px;
2723
+ display: flex;
2724
+ flex-direction: column;
2725
+ gap: 4px;
2726
+ }
2727
+ .rollout-artifact-item {
2728
+ display: flex;
2729
+ align-items: center;
2730
+ gap: 8px;
2731
+ padding: 8px 12px;
2732
+ background: var(--subtle);
2733
+ border-radius: var(--radius);
2734
+ color: var(--text);
2735
+ text-decoration: none;
2736
+ font-family: var(--mono);
2737
+ font-size: 12px;
2738
+ transition: background 0.15s;
2739
+ }
2740
+ .rollout-artifact-item:hover {
2741
+ background: var(--border);
2742
+ }
2743
+ .rollout-artifact-icon {
2744
+ font-size: 14px;
2745
+ }
2746
+
2747
+ /* Resolution badge */
2748
+ .rollout-task-resolution {
2749
+ font-size: 10px;
2750
+ padding: 1px 6px;
2751
+ border-radius: 8px;
2752
+ background: rgba(187, 154, 247, 0.15);
2753
+ color: #bb9af7;
2754
+ font-weight: 600;
2755
+ }
2756
+
2757
+ /* Config info */
2758
+ .rollout-config-info {
2759
+ font-size: 12px;
2760
+ line-height: 1.8;
2761
+ color: var(--muted);
2762
+ }
2763
+ .rollout-config-info code {
2764
+ font-family: var(--mono);
2765
+ font-size: 11px;
2766
+ background: var(--subtle);
2767
+ padding: 1px 5px;
2768
+ border-radius: 3px;
2769
+ }
2770
+
2771
+ /* New Task Dialog */
2772
+ .rollout-dialog {
2773
+ position: fixed;
2774
+ top: 50%;
2775
+ left: 50%;
2776
+ transform: translate(-50%, -50%);
2777
+ width: 680px;
2778
+ max-width: 90vw;
2779
+ max-height: 85vh;
2780
+ background: var(--panel);
2781
+ border: 1px solid var(--border);
2782
+ border-radius: 12px;
2783
+ display: flex;
2784
+ flex-direction: column;
2785
+ z-index: 100;
2786
+ animation: rollout-dialog-in 0.2s ease;
2787
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
2788
+ }
2789
+ @keyframes rollout-dialog-in {
2790
+ from {
2791
+ opacity: 0;
2792
+ transform: translate(-50%, -48%);
2793
+ }
2794
+ to {
2795
+ opacity: 1;
2796
+ transform: translate(-50%, -50%);
2797
+ }
2798
+ }
2799
+ .rollout-dialog-header {
2800
+ display: flex;
2801
+ align-items: center;
2802
+ justify-content: space-between;
2803
+ padding: 16px 20px 12px;
2804
+ border-bottom: 1px solid var(--border);
2805
+ }
2806
+ .rollout-dialog-header h3 {
2807
+ font-size: 16px;
2808
+ margin: 0;
2809
+ }
2810
+ .rollout-dialog-body {
2811
+ flex: 1;
2812
+ overflow-y: auto;
2813
+ padding: 16px 20px;
2814
+ display: flex;
2815
+ flex-direction: column;
2816
+ gap: 12px;
2817
+ }
2818
+ .rollout-dialog-footer {
2819
+ display: flex;
2820
+ align-items: center;
2821
+ justify-content: space-between;
2822
+ padding-top: 12px;
2823
+ border-top: 1px solid var(--border);
2824
+ margin-top: 4px;
2825
+ }
2826
+
2827
+ /* Form groups */
2828
+ .rollout-form-group {
2829
+ display: flex;
2830
+ flex-direction: column;
2831
+ gap: 4px;
2832
+ }
2833
+ .rollout-form-row {
2834
+ display: flex;
2835
+ gap: 12px;
2836
+ align-items: flex-end;
2837
+ }
2838
+ .rollout-form-details {
2839
+ border: 1px solid var(--border);
2840
+ border-radius: var(--radius);
2841
+ padding: 8px 12px;
2842
+ }
2843
+ .rollout-form-details[open] {
2844
+ padding-bottom: 4px;
2845
+ }
2846
+
2847
+ /* JSON editor */
2848
+ .rollout-json-editor {
2849
+ font-family: var(--mono) !important;
2850
+ font-size: 13px !important;
2851
+ line-height: 1.5 !important;
2852
+ min-height: 300px;
2853
+ resize: vertical;
2854
+ tab-size: 2;
2855
+ }
2856
+ .rollout-json-error {
2857
+ color: var(--err);
2858
+ font-size: 12px;
2859
+ padding: 4px 0;
2860
+ }