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

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);
@@ -154,7 +154,7 @@ textarea {
154
154
  }
155
155
 
156
156
  .md {
157
- font-size: 13px;
157
+ font-size: 14px;
158
158
  line-height: 1.55;
159
159
  color: var(--text);
160
160
  }
@@ -170,16 +170,16 @@ textarea {
170
170
  line-height: 1.25;
171
171
  }
172
172
  .md h1 {
173
- font-size: 18px;
173
+ font-size: 20px;
174
174
  }
175
175
  .md h2 {
176
- font-size: 16px;
176
+ font-size: 17px;
177
177
  }
178
178
  .md h3 {
179
- font-size: 14px;
179
+ font-size: 15px;
180
180
  }
181
181
  .md h4 {
182
- font-size: 13px;
182
+ font-size: 14px;
183
183
  color: rgba(255, 255, 255, 0.86);
184
184
  }
185
185
  .md ul,
@@ -193,7 +193,7 @@ textarea {
193
193
  }
194
194
  .md code.inline {
195
195
  font-family: var(--mono);
196
- font-size: 12px;
196
+ font-size: 13px;
197
197
  padding: 2px 6px;
198
198
  border-radius: 8px;
199
199
  border: 1px solid var(--border);
@@ -208,7 +208,7 @@ textarea {
208
208
  background: rgba(0, 0, 0, 0.3);
209
209
  overflow: auto;
210
210
  font-family: var(--mono);
211
- font-size: 12px;
211
+ font-size: 13px;
212
212
  line-height: 1.5;
213
213
  }
214
214
  .md pre code {
@@ -935,75 +935,27 @@ textarea {
935
935
  }
936
936
  }
937
937
 
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
- }
938
+ /* =============================================
939
+ Control Plane — shared base styles
940
+ ============================================= */
993
941
 
994
- /* Control plane */
995
942
  .control-plane {
996
943
  display: flex;
944
+ flex-direction: column;
997
945
  gap: 0;
946
+ height: 100%;
947
+ min-height: 0;
998
948
  }
999
949
 
950
+ /* Top header bar */
1000
951
  .cp-header {
1001
952
  display: flex;
1002
953
  align-items: center;
1003
954
  justify-content: space-between;
1004
955
  gap: 12px;
1005
- padding: 14px 18px;
956
+ padding: 12px 16px;
1006
957
  border-bottom: 1px solid var(--border);
958
+ flex-shrink: 0;
1007
959
  }
1008
960
 
1009
961
  .cp-header h1 {
@@ -1017,303 +969,343 @@ textarea {
1017
969
  }
1018
970
 
1019
971
  .cp-subtitle {
1020
- font-size: 12px;
972
+ font-size: 13px;
1021
973
  color: var(--muted);
1022
- margin-top: 4px;
974
+ margin-top: 3px;
1023
975
  }
1024
976
 
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;
977
+ /* Body area below header — sidebar + main */
978
+ .cp-body {
1039
979
  display: flex;
1040
- flex-direction: column;
980
+ flex: 1;
981
+ min-height: 0;
982
+ overflow: hidden;
1041
983
  }
1042
984
 
1043
- .cp-drawer.open {
1044
- transform: translateX(0);
1045
- }
985
+ /* =============================================
986
+ PC Sidebar
987
+ ============================================= */
1046
988
 
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);
989
+ .cp-sidebar {
990
+ width: 260px;
991
+ flex-shrink: 0;
992
+ border-right: 1px solid var(--border);
993
+ display: flex;
994
+ flex-direction: column;
995
+ overflow: hidden;
996
+ background: var(--panel-2);
1053
997
  }
1054
998
 
