@codemem/server 0.46.0-alpha.1 → 0.46.0-beta.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.
package/static/index.html CHANGED
@@ -110,7 +110,7 @@
110
110
  align-items: center;
111
111
  gap: var(--sp-3);
112
112
  min-width: 0;
113
- overflow: hidden;
113
+ overflow: visible;
114
114
  }
115
115
 
116
116
  .logo {
@@ -774,6 +774,10 @@
774
774
  — quieter than any real button nearby, since it's navigation,
775
775
  not action. */
776
776
  .sync-subview-link {
777
+ background: none;
778
+ border: 0;
779
+ cursor: pointer;
780
+ font-family: inherit;
777
781
  display: inline-flex;
778
782
  align-items: center;
779
783
  gap: 4px;
@@ -832,6 +836,10 @@
832
836
  stroke: var(--accent);
833
837
  opacity: 0.6;
834
838
  }
839
+ .health-icon-slot {
840
+ display: flex;
841
+ flex-shrink: 0;
842
+ }
835
843
 
836
844
  .stat-content {
837
845
  display: flex;
@@ -883,13 +891,80 @@
883
891
  line-height: 1.5;
884
892
  }
885
893
 
886
- .health-primary {
887
- border-width: 2px;
894
+ .has-tooltip { cursor: help; }
895
+ .health-loading-icon {
896
+ animation: viewerLoadingSpin var(--duration-attention) linear infinite;
888
897
  }
889
- .health-primary .value { font-size: var(--font-size-3xl); letter-spacing: 0.2px; }
890
- .health-primary.status-healthy .value { color: var(--status-healthy); }
891
- .health-primary.status-degraded .value { color: var(--status-degraded); }
892
- .health-primary.status-attention .value { color: var(--status-attention); }
898
+
899
+ .health-system-card {
900
+ display: flex;
901
+ flex-direction: column;
902
+ gap: var(--sp-4);
903
+ }
904
+ .health-system-header {
905
+ display: flex;
906
+ flex-wrap: wrap;
907
+ align-items: center;
908
+ justify-content: space-between;
909
+ gap: var(--sp-4);
910
+ }
911
+ .health-status-summary {
912
+ display: flex;
913
+ align-items: center;
914
+ gap: var(--sp-3);
915
+ min-width: 0;
916
+ }
917
+ .health-status-copy {
918
+ display: flex;
919
+ flex-direction: column;
920
+ gap: 2px;
921
+ min-width: 0;
922
+ }
923
+ .health-status-word {
924
+ font-size: var(--font-size-3xl);
925
+ font-weight: var(--font-weight-semibold);
926
+ line-height: 1.15;
927
+ }
928
+ .health-status-word.status-healthy { color: var(--status-healthy); }
929
+ .health-status-word.status-degraded { color: var(--status-degraded); }
930
+ .health-status-word.status-attention { color: var(--status-attention); }
931
+ .health-status-word.status-unknown { color: var(--text-tertiary); }
932
+ .health-status-copy .section-meta { margin: 0; }
933
+ .health-status-meta {
934
+ display: flex;
935
+ align-items: center;
936
+ flex-wrap: wrap;
937
+ gap: var(--sp-2);
938
+ }
939
+ .health-tile-grid {
940
+ display: grid;
941
+ grid-template-columns: repeat(4, minmax(0, 1fr));
942
+ gap: var(--sp-3);
943
+ }
944
+ .health-tile {
945
+ display: flex;
946
+ flex-direction: column;
947
+ gap: var(--sp-1);
948
+ min-width: 0;
949
+ padding: var(--sp-3) var(--sp-4);
950
+ border-radius: var(--radius-sm);
951
+ background: var(--surface-2);
952
+ }
953
+ .health-tile-label {
954
+ color: var(--text-tertiary);
955
+ font-size: var(--font-size-2xs);
956
+ letter-spacing: 0.06em;
957
+ text-transform: uppercase;
958
+ }
959
+ .health-tile-value {
960
+ display: inline-flex;
961
+ align-items: center;
962
+ gap: 6px;
963
+ min-width: 0;
964
+ color: var(--text-secondary);
965
+ font-size: var(--font-size-md);
966
+ }
967
+ .health-maintenance-grid { margin-top: var(--sp-3); }
893
968
 
894
969
  /* ── Buttons ───────────────────────────────────────────── */
895
970
 
@@ -1159,16 +1234,10 @@
1159
1234
  font-family: var(--font-sans);
1160
1235
  font-size: var(--font-size-md);
1161
1236
  }
1162
- .project-inventory-list {
1163
- display: grid;
1164
- gap: var(--sp-3);
1165
- margin-top: var(--sp-4);
1166
- }
1167
- .project-inventory-skeleton {
1168
- display: grid;
1169
- gap: var(--sp-3);
1170
- margin-top: var(--sp-4);
1171
- }
1237
+ .projects-toolbar #projectsStatusFilter { flex: 0 1 220px; min-width: 0; }
1238
+ #projectsInventoryMeta { color: var(--text-tertiary); white-space: nowrap; }
1239
+ .project-inventory-list { margin-top: var(--sp-3); min-width: 0; }
1240
+ .project-inventory-skeleton { display: grid; gap: var(--sp-3); margin-top: var(--sp-4); }
1172
1241
  .project-inventory-skeleton-row {
1173
1242
  padding: var(--sp-4);
1174
1243
  border: 1px solid var(--border);
@@ -1186,93 +1255,169 @@
1186
1255
  .project-inventory-skeleton-line.title { width: 42%; height: 16px; }
1187
1256
  .project-inventory-skeleton-line.meta { width: 68%; }
1188
1257
  .project-inventory-skeleton-line.signal { width: 86%; }
1189
- .project-inventory-row {
1190
- padding: var(--sp-4);
1258
+ .project-inventory-table {
1259
+ display: block;
1260
+ width: 100%;
1261
+ min-width: 0;
1262
+ overflow: visible;
1263
+ border-spacing: 0;
1191
1264
  border: 1px solid var(--border);
1192
1265
  border-radius: var(--radius-md);
1193
- background: var(--surface-1);
1194
1266
  }
1195
- .project-inventory-row-header {
1196
- display: flex;
1197
- justify-content: space-between;
1198
- gap: var(--sp-3);
1199
- align-items: flex-start;
1267
+ .project-inventory-table > thead,
1268
+ .project-inventory-table > tbody { display: block; width: 100%; }
1269
+ .project-inventory-table th,
1270
+ .project-inventory-table td { padding: 0; text-align: left; font-weight: inherit; }
1271
+ .project-inventory-table-row {
1272
+ display: grid;
1273
+ grid-template-columns: 28px minmax(0, 1fr) 72px 72px 120px minmax(0, 130px) 180px;
1274
+ align-items: center;
1275
+ column-gap: var(--sp-3);
1276
+ min-width: 0;
1200
1277
  }
1201
- .project-inventory-title { font-size: var(--font-size-lg); font-weight: 650; color: var(--text-primary); }
1202
- .project-inventory-domain { font-family: var(--font-mono); font-size: var(--font-size-sm); color: var(--accent); }
1203
- .project-inventory-meta, .project-inventory-signal {
1204
- margin-top: var(--sp-2);
1205
- color: var(--text-secondary);
1206
- font-size: var(--font-size-sm);
1278
+ .project-inventory-table-header {
1279
+ padding: var(--sp-2) var(--sp-4);
1280
+ background: var(--surface-2);
1281
+ color: var(--text-tertiary);
1282
+ font-size: var(--font-size-2xs);
1283
+ font-weight: var(--font-weight-medium);
1284
+ letter-spacing: 0.06em;
1285
+ text-transform: uppercase;
1207
1286
  }
1208
- .project-inventory-signal { overflow-wrap: anywhere; }
1209
- .project-inventory-badges {
1287
+ .project-inventory-row-header {
1288
+ min-width: 0;
1289
+ border-top: 1px solid var(--border);
1290
+ background: var(--surface-1);
1291
+ }
1292
+ .project-inventory-row-header { padding: var(--sp-3) var(--sp-4); }
1293
+ .project-inventory-row-stats { display: contents; }
1294
+ .project-inventory-cell { min-width: 0; }
1295
+ .project-inventory-project-cell { display: flex; flex-direction: column; gap: var(--sp-1); }
1296
+ .project-inventory-title { overflow-wrap: anywhere; color: var(--text-primary); font-size: var(--font-size-md); font-weight: var(--font-weight-semibold); }
1297
+ .project-inventory-signal { overflow: hidden; color: var(--text-tertiary); font-size: var(--font-size-xs); text-overflow: ellipsis; white-space: nowrap; }
1298
+ .project-inventory-number { font-variant-numeric: tabular-nums; }
1299
+ .project-inventory-latest { color: var(--text-secondary); }
1300
+ .project-inventory-badges { display: flex; flex-wrap: wrap; gap: var(--sp-1); }
1301
+ .project-inventory-badges:empty { display: none; }
1302
+ .project-inventory-row-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--sp-2); }
1303
+ .project-inventory-row-actions .settings-button { min-width: 0; max-width: 100%; white-space: normal; overflow-wrap: anywhere; }
1304
+ .project-row-menu { position: relative; flex: 0 0 auto; }
1305
+ .project-row-menu-panel { position: absolute; top: calc(100% + var(--sp-1)); right: 0; }
1306
+ button.feed-menu-item { border: 0; background: transparent; font-family: inherit; text-align: left; }
1307
+ button.feed-menu-item:hover,
1308
+ button.feed-menu-item:focus-visible { background: var(--surface-2); }
1309
+ button.feed-menu-item:disabled { color: var(--text-tertiary); cursor: default; }
1310
+ .project-inventory-details { background: var(--surface-2); }
1311
+ .project-inventory-details-row,
1312
+ .project-inventory-details-cell { display: block; min-width: 0; }
1313
+ .project-inventory-details > summary {
1210
1314
  display: flex;
1211
- flex-wrap: wrap;
1315
+ align-items: center;
1212
1316
  gap: var(--sp-2);
1213
- margin-top: var(--sp-3);
1214
- }
1215
- .project-status-badge {
1216
- padding: 2px 8px;
1217
- border-radius: var(--radius-pill);
1218
- background: var(--surface-2);
1317
+ padding: var(--sp-3) var(--sp-4) var(--sp-3) 44px;
1318
+ cursor: pointer;
1219
1319
  color: var(--text-secondary);
1220
- font-size: var(--font-size-xs);
1221
- border: 1px solid var(--border);
1320
+ font-size: var(--font-size-sm);
1222
1321
  }
1223
- .project-status-badge.needs_attention,
1224
- .project-status-badge.legacy_review { color: var(--accent-warm); background: var(--accent-warm-subtle); }
1225
- .project-status-badge.suggested { color: var(--accent); background: var(--accent-subtle); }
1226
- .project-inventory-details { margin-top: var(--sp-3); }
1227
- .project-inventory-details summary { cursor: pointer; color: var(--text-secondary); font-size: var(--font-size-sm); }
1322
+ .project-inventory-details-body { padding: 0 var(--sp-4) var(--sp-4) 44px; }
1323
+ .project-inventory-domain { color: var(--accent); font-family: var(--font-mono); font-size: var(--font-size-sm); }
1324
+ .project-inventory-meta { margin-top: var(--sp-2); color: var(--text-secondary); font-size: var(--font-size-sm); }
1228
1325
  .project-detail-grid {
1229
1326
  display: grid;
1230
- grid-template-columns: minmax(130px, max-content) 1fr;
1231
- gap: var(--sp-2) var(--sp-3);
1327
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1328
+ gap: var(--sp-2) var(--sp-4);
1232
1329
  margin-top: var(--sp-3);
1233
1330
  font-size: var(--font-size-sm);
1234
1331
  }
1332
+ .project-detail-pair { display: grid; grid-template-columns: minmax(130px, max-content) minmax(0, 1fr); gap: var(--sp-3); }
1235
1333
  .project-detail-grid dt { color: var(--text-tertiary); }
1236
1334
  .project-detail-grid dd { margin: 0; overflow-wrap: anywhere; color: var(--text-primary); }
1237
- .project-inventory-actions {
1238
- display: flex;
1239
- align-items: center;
1240
- flex-wrap: wrap;
1241
- gap: var(--sp-2);
1242
- margin-top: var(--sp-4);
1243
- }
1335
+ .project-inventory-actions { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2); margin-top: var(--sp-4); }
1244
1336
  .project-domain-select {
1245
1337
  min-width: min(100%, 260px);
1246
1338
  padding: var(--sp-2) var(--sp-3);
1247
- border-radius: var(--radius-sm);
1248
1339
  border: 1px solid var(--border);
1340
+ border-radius: var(--radius-sm);
1249
1341
  background: var(--input-bg);
1250
1342
  color: var(--text-primary);
1251
1343
  font-family: var(--font-sans);
1252
1344
  font-size: var(--font-size-md);
1253
1345
  }
1254
- .project-guardrail-confirmation {
1255
- flex-basis: 100%;
1256
- margin-top: var(--sp-2);
1257
- }
1346
+ .project-guardrail-confirmation { flex-basis: 100%; margin-top: var(--sp-2); }
1258
1347
  .projects-pagination { margin-top: var(--sp-4); }
1348
+ .project-selection-control { display: inline-flex; align-items: center; justify-content: center; min-width: 24px; min-height: 24px; cursor: pointer; }
1349
+ .project-selection-checkbox { width: 18px; height: 18px; }
1350
+ .project-recipient-summary { min-width: 0; }
1351
+ .project-recipient-status { color: var(--text-secondary); font-size: var(--font-size-sm); }
1352
+ .project-recipient-chips { display: flex; flex-wrap: wrap; gap: var(--sp-1); padding: 0; margin: 0; list-style: none; }
1353
+ .project-recipient-chip { overflow: hidden; padding: 2px var(--sp-2); border: 1px solid var(--border); border-radius: var(--radius-pill); background: var(--surface-2); color: var(--text-primary); font-size: var(--font-size-2xs); text-overflow: ellipsis; white-space: nowrap; }
1354
+ .project-inventory-child-row { padding-left: var(--sp-5); }
1355
+ .project-inventory-cluster + .project-inventory-child .project-inventory-child-row { border-top: 1px solid var(--border); }
1259
1356
  .recipient-policy-review-section + .recipient-policy-review-section { margin-top: var(--sp-5); }
1260
1357
  .recipient-policy-review-heading { margin-bottom: var(--sp-2); }
1261
- .recipient-policy-review-status:empty { display: none; }
1262
- .recipient-policy-review-list { margin-top: var(--sp-3); }
1263
1358
  .recipient-policy-review-item .project-inventory-actions label {
1264
1359
  color: var(--text-secondary);
1265
1360
  font-size: var(--font-size-sm);
1266
1361
  font-weight: var(--font-weight-semibold);
1267
1362
  }
1268
- .recipient-policy-review-select { min-width: min(100%, 280px); }
1269
- .recipient-policy-deferred { margin-top: var(--sp-3); }
1270
- .recipient-policy-preview { margin-top: var(--sp-3); }
1363
+ .recipient-policy-review-header {
1364
+ display: flex;
1365
+ align-items: baseline;
1366
+ justify-content: space-between;
1367
+ gap: var(--sp-4);
1368
+ }
1369
+ }
1370
+ .recipient-policy-review-count {
1371
+ color: var(--text-tertiary);
1372
+ font-weight: var(--font-weight-regular);
1373
+ }
1374
+ .recipient-policy-review-status:empty { display: none; }
1375
+ .recipient-policy-review-list {
1376
+ margin-top: var(--sp-3);
1377
+ overflow: hidden;
1378
+ border: 1px solid var(--border);
1379
+ border-radius: var(--radius-md);
1380
+ }
1381
+ .recipient-policy-review-item {
1382
+ display: grid;
1383
+ grid-template-columns: minmax(0, 1fr) 260px auto;
1384
+ align-items: center;
1385
+ column-gap: var(--sp-4);
1386
+ padding: var(--sp-3) var(--sp-4);
1387
+ background: var(--surface-1);
1388
+ }
1389
+ .recipient-policy-review-item + .recipient-policy-review-item { border-top: 1px solid var(--border); }
1390
+ .recipient-policy-review-name,
1391
+ .recipient-policy-review-actions {
1392
+ display: flex;
1393
+ align-items: center;
1394
+ flex-wrap: wrap;
1395
+ gap: var(--sp-2);
1396
+ }
1397
+ .recipient-policy-review-name > strong { font-size: var(--font-size-lg); }
1398
+ .recipient-policy-review-identity { color: var(--text-tertiary); overflow-wrap: anywhere; }
1399
+ .recipient-policy-review-meta {
1400
+ color: var(--text-secondary);
1401
+ margin-top: var(--sp-1);
1402
+ }
1403
+ .recipient-policy-review-meta .badge { margin-left: var(--sp-2); }
1404
+ .recipient-policy-review-select { min-width: 0; width: 100%; }
1405
+ .recipient-policy-review-details {
1406
+ grid-column: 1 / -1;
1407
+ padding: var(--sp-3) 0 var(--sp-1);
1408
+ }
1409
+ .recipient-policy-deferred,
1410
+ .recipient-policy-preview { margin-top: var(--sp-2); }
1271
1411
  .recipient-policy-preview-list { margin-top: var(--sp-2); }
1272
1412
  .recipient-policy-preview-list ul {
1273
1413
  margin-top: var(--sp-1);
1274
1414
  padding-left: var(--sp-5);
1275
1415
  }
1416
+ .recipient-policy-review-section { margin-top: var(--sp-5); }
1417
+ @media (max-width: 900px) {
1418
+ .recipient-policy-review-item { grid-template-columns: minmax(0, 1fr); row-gap: var(--sp-3); }
1419
+ .recipient-policy-review-details { grid-column: 1; }
1420
+ }
1276
1421
  .project-selection-actions,
1277
1422
  .recipient-policy-management-actions,
1278
1423
  .recipient-policy-sharing-actions {
@@ -1540,6 +1685,16 @@
1540
1685
  .recipient-policy-management-details li { overflow-wrap: anywhere; }
1541
1686
  .recipient-policy-management-status:empty { display: none; }
1542
1687
  .recipient-policy-sharing-header { margin-bottom: var(--sp-4); }
1688
+ .sharing-member-preview {
1689
+ overflow-wrap: anywhere;
1690
+ }
1691
+ .sharing-member-names .sharing-member-preview {
1692
+ display: -webkit-box;
1693
+ -webkit-box-orient: vertical;
1694
+ -webkit-line-clamp: 2;
1695
+ overflow: hidden;
1696
+ }
1697
+ .sharing-member-names p { overflow-wrap: anywhere; }
1543
1698
  .recipient-policy-sharing-tabs {
1544
1699
  position: static;
1545
1700
  display: flex;
@@ -1567,6 +1722,89 @@
1567
1722
  gap: var(--sp-3);
1568
1723
  }
1569
1724
  .recipient-policy-sharing-card-title h3 { margin: 0; }
1725
+ .recipient-policy-sharing-card-header {
1726
+ display: flex;
1727
+ align-items: flex-start;
1728
+ justify-content: space-between;
1729
+ gap: var(--sp-4);
1730
+ }
1731
+ .recipient-policy-sharing-card-title { justify-content: flex-start; flex-wrap: wrap; }
1732
+ .recipient-policy-sharing-card-actions,
1733
+ .recipient-policy-sharing-card-actions .recipient-policy-sharing-actions {
1734
+ display: flex;
1735
+ align-items: center;
1736
+ justify-content: flex-end;
1737
+ gap: var(--sp-2);
1738
+ flex-wrap: wrap;
1739
+ }
1740
+ .recipient-policy-sharing-card-actions .settings-button { margin-top: 0; }
1741
+ .recipient-policy-sharing-stats {
1742
+ display: grid;
1743
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1744
+ gap: var(--sp-2);
1745
+ margin-top: var(--sp-4);
1746
+ }
1747
+ .recipient-policy-sharing-stats > div {
1748
+ display: grid;
1749
+ gap: var(--sp-1);
1750
+ min-width: 0;
1751
+ padding: var(--sp-3);
1752
+ border-radius: var(--radius-sm);
1753
+ background: var(--surface-2);
1754
+ }
1755
+ .recipient-policy-sharing-stats strong { font-size: var(--font-size-lg); }
1756
+ .recipient-policy-sharing-stats span { color: var(--text-secondary); overflow-wrap: anywhere; }
1757
+ .recipient-policy-sharing-projects,
1758
+ .recipient-policy-sharing-identity-rows,
1759
+ .recipient-policy-sharing-identity-rows > div { display: grid; gap: var(--sp-2); }
1760
+ .recipient-policy-sharing-projects,
1761
+ .recipient-policy-sharing-identity-rows { margin-top: var(--sp-4); }
1762
+ .recipient-policy-sharing-identity-rows > div + div { padding-top: var(--sp-3); border-top: 1px solid var(--border); }
1763
+ .recipient-policy-sharing-chips { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }
1764
+ .recipient-policy-sharing-more {
1765
+ padding: 0;
1766
+ border: 0;
1767
+ background: transparent;
1768
+ color: var(--accent);
1769
+ font: inherit;
1770
+ cursor: pointer;
1771
+ }
1772
+ .recipient-policy-sharing-toolbar {
1773
+ display: flex;
1774
+ align-items: center;
1775
+ justify-content: space-between;
1776
+ gap: var(--sp-3);
1777
+ margin-bottom: var(--sp-3);
1778
+ }
1779
+ .recipient-policy-sharing-toolbar label { flex: 1; }
1780
+ .recipient-policy-sharing-toolbar input { width: 100%; }
1781
+ .recipient-policy-sharing-received-table { display: block; width: 100%; overflow: hidden; border: 1px solid var(--border); border-spacing: 0; border-radius: var(--radius-md); }
1782
+ .recipient-policy-sharing-received-table thead,
1783
+ .recipient-policy-sharing-received-table tbody { display: block; }
1784
+ .recipient-policy-sharing-received-head,
1785
+ .recipient-policy-sharing-received-row {
1786
+ display: grid;
1787
+ grid-template-columns: minmax(0, 1fr) 180px 190px 170px;
1788
+ gap: var(--sp-4);
1789
+ align-items: center;
1790
+ padding: var(--sp-3) var(--sp-4);
1791
+ }
1792
+ .recipient-policy-sharing-received-head {
1793
+ background: var(--surface-2);
1794
+ color: var(--text-tertiary);
1795
+ font-size: var(--font-size-2xs);
1796
+ font-weight: var(--font-weight-semibold);
1797
+ letter-spacing: var(--letter-spacing-wide);
1798
+ text-transform: uppercase;
1799
+ }
1800
+ .recipient-policy-sharing-received-row { border-top: 1px solid var(--border); background: var(--surface-1); }
1801
+ .recipient-policy-sharing-received-row > * { min-width: 0; overflow-wrap: anywhere; }
1802
+ .recipient-policy-sharing-received-row td { min-width: 0; padding: 0; color: var(--text-secondary); text-align: left; }
1803
+ .recipient-policy-sharing-received-row td:first-child { color: var(--text-primary); }
1804
+ .recipient-policy-sharing-received-head th { min-width: 0; padding: 0; text-align: left; }
1805
+ .recipient-policy-sharing-received-head th:nth-child(n + 3),
1806
+ .recipient-policy-sharing-received-row td:nth-child(n + 3) { text-align: right; }
1807
+ .recipient-policy-sharing-pointer { display: inline-block; margin-top: var(--sp-3); }
1570
1808
  .recipient-policy-sharing-card,
1571
1809
  .recipient-policy-sharing-card-title,
1572
1810
  .recipient-policy-sharing-details dd { min-width: 0; overflow-wrap: anywhere; }
@@ -1600,10 +1838,6 @@
1600
1838
  }
1601
1839
  .recipient-policy-sharing-details dt { color: var(--text-secondary); }
1602
1840
  .recipient-policy-sharing-details dd { margin: 0; color: var(--text-primary); }
1603
- .recipient-policy-sharing-team-card > .recipient-policy-sharing-actions + .recipient-policy-sharing-actions {
1604
- margin-top: var(--sp-2);
1605
- }
1606
-
1607
1841
  .loading-card-list { display: grid; gap: var(--sp-3); }
1608
1842
  .loading-card {
1609
1843
  padding: var(--sp-4);
@@ -1753,10 +1987,177 @@
1753
1987
  .device-identity-review-panel ul { margin: var(--sp-3) 0; padding-left: var(--sp-5); }
1754
1988
  .device-identity-review-panel .peer-actions { margin-top: var(--sp-4); }
1755
1989
 
1990
+ #devicesMount .recipient-policy-sharing-header {
1991
+ display: flex;
1992
+ align-items: flex-start;
1993
+ justify-content: space-between;
1994
+ gap: var(--sp-4);
1995
+ }
1996
+ .devices-summary-bar,
1997
+ .devices-summary-counts,
1998
+ .devices-summary-counts > span,
1999
+ .devices-identity-header,
2000
+ .devices-table-device {
2001
+ display: flex;
2002
+ align-items: center;
2003
+ }
2004
+ .devices-summary-bar {
2005
+ justify-content: space-between;
2006
+ gap: var(--sp-4);
2007
+ padding: 10px 14px;
2008
+ border-radius: var(--radius-sm);
2009
+ background: var(--surface-2);
2010
+ color: var(--text-secondary);
2011
+ font-size: var(--font-size-sm);
2012
+ }
2013
+ .devices-summary-counts { gap: var(--sp-4); flex-wrap: wrap; }
2014
+ .devices-summary-counts > span { gap: 6px; }
2015
+ .devices-coordinator-status {
2016
+ display: flex;
2017
+ align-items: center;
2018
+ gap: var(--sp-2);
2019
+ padding: var(--sp-2) var(--sp-3);
2020
+ border-radius: var(--radius-sm);
2021
+ background: var(--surface-2);
2022
+ }
2023
+ .devices-coordinator-status-spacer { flex: 1; }
2024
+ .devices-local-row {
2025
+ display: grid;
2026
+ grid-template-columns: 16px minmax(0, 1fr) auto;
2027
+ align-items: center;
2028
+ gap: var(--sp-3);
2029
+ padding: 14px var(--sp-4);
2030
+ border: 1px solid var(--border);
2031
+ border-radius: var(--radius-md);
2032
+ background: var(--surface-1);
2033
+ }
2034
+ .devices-local-copy { display: grid; gap: 2px; }
2035
+ .devices-local-copy .small { color: var(--text-tertiary); }
2036
+ .devices-empty-state {
2037
+ display: flex;
2038
+ flex-direction: column;
2039
+ align-items: center;
2040
+ gap: var(--sp-2);
2041
+ padding: 40px var(--sp-6);
2042
+ border: 1px dashed var(--border-strong);
2043
+ border-radius: var(--radius-md);
2044
+ text-align: center;
2045
+ }
2046
+ .devices-empty-state > strong { font-size: var(--font-size-lg); }
2047
+ .devices-empty-actions { display: flex; gap: var(--sp-2); margin-top: var(--sp-2); }
2048
+ .devices-pairing-panel {
2049
+ display: grid;
2050
+ gap: var(--sp-3);
2051
+ padding: var(--sp-4);
2052
+ border: 1px solid var(--border);
2053
+ border-radius: var(--radius-md);
2054
+ background: var(--surface-2);
2055
+ }
2056
+ .devices-pairing-panel p { margin: 0; color: var(--text-secondary); }
2057
+ .devices-pairing-header,
2058
+ .devices-pairing-command { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); }
2059
+ .devices-pairing-header h3 { margin: 0; }
2060
+ .devices-pairing-command code { min-width: 0; overflow-wrap: anywhere; }
2061
+ .devices-identity-group { display: grid; gap: var(--sp-2); margin-top: var(--sp-4); }
2062
+ .devices-identity-header { align-items: baseline; justify-content: space-between; gap: var(--sp-3); }
2063
+ .devices-identity-header strong > span { color: var(--text-tertiary); font-weight: var(--font-weight-regular); }
2064
+ .devices-identity-header > .small { color: var(--text-tertiary); }
2065
+ .devices-table { width: 100%; overflow: visible; border: 1px solid var(--border); border-spacing: 0; border-radius: var(--radius-md); }
2066
+ .devices-table-head,
2067
+ .devices-table-row {
2068
+ display: grid;
2069
+ grid-template-columns: 16px minmax(0, 1fr) 160px 140px 48px;
2070
+ align-items: center;
2071
+ column-gap: var(--sp-4);
2072
+ }
2073
+ .devices-table-head {
2074
+ padding: var(--sp-2) var(--sp-4);
2075
+ background: var(--surface-2);
2076
+ color: var(--text-tertiary);
2077
+ font-size: var(--font-size-2xs);
2078
+ font-weight: var(--font-weight-medium);
2079
+ letter-spacing: 0.06em;
2080
+ text-transform: uppercase;
2081
+ }
2082
+ .devices-table th,
2083
+ .devices-table td { min-width: 0; padding: 0; text-align: left; }
2084
+ .devices-table-head { border-radius: var(--radius-md) var(--radius-md) 0 0; }
2085
+ .devices-table-row { min-width: 0; padding: var(--sp-3) var(--sp-4); border-top: 1px solid var(--border); }
2086
+ .devices-table-device { min-width: 0; gap: var(--sp-2); flex-wrap: wrap; }
2087
+ .devices-table-device strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2088
+ .devices-table-availability { color: var(--text-secondary); }
2089
+ .devices-table-version { color: var(--text-tertiary); font-family: var(--font-mono); font-size: var(--font-size-xs); }
2090
+ .devices-row-menu { position: relative; }
2091
+ .devices-row-menu > summary { list-style: none; }
2092
+ .devices-row-menu > summary::-webkit-details-marker { display: none; }
2093
+ .devices-row-menu[open] > .feed-menu-trigger { background: var(--surface-2); color: var(--text-primary); border-color: var(--border-hover); }
2094
+ .devices-row-menu > .feed-menu-panel { position: absolute; top: calc(100% + 4px); right: 0; }
2095
+ .devices-table-details { border-top: 1px solid var(--border); background: var(--surface-2); }
2096
+ .devices-table-details > td { display: grid; gap: var(--sp-3); padding: var(--sp-4) var(--sp-6); }
2097
+ .devices-table-details p { margin: 0; }
2098
+ .devices-table-details ul { margin: 0; padding-left: var(--sp-5); }
2099
+ .devices-table-details .device-identity-rebind { margin-top: 0; }
2100
+ .devices-delivered-copy-warning { margin-top: var(--sp-3); color: var(--text-secondary); }
2101
+
2102
+ @media (max-width: 900px) {
2103
+ .recipient-policy-sharing-card-header { align-items: stretch; flex-direction: column; }
2104
+ .recipient-policy-sharing-card-actions { justify-content: flex-start; }
2105
+ .recipient-policy-sharing-stats { grid-template-columns: 1fr; }
2106
+ .recipient-policy-sharing-received-head {
2107
+ position: absolute;
2108
+ width: 1px;
2109
+ height: 1px;
2110
+ padding: 0;
2111
+ margin: -1px;
2112
+ overflow: hidden;
2113
+ clip: rect(0, 0, 0, 0);
2114
+ clip-path: inset(50%);
2115
+ white-space: nowrap;
2116
+ border: 0;
2117
+ }
2118
+ .recipient-policy-sharing-received-row { grid-template-columns: 1fr 1fr; }
2119
+ .recipient-policy-sharing-received-row > td:not(:first-child)::before {
2120
+ content: attr(data-label) " ";
2121
+ display: block;
2122
+ color: var(--text-tertiary);
2123
+ font-size: var(--font-size-2xs);
2124
+ text-transform: uppercase;
2125
+ }
2126
+ .recipient-policy-sharing-received-row td:nth-child(n + 3) { text-align: left; }
2127
+ .project-inventory-table-header { display: none; }
2128
+ .project-inventory-table-row { grid-template-columns: 28px minmax(0, 1fr) auto; row-gap: var(--sp-3); }
2129
+ .project-inventory-select-cell { grid-column: 1; grid-row: 1; }
2130
+ .project-inventory-project-cell { grid-column: 2; grid-row: 1; }
2131
+ .project-inventory-row-actions { grid-column: 3; grid-row: 1; flex-wrap: wrap; }
2132
+ .project-inventory-number::before,
2133
+ .project-inventory-latest::before,
2134
+ .project-inventory-shared::before { content: attr(data-label) " "; color: var(--text-tertiary); font-size: var(--font-size-2xs); text-transform: uppercase; }
2135
+ .project-inventory-table-row > :nth-child(3) { grid-column: 2; grid-row: 2; }
2136
+ .project-inventory-table-row > :nth-child(4) { grid-column: 3; grid-row: 2; }
2137
+ .project-inventory-table-row > :nth-child(5) { grid-column: 2; grid-row: 3; }
2138
+ .project-inventory-table-row > :nth-child(6) { grid-column: 3; grid-row: 3; }
2139
+ .project-detail-grid { grid-template-columns: 1fr; }
2140
+ .devices-table-head { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); clip-path: inset(50%); white-space: nowrap; border: 0; }
2141
+ .devices-table-row { grid-template-columns: 16px minmax(0, 1fr) 48px; row-gap: var(--sp-2); }
2142
+ .devices-table-row > :nth-child(1) { grid-column: 1; grid-row: 1; }
2143
+ .devices-table-row > :nth-child(2) { grid-column: 2; grid-row: 1; }
2144
+ .devices-table-row > :nth-child(3) { grid-column: 2; grid-row: 2; }
2145
+ .devices-table-row > :nth-child(4) { grid-column: 2; grid-row: 3; }
2146
+ .devices-table-row > :nth-child(5) { grid-column: 3; grid-row: 1; }
2147
+ .devices-table-availability::before,
2148
+ .devices-table-version::before { content: attr(data-label) " "; color: var(--text-tertiary); font-family: var(--font-sans); font-size: var(--font-size-2xs); text-transform: uppercase; }
2149
+ }
2150
+
1756
2151
  @media (max-width: 720px) {
1757
- .project-inventory-row-header { align-items: center; flex-wrap: wrap; }
1758
- .project-inventory-title { flex: 1 1 calc(100% - 48px); }
1759
- .project-recipient-action { width: 100%; }
2152
+ .recipient-policy-sharing-toolbar { align-items: stretch; flex-direction: column; }
2153
+ .recipient-policy-sharing-received-row { grid-template-columns: 1fr; }
2154
+ .project-inventory-row-header { grid-template-columns: 28px minmax(0, 1fr); }
2155
+ .project-inventory-row-actions { grid-column: 2; grid-row: 2; justify-content: flex-start; }
2156
+ .project-inventory-table-row > :nth-child(3) { grid-column: 2; grid-row: 3; }
2157
+ .project-inventory-table-row > :nth-child(4) { grid-column: 2; grid-row: 4; }
2158
+ .project-inventory-table-row > :nth-child(5) { grid-column: 2; grid-row: 5; }
2159
+ .project-inventory-table-row > :nth-child(6) { grid-column: 2; grid-row: 6; }
2160
+ .project-recipient-action { width: auto; }
1760
2161
  .recipient-policy-management-dialog .modal-card { width: calc(100vw - 16px); }
1761
2162
  .recipient-policy-management-actions,
1762
2163
  .recipient-policy-sharing-responsive-actions { display: grid; grid-template-columns: 1fr; }
@@ -1778,6 +2179,16 @@
1778
2179
  .device-identity-setup-summary { align-items: stretch; flex-direction: column; }
1779
2180
  .device-identity-setup-summary .settings-button,
1780
2181
  .device-identity-review-panel .settings-button { min-height: 44px; width: 100%; }
2182
+ .devices-summary-bar,
2183
+ .devices-coordinator-status,
2184
+ .devices-pairing-header,
2185
+ .devices-pairing-command,
2186
+ .devices-identity-header,
2187
+ #devicesMount .recipient-policy-sharing-header { align-items: stretch; flex-direction: column; }
2188
+ .devices-summary-bar .settings-button,
2189
+ .devices-coordinator-status .settings-button,
2190
+ .devices-pairing-panel button { width: 100%; min-height: 44px; }
2191
+ .devices-empty-actions { align-items: stretch; flex-direction: column; width: 100%; }
1781
2192
  }