1055
- .cp-drawer-header {
999
+ .cp-sidebar-section-label {
1000
+ padding: 10px 12px 6px;
1001
+ font-size: 11px;
1002
+ font-weight: 700;
1003
+ color: var(--muted);
1004
+ text-transform: uppercase;
1005
+ letter-spacing: 0.08em;
1006
+ flex-shrink: 0;
1056
1007
  display: flex;
1057
1008
  align-items: center;
1058
- justify-content: space-between;
1059
- gap: 12px;
1060
- padding: 14px 16px;
1061
- border-bottom: 1px solid var(--border);
1009
+ gap: 6px;
1062
1010
  }
1063
1011
 
1064
- .cp-drawer-header h2 {
1065
- margin: 0;
1066
- font-size: 14px;
1012
+ .cp-sidebar-workers-label {
1013
+ border-top: 1px solid var(--border);
1067
1014
  }
1068
1015
 
1069
- .cp-drawer-toolbar {
1016
+ .cp-sidebar-workers-count {
1017
+ background: rgba(255, 255, 255, 0.08);
1018
+ border-radius: 999px;
1019
+ padding: 1px 7px;
1020
+ font-size: 11px;
1021
+ font-weight: 600;
1022
+ color: var(--muted);
1023
+ }
1024
+
1025
+ /* Broadcast summary section in sidebar */
1026
+ .cp-sidebar-broadcast-section {
1027
+ padding: 10px 12px 12px;
1028
+ border-bottom: 1px solid var(--border);
1029
+ flex-shrink: 0;
1070
1030
  display: flex;
1071
1031
  flex-direction: column;
1072
1032
  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
1033
  }
1082
1034
 
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;
1035
+ .cp-sidebar-broadcast-target {
1090
1036
  font-size: 12px;
1091
- width: 100%;
1037
+ color: var(--muted);
1092
1038
  }
1093
1039
 
1094
- .cp-select {
1095
- min-width: 100px;
1040
+ .cp-sidebar-broadcast-btn {
1041
+ width: 100%;
1042
+ justify-content: center;
1096
1043
  }
1097
1044
 
1098
- .cp-content {
1099
- padding: 12px 18px;
1100
- overflow: auto;
1045
+ /* Worker nav list inside sidebar */
1046
+ .cp-sidebar-workers {
1101
1047
  flex: 1;
1048
+ overflow-y: auto;
1049
+ padding: 4px 0 8px;
1102
1050
  }
1103
1051
 
1104
- .cp-list {
1052
+ .cp-sidebar-worker-item {
1105
1053
  display: flex;
1106
- flex-direction: column;
1107
- gap: 12px;
1054
+ align-items: flex-start;
1055
+ gap: 8px;
1056
+ padding: 8px 12px;
1057
+ cursor: pointer;
1058
+ transition: background 0.12s;
1059
+ border-left: 2px solid transparent;
1108
1060
  }
1109
1061
 
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);
1062
+ .cp-sidebar-worker-item:hover {
1063
+ background: rgba(255, 255, 255, 0.04);
1118
1064
  }
1119
1065
 
1120
- .cp-select-box {
1121
- display: flex;
1122
- align-items: flex-start;
1123
- padding-top: 4px;
1066
+ .cp-sidebar-worker-item.active {
1067
+ background: rgba(122, 162, 247, 0.08);
1068
+ border-left-color: var(--accent);
1124
1069
  }
1125
1070
 
1126
- .cp-select-box input {
1127
- width: 16px;
1128
- height: 16px;
1071
+ .cp-sidebar-worker-item input[type='checkbox'] {
1072
+ width: 14px;
1073
+ height: 14px;
1074
+ flex-shrink: 0;
1075
+ cursor: pointer;
1076
+ margin-top: 3px;
1129
1077
  }
1130
1078
 
1131
- .cp-row-main {
1079
+ .cp-sidebar-worker-info {
1132
1080
  flex: 1;
1133
1081
  min-width: 0;
1134
- }
1135
-
1136
- .cp-row-title {
1137
1082
  display: flex;
1138
1083
  flex-direction: column;
1139
- gap: 4px;
1084
+ gap: 2px;
1140
1085
  }
1141
1086
 
1142
- .cp-name {
1143
- font-weight: 600;
1087
+ .cp-sidebar-worker-name {
1088
+ font-size: 13px;
1089
+ font-weight: 500;
1090
+ line-height: 1.4;
1091
+ word-break: break-word;
1144
1092
  }
1145
1093
 
1146
- .cp-url {
1094
+ .cp-sidebar-worker-url {
1147
1095
  font-family: var(--mono);
1148
1096
  font-size: 11px;
1149
1097
  color: var(--muted);
1150
1098
  word-break: break-all;
1099
+ line-height: 1.4;
1151
1100
  }
1152
1101
 
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;
1102
+ .cp-sidebar-worker-tags {
1103
+ font-size: 11px;
1104
+ color: rgba(187, 154, 247, 0.7);
1105
+ line-height: 1.4;
1165
1106
  }
1166
1107
 
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);
1108
+ .cp-sidebar-worker-status {
1109
+ flex-shrink: 0;
1110
+ margin-top: 2px;
1173
1111
  }
1174
1112
 
1175
- .cp-tag.muted {
1176
- opacity: 0.6;
1177
- }
1113
+ /* =============================================
1114
+ PC Broadcast Modal
1115
+ ============================================= */
1178
1116
 
1179
- .cp-actions {
1117
+ .cp-broadcast-modal-backdrop {
1118
+ position: fixed;
1119
+ inset: 0;
1120
+ background: rgba(0, 0, 0, 0.6);
1121
+ z-index: 300;
1180
1122
  display: flex;
1181
- gap: 6px;
1182
1123
  align-items: center;
1124
+ justify-content: center;
1125
+ padding: 20px;
1126
+ backdrop-filter: blur(3px);
1183
1127
  }
1184
1128
 
1185
- .cp-health {
1186
- font-size: 11px;
1187
- padding: 2px 6px;
1188
- border-radius: 6px;
1129
+ .cp-broadcast-modal {
1130
+ width: min(860px, 96vw);
1131
+ max-height: 88vh;
1132
+ background: rgba(16, 21, 33, 0.98);
1189
1133
  border: 1px solid var(--border);
1190
- color: var(--muted);
1134
+ border-radius: 16px;
1135
+ box-shadow: var(--shadow);
1136
+ display: flex;
1137
+ flex-direction: column;
1138
+ overflow: hidden;
1191
1139
  }
1192
1140
 
1193
- .cp-health.ok {
1194
- color: var(--ok);
1195
- border-color: rgba(158, 206, 106, 0.4);
1141
+ .cp-broadcast-modal-header {
1142
+ display: flex;
1143
+ align-items: center;
1144
+ justify-content: space-between;
1145
+ padding: 14px 18px;
1146
+ border-bottom: 1px solid var(--border);
1147
+ flex-shrink: 0;
1196
1148
  }
1197
1149
 
1198
- .cp-health.err {
1199
- color: var(--err);
1200
- border-color: rgba(247, 118, 142, 0.4);
1150
+ .cp-broadcast-modal-title {
1151
+ font-size: 15px;
1152
+ font-weight: 650;
1201
1153
  }
1202
1154
 
1203
- .cp-health.pending {
1155
+ .cp-broadcast-modal-close {
1156
+ background: none;
1157
+ border: none;
1204
1158
  color: var(--muted);
1159
+ font-size: 16px;
1160
+ cursor: pointer;
1161
+ padding: 4px 8px;
1162
+ border-radius: 6px;
1163
+ line-height: 1;
1205
1164
  }
1206
1165
 
1207
- .cp-health-ms {
1208
- margin-left: 6px;
1209
- color: var(--muted);
1210
- font-size: 10px;
1166
+ .cp-broadcast-modal-close:hover {
1167
+ background: rgba(255, 255, 255, 0.06);
1168
+ color: var(--text);
1211
1169
  }
1212
1170
 
1213
- .cp-pagination {
1171
+ .cp-broadcast-modal-body {
1172
+ display: grid;
1173
+ grid-template-columns: 1fr 320px;
1174
+ gap: 0;
1175
+ flex: 1;
1176
+ min-height: 0;
1177
+ overflow: hidden;
1178
+ }
1179
+
1180
+ .cp-broadcast-modal-left {
1214
1181
  display: flex;
1215
- align-items: center;
1216
- justify-content: space-between;
1182
+ flex-direction: column;
1183
+ padding: 14px 18px;
1217
1184
  gap: 10px;
1218
- padding: 12px 18px;
1219
- border-top: 1px solid var(--border);
1185
+ border-right: 1px solid var(--border);
1186
+ min-height: 0;
1220
1187
  }
1221
1188
 
1222
- .cp-page-info,
1223
- .cp-page-number {
1224
- font-size: 12px;
1225
- color: var(--muted);
1189
+ .cp-broadcast-modal-right {
1190
+ display: flex;
1191
+ flex-direction: column;
1192
+ min-height: 0;
1193
+ overflow: hidden;
1226
1194
  }
1227
1195
 
1228
- .cp-page-controls {
1196
+ .cp-broadcast-modal-label {
1197
+ font-size: 11px;
1198
+ font-weight: 700;
1199
+ color: var(--muted);
1200
+ text-transform: uppercase;
1201
+ letter-spacing: 0.08em;
1229
1202
  display: flex;
1230
1203
  align-items: center;
1204
+ justify-content: space-between;
1231
1205
  gap: 8px;
1206
+ flex-shrink: 0;
1232
1207
  }
1233
1208
 
1234
- .cp-modal-body {
1209
+ .cp-broadcast-modal-node-actions {
1235
1210
  display: flex;
1236
- flex-direction: column;
1237
- gap: 10px;
1238
- padding: 12px;
1211
+ gap: 6px;
1239
1212
  }
1240
1213
 
1241
- .cp-label {
1214
+ .cp-broadcast-modal-textarea {
1215
+ flex: 1;
1216
+ min-height: 160px;
1217
+ resize: none;
1218
+ border: 1px solid var(--border);
1219
+ border-radius: var(--radius-sm);
1220
+ background: rgba(255, 255, 255, 0.03);
1221
+ color: var(--text);
1222
+ padding: 10px 12px;
1223
+ font-size: 14px;
1224
+ line-height: 1.5;
1225
+ }
1226
+
1227
+ .cp-broadcast-modal-textarea:focus {
1228
+ outline: none;
1229
+ border-color: rgba(122, 162, 247, 0.5);
1230
+ box-shadow: 0 0 0 3px rgba(122, 162, 247, 0.1);
1231
+ }
1232
+
1233
+ .cp-broadcast-modal-footer {
1242
1234
  display: flex;
1243
- flex-direction: column;
1244
- gap: 6px;
1235
+ align-items: center;
1236
+ justify-content: space-between;
1237
+ gap: 10px;
1238
+ flex-shrink: 0;
1239
+ }
1240
+
1241
+ .cp-broadcast-modal-target {
1245
1242
  font-size: 12px;
1246
1243
  color: var(--muted);
1247
1244
  }
1248
1245
 
1249
- .cp-modal-actions {
1250
- display: flex;
1251
- gap: 8px;
1246
+ .cp-broadcast-modal-node-list {
1247
+ flex: 1;
1248
+ overflow-y: auto;
1249
+ padding: 8px 0;
1252
1250
  }
1253
1251
 
1254
- .cp-error {
1255
- color: var(--err);
1256
- font-size: 12px;
1257
- margin-top: 6px;
1252
+ .cp-broadcast-modal-node-item {
1253
+ display: flex;
1254
+ align-items: flex-start;
1255
+ gap: 10px;
1256
+ padding: 8px 16px;
1257
+ cursor: pointer;
1258
+ transition: background 0.1s;
1258
1259
  }
1259
1260
 
1260
- .cp-loading,
1261
- .cp-empty {
1262
- color: var(--muted);
1263
- font-size: 12px;
1264
- padding: 10px 0;
1261
+ .cp-broadcast-modal-node-item:hover {
1262
+ background: rgba(255, 255, 255, 0.04);
1265
1263
  }
1266
1264
 
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;
1265
+ .cp-broadcast-modal-node-item input[type='checkbox'] {
1266
+ width: 15px;
1267
+ height: 15px;
1268
+ flex-shrink: 0;
1269
+ cursor: pointer;
1270
+ margin-top: 2px;
1273
1271
  }
1274
1272
 
1275
- .cp-broadcast-header {
1273
+ .cp-broadcast-modal-node-info {
1276
1274
  display: flex;
1277
- align-items: center;
1278
- justify-content: space-between;
1279
- gap: 10px;
1280
- margin-bottom: 8px;
1275
+ flex-direction: column;
1276
+ gap: 2px;
1277
+ min-width: 0;
1281
1278
  }
1282
1279
 
1283
- .cp-broadcast-title {
1280
+ .cp-broadcast-modal-node-name {
1284
1281
  font-size: 13px;
1285
- font-weight: 600;
1282
+ font-weight: 500;
1283
+ line-height: 1.4;
1284
+ word-break: break-word;
1286
1285
  }
1287
1286
 
1288
- .cp-broadcast-subtitle {
1287
+ .cp-broadcast-modal-node-url {
1288
+ font-family: var(--mono);
1289
1289
  font-size: 11px;
1290
1290
  color: var(--muted);
1291
- margin-top: 4px;
1291
+ word-break: break-all;
1292
1292
  }
1293
1293
 
1294
- .cp-broadcast-actions {
1295
- display: flex;
1296
- gap: 8px;
1294
+ .cp-broadcast-modal-node-tags {
1295
+ font-size: 11px;
1296
+ color: rgba(187, 154, 247, 0.7);
1297
1297
  }
1298
1298
 
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
- }
1299
+ /* =============================================
1300
+ PC Main area — worker grid
1301
+ ============================================= */
1312
1302
 
1313
- .cp-broadcast-footer {
1303
+ .cp-main {
1304
+ flex: 1;
1305
+ min-width: 0;
1314
1306
  display: flex;
1315
- justify-content: flex-end;
1316
- margin-top: 8px;
1307
+ flex-direction: column;
1308
+ overflow: hidden;
1317
1309
  }
1318
1310
 
1319
1311
  .cp-workers {
@@ -1324,20 +1316,26 @@ textarea {
1324
1316
  }
1325
1317
 
1326
1318
  .cp-workers-header {
1327
- padding: 12px 18px 0;
1328
- font-size: 12px;
1319
+ padding: 12px 16px 0;
1320
+ font-size: 11px;
1329
1321
  color: var(--muted);
1330
1322
  text-transform: uppercase;
1331
1323
  letter-spacing: 0.08em;
1324
+ flex-shrink: 0;
1332
1325
  }
1333
1326
 
1334
1327
  .cp-worker-grid {
1335
1328
  display: grid;
1336
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1329
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1337
1330
  gap: 12px;
1338
- padding: 12px 18px 18px;
1331
+ padding: 12px 16px 16px;
1332
+ align-content: start;
1339
1333
  }
1340
1334
 
1335
+ /* =============================================
1336
+ Worker task cards
1337
+ ============================================= */
1338
+
1341
1339
  .cp-task-card {
1342
1340
  border: 2px solid var(--border);
1343
1341
  border-radius: var(--radius);
@@ -1347,6 +1345,7 @@ textarea {
1347
1345
  flex-direction: column;
1348
1346
  cursor: pointer;
1349
1347
  transition: border-color 0.15s ease;
1348
+ min-height: 360px;
1350
1349
  }
1351
1350
 
1352
1351
  .cp-task-card:hover {
@@ -1372,11 +1371,12 @@ textarea {
1372
1371
  gap: 12px;
1373
1372
  padding: 10px 12px;
1374
1373
  border-bottom: 1px solid var(--border);
1374
+ flex-shrink: 0;
1375
1375
  }
1376
1376
 
1377
1377
  .cp-task-name {
1378
1378
  font-weight: 600;
1379
- font-size: 13px;
1379
+ font-size: 14px;
1380
1380
  }
1381
1381
 
1382
1382
  .cp-task-url {
@@ -1414,7 +1414,7 @@ textarea {
1414
1414
 
1415
1415
  .cp-queue,
1416
1416
  .cp-activity {
1417
- font-size: 10px;
1417
+ font-size: 11px;
1418
1418
  }
1419
1419
 
1420
1420
  .cp-task-actions {
@@ -1425,9 +1425,10 @@ textarea {
1425
1425
 
1426
1426
  .cp-task-error {
1427
1427
  padding: 6px 12px;
1428
- font-size: 11px;
1428
+ font-size: 12px;
1429
1429
  color: var(--err);
1430
1430
  border-bottom: 1px solid var(--border);
1431
+ flex-shrink: 0;
1431
1432
  }
1432
1433
 
1433
1434
  .cp-task-body {
@@ -1435,7 +1436,6 @@ textarea {
1435
1436
  overflow: auto;
1436
1437
  flex: 1;
1437
1438
  min-height: 120px;
1438
- max-height: 320px;
1439
1439
  }
1440
1440
 
1441
1441
  .cp-task-message,
@@ -1449,6 +1449,7 @@ textarea {
1449
1449
  padding: 10px 12px;
1450
1450
  border-top: 1px solid var(--border);
1451
1451
  background: rgba(0, 0, 0, 0.1);
1452
+ flex-shrink: 0;
1452
1453
  }
1453
1454
 
1454
1455
  .cp-task-textarea {
@@ -1461,10 +1462,727 @@ textarea {
1461
1462
  background: rgba(255, 255, 255, 0.03);
1462
1463
  color: var(--text);
1463
1464
  padding: 8px 10px;
1464
- font-size: 12px;
1465
+ font-size: 13px;
1465
1466
  line-height: 1.4;
1466
1467
  }
1467
1468
 
1468
1469
  .cp-task-input .btn {
1469
1470
  align-self: flex-end;
1470
1471
  }
1472
+
1473
+ /* =============================================
1474
+ Endpoint registry Drawer (right side)
1475
+ ============================================= */
1476
+
1477
+ .cp-drawer {
1478
+ position: fixed;
1479
+ top: 0;
1480
+ right: 0;
1481
+ bottom: 0;
1482
+ width: 600px;
1483
+ max-width: 100%;
1484
+ z-index: 100;
1485
+ background: var(--panel-2);
1486
+ border-left: 1px solid var(--border);
1487
+ box-shadow: -4px 0 20px rgba(0, 0, 0, 0.5);
1488
+ transform: translateX(100%);
1489
+ transition: transform 0.2s ease;
1490
+ display: flex;
1491
+ flex-direction: column;
1492
+ }
1493
+
1494
+ .cp-drawer.open {
1495
+ transform: translateX(0);
1496
+ }
1497
+
1498
+ .cp-drawer-backdrop {
1499
+ position: fixed;
1500
+ inset: 0;
1501
+ background: rgba(0, 0, 0, 0.5);
1502
+ z-index: 90;
1503
+ backdrop-filter: blur(2px);
1504
+ }
1505
+
1506
+ .cp-drawer-header {
1507
+ display: flex;
1508
+ align-items: center;
1509
+ justify-content: space-between;
1510
+ gap: 12px;
1511
+ padding: 14px 16px;
1512
+ border-bottom: 1px solid var(--border);
1513
+ position: sticky;
1514
+ top: 0;
1515
+ background: var(--panel-2);
1516
+ z-index: 10;
1517
+ }
1518
+
1519
+ .cp-drawer-header h2 {
1520
+ margin: 0;
1521
+ font-size: 14px;
1522
+ }
1523
+
1524
+ .cp-drawer-toolbar {
1525
+ display: flex;
1526
+ flex-direction: column;
1527
+ gap: 8px;
1528
+ padding: 12px 16px;
1529
+ border-bottom: 1px solid var(--border);
1530
+ }
1531
+
1532
+ .cp-drawer-content {
1533
+ flex: 1;
1534
+ overflow: auto;
1535
+ padding: 12px 16px;
1536
+ }
1537
+
1538
+ /* =============================================
1539
+ Shared form elements
1540
+ ============================================= */
1541
+
1542
+ .cp-input,
1543
+ .cp-select {
1544
+ background: rgba(255, 255, 255, 0.03);
1545
+ border: 1px solid var(--border);
1546
+ color: var(--text);
1547
+ border-radius: var(--radius-sm);
1548
+ padding: 8px 10px;
1549
+ font-size: 13px;
1550
+ width: 100%;
1551
+ }
1552
+
1553
+ .cp-select {
1554
+ min-width: 100px;
1555
+ }
1556
+
1557
+ .cp-content {
1558
+ padding: 12px 16px;
1559
+ overflow: auto;
1560
+ flex: 1;
1561
+ }
1562
+
1563
+ .cp-list {
1564
+ display: flex;
1565
+ flex-direction: column;
1566
+ gap: 10px;
1567
+ }
1568
+
1569
+ .cp-row {
1570
+ display: flex;
1571
+ justify-content: space-between;
1572
+ gap: 12px;
1573
+ padding: 10px 12px;
1574
+ border: 1px solid var(--border);
1575
+ border-radius: var(--radius);
1576
+ background: rgba(255, 255, 255, 0.03);
1577
+ }
1578
+
1579
+ .cp-select-box {
1580
+ display: flex;
1581
+ align-items: flex-start;
1582
+ padding-top: 3px;
1583
+ }
1584
+
1585
+ .cp-select-box input {
1586
+ width: 15px;
1587
+ height: 15px;
1588
+ }
1589
+
1590
+ .cp-row-main {
1591
+ flex: 1;
1592
+ min-width: 0;
1593
+ }
1594
+
1595
+ .cp-row-title {
1596
+ display: flex;
1597
+ flex-direction: column;
1598
+ gap: 3px;
1599
+ }
1600
+
1601
+ .cp-name {
1602
+ font-weight: 600;
1603
+ font-size: 13px;
1604
+ }
1605
+
1606
+ .cp-url {
1607
+ font-family: var(--mono);
1608
+ font-size: 11px;
1609
+ color: var(--muted);
1610
+ word-break: break-all;
1611
+ }
1612
+
1613
+ .cp-row-meta {
1614
+ display: flex;
1615
+ align-items: center;
1616
+ gap: 10px;
1617
+ flex-wrap: wrap;
1618
+ margin-top: 6px;
1619
+ }
1620
+
1621
+ .cp-tags {
1622
+ display: flex;
1623
+ gap: 6px;
1624
+ flex-wrap: wrap;
1625
+ }
1626
+
1627
+ .cp-tag {
1628
+ padding: 2px 6px;
1629
+ border: 1px solid var(--border);
1630
+ border-radius: 6px;
1631
+ font-size: 11px;
1632
+ color: var(--muted);
1633
+ }
1634
+
1635
+ .cp-tag.muted {
1636
+ opacity: 0.6;
1637
+ }
1638
+
1639
+ .cp-actions {
1640
+ display: flex;
1641
+ gap: 6px;
1642
+ align-items: center;
1643
+ }
1644
+
1645
+ .cp-health {
1646
+ font-size: 11px;
1647
+ padding: 2px 6px;
1648
+ border-radius: 6px;
1649
+ border: 1px solid var(--border);
1650
+ color: var(--muted);
1651
+ }
1652
+
1653
+ .cp-health.ok {
1654
+ color: var(--ok);
1655
+ border-color: rgba(158, 206, 106, 0.4);
1656
+ }
1657
+
1658
+ .cp-health.err {
1659
+ color: var(--err);
1660
+ border-color: rgba(247, 118, 142, 0.4);
1661
+ }
1662
+
1663
+ .cp-health.pending {
1664
+ color: var(--muted);
1665
+ }
1666
+
1667
+ .cp-health-ms {
1668
+ margin-left: 6px;
1669
+ color: var(--muted);
1670
+ font-size: 11px;
1671
+ }
1672
+
1673
+ .cp-pagination {
1674
+ display: flex;
1675
+ align-items: center;
1676
+ justify-content: space-between;
1677
+ gap: 10px;
1678
+ padding: 10px 16px;
1679
+ border-top: 1px solid var(--border);
1680
+ }
1681
+
1682
+ .cp-page-info,
1683
+ .cp-page-number {
1684
+ font-size: 12px;
1685
+ color: var(--muted);
1686
+ }
1687
+
1688
+ .cp-page-controls {
1689
+ display: flex;
1690
+ align-items: center;
1691
+ gap: 8px;
1692
+ }
1693
+
1694
+ .cp-modal-body {
1695
+ display: flex;
1696
+ flex-direction: column;
1697
+ gap: 10px;
1698
+ padding: 12px;
1699
+ }
1700
+
1701
+ .cp-label {
1702
+ display: flex;
1703
+ flex-direction: column;
1704
+ gap: 6px;
1705
+ font-size: 13px;
1706
+ color: var(--muted);
1707
+ }
1708
+
1709
+ .cp-modal-actions {
1710
+ display: flex;
1711
+ gap: 8px;
1712
+ }
1713
+
1714
+ .cp-error {
1715
+ color: var(--err);
1716
+ font-size: 13px;
1717
+ margin-top: 6px;
1718
+ }
1719
+
1720
+ .cp-loading,
1721
+ .cp-empty {
1722
+ color: var(--muted);
1723
+ font-size: 13px;
1724
+ padding: 10px 0;
1725
+ }
1726
+
1727
+ /* =============================================
1728
+ Mobile — Worker compact list card
1729
+ ============================================= */
1730
+
1731
+ .cp-task-card-compact {
1732
+ display: flex;
1733
+ align-items: center;
1734
+ gap: 10px;
1735
+ padding: 12px 14px;
1736
+ border: 1px solid var(--border);
1737
+ border-radius: var(--radius);
1738
+ background: rgba(255, 255, 255, 0.02);
1739
+ cursor: pointer;
1740
+ transition: background 0.12s;
1741
+ -webkit-tap-highlight-color: transparent;
1742
+ }
1743
+
1744
+ .cp-task-card-compact:active {
1745
+ background: rgba(255, 255, 255, 0.05);
1746
+ }
1747
+
1748
+ .cp-task-card-compact.error {
1749
+ border-color: rgba(247, 118, 142, 0.35);
1750
+ }
1751
+
1752
+ .cp-task-card-compact input[type='checkbox'] {
1753
+ width: 18px;
1754
+ height: 18px;
1755
+ flex-shrink: 0;
1756
+ cursor: pointer;
1757
+ }
1758
+
1759
+ .cp-task-card-compact-body {
1760
+ flex: 1;
1761
+ min-width: 0;
1762
+ }
1763
+
1764
+ .cp-task-card-compact-top {
1765
+ display: flex;
1766
+ align-items: center;
1767
+ gap: 8px;
1768
+ margin-bottom: 4px;
1769
+ }
1770
+
1771
+ .cp-task-card-compact-name {
1772
+ font-size: 14px;
1773
+ font-weight: 600;
1774
+ flex: 1;
1775
+ min-width: 0;
1776
+ overflow: hidden;
1777
+ text-overflow: ellipsis;
1778
+ white-space: nowrap;
1779
+ }
1780
+
1781
+ .cp-task-card-compact-meta {
1782
+ font-size: 11px;
1783
+ color: var(--muted);
1784
+ display: flex;
1785
+ gap: 8px;
1786
+ }
1787
+
1788
+ .cp-task-card-compact-preview {
1789
+ font-size: 12px;
1790
+ color: var(--muted);
1791
+ overflow: hidden;
1792
+ text-overflow: ellipsis;
1793
+ white-space: nowrap;
1794
+ }
1795
+
1796
+ .cp-task-card-compact-chevron {
1797
+ color: var(--muted);
1798
+ flex-shrink: 0;
1799
+ font-size: 16px;
1800
+ opacity: 0.5;
1801
+ }
1802
+
1803
+ /* =============================================
1804
+ Mobile — Detail view
1805
+ ============================================= */
1806
+
1807
+ .cp-mobile-detail {
1808
+ display: flex;
1809
+ flex-direction: column;
1810
+ flex: 1;
1811
+ min-height: 0;
1812
+ overflow: hidden;
1813
+ }
1814
+
1815
+ .cp-mobile-header-title {
1816
+ font-size: 16px;
1817
+ font-weight: 700;
1818
+ margin: 0;
1819
+ }
1820
+
1821
+ .cp-mobile-back-btn {
1822
+ display: flex;
1823
+ align-items: center;
1824
+ gap: 4px;
1825
+ background: none;
1826
+ border: none;
1827
+ color: var(--accent);
1828
+ font-size: 15px;
1829
+ cursor: pointer;
1830
+ padding: 4px 0;
1831
+ flex-shrink: 0;
1832
+ }
1833
+
1834
+ .cp-mobile-detail-title {
1835
+ font-size: 15px;
1836
+ font-weight: 600;
1837
+ overflow: hidden;
1838
+ text-overflow: ellipsis;
1839
+ white-space: nowrap;
1840
+ }
1841
+
1842
+ .cp-mobile-detail-feed {
1843
+ flex: 1;
1844
+ overflow: auto;
1845
+ padding: 10px 14px;
1846
+ min-height: 0;
1847
+ }
1848
+
1849
+ .cp-mobile-detail-input {
1850
+ display: flex;
1851
+ gap: 8px;
1852
+ padding: 10px 14px;
1853
+ border-top: 1px solid var(--border);
1854
+ background: rgba(0, 0, 0, 0.1);
1855
+ flex-shrink: 0;
1856
+ }
1857
+
1858
+ .cp-mobile-detail-textarea {
1859
+ flex: 1;
1860
+ min-height: 44px;
1861
+ max-height: 120px;
1862
+ resize: none;
1863
+ border: 1px solid var(--border);
1864
+ border-radius: var(--radius-sm);
1865
+ background: rgba(255, 255, 255, 0.03);
1866
+ color: var(--text);
1867
+ padding: 10px 12px;
1868
+ font-size: 14px;
1869
+ line-height: 1.4;
1870
+ }
1871
+
1872
+ .cp-mobile-detail-send {
1873
+ align-self: flex-end;
1874
+ min-height: 44px;
1875
+ padding: 0 18px;
1876
+ }
1877
+
1878
+ /* =============================================
1879
+ Mobile — Bottom Tab Bar
1880
+ ============================================= */
1881
+
1882
+ .cp-mobile-tab-bar {
1883
+ display: none;
1884
+ flex-shrink: 0;
1885
+ border-top: 1px solid var(--border);
1886
+ background: var(--panel-2);
1887
+ padding-bottom: env(safe-area-inset-bottom, 0px);
1888
+ }
1889
+
1890
+ .cp-mobile-tab {
1891
+ flex: 1;
1892
+ display: flex;
1893
+ flex-direction: column;
1894
+ align-items: center;
1895
+ justify-content: center;
1896
+ gap: 4px;
1897
+ padding: 10px 4px;
1898
+ background: none;
1899
+ border: none;
1900
+ color: var(--muted);
1901
+ font-size: 11px;
1902
+ cursor: pointer;
1903
+ position: relative;
1904
+ -webkit-tap-highlight-color: transparent;
1905
+ transition: color 0.12s;
1906
+ }
1907
+
1908
+ .cp-mobile-tab.active {
1909
+ color: var(--accent);
1910
+ }
1911
+
1912
+ .cp-mobile-tab svg {
1913
+ flex-shrink: 0;
1914
+ }
1915
+
1916
+ .cp-mobile-tab-broadcast {
1917
+ color: var(--muted);
1918
+ }
1919
+
1920
+ .cp-mobile-tab-badge {
1921
+ position: absolute;
1922
+ top: 6px;
1923
+ right: calc(50% - 18px);
1924
+ background: var(--accent);
1925
+ color: #0f111a;
1926
+ font-size: 10px;
1927
+ font-weight: 700;
1928
+ border-radius: 999px;
1929
+ padding: 1px 5px;
1930
+ min-width: 16px;
1931
+ text-align: center;
1932
+ line-height: 1.4;
1933
+ }
1934
+
1935
+ /* =============================================
1936
+ Mobile — Broadcast tab (inline, full height)
1937
+ ============================================= */
1938
+
1939
+ .cp-mobile-broadcast-tab {
1940
+ flex: 1;
1941
+ display: flex;
1942
+ flex-direction: column;
1943
+ overflow: hidden;
1944
+ min-height: 0;
1945
+ }
1946
+
1947
+ .cp-broadcast-sheet-nodes {
1948
+ border-bottom: 1px solid var(--border);
1949
+ overflow: hidden;
1950
+ flex: 1;
1951
+ display: flex;
1952
+ flex-direction: column;
1953
+ min-height: 0;
1954
+ }
1955
+
1956
+ .cp-broadcast-sheet-nodes-header {
1957
+ display: flex;
1958
+ align-items: center;
1959
+ justify-content: space-between;
1960
+ gap: 8px;
1961
+ padding: 10px 16px;
1962
+ border-bottom: 1px solid var(--border);
1963
+ background: rgba(255, 255, 255, 0.02);
1964
+ flex-shrink: 0;
1965
+ }
1966
+
1967
+ .cp-broadcast-sheet-subtitle {
1968
+ font-size: 13px;
1969
+ color: var(--muted);
1970
+ }
1971
+
1972
+ .cp-broadcast-sheet-node-list {
1973
+ overflow-y: auto;
1974
+ flex: 1;
1975
+ }
1976
+
1977
+ .cp-broadcast-sheet-node-item {
1978
+ display: flex;
1979
+ align-items: flex-start;
1980
+ gap: 12px;
1981
+ padding: 12px 16px;
1982
+ cursor: pointer;
1983
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
1984
+ -webkit-tap-highlight-color: transparent;
1985
+ }
1986
+
1987
+ .cp-broadcast-sheet-node-item:active {
1988
+ background: rgba(255, 255, 255, 0.04);
1989
+ }
1990
+
1991
+ .cp-broadcast-sheet-node-item:last-child {
1992
+ border-bottom: none;
1993
+ }
1994
+
1995
+ .cp-broadcast-sheet-node-item input[type='checkbox'] {
1996
+ width: 18px;
1997
+ height: 18px;
1998
+ flex-shrink: 0;
1999
+ margin-top: 2px;
2000
+ cursor: pointer;
2001
+ }
2002
+
2003
+ .cp-broadcast-sheet-node-info {
2004
+ display: flex;
2005
+ flex-direction: column;
2006
+ gap: 3px;
2007
+ min-width: 0;
2008
+ }
2009
+
2010
+ .cp-broadcast-sheet-node-name {
2011
+ font-size: 14px;
2012
+ font-weight: 500;
2013
+ word-break: break-word;
2014
+ line-height: 1.4;
2015
+ }
2016
+
2017
+ .cp-broadcast-sheet-node-url {
2018
+ font-family: var(--mono);
2019
+ font-size: 12px;
2020
+ color: var(--muted);
2021
+ word-break: break-all;
2022
+ }
2023
+
2024
+ .cp-broadcast-sheet-compose {
2025
+ padding: 12px 16px;
2026
+ border-top: 1px solid var(--border);
2027
+ display: flex;
2028
+ flex-direction: column;
2029
+ gap: 10px;
2030
+ flex-shrink: 0;
2031
+ padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
2032
+ }
2033
+
2034
+ .cp-broadcast-sheet-textarea {
2035
+ width: 100%;
2036
+ min-height: 80px;
2037
+ max-height: 160px;
2038
+ resize: none;
2039
+ border: 1px solid var(--border);
2040
+ border-radius: var(--radius-sm);
2041
+ background: rgba(255, 255, 255, 0.03);
2042
+ color: var(--text);
2043
+ padding: 10px 12px;
2044
+ font-size: 14px;
2045
+ line-height: 1.4;
2046
+ }
2047
+
2048
+ .cp-broadcast-sheet-footer {
2049
+ display: flex;
2050
+ gap: 10px;
2051
+ }
2052
+
2053
+ .cp-broadcast-sheet-footer .btn {
2054
+ flex: 1;
2055
+ min-height: 44px;
2056
+ font-size: 14px;
2057
+ }
2058
+
2059
+ /* =============================================
2060
+ Mobile — Worker list view
2061
+ ============================================= */
2062
+
2063
+ .cp-mobile-list {
2064
+ flex: 1;
2065
+ overflow-y: auto;
2066
+ padding: 10px 12px;
2067
+ display: flex;
2068
+ flex-direction: column;
2069
+ gap: 8px;
2070
+ }
2071
+
2072
+ /* =============================================
2073
+ Mobile — Endpoints tab
2074
+ ============================================= */
2075
+
2076
+ .cp-mobile-endpoints-tab {
2077
+ flex: 1;
2078
+ display: flex;
2079
+ flex-direction: column;
2080
+ overflow: hidden;
2081
+ min-height: 0;
2082
+ }
2083
+
2084
+ .cp-mobile-endpoints-toolbar {
2085
+ padding: 10px 14px;
2086
+ border-bottom: 1px solid var(--border);
2087
+ flex-shrink: 0;
2088
+ }
2089
+
2090
+ /* =============================================
2091
+ Responsive breakpoints
2092
+ ============================================= */
2093
+
2094
+ /* Desktop: sidebar + broadcast modal, no mobile elements */
2095
+ @media (min-width: 769px) {
2096
+ .cp-sidebar {
2097
+ display: flex;
2098
+ }
2099
+ .cp-header-mobile,
2100
+ .cp-mobile-list,
2101
+ .cp-mobile-detail,
2102
+ .cp-mobile-tab-bar,
2103
+ .cp-mobile-endpoints-tab,
2104
+ .cp-mobile-broadcast-tab {
2105
+ display: none !important;
2106
+ }
2107
+ .cp-header-pc {
2108
+ display: flex;
2109
+ }
2110
+ }
2111
+
2112
+ /* Mobile: bottom tabs, no sidebar */
2113
+ @media (max-width: 768px) {
2114
+ .app {
2115
+ padding: 0;
2116
+ }
2117
+
2118
+ .cp-header-pc {
2119
+ display: none !important;
2120
+ }
2121
+
2122
+ .cp-header-mobile {
2123
+ display: flex;
2124
+ }
2125
+
2126
+ .cp-sidebar {
2127
+ display: none;
2128
+ }
2129
+
2130
+ .cp-main {
2131
+ display: none;
2132
+ }
2133
+
2134
+ .cp-mobile-tab-bar {
2135
+ display: flex;
2136
+ }
2137
+
2138
+ /* Body fills between header and tab bar */
2139
+ .cp-body {
2140
+ flex: 1;
2141
+ min-height: 0;
2142
+ overflow: hidden;
2143
+ position: relative;
2144
+ }
2145
+
2146
+ /* Drawer goes full screen on mobile */
2147
+ .cp-drawer {
2148
+ inset: 0;
2149
+ width: 100%;
2150
+ max-width: none;
2151
+ border-radius: 0;
2152
+ border: none;
2153
+ }
2154
+ .cp-drawer.open {
2155
+ width: 100%;
2156
+ }
2157
+
2158
+ /* Endpoint list rows stack vertically */
2159
+ .cp-row {
2160
+ flex-direction: column;
2161
+ gap: 8px;
2162
+ }
2163
+ .cp-actions {
2164
+ margin-top: 0;
2165
+ justify-content: flex-start;
2166
+ flex-wrap: wrap;
2167
+ gap: 8px;
2168
+ }
2169
+ .cp-actions .btn {
2170
+ min-height: 40px;
2171
+ flex: 1;
2172
+ }
2173
+
2174
+ .cp-input,
2175
+ .cp-select {
2176
+ min-height: 40px;
2177
+ font-size: 14px;
2178
+ }
2179
+
2180
+ .btn {
2181
+ min-height: 38px;
2182
+ }
2183
+
2184
+ /* Broadcast modal hidden on mobile (use sheet instead) */
2185
+ .cp-broadcast-modal-backdrop {
2186
+ display: none !important;
2187
+ }
2188
+ }