1782
2193
 
1783
2194
  /* 36×36 square icon buttons — theme toggle, settings gear. */
@@ -1925,7 +2336,9 @@
1925
2336
  transition: background-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard);
1926
2337
  }
1927
2338
  .toggle-button:hover { background: var(--toggle-hover-bg); color: var(--text-primary); }
1928
- .toggle-button.active {
2339
+ .toggle-button.active,
2340
+ .toggle-button[data-state="checked"],
2341
+ .toggle-button[aria-checked="true"] {
1929
2342
  background: var(--accent-subtle);
1930
2343
  color: var(--accent);
1931
2344
  box-shadow: inset 0 0 0 1px var(--accent-strong);
@@ -2000,18 +2413,14 @@
2000
2413
  .feed-skeleton-chip.w-56 { width: 56px; }
2001
2414
 
2002
2415
  /* ── Feed items ────────────────────────────────────────── */
2003
- /* Design-handoff clarification (2026-04-19): feed items render with
2004
- a full-width top banner in the kind's tint, not a 4px left rail.
2005
- Banner ~28px tall, --accent-subtle bg per kind, 1px accent-strong
2006
- bottom border; kind chip sits inset left inside the banner. */
2007
-
2008
2416
  .feed-item {
2417
+ display: grid;
2418
+ grid-template-columns: 104px minmax(0, 1fr) auto;
2419
+ column-gap: var(--sp-4);
2420
+ padding: var(--sp-4) var(--sp-5);
2009
2421
  border: 1px solid var(--border);
2010
- border-radius: var(--radius-md);
2422
+ border-radius: var(--radius-lg);
2011
2423
  background: var(--surface-1);
2012
- overflow: hidden;
2013
- display: flex;
2014
- flex-direction: column;
2015
2424
  box-shadow: var(--shadow-sm);
2016
2425
  transition: transform var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard);
2017
2426
  }
@@ -2021,31 +2430,17 @@
2021
2430
  border-color: var(--border-hover);
2022
2431
  }
2023
2432
 
2024
- /* Kind banner — defaults to mint (feature). Per-kind overrides below. */
2025
- .feed-kind-banner {
2026
- padding: 7px var(--sp-5);
2027
- background: var(--accent-subtle);
2028
- border-bottom: 1px solid var(--accent-strong);
2029
- }
2030
- .feed-item.change .feed-kind-banner { background: var(--accent-cool-subtle); border-bottom-color: color-mix(in srgb, var(--accent-cool) 30%, transparent); }
2031
- .feed-item.bugfix .feed-kind-banner { background: var(--accent-warm-subtle); border-bottom-color: color-mix(in srgb, var(--accent-warm) 30%, transparent); }
2032
- .feed-item.refactor .feed-kind-banner { background: var(--accent-violet-subtle); border-bottom-color: color-mix(in srgb, var(--accent-violet) 30%, transparent); }
2033
- .feed-item.discovery .feed-kind-banner { background: var(--accent-steel-subtle); border-bottom-color: color-mix(in srgb, var(--accent-steel) 30%, transparent); }
2034
- .feed-item.docs .feed-kind-banner { background: var(--accent-ochre-subtle); border-bottom-color: color-mix(in srgb, var(--accent-ochre) 30%, transparent); }
2035
- .feed-item.test .feed-kind-banner { background: var(--accent-neutral-subtle); border-bottom-color: color-mix(in srgb, var(--accent-neutral) 30%, transparent); }
2036
- /* Core emits 'decision' / 'exploration' / 'session_summary' too — preserve
2037
- neutral treatments so those items aren't unstyled. */
2038
- .feed-item.decision .feed-kind-banner { background: var(--accent-neutral-subtle); border-bottom-color: color-mix(in srgb, var(--accent-neutral) 30%, transparent); }
2039
- .feed-item.exploration .feed-kind-banner { background: color-mix(in srgb, var(--text-tertiary) 12%, transparent); border-bottom-color: color-mix(in srgb, var(--text-tertiary) 24%, transparent); }
2040
- .feed-item.session_summary .feed-kind-banner { background: color-mix(in srgb, var(--accent-cool) 10%, transparent); border-bottom-color: color-mix(in srgb, var(--accent-cool) 22%, transparent); }
2041
-
2433
+ .feed-kind-rail { align-self: start; min-width: 0; }
2042
2434
  .feed-card-body {
2043
2435
  padding: var(--sp-4) var(--sp-5);
2044
2436
  display: flex;
2045
2437
  flex-direction: column;
2046
2438
  gap: var(--sp-2);
2047
2439
  }
2048
-
2440
+ .feed-item > .feed-card-body {
2441
+ padding: 0;
2442
+ min-width: 0;
2443
+ }
2049
2444
  .feed-card-header {
2050
2445
  display: flex;
2051
2446
  align-items: flex-start;
@@ -2053,21 +2448,23 @@
2053
2448
  gap: var(--sp-3);
2054
2449
  }
2055
2450
  .feed-card-header > .feed-header { flex: 1; overflow: hidden; }
2056
-
2057
- .feed-header {
2451
+ .feed-card-side {
2058
2452
  display: flex;
2059
- align-items: center;
2060
- gap: var(--sp-2);
2061
- flex-wrap: wrap;
2453
+ flex-direction: column;
2454
+ align-items: flex-end;
2455
+ justify-content: space-between;
2062
2456
  min-width: 0;
2457
+ gap: var(--sp-3);
2063
2458
  }
2064
-
2065
- .feed-actions {
2459
+ .feed-card-side-top,
2460
+ .feed-card-side-bottom {
2066
2461
  display: flex;
2067
2462
  align-items: center;
2463
+ justify-content: flex-end;
2464
+ min-width: 0;
2068
2465
  gap: var(--sp-2);
2069
- flex-shrink: 0;
2070
2466
  }
2467
+ .feed-card-side-bottom { flex-wrap: wrap; }
2071
2468
 
2072
2469
  .feed-menu-panel {
2073
2470
  min-width: 180px;
@@ -2127,25 +2524,88 @@
2127
2524
  }
2128
2525
 
2129
2526
  .feed-title {
2130
- font-weight: var(--font-weight-semibold);
2527
+ display: block;
2528
+ width: 100%;
2529
+ min-width: 0;
2530
+ padding: 0;
2531
+ border: 0;
2532
+ background: transparent;
2533
+ color: var(--text-primary);
2534
+ font-family: var(--font-sans);
2131
2535
  font-size: var(--font-size-lg);
2132
- flex: 1;
2536
+ font-weight: var(--font-weight-semibold);
2537
+ line-height: 1.35;
2538
+ text-align: left;
2539
+ overflow-wrap: anywhere;
2540
+ white-space: normal;
2541
+ }
2542
+ button.feed-title { cursor: pointer; }
2543
+ button.feed-title:hover { color: var(--accent); }
2544
+ button.feed-title:focus-visible {
2545
+ border-radius: var(--radius-sm);
2546
+ outline: 2px solid var(--accent);
2547
+ outline-offset: 2px;
2548
+ }
2549
+ .feed-summary {
2133
2550
  min-width: 0;
2134
- display: -webkit-box;
2135
- -webkit-box-orient: vertical;
2136
- -webkit-line-clamp: 2;
2137
2551
  overflow: hidden;
2138
- overflow-wrap: anywhere;
2139
- word-break: break-word;
2552
+ color: var(--text-secondary);
2553
+ font-size: var(--font-size-md);
2554
+ line-height: 1.4;
2555
+ text-overflow: ellipsis;
2556
+ white-space: nowrap;
2140
2557
  }
2141
- .feed-card-subtitle {
2142
- width: 100%;
2558
+ .feed-meta-line {
2559
+ display: flex;
2560
+ align-items: center;
2561
+ flex-wrap: wrap;
2562
+ min-width: 0;
2563
+ gap: 6px;
2143
2564
  color: var(--text-tertiary);
2565
+ font-size: var(--font-size-sm);
2144
2566
  }
2567
+ .feed-project { color: var(--text-secondary); }
2145
2568
  .feed-meta {
2146
2569
  color: var(--text-tertiary);
2147
2570
  font-size: var(--font-size-sm);
2148
2571
  }
2572
+ .feed-expanded-provenance {
2573
+ display: flex;
2574
+ flex-wrap: wrap;
2575
+ gap: 6px;
2576
+ }
2577
+ .feed-search-match {
2578
+ display: flex;
2579
+ min-width: 0;
2580
+ gap: var(--sp-2);
2581
+ padding: var(--sp-2) var(--sp-3);
2582
+ border-left: 2px solid var(--accent);
2583
+ background: var(--accent-subtle);
2584
+ color: var(--text-secondary);
2585
+ font-size: var(--font-size-sm);
2586
+ }
2587
+ .feed-search-match-label {
2588
+ flex-shrink: 0;
2589
+ color: var(--accent);
2590
+ font-family: var(--font-mono);
2591
+ text-transform: capitalize;
2592
+ }
2593
+ .feed-search-match > span:last-child {
2594
+ min-width: 0;
2595
+ overflow-wrap: anywhere;
2596
+ }
2597
+ .feed-detail {
2598
+ display: flex;
2599
+ flex-direction: column;
2600
+ gap: var(--sp-2);
2601
+ padding-top: var(--sp-2);
2602
+ border-top: 1px solid var(--border);
2603
+ animation: feedDisclosure var(--duration-fast) var(--ease-out);
2604
+ }
2605
+ @keyframes feedDisclosure {
2606
+ from { opacity: 0; transform: translateY(-4px); }
2607
+ to { opacity: 1; transform: translateY(0); }
2608
+ }
2149
2609
  /* Empty state renders as a terminal-output block — mono surface,
2150
2610
  blinking mint cursor — to match the codemem "warm local journal"
2151
2611
  voice and signal "this is a CLI-native tool." */
@@ -2183,12 +2643,6 @@
2183
2643
  50% { opacity: 0; }
2184
2644
  }
2185
2645
 
2186
- .feed-provenance {
2187
- display: flex;
2188
- flex-wrap: wrap;
2189
- gap: 6px;
2190
- }
2191
-
2192
2646
  /* ── Chip base ─────────────────────────────────────────── */
2193
2647
  /* Shared layout for every pill-shaped label in the viewer. Per-variant
2194
2648
  rules below only override background / color / border / typography.
@@ -2218,6 +2672,12 @@
2218
2672
  background: var(--surface-2);
2219
2673
  color: var(--text-tertiary);
2220
2674
  }
2675
+ .feed-item .feed-meta-line > *, .feed-item .feed-expanded-provenance > * {
2676
+ min-width: 0;
2677
+ max-width: 100%;
2678
+ white-space: normal;
2679
+ overflow-wrap: anywhere;
2680
+ }
2221
2681
  .provenance-chip.mine { background: var(--accent-subtle); color: var(--accent); border-color: rgba(43, 122, 176, 0.18); }
2222
2682
  .provenance-chip.author { color: var(--text-secondary); }
2223
2683
  .provenance-chip.private { background: rgba(140, 140, 140, 0.12); color: var(--text-secondary); }
@@ -2234,10 +2694,61 @@
2234
2694
  }
2235
2695
 
2236
2696
  .feed-body {
2697
+ min-width: 0;
2698
+ overflow-wrap: anywhere;
2237
2699
  font-size: var(--font-size-md);
2238
2700
  line-height: 1.55;
2239
2701
  color: var(--text-secondary);
2240
2702
  }
2703
+ .first-run-guide {
2704
+ display: flex;
2705
+ flex-direction: column;
2706
+ gap: var(--sp-3);
2707
+ margin-bottom: var(--sp-4);
2708
+ padding: var(--sp-4);
2709
+ border: 1px solid var(--border);
2710
+ border-radius: var(--radius-md);
2711
+ background: var(--surface-1);
2712
+ }
2713
+ .first-run-guide-header {
2714
+ display: flex;
2715
+ align-items: flex-start;
2716
+ justify-content: space-between;
2717
+ gap: var(--sp-3);
2718
+ }
2719
+ .first-run-guide h2 { margin: 0; font-size: var(--font-size-lg); }
2720
+ .first-run-guide p { margin: 3px 0 0; color: var(--text-secondary); }
2721
+ .first-run-guide-list {
2722
+ display: grid;
2723
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2724
+ gap: var(--sp-2);
2725
+ margin: 0;
2726
+ padding: 0;
2727
+ list-style: none;
2728
+ }
2729
+ .first-run-guide-list li {
2730
+ display: flex;
2731
+ align-items: center;
2732
+ justify-content: space-between;
2733
+ gap: var(--sp-2);
2734
+ min-width: 0;
2735
+ padding: var(--sp-2);
2736
+ border: 1px solid var(--border);
2737
+ border-radius: var(--radius-sm);
2738
+ }
2739
+ .first-run-guide-list li.is-complete { background: var(--surface-2); }
2740
+ .first-run-guide-status { display: flex; align-items: flex-start; gap: var(--sp-2); min-width: 0; }
2741
+ .first-run-guide-status > span:last-child { display: flex; flex-direction: column; min-width: 0; }
2742
+ .first-run-guide-status .small { color: var(--text-tertiary); }
2743
+ .feed-empty-actions { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
2744
+
2745
+ @media (max-width: 755px) {
2746
+ .first-run-guide-header,
2747
+ .first-run-guide-list li { align-items: stretch; flex-direction: column; }
2748
+ .first-run-guide-list { grid-template-columns: 1fr; }
2749
+ .first-run-guide button,
2750
+ .feed-empty-actions .settings-button { width: 100%; }
2751
+ }
2241
2752
  .feed-body.narrative { max-width: 88ch; }
2242
2753
  .feed-body.clamp { display: -webkit-box; -webkit-box-orient: vertical; overflow: hidden; }
2243
2754
  .feed-body.clamp-3 { -webkit-line-clamp: 3; }
@@ -2268,16 +2779,15 @@
2268
2779
  .summary-section-label { font-size: var(--font-size-xs); font-weight: var(--font-weight-semibold); text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-tertiary); }
2269
2780
  .summary-section-content { font-size: var(--font-size-md); line-height: 1.5; color: var(--text-primary); }
2270
2781
 
2271
- .feed-footer {
2782
+ .feed-visibility-label {
2272
2783
  display: flex;
2273
- flex-wrap: wrap;
2274
- gap: var(--sp-2);
2275
- align-items: flex-start;
2276
- justify-content: space-between;
2784
+ flex-direction: column;
2785
+ gap: 3px;
2786
+ color: var(--text-tertiary);
2787
+ font-size: var(--font-size-2xs);
2788
+ letter-spacing: 0.06em;
2789
+ text-transform: uppercase;
2277
2790
  }
2278
- .feed-footer-left { display: flex; flex-direction: column; gap: 6px; }
2279
- .feed-footer-right { display: flex; align-items: center; gap: var(--sp-2); flex-shrink: 0; }
2280
- .feed-visibility-controls { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
2281
2791
  .feed-visibility-select {
2282
2792
  min-width: 180px;
2283
2793
  padding: 6px 10px;
@@ -2287,22 +2797,8 @@
2287
2797
  color: var(--text-primary);
2288
2798
  font-family: var(--font-sans);
2289
2799
  font-size: var(--font-size-sm);
2290
- }
2291
- .feed-visibility-note { width: 100%; max-width: 60ch; font-size: var(--font-size-sm); color: var(--text-tertiary); }
2292
-
2293
- .feed-expand {
2294
- border: 1px solid var(--border);
2295
- background: transparent;
2296
- color: var(--text-tertiary);
2297
- padding: 3px 10px;
2298
- font-size: var(--font-size-xs);
2299
- transition: background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);
2300
- }
2301
- .feed-expand:hover { background: var(--accent-subtle); color: var(--accent); }
2302
- .feed-expand:focus-visible {
2303
- outline: 2px solid var(--accent);
2304
- outline-offset: 2px;
2305
- box-shadow: 0 0 0 4px var(--focus-ring);
2800
+ letter-spacing: normal;
2801
+ text-transform: none;
2306
2802
  }
2307
2803
 
2308
2804
  .feed-tags { display: flex; flex-wrap: wrap; gap: 6px; }
@@ -2310,6 +2806,9 @@
2310
2806
  filename is informative and earns its horizontal space. */
2311
2807
  .feed-files { display: flex; flex-wrap: wrap; gap: 6px; }
2312
2808
  .feed-file {
2809
+ max-width: 100%;
2810
+ overflow: hidden;
2811
+ text-overflow: ellipsis;
2313
2812
  padding: 2px 8px;
2314
2813
  border-radius: var(--radius-sm);
2315
2814
  background: var(--surface-2);
@@ -2323,7 +2822,7 @@
2323
2822
 
2324
2823
  /* ── Pills & badges ────────────────────────────────────── */
2325
2824
 
2326
- /* Kind chip — lives inside .feed-kind-banner. Tint + colored border
2825
+ /* Kind chip — lives inside .feed-kind-rail. Tint + colored border
2327
2826
  match the banner per kind so the chip reads as part of the strip. */
2328
2827
  .kind-chip {
2329
2828
  padding: 2px 10px;
@@ -2423,55 +2922,31 @@
2423
2922
 
2424
2923
  .health-update-banner {
2425
2924
  display: flex;
2426
- align-items: flex-start;
2427
- gap: var(--sp-3);
2428
- padding: var(--sp-4);
2925
+ align-items: center;
2926
+ flex-wrap: wrap;
2927
+ gap: var(--sp-2);
2928
+ padding: 10px var(--sp-4);
2429
2929
  border: 1px solid var(--border);
2430
- border-radius: var(--radius-lg);
2930
+ border-radius: var(--radius-md);
2431
2931
  background: var(--surface-1);
2432
- box-shadow: var(--shadow-sm);
2433
- }
2434
- .health-update-banner--current {
2435
- border-color: color-mix(in srgb, var(--status-healthy) 34%, var(--border));
2436
- background: color-mix(in srgb, var(--status-healthy) 7%, var(--surface-1));
2437
- }
2438
- .health-update-banner--available,
2439
- .health-update-banner--stale {
2440
- border-color: color-mix(in srgb, var(--accent-warm) 34%, var(--border));
2441
- background: color-mix(in srgb, var(--accent-warm-subtle) 34%, var(--surface-1));
2442
- }
2443
- .health-update-banner--unavailable {
2444
- border-color: color-mix(in srgb, var(--status-attention) 34%, var(--border));
2445
- background: color-mix(in srgb, var(--status-attention) 7%, var(--surface-1));
2932
+ color: var(--text-secondary);
2446
2933
  }
2447
2934
  .health-update-icon {
2448
- width: 20px;
2449
- height: 20px;
2450
- flex: 0 0 20px;
2451
- margin-top: 2px;
2935
+ width: 16px;
2936
+ height: 16px;
2937
+ flex: 0 0 16px;
2452
2938
  color: var(--accent);
2453
2939
  }
2454
- .health-update-banner--current .health-update-icon { color: var(--status-healthy); }
2455
- .health-update-banner--available .health-update-icon,
2456
- .health-update-banner--stale .health-update-icon { color: var(--accent-warm); }
2457
- .health-update-banner--unavailable .health-update-icon { color: var(--status-attention); }
2458
- .health-update-copy { min-width: 0; }
2459
- .health-update-copy h2 { font-size: var(--font-size-lg); line-height: 1.3; }
2460
- .health-update-copy p { margin-top: var(--sp-1); color: var(--text-secondary); }
2461
- .health-update-guidance { display: grid; gap: 3px; }
2462
- .health-update-guidance-label {
2463
- color: var(--text-tertiary);
2464
- font-size: var(--font-size-xs);
2465
- font-weight: var(--font-weight-semibold);
2466
- letter-spacing: 0.06em;
2467
- text-transform: uppercase;
2940
+ .health-update-source {
2941
+ background: var(--accent-cool-subtle);
2942
+ color: var(--accent-cool);
2468
2943
  }
2469
- .health-update-guidance code {
2470
- color: var(--text-primary);
2471
- font-family: var(--font-mono);
2472
- font-size: var(--font-size-sm);
2944
+ .health-update-detail { flex: 1 1 280px; min-width: 0; }
2945
+ .health-update-command {
2946
+ flex: 1 1 100%;
2473
2947
  overflow-wrap: anywhere;
2474
2948
  }
2949
+ .health-update-copy-button { margin-left: auto; }
2475
2950
 
2476
2951
  .health-actions, .sync-actions {
2477
2952
  display: grid;
@@ -3049,7 +3524,8 @@
3049
3524
  animation: sync-attention-target var(--duration-attention) var(--ease-out);
3050
3525
  }
3051
3526
  .settings-button:disabled,
3052
- .settings-button[aria-disabled="true"] {
3527
+ .settings-button[aria-disabled="true"],
3528
+ .settings-save[aria-disabled="true"] {
3053
3529
  opacity: 0.55;
3054
3530
  cursor: not-allowed;
3055
3531
  }
@@ -3523,6 +3999,18 @@
3523
3999
  }
3524
4000
  .modal-body { display: flex; flex-direction: column; gap: var(--sp-3); flex: 1; min-height: 0; overflow-y: auto; padding-right: 6px; }
3525
4001
  .modal-footer { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); flex-shrink: 0; padding-top: var(--sp-2); border-top: 1px solid var(--border); }
4002
+ .settings-footer-copy { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; }
4003
+ .settings-link-button {
4004
+ padding: 0;
4005
+ border: 0;
4006
+ background: transparent;
4007
+ color: var(--text-secondary);
4008
+ font: inherit;
4009
+ font-size: var(--font-size-sm);
4010
+ text-decoration: underline;
4011
+ text-underline-offset: 2px;
4012
+ }
4013
+ .settings-link-button:hover { color: var(--text-primary); }
3526
4014
  /* ── Toast (Radix Toast-backed) ───────────────────────── */
3527
4015
  /* Fixed viewport anchored bottom-right. Each toast is a surface-card
3528
4016
  with a severity-tinted left accent keyed to .toast-{variant}. */
@@ -3658,9 +4146,9 @@
3658
4146
  border-radius: 50%;
3659
4147
  border: 2px solid color-mix(in srgb, var(--accent) 22%, transparent);
3660
4148
  border-top-color: var(--accent);
3661
- animation: reconnectSpin var(--duration-attention) linear infinite;
4149
+ animation: viewerLoadingSpin var(--duration-attention) linear infinite;
3662
4150
  }
3663
- @keyframes reconnectSpin {
4151
+ @keyframes viewerLoadingSpin {
3664
4152
  from { transform: rotate(0deg); }
3665
4153
  to { transform: rotate(360deg); }
3666
4154
  }
@@ -3683,6 +4171,23 @@
3683
4171
  color: var(--accent);
3684
4172
  background: var(--accent-subtle);
3685
4173
  }
4174
+ .advanced-heading { margin: 0 0 var(--sp-4); font-size: var(--font-size-2xl); }
4175
+ #advancedTabsMount .settings-tabs { grid-template-columns: repeat(2, minmax(0, 1fr)); }
4176
+ .advanced-sync-status,
4177
+ .advanced-sync-status-label {
4178
+ display: flex;
4179
+ align-items: center;
4180
+ }
4181
+ .advanced-sync-status { justify-content: space-between; gap: var(--sp-4); }
4182
+ .advanced-sync-status-label { gap: var(--sp-3); }
4183
+ .advanced-sync-status-label .xl { font-size: var(--font-size-xl); }
4184
+ .advanced-administration-sections { margin-bottom: var(--sp-3); }
4185
+
4186
+ @media (max-width: 720px) {
4187
+ .advanced-sync-status { align-items: stretch; flex-direction: column; }
4188
+ .advanced-sync-status .section-actions { align-items: stretch; flex-direction: column; }
4189
+ .advanced-sync-status .settings-save { width: 100%; }
4190
+ }
3686
4191
  .settings-panel { display: flex; flex-direction: column; gap: var(--sp-3); }
3687
4192
  .settings-panel[data-state="inactive"] { display: none; }
3688
4193
  .settings-panel[hidden] { display: none; }
@@ -3842,6 +4347,19 @@
3842
4347
  }
3843
4348
 
3844
4349
  .field { display: flex; flex-direction: column; gap: 6px; font-size: var(--font-size-md); }
4350
+ .settings-outcome {
4351
+ margin: 0;
4352
+ color: var(--text-tertiary);
4353
+ font-size: var(--font-size-xs);
4354
+ line-height: 1.45;
4355
+ }
4356
+ .settings-outcome > summary,
4357
+ .settings-config-details > summary { cursor: pointer; color: var(--text-secondary); }
4358
+ .settings-outcome > summary:focus-visible,
4359
+ .settings-config-details > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
4360
+ .settings-outcome-details { display: grid; gap: var(--sp-1); padding-top: var(--sp-2); }
4361
+ .settings-config-details { margin-top: var(--sp-4); font-size: var(--font-size-xs); overflow-wrap: anywhere; }
4362
+ .settings-outcome strong { color: var(--text-secondary); font-weight: var(--font-weight-medium); }
3845
4363
  .field input:not([type="checkbox"]), .field select, .field textarea { padding: var(--sp-2) var(--sp-3); border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--input-bg); font-family: var(--font-sans); font-size: var(--font-size-md); color: var(--text-primary); }
3846
4364
  .settings-select-trigger {
3847
4365
  display: inline-flex;
@@ -3902,7 +4420,9 @@
3902
4420
  justify-content: flex-start;
3903
4421
  gap: 10px;
3904
4422
  flex: 0 1 auto;
4423
+ flex-wrap: wrap;
3905
4424
  }
4425
+ .settings-switch-row .settings-outcome { flex-basis: 100%; }
3906
4426
  .settings-switch-copy {
3907
4427
  color: var(--text-primary);
3908
4428
  line-height: 1.35;
@@ -3965,6 +4485,19 @@
3965
4485
  transition: background var(--duration-fast) var(--ease-standard);
3966
4486
  }
3967
4487
  .settings-save:hover { background: var(--control-hover-bg); }
4488
+ /* Text actions share geometry; icon, tab, and segmented controls retain theirs. */
4489
+ .settings-button,
4490
+ .settings-save {
4491
+ display: inline-flex;
4492
+ align-items: center;
4493
+ justify-content: center;
4494
+ box-sizing: border-box;
4495
+ min-height: 36px;
4496
+ padding: 8px 12px;
4497
+ border-radius: var(--radius-md);
4498
+ font-size: var(--font-size-sm);
4499
+ line-height: 18px;
4500
+ }
3968
4501
  .sync-dialog-card {
3969
4502
  width: min(560px, 100%);
3970
4503
  }
@@ -4112,8 +4645,8 @@
4112
4645
  50% { transform: scale(1.3); opacity: 0.5; }
4113
4646
  }
4114
4647
 
4115
- /* newPulse: fresh feed items pulse their kind-banner bottom border
4116
- from accent-strong to transparent once on mount. The class is
4648
+ /* newPulse: fresh feed items pulse the card outline from accent-strong
4649
+ to transparent once on mount. The class is
4117
4650
  applied by feed.ts only while state.newItemKeys holds the item's
4118
4651
  key (700ms useEffect then clears it). Skipped entirely under
4119
4652
  prefers-reduced-motion so the ambient accessibility pass still
@@ -4150,12 +4683,9 @@
4150
4683
  .tab-btn { flex-shrink: 0; }
4151
4684
  .tab-panel { padding: var(--sp-4); }
4152
4685
  .summary-row { grid-template-columns: 1fr; }
4153
- .feed-card-header { flex-wrap: wrap; }
4154
- .feed-actions { width: 100%; justify-content: flex-end; }
4686
+ .health-tile-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
4155
4687
  .actor-row { align-items: stretch; flex-direction: column; }
4156
4688
  .peer-scope-row { grid-template-columns: 1fr; }
4157
- .feed-visibility-controls { align-items: stretch; }
4158
- .feed-visibility-select { width: 100%; }
4159
4689
  .actor-actions { justify-content: flex-start; }
4160
4690
  .legacy-review-header { flex-direction: column; }
4161
4691
  .legacy-review-group-main { grid-template-columns: 1fr; }
@@ -4164,6 +4694,41 @@
4164
4694
  .legacy-review-bulk-row .settings-save { width: 100%; }
4165
4695
  }
4166
4696
 
4697
+ @media (max-width: 755px) {
4698
+ .feed-item {
4699
+ grid-template-columns: minmax(0, 1fr) auto;
4700
+ row-gap: var(--sp-3);
4701
+ padding: var(--sp-4);
4702
+ }
4703
+ .feed-kind-rail { grid-column: 1; grid-row: 1; align-self: center; }
4704
+ .feed-card-side { display: contents; }
4705
+ .feed-card-side-top { grid-column: 2; grid-row: 1; }
4706
+ .feed-item > .feed-card-body { grid-column: 1 / -1; grid-row: 2; }
4707
+ .feed-card-side-bottom {
4708
+ grid-column: 1 / -1;
4709
+ grid-row: 3;
4710
+ justify-content: space-between;
4711
+ flex-wrap: wrap;
4712
+ }
4713
+ .feed-toggle { max-width: 100%; }
4714
+ .toggle-button { padding-inline: var(--sp-2); }
4715
+ .feed-visibility-label { flex: 1 1 180px; }
4716
+ .feed-visibility-select { box-sizing: border-box; width: 100%; min-width: 0; }
4717
+ .feed-meta-line { max-width: 100%; }
4718
+ .feed-file { max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
4719
+ }
4720
+
4721
+ @media print {
4722
+ .feed-menu-trigger,
4723
+ .feed-card-side-bottom { display: none !important; }
4724
+ .feed-item {
4725
+ break-inside: avoid;
4726
+ grid-template-columns: 104px minmax(0, 1fr) auto;
4727
+ box-shadow: none;
4728
+ }
4729
+ .feed-item:hover { transform: none; box-shadow: none; }
4730
+ }
4731
+
4167
4732
  @media (max-width: 720px) {
4168
4733
  .header-title { font-size: var(--font-size-xl); }
4169
4734
  }
@@ -4213,6 +4778,12 @@
4213
4778
  }
4214
4779
 
4215
4780
  @media (prefers-reduced-motion: reduce) {
4781
+ .health-loading-icon,
4782
+ .viewer-reconnect-spinner,
4783
+ .feed-detail,
4784
+ .feed-item.new-item {
4785
+ animation: none;
4786
+ }
4216
4787
  *, *::before, *::after {
4217
4788
  animation-duration: 0.01ms !important;
4218
4789
  animation-iteration-count: 1 !important;
@@ -4501,15 +5072,21 @@
4501
5072
  <!-- ── Tab: Health ─────────────────────────────────────── -->
4502
5073
  <div class="tab-panel" id="tab-health" hidden>
4503
5074
  <div id="healthUpdateBanner" hidden></div>
4504
- <div class="card" style="animation-delay: 0s">
4505
- <div class="section-header">
4506
- <h2>System health</h2>
5075
+ <section class="card health-system-card" id="healthSystemCard" aria-label="System health" tabindex="-1">
5076
+ <div class="health-system-header">
5077
+ <div id="healthStatus">
5078
+ <div class="health-status-summary">
5079
+ <div class="health-status-copy">
5080
+ <strong class="health-status-word status-unknown">Assessing</strong>
5081
+ <div class="section-meta" id="healthMeta" role="status" aria-live="polite" aria-atomic="true">Assessing health signals…</div>
5082
+ </div>
5083
+ </div>
5084
+ </div>
4507
5085
  <button class="settings-button" id="healthOpenDiagnostics" type="button">View diagnostics</button>
4508
5086
  </div>
4509
- <div class="section-meta" id="healthMeta">Assessing health signals…</div>
4510
5087
  <div class="health-actions" id="healthActions"></div>
4511
- <div class="grid-2" id="healthGrid"></div>
4512
- </div>
5088
+ <div id="healthGrid"></div>
5089
+ </section>
4513
5090
 
4514
5091
  <div class="summary-row">
4515
5092
  <div class="card" style="animation-delay: 0.05s">
@@ -4530,20 +5107,17 @@
4530
5107
  <div id="recipientPolicyReviewMount" hidden></div>
4531
5108
  <div class="card" style="animation-delay: 0s">
4532
5109
  <div class="section-header">
4533
- <div>
4534
- <h2>Projects</h2>
4535
- <div class="section-meta">Choose exact Projects, then share them with Teams or Identities.</div>
4536
- </div>
5110
+ <h2>Projects</h2>
4537
5111
  <div class="section-actions project-selection-actions">
4538
5112
  <span class="section-meta" id="projectsSelectionStatus" role="status" aria-live="polite">0 Projects selected.</span>
4539
- <button class="settings-button project-selection-target" id="projectsShareSelected" type="button" disabled>Share selected</button>
5113
+ <button class="settings-button project-selection-target" id="projectsShareSelected" type="button" disabled>Add Teams or Identities</button>
4540
5114
  </div>
4541
5115
  </div>
4542
5116
  <div class="projects-toolbar">
4543
- <input class="feed-search" id="projectsSearch" placeholder="Search project, path, git remote, or workspace id…" />
4544
- <select id="projectsStatusFilter" aria-label="Project status filter"></select>
5117
+ <input class="feed-search" id="projectsSearch" placeholder="Search by name, path, or git remote…" />
5118
+ <select id="projectsStatusFilter" aria-label="Filter projects"></select>
5119
+ <span class="small" id="projectsInventoryMeta">Loading project inventory…</span>
4545
5120
  </div>
4546
- <div class="section-meta" id="projectsInventoryMeta">Loading project inventory…</div>
4547
5121
  <div class="project-inventory-skeleton" id="projectsInventorySkeleton" role="status" aria-label="Loading project inventory" aria-busy="true">
4548
5122
  <div class="project-inventory-skeleton-row">
4549
5123
  <div class="project-inventory-skeleton-line title"></div>
@@ -4563,8 +5137,7 @@
4563
5137
  </div>
4564
5138
  </div>
4565
5139
  <details class="card project-advanced-surface">
4566
- <summary>Advanced Project invitations</summary>
4567
- <div class="section-meta">Use the legacy invitation flow when the recipient does not have an Identity yet.</div>
5140
+ <summary>Invite someone</summary>
4568
5141
  <div class="section-actions" id="projectShareFlowMount"></div>
4569
5142
  </details>
4570
5143
  </div>
@@ -4581,39 +5154,33 @@
4581
5154
 
4582
5155
  <!-- ── Tab: Advanced ───────────────────────────────────── -->
4583
5156
  <div class="tab-panel" id="tab-advanced" hidden>
4584
- <div class="card">
4585
- <div class="section-header advanced-legacy-header">
4586
- <div>
4587
- <h2>Advanced</h2>
4588
- <div class="section-meta">Device sync, legacy Team and Space setup, and coordinator administration.</div>
4589
- </div>
4590
- <div class="section-actions" aria-label="Advanced sections" role="group">
4591
- <button class="settings-button" id="advancedSyncButton" type="button" aria-pressed="true">Sync</button>
4592
- <button class="settings-button" id="advancedTeamsButton" type="button" aria-pressed="false">Coordinator Administration</button>
4593
- </div>
4594
- </div>
4595
- </div>
5157
+ <h2 class="advanced-heading">Advanced</h2>
5158
+ <div id="advancedTabsMount"></div>
4596
5159
 
4597
- <div id="advancedSyncContent">
5160
+ <div id="advancedSyncContent" role="tabpanel" aria-labelledby="advancedSyncButton">
4598
5161
 
4599
5162
  <!-- Sub-view: main Sync surface. Toggled by syncViewController and
4600
5163
  app compatibility routing for canonical and legacy hashes. -->
4601
5164
  <div id="syncMainView">
4602
5165
 
5166
+ <section class="card advanced-sync-status">
5167
+ <div id="syncAdvancedStatusMount"></div>
5168
+ <div class="section-actions">
5169
+ <button class="settings-button" id="syncNowButton">Sync now</button>
5170
+ <a class="sync-subview-link" href="#advanced/sync/diagnostics">View diagnostics &rarr;</a>
5171
+ <button class="settings-save" id="syncTurnOnButton" type="button" hidden>Turn on sync</button>
5172
+ </div>
5173
+ </section>
5174
+
4603
5175
  <!-- 1. Needs attention + team setup/status -->
4604
5176
  <div class="card" id="syncTeamCard">
4605
5177
  <div class="section-header">
4606
5178
  <div class="section-header-title">
4607
- <h2>Team sync</h2>
5179
+ <h2>Join a team</h2>
4608
5180
  <span class="sync-online-badge" id="syncOnlineBadge" hidden role="status" aria-live="polite"></span>
4609
5181
  </div>
4610
- <div class="section-actions">
4611
- <button class="settings-button" id="syncShareProjectsButton" type="button">Share projects</button>
4612
- <button class="settings-button" id="syncNowButton">Sync now</button>
4613
- <a class="sync-subview-link" href="#advanced/sync/diagnostics">View diagnostics &rarr;</a>
4614
- </div>
4615
5182
  </div>
4616
- <div class="section-meta" id="syncTeamMeta">Start with the next step below, then review team status and device details.</div>
5183
+ <div class="section-meta" id="syncTeamMeta" hidden></div>
4617
5184
  <div class="sync-skeleton" id="syncTeamSkeleton" role="status" aria-label="Loading team sync">
4618
5185
  <div class="sync-skeleton-line medium"></div>
4619
5186
  <div class="sync-skeleton-block"></div>
@@ -4623,10 +5190,9 @@
4623
5190
  <div id="syncSetupPanel">
4624
5191
  <div id="syncJoinSection">
4625
5192
  <h3 class="settings-group-title">Join a team</h3>
4626
- <div class="section-meta">Have an invite? Paste it here.</div>
4627
- <div class="actor-create-row" id="syncJoinPanel">
4628
- <label for="syncJoinInvite" class="sr-only">Team invite or pairing payload</label>
4629
- <textarea class="feed-search" id="syncJoinInvite" placeholder="Paste a team invite or device pairing payload"></textarea>
5193
+ <div class="actor-create-row" id="syncJoinPanel" hidden>
5194
+ <label for="syncJoinInvite" class="sr-only">Invite or pairing code</label>
5195
+ <textarea class="feed-search" id="syncJoinInvite" placeholder="Invite or pairing code" rows="2"></textarea>
4630
5196
  <div id="syncProjectInviteReview" role="region" aria-labelledby="syncProjectInviteReviewHeading" hidden>
4631
5197
  <h4 id="syncProjectInviteReviewHeading" tabindex="-1">Review project invitation</h4>
4632
5198
  <div class="section-meta" id="syncProjectInviteContext"></div>
@@ -4635,6 +5201,15 @@
4635
5201
  <label for="syncRecipientDeviceName">This device</label>
4636
5202
  <input class="feed-search" id="syncRecipientDeviceName" maxlength="120" />
4637
5203
  </div>
5204
+ <div id="syncPairingReview" role="region" aria-labelledby="syncPairingReviewHeading" hidden>
5205
+ <h4 id="syncPairingReviewHeading" tabindex="-1">Review device pairing</h4>
5206
+ <p>Check these details with the other device. Accept only a device you trust.</p>
5207
+ <dl>
5208
+ <dt>Device ID</dt><dd id="syncPairingDeviceId" style="overflow-wrap: anywhere"></dd>
5209
+ <dt>Fingerprint</dt><dd id="syncPairingFingerprint" style="overflow-wrap: anywhere"></dd>
5210
+ <dt>Addresses</dt><dd id="syncPairingAddresses" style="white-space: pre-wrap; overflow-wrap: anywhere"></dd>
5211
+ </dl>
5212
+ </div>
4638
5213
  <button class="settings-button" id="syncJoinButton">Review invite</button>
4639
5214
  </div>
4640
5215
  </div>
@@ -4650,19 +5225,24 @@
4650
5225
  </div>
4651
5226
  </div>
4652
5227
 
4653
- <!-- 2. People & devices -->
5228
+ <!-- 2. People and devices -->
4654
5229
  <div class="card" style="animation-delay: 0.04s">
4655
- <h2>People &amp; devices</h2>
5230
+ <div class="section-header">
5231
+ <h2>People and devices</h2>
5232
+ <a class="sync-subview-link" href="#sharing" id="advancedSharingLink">Invite someone via Sharing &rarr;</a>
5233
+ </div>
4656
5234
 
4657
- <h3 class="settings-group-title">Project sharing</h3>
4658
- <div class="section-meta" id="syncProjectShareOperationsMeta">Loading project sharing status…</div>
4659
- <div class="actor-list" id="syncProjectShareOperations" aria-live="polite"></div>
5235
+ <div id="syncSharingReview" hidden>
5236
+ <h3 class="settings-group-title" style="margin-top: 20px">What teammates will receive</h3>
5237
+ <div class="section-meta" id="syncSharingReviewMeta"></div>
5238
+ <div class="actor-list" id="syncSharingReviewList"></div>
5239
+ </div>
4660
5240
 
4661
- <details class="project-inventory-details" style="margin-top: 20px">
5241
+ <details class="project-inventory-details" id="manualDeviceIdentityControls" style="margin-top: 20px">
4662
5242
  <summary>Manual device and identity controls</summary>
4663
5243
 
4664
5244
  <h3 class="settings-group-title">People</h3>
4665
- <div class="section-meta" id="syncActorsMeta">Create and rename people here. Assign each device below.</div>
5245
+ <div class="section-meta" id="syncActorsMeta"></div>
4666
5246
  <div class="actor-create-row">
4667
5247
  <div class="sync-labeled-field">
4668
5248
  <label for="syncActorCreateInput" class="sync-labeled-field-caption">Person name</label>
@@ -4683,21 +5263,6 @@
4683
5263
  <div class="device-row-skeleton"><span class="skel-pip"></span><span class="skel-name"></span><span class="skel-chip"></span></div>
4684
5264
  <div class="device-row-skeleton"><span class="skel-pip"></span><span class="skel-name"></span><span class="skel-chip"></span></div>
4685
5265
  </div>
4686
-
4687
- <h3 class="settings-group-title" style="margin-top: 20px">Connect another device</h3>
4688
- <div class="section-meta">Share this command on the new device to join it to the team.</div>
4689
- <div class="actor-create-row">
4690
- <div id="syncPairingDisclosureMount" style="display: contents"></div>
4691
- </div>
4692
- <div id="syncPairingPanelMount" style="display: contents"></div>
4693
- </details>
4694
-
4695
- <div id="syncSharingReview" hidden>
4696
- <h3 class="settings-group-title" style="margin-top: 20px">What teammates will receive</h3>
4697
- <div class="section-meta" id="syncSharingReviewMeta"></div>
4698
- <div class="actor-list" id="syncSharingReviewList"></div>
4699
- </div>
4700
-
4701
5266
  <div id="syncLegacyClaims" hidden>
4702
5267
  <h3 class="settings-group-title" style="margin-top: 20px">Legacy device history</h3>
4703
5268
  <div class="peer-meta" id="syncLegacyClaimsMeta"></div>
@@ -4707,6 +5272,7 @@
4707
5272
  <button class="sync-legacy-button" id="syncLegacyClaimButton">Attach device history</button>
4708
5273
  </div>
4709
5274
  </div>
5275
+ </details>
4710
5276
  </div>
4711
5277
 
4712
5278
  </div><!-- /#syncMainView -->
@@ -4728,7 +5294,8 @@
4728
5294
  </label>
4729
5295
  </div>
4730
5296
  </div>
4731
- <div class="section-meta" id="syncMeta">Use this surface for sync debugging and recent attempt details.</div>
5297
+ <div class="section-meta" id="syncPrimaryStatusDetail"></div>
5298
+ <div class="section-meta" id="syncMeta"></div>
4732
5299
  <div class="sync-skeleton" id="syncDiagSkeleton" role="status" aria-label="Loading diagnostics">
4733
5300
  <div class="sync-skeleton-line long"></div>
4734
5301
  <div class="sync-skeleton-line medium"></div>
@@ -4743,30 +5310,21 @@
4743
5310
  </div><!-- /#syncDiagnosticsView -->
4744
5311
  </div><!-- /#advancedSyncContent -->
4745
5312
 
4746
- <div id="advancedTeamsContent" hidden>
5313
+ <div id="advancedTeamsContent" role="tabpanel" aria-labelledby="advancedTeamsButton" hidden>
4747
5314
  <div class="card">
4748
- <aside
4749
- aria-labelledby="coordinatorAdminLegacyNoticeTitle"
4750
- class="coordinator-admin-inline-warning coordinator-admin-legacy-notice"
4751
- role="note"
4752
- >
4753
- <div class="coordinator-admin-legacy-notice-copy">
4754
- <h3 id="coordinatorAdminLegacyNoticeTitle" tabindex="-1">Looking for Team settings?</h3>
4755
- <div class="peer-submeta">
4756
- Manage Team members, names, and Project access in Sharing. Use this page only for older coordinator groups and Spaces.
4757
- </div>
4758
- </div>
4759
- <button class="settings-button" id="coordinatorAdminOpenSharing" type="button">Open Sharing</button>
4760
- </aside>
4761
- <details class="advanced-administration-disclosure" open>
4762
- <summary>Coordinator Administration</summary>
4763
- <div class="section-meta">Technical coordinator groups, Spaces, enrollment, and recovery controls.</div>
5315
+ <div class="section-header">
5316
+ <h2 id="coordinatorAdminHeading" tabindex="-1">Coordinator administration</h2>
5317
+ <a class="sync-subview-link" href="#sharing" id="advancedTeamSettingsLink">Team settings &rarr;</a>
5318
+ </div>
5319
+ <div class="section-meta advanced-administration-sections">Groups · Invites · Join requests · Devices</div>
5320
+ <details class="advanced-administration-disclosure" id="advancedAdministrationDisclosure">
5321
+ <summary>Legacy administration</summary>
4764
5322
  <div id="coordinatorAdminMount"></div>
4765
5323
  </details>
4766
5324
  </div>
4767
5325
  </div>
4768
5326
  </div>
4769
5327
 
4770
- <script src="/assets/app.js?v=e12e29717376"></script>
5328
+ <script src="/assets/app.js?v=a52e5e81ae2c"></script>
4771
5329
  </body>
4772
5330
  </html>