@codemem/server 0.46.0-alpha.2 → 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;
@@ -887,17 +891,81 @@
887
891
  line-height: 1.5;
888
892
  }
889
893
 
890
- .health-primary {
891
- border-width: 2px;
892
- }
893
- .health-primary .value { font-size: var(--font-size-3xl); letter-spacing: 0.2px; }
894
- .health-primary.status-healthy .value { color: var(--status-healthy); }
895
- .health-primary.status-degraded .value { color: var(--status-degraded); }
896
- .health-primary.status-attention .value { color: var(--status-attention); }
894
+ .has-tooltip { cursor: help; }
897
895
  .health-loading-icon {
898
896
  animation: viewerLoadingSpin var(--duration-attention) linear infinite;
899
897
  }
900
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); }
968
+
901
969
  /* ── Buttons ───────────────────────────────────────────── */
902
970
 
903
971
  /* ── Button base ─────────────────────────────────────── */
@@ -1166,16 +1234,10 @@
1166
1234
  font-family: var(--font-sans);
1167
1235
  font-size: var(--font-size-md);
1168
1236
  }
1169
- .project-inventory-list {
1170
- display: grid;
1171
- gap: var(--sp-3);
1172
- margin-top: var(--sp-4);
1173
- }
1174
- .project-inventory-skeleton {
1175
- display: grid;
1176
- gap: var(--sp-3);
1177
- margin-top: var(--sp-4);
1178
- }
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); }
1179
1241
  .project-inventory-skeleton-row {
1180
1242
  padding: var(--sp-4);
1181
1243
  border: 1px solid var(--border);
@@ -1193,93 +1255,169 @@
1193
1255
  .project-inventory-skeleton-line.title { width: 42%; height: 16px; }
1194
1256
  .project-inventory-skeleton-line.meta { width: 68%; }
1195
1257
  .project-inventory-skeleton-line.signal { width: 86%; }
1196
- .project-inventory-row {
1197
- 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;
1198
1264
  border: 1px solid var(--border);
1199
1265
  border-radius: var(--radius-md);
1200
- background: var(--surface-1);
1201
1266
  }
1202
- .project-inventory-row-header {
1203
- display: flex;
1204
- justify-content: space-between;
1205
- gap: var(--sp-3);
1206
- 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;
1207
1277
  }
1208
- .project-inventory-title { font-size: var(--font-size-lg); font-weight: 650; color: var(--text-primary); }
1209
- .project-inventory-domain { font-family: var(--font-mono); font-size: var(--font-size-sm); color: var(--accent); }
1210
- .project-inventory-meta, .project-inventory-signal {
1211
- margin-top: var(--sp-2);
1212
- color: var(--text-secondary);
1213
- 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;
1214
1286
  }
1215
- .project-inventory-signal { overflow-wrap: anywhere; }
1216
- .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 {
1217
1314
  display: flex;
1218
- flex-wrap: wrap;
1315
+ align-items: center;
1219
1316
  gap: var(--sp-2);
1220
- margin-top: var(--sp-3);
1221
- }
1222
- .project-status-badge {
1223
- padding: 2px 8px;
1224
- border-radius: var(--radius-pill);
1225
- background: var(--surface-2);
1317
+ padding: var(--sp-3) var(--sp-4) var(--sp-3) 44px;
1318
+ cursor: pointer;
1226
1319
  color: var(--text-secondary);
1227
- font-size: var(--font-size-xs);
1228
- border: 1px solid var(--border);
1320
+ font-size: var(--font-size-sm);
1229
1321
  }
1230
- .project-status-badge.needs_attention,
1231
- .project-status-badge.legacy_review { color: var(--accent-warm); background: var(--accent-warm-subtle); }
1232
- .project-status-badge.suggested { color: var(--accent); background: var(--accent-subtle); }
1233
- .project-inventory-details { margin-top: var(--sp-3); }
1234
- .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); }
1235
1325
  .project-detail-grid {
1236
1326
  display: grid;
1237
- grid-template-columns: minmax(130px, max-content) 1fr;
1238
- gap: var(--sp-2) var(--sp-3);
1327
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1328
+ gap: var(--sp-2) var(--sp-4);
1239
1329
  margin-top: var(--sp-3);
1240
1330
  font-size: var(--font-size-sm);
1241
1331
  }
1332
+ .project-detail-pair { display: grid; grid-template-columns: minmax(130px, max-content) minmax(0, 1fr); gap: var(--sp-3); }
1242
1333
  .project-detail-grid dt { color: var(--text-tertiary); }
1243
1334
  .project-detail-grid dd { margin: 0; overflow-wrap: anywhere; color: var(--text-primary); }
1244
- .project-inventory-actions {
1245
- display: flex;
1246
- align-items: center;
1247
- flex-wrap: wrap;
1248
- gap: var(--sp-2);
1249
- margin-top: var(--sp-4);
1250
- }
1335
+ .project-inventory-actions { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2); margin-top: var(--sp-4); }
1251
1336
  .project-domain-select {
1252
1337
  min-width: min(100%, 260px);
1253
1338
  padding: var(--sp-2) var(--sp-3);
1254
- border-radius: var(--radius-sm);
1255
1339
  border: 1px solid var(--border);
1340
+ border-radius: var(--radius-sm);
1256
1341
  background: var(--input-bg);
1257
1342
  color: var(--text-primary);
1258
1343
  font-family: var(--font-sans);
1259
1344
  font-size: var(--font-size-md);
1260
1345
  }
1261
- .project-guardrail-confirmation {
1262
- flex-basis: 100%;
1263
- margin-top: var(--sp-2);
1264
- }
1346
+ .project-guardrail-confirmation { flex-basis: 100%; margin-top: var(--sp-2); }
1265
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); }
1266
1356
  .recipient-policy-review-section + .recipient-policy-review-section { margin-top: var(--sp-5); }
1267
1357
  .recipient-policy-review-heading { margin-bottom: var(--sp-2); }
1268
- .recipient-policy-review-status:empty { display: none; }
1269
- .recipient-policy-review-list { margin-top: var(--sp-3); }
1270
1358
  .recipient-policy-review-item .project-inventory-actions label {
1271
1359
  color: var(--text-secondary);
1272
1360
  font-size: var(--font-size-sm);
1273
1361
  font-weight: var(--font-weight-semibold);
1274
1362
  }
1275
- .recipient-policy-review-select { min-width: min(100%, 280px); }
1276
- .recipient-policy-deferred { margin-top: var(--sp-3); }
1277
- .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); }
1278
1411
  .recipient-policy-preview-list { margin-top: var(--sp-2); }
1279
1412
  .recipient-policy-preview-list ul {
1280
1413
  margin-top: var(--sp-1);
1281
1414
  padding-left: var(--sp-5);
1282
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
+ }
1283
1421
  .project-selection-actions,
1284
1422
  .recipient-policy-management-actions,
1285
1423
  .recipient-policy-sharing-actions {
@@ -1547,6 +1685,16 @@
1547
1685
  .recipient-policy-management-details li { overflow-wrap: anywhere; }
1548
1686
  .recipient-policy-management-status:empty { display: none; }
1549
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; }
1550
1698
  .recipient-policy-sharing-tabs {
1551
1699
  position: static;
1552
1700
  display: flex;
@@ -1574,6 +1722,89 @@
1574
1722
  gap: var(--sp-3);
1575
1723
  }
1576
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); }
1577
1808
  .recipient-policy-sharing-card,
1578
1809
  .recipient-policy-sharing-card-title,
1579
1810
  .recipient-policy-sharing-details dd { min-width: 0; overflow-wrap: anywhere; }
@@ -1607,10 +1838,6 @@
1607
1838
  }
1608
1839
  .recipient-policy-sharing-details dt { color: var(--text-secondary); }
1609
1840
  .recipient-policy-sharing-details dd { margin: 0; color: var(--text-primary); }
1610
- .recipient-policy-sharing-team-card > .recipient-policy-sharing-actions + .recipient-policy-sharing-actions {
1611
- margin-top: var(--sp-2);
1612
- }
1613
-
1614
1841
  .loading-card-list { display: grid; gap: var(--sp-3); }
1615
1842
  .loading-card {
1616
1843
  padding: var(--sp-4);
@@ -1760,10 +1987,177 @@
1760
1987
  .device-identity-review-panel ul { margin: var(--sp-3) 0; padding-left: var(--sp-5); }
1761
1988
  .device-identity-review-panel .peer-actions { margin-top: var(--sp-4); }
1762
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
+
1763
2151
  @media (max-width: 720px) {
1764
- .project-inventory-row-header { align-items: center; flex-wrap: wrap; }
1765
- .project-inventory-title { flex: 1 1 calc(100% - 48px); }
1766
- .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; }
1767
2161
  .recipient-policy-management-dialog .modal-card { width: calc(100vw - 16px); }
1768
2162
  .recipient-policy-management-actions,
1769
2163
  .recipient-policy-sharing-responsive-actions { display: grid; grid-template-columns: 1fr; }
@@ -1785,6 +2179,16 @@
1785
2179
  .device-identity-setup-summary { align-items: stretch; flex-direction: column; }
1786
2180
  .device-identity-setup-summary .settings-button,
1787
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%; }
1788
2192
  }
1789
2193
 
1790
2194
  /* 36×36 square icon buttons — theme toggle, settings gear. */
@@ -1932,7 +2336,9 @@
1932
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);
1933
2337
  }
1934
2338
  .toggle-button:hover { background: var(--toggle-hover-bg); color: var(--text-primary); }
1935
- .toggle-button.active {
2339
+ .toggle-button.active,
2340
+ .toggle-button[data-state="checked"],
2341
+ .toggle-button[aria-checked="true"] {
1936
2342
  background: var(--accent-subtle);
1937
2343
  color: var(--accent);
1938
2344
  box-shadow: inset 0 0 0 1px var(--accent-strong);
@@ -2007,18 +2413,14 @@
2007
2413
  .feed-skeleton-chip.w-56 { width: 56px; }
2008
2414
 
2009
2415
  /* ── Feed items ────────────────────────────────────────── */
2010
- /* Design-handoff clarification (2026-04-19): feed items render with
2011
- a full-width top banner in the kind's tint, not a 4px left rail.
2012
- Banner ~28px tall, --accent-subtle bg per kind, 1px accent-strong
2013
- bottom border; kind chip sits inset left inside the banner. */
2014
-
2015
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);
2016
2421
  border: 1px solid var(--border);
2017
- border-radius: var(--radius-md);
2422
+ border-radius: var(--radius-lg);
2018
2423
  background: var(--surface-1);
2019
- overflow: hidden;
2020
- display: flex;
2021
- flex-direction: column;
2022
2424
  box-shadow: var(--shadow-sm);
2023
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);
2024
2426
  }
@@ -2028,31 +2430,17 @@
2028
2430
  border-color: var(--border-hover);
2029
2431
  }
2030
2432
 
2031
- /* Kind banner — defaults to mint (feature). Per-kind overrides below. */
2032
- .feed-kind-banner {
2033
- padding: 7px var(--sp-5);
2034
- background: var(--accent-subtle);
2035
- border-bottom: 1px solid var(--accent-strong);
2036
- }
2037
- .feed-item.change .feed-kind-banner { background: var(--accent-cool-subtle); border-bottom-color: color-mix(in srgb, var(--accent-cool) 30%, transparent); }
2038
- .feed-item.bugfix .feed-kind-banner { background: var(--accent-warm-subtle); border-bottom-color: color-mix(in srgb, var(--accent-warm) 30%, transparent); }
2039
- .feed-item.refactor .feed-kind-banner { background: var(--accent-violet-subtle); border-bottom-color: color-mix(in srgb, var(--accent-violet) 30%, transparent); }
2040
- .feed-item.discovery .feed-kind-banner { background: var(--accent-steel-subtle); border-bottom-color: color-mix(in srgb, var(--accent-steel) 30%, transparent); }
2041
- .feed-item.docs .feed-kind-banner { background: var(--accent-ochre-subtle); border-bottom-color: color-mix(in srgb, var(--accent-ochre) 30%, transparent); }
2042
- .feed-item.test .feed-kind-banner { background: var(--accent-neutral-subtle); border-bottom-color: color-mix(in srgb, var(--accent-neutral) 30%, transparent); }
2043
- /* Core emits 'decision' / 'exploration' / 'session_summary' too — preserve
2044
- neutral treatments so those items aren't unstyled. */
2045
- .feed-item.decision .feed-kind-banner { background: var(--accent-neutral-subtle); border-bottom-color: color-mix(in srgb, var(--accent-neutral) 30%, transparent); }
2046
- .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); }
2047
- .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); }
2048
-
2433
+ .feed-kind-rail { align-self: start; min-width: 0; }
2049
2434
  .feed-card-body {
2050
2435
  padding: var(--sp-4) var(--sp-5);
2051
2436
  display: flex;
2052
2437
  flex-direction: column;
2053
2438
  gap: var(--sp-2);
2054
2439
  }
2055
-
2440
+ .feed-item > .feed-card-body {
2441
+ padding: 0;
2442
+ min-width: 0;
2443
+ }
2056
2444
  .feed-card-header {
2057
2445
  display: flex;
2058
2446
  align-items: flex-start;
@@ -2060,21 +2448,23 @@
2060
2448
  gap: var(--sp-3);
2061
2449
  }
2062
2450
  .feed-card-header > .feed-header { flex: 1; overflow: hidden; }
2063
-
2064
- .feed-header {
2451
+ .feed-card-side {
2065
2452
  display: flex;
2066
- align-items: center;
2067
- gap: var(--sp-2);
2068
- flex-wrap: wrap;
2453
+ flex-direction: column;
2454
+ align-items: flex-end;
2455
+ justify-content: space-between;
2069
2456
  min-width: 0;
2457
+ gap: var(--sp-3);
2070
2458
  }
2071
-
2072
- .feed-actions {
2459
+ .feed-card-side-top,
2460
+ .feed-card-side-bottom {
2073
2461
  display: flex;
2074
2462
  align-items: center;
2463
+ justify-content: flex-end;
2464
+ min-width: 0;
2075
2465
  gap: var(--sp-2);
2076
- flex-shrink: 0;
2077
2466
  }
2467
+ .feed-card-side-bottom { flex-wrap: wrap; }
2078
2468
 
2079
2469
  .feed-menu-panel {
2080
2470
  min-width: 180px;
@@ -2134,25 +2524,88 @@
2134
2524
  }
2135
2525
 
2136
2526
  .feed-title {
2137
- 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);
2138
2535
  font-size: var(--font-size-lg);
2139
- 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 {
2140
2550
  min-width: 0;
2141
- display: -webkit-box;
2142
- -webkit-box-orient: vertical;
2143
- -webkit-line-clamp: 2;
2144
2551
  overflow: hidden;
2145
- overflow-wrap: anywhere;
2146
- 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;
2147
2557
  }
2148
- .feed-card-subtitle {
2149
- width: 100%;
2558
+ .feed-meta-line {
2559
+ display: flex;
2560
+ align-items: center;
2561
+ flex-wrap: wrap;
2562
+ min-width: 0;
2563
+ gap: 6px;
2150
2564
  color: var(--text-tertiary);
2565
+ font-size: var(--font-size-sm);
2151
2566
  }
2567
+ .feed-project { color: var(--text-secondary); }
2152
2568
  .feed-meta {
2153
2569
  color: var(--text-tertiary);
2154
2570
  font-size: var(--font-size-sm);
2155
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
+ }
2156
2609
  /* Empty state renders as a terminal-output block — mono surface,
2157
2610
  blinking mint cursor — to match the codemem "warm local journal"
2158
2611
  voice and signal "this is a CLI-native tool." */
@@ -2190,12 +2643,6 @@
2190
2643
  50% { opacity: 0; }
2191
2644
  }
2192
2645
 
2193
- .feed-provenance {
2194
- display: flex;
2195
- flex-wrap: wrap;
2196
- gap: 6px;
2197
- }
2198
-
2199
2646
  /* ── Chip base ─────────────────────────────────────────── */
2200
2647
  /* Shared layout for every pill-shaped label in the viewer. Per-variant
2201
2648
  rules below only override background / color / border / typography.
@@ -2225,6 +2672,12 @@
2225
2672
  background: var(--surface-2);
2226
2673
  color: var(--text-tertiary);
2227
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
+ }
2228
2681
  .provenance-chip.mine { background: var(--accent-subtle); color: var(--accent); border-color: rgba(43, 122, 176, 0.18); }
2229
2682
  .provenance-chip.author { color: var(--text-secondary); }
2230
2683
  .provenance-chip.private { background: rgba(140, 140, 140, 0.12); color: var(--text-secondary); }
@@ -2241,10 +2694,61 @@
2241
2694
  }
2242
2695
 
2243
2696
  .feed-body {
2697
+ min-width: 0;
2698
+ overflow-wrap: anywhere;
2244
2699
  font-size: var(--font-size-md);
2245
2700
  line-height: 1.55;
2246
2701
  color: var(--text-secondary);
2247
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
+ }
2248
2752
  .feed-body.narrative { max-width: 88ch; }
2249
2753
  .feed-body.clamp { display: -webkit-box; -webkit-box-orient: vertical; overflow: hidden; }
2250
2754
  .feed-body.clamp-3 { -webkit-line-clamp: 3; }
@@ -2275,16 +2779,15 @@
2275
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); }
2276
2780
  .summary-section-content { font-size: var(--font-size-md); line-height: 1.5; color: var(--text-primary); }
2277
2781
 
2278
- .feed-footer {
2782
+ .feed-visibility-label {
2279
2783
  display: flex;
2280
- flex-wrap: wrap;
2281
- gap: var(--sp-2);
2282
- align-items: flex-start;
2283
- 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;
2284
2790
  }
2285
- .feed-footer-left { display: flex; flex-direction: column; gap: 6px; }
2286
- .feed-footer-right { display: flex; align-items: center; gap: var(--sp-2); flex-shrink: 0; }
2287
- .feed-visibility-controls { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
2288
2791
  .feed-visibility-select {
2289
2792
  min-width: 180px;
2290
2793
  padding: 6px 10px;
@@ -2294,22 +2797,8 @@
2294
2797
  color: var(--text-primary);
2295
2798
  font-family: var(--font-sans);
2296
2799
  font-size: var(--font-size-sm);
2297
- }
2298
- .feed-visibility-note { width: 100%; max-width: 60ch; font-size: var(--font-size-sm); color: var(--text-tertiary); }
2299
-
2300
- .feed-expand {
2301
- border: 1px solid var(--border);
2302
- background: transparent;
2303
- color: var(--text-tertiary);
2304
- padding: 3px 10px;
2305
- font-size: var(--font-size-xs);
2306
- transition: background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);
2307
- }
2308
- .feed-expand:hover { background: var(--accent-subtle); color: var(--accent); }
2309
- .feed-expand:focus-visible {
2310
- outline: 2px solid var(--accent);
2311
- outline-offset: 2px;
2312
- box-shadow: 0 0 0 4px var(--focus-ring);
2800
+ letter-spacing: normal;
2801
+ text-transform: none;
2313
2802
  }
2314
2803
 
2315
2804
  .feed-tags { display: flex; flex-wrap: wrap; gap: 6px; }
@@ -2317,6 +2806,9 @@
2317
2806
  filename is informative and earns its horizontal space. */
2318
2807
  .feed-files { display: flex; flex-wrap: wrap; gap: 6px; }
2319
2808
  .feed-file {
2809
+ max-width: 100%;
2810
+ overflow: hidden;
2811
+ text-overflow: ellipsis;
2320
2812
  padding: 2px 8px;
2321
2813
  border-radius: var(--radius-sm);
2322
2814
  background: var(--surface-2);
@@ -2330,7 +2822,7 @@
2330
2822
 
2331
2823
  /* ── Pills & badges ────────────────────────────────────── */
2332
2824
 
2333
- /* Kind chip — lives inside .feed-kind-banner. Tint + colored border
2825
+ /* Kind chip — lives inside .feed-kind-rail. Tint + colored border
2334
2826
  match the banner per kind so the chip reads as part of the strip. */
2335
2827
  .kind-chip {
2336
2828
  padding: 2px 10px;
@@ -2430,55 +2922,31 @@
2430
2922
 
2431
2923
  .health-update-banner {
2432
2924
  display: flex;
2433
- align-items: flex-start;
2434
- gap: var(--sp-3);
2435
- padding: var(--sp-4);
2925
+ align-items: center;
2926
+ flex-wrap: wrap;
2927
+ gap: var(--sp-2);
2928
+ padding: 10px var(--sp-4);
2436
2929
  border: 1px solid var(--border);
2437
- border-radius: var(--radius-lg);
2930
+ border-radius: var(--radius-md);
2438
2931
  background: var(--surface-1);
2439
- box-shadow: var(--shadow-sm);
2440
- }
2441
- .health-update-banner--current {
2442
- border-color: color-mix(in srgb, var(--status-healthy) 34%, var(--border));
2443
- background: color-mix(in srgb, var(--status-healthy) 7%, var(--surface-1));
2444
- }
2445
- .health-update-banner--available,
2446
- .health-update-banner--stale {
2447
- border-color: color-mix(in srgb, var(--accent-warm) 34%, var(--border));
2448
- background: color-mix(in srgb, var(--accent-warm-subtle) 34%, var(--surface-1));
2449
- }
2450
- .health-update-banner--unavailable {
2451
- border-color: color-mix(in srgb, var(--status-attention) 34%, var(--border));
2452
- background: color-mix(in srgb, var(--status-attention) 7%, var(--surface-1));
2932
+ color: var(--text-secondary);
2453
2933
  }
2454
2934
  .health-update-icon {
2455
- width: 20px;
2456
- height: 20px;
2457
- flex: 0 0 20px;
2458
- margin-top: 2px;
2935
+ width: 16px;
2936
+ height: 16px;
2937
+ flex: 0 0 16px;
2459
2938
  color: var(--accent);
2460
2939
  }
2461
- .health-update-banner--current .health-update-icon { color: var(--status-healthy); }
2462
- .health-update-banner--available .health-update-icon,
2463
- .health-update-banner--stale .health-update-icon { color: var(--accent-warm); }
2464
- .health-update-banner--unavailable .health-update-icon { color: var(--status-attention); }
2465
- .health-update-copy { min-width: 0; }
2466
- .health-update-copy h2 { font-size: var(--font-size-lg); line-height: 1.3; }
2467
- .health-update-copy p { margin-top: var(--sp-1); color: var(--text-secondary); }
2468
- .health-update-guidance { display: grid; gap: 3px; }
2469
- .health-update-guidance-label {
2470
- color: var(--text-tertiary);
2471
- font-size: var(--font-size-xs);
2472
- font-weight: var(--font-weight-semibold);
2473
- letter-spacing: 0.06em;
2474
- text-transform: uppercase;
2940
+ .health-update-source {
2941
+ background: var(--accent-cool-subtle);
2942
+ color: var(--accent-cool);
2475
2943
  }
2476
- .health-update-guidance code {
2477
- color: var(--text-primary);
2478
- font-family: var(--font-mono);
2479
- 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%;
2480
2947
  overflow-wrap: anywhere;
2481
2948
  }
2949
+ .health-update-copy-button { margin-left: auto; }
2482
2950
 
2483
2951
  .health-actions, .sync-actions {
2484
2952
  display: grid;
@@ -3056,7 +3524,8 @@
3056
3524
  animation: sync-attention-target var(--duration-attention) var(--ease-out);
3057
3525
  }
3058
3526
  .settings-button:disabled,
3059
- .settings-button[aria-disabled="true"] {
3527
+ .settings-button[aria-disabled="true"],
3528
+ .settings-save[aria-disabled="true"] {
3060
3529
  opacity: 0.55;
3061
3530
  cursor: not-allowed;
3062
3531
  }
@@ -3530,6 +3999,18 @@
3530
3999
  }
3531
4000
  .modal-body { display: flex; flex-direction: column; gap: var(--sp-3); flex: 1; min-height: 0; overflow-y: auto; padding-right: 6px; }
3532
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); }
3533
4014
  /* ── Toast (Radix Toast-backed) ───────────────────────── */
3534
4015
  /* Fixed viewport anchored bottom-right. Each toast is a surface-card
3535
4016
  with a severity-tinted left accent keyed to .toast-{variant}. */
@@ -3690,6 +4171,23 @@
3690
4171
  color: var(--accent);
3691
4172
  background: var(--accent-subtle);
3692
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
+ }
3693
4191
  .settings-panel { display: flex; flex-direction: column; gap: var(--sp-3); }
3694
4192
  .settings-panel[data-state="inactive"] { display: none; }
3695
4193
  .settings-panel[hidden] { display: none; }
@@ -3849,6 +4347,19 @@
3849
4347
  }
3850
4348
 
3851
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); }
3852
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); }
3853
4364
  .settings-select-trigger {
3854
4365
  display: inline-flex;
@@ -3909,7 +4420,9 @@
3909
4420
  justify-content: flex-start;
3910
4421
  gap: 10px;
3911
4422
  flex: 0 1 auto;
4423
+ flex-wrap: wrap;
3912
4424
  }
4425
+ .settings-switch-row .settings-outcome { flex-basis: 100%; }
3913
4426
  .settings-switch-copy {
3914
4427
  color: var(--text-primary);
3915
4428
  line-height: 1.35;
@@ -3972,6 +4485,19 @@
3972
4485
  transition: background var(--duration-fast) var(--ease-standard);
3973
4486
  }
3974
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
+ }
3975
4501
  .sync-dialog-card {
3976
4502
  width: min(560px, 100%);
3977
4503
  }
@@ -4119,8 +4645,8 @@
4119
4645
  50% { transform: scale(1.3); opacity: 0.5; }
4120
4646
  }
4121
4647
 
4122
- /* newPulse: fresh feed items pulse their kind-banner bottom border
4123
- 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
4124
4650
  applied by feed.ts only while state.newItemKeys holds the item's
4125
4651
  key (700ms useEffect then clears it). Skipped entirely under
4126
4652
  prefers-reduced-motion so the ambient accessibility pass still
@@ -4157,12 +4683,9 @@
4157
4683
  .tab-btn { flex-shrink: 0; }
4158
4684
  .tab-panel { padding: var(--sp-4); }
4159
4685
  .summary-row { grid-template-columns: 1fr; }
4160
- .feed-card-header { flex-wrap: wrap; }
4161
- .feed-actions { width: 100%; justify-content: flex-end; }
4686
+ .health-tile-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
4162
4687
  .actor-row { align-items: stretch; flex-direction: column; }
4163
4688
  .peer-scope-row { grid-template-columns: 1fr; }
4164
- .feed-visibility-controls { align-items: stretch; }
4165
- .feed-visibility-select { width: 100%; }
4166
4689
  .actor-actions { justify-content: flex-start; }
4167
4690
  .legacy-review-header { flex-direction: column; }
4168
4691
  .legacy-review-group-main { grid-template-columns: 1fr; }
@@ -4171,6 +4694,41 @@
4171
4694
  .legacy-review-bulk-row .settings-save { width: 100%; }
4172
4695
  }
4173
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
+
4174
4732
  @media (max-width: 720px) {
4175
4733
  .header-title { font-size: var(--font-size-xl); }
4176
4734
  }
@@ -4221,7 +4779,9 @@
4221
4779
 
4222
4780
  @media (prefers-reduced-motion: reduce) {
4223
4781
  .health-loading-icon,
4224
- .viewer-reconnect-spinner {
4782
+ .viewer-reconnect-spinner,
4783
+ .feed-detail,
4784
+ .feed-item.new-item {
4225
4785
  animation: none;
4226
4786
  }
4227
4787
  *, *::before, *::after {
@@ -4512,15 +5072,21 @@
4512
5072
  <!-- ── Tab: Health ─────────────────────────────────────── -->
4513
5073
  <div class="tab-panel" id="tab-health" hidden>
4514
5074
  <div id="healthUpdateBanner" hidden></div>
4515
- <div class="card" style="animation-delay: 0s">
4516
- <div class="section-header">
4517
- <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>
4518
5085
  <button class="settings-button" id="healthOpenDiagnostics" type="button">View diagnostics</button>
4519
5086
  </div>
4520
- <div class="section-meta" id="healthMeta" role="status" aria-live="polite" aria-atomic="true">Assessing health signals…</div>
4521
5087
  <div class="health-actions" id="healthActions"></div>
4522
- <div class="grid-2" id="healthGrid"></div>
4523
- </div>
5088
+ <div id="healthGrid"></div>
5089
+ </section>
4524
5090
 
4525
5091
  <div class="summary-row">
4526
5092
  <div class="card" style="animation-delay: 0.05s">
@@ -4541,20 +5107,17 @@
4541
5107
  <div id="recipientPolicyReviewMount" hidden></div>
4542
5108
  <div class="card" style="animation-delay: 0s">
4543
5109
  <div class="section-header">
4544
- <div>
4545
- <h2>Projects</h2>
4546
- <div class="section-meta">Choose exact Projects, then share them with Teams or Identities.</div>
4547
- </div>
5110
+ <h2>Projects</h2>
4548
5111
  <div class="section-actions project-selection-actions">
4549
5112
  <span class="section-meta" id="projectsSelectionStatus" role="status" aria-live="polite">0 Projects selected.</span>
4550
- <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>
4551
5114
  </div>
4552
5115
  </div>
4553
5116
  <div class="projects-toolbar">
4554
- <input class="feed-search" id="projectsSearch" placeholder="Search project, path, git remote, or workspace id…" />
4555
- <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>
4556
5120
  </div>
4557
- <div class="section-meta" id="projectsInventoryMeta">Loading project inventory…</div>
4558
5121
  <div class="project-inventory-skeleton" id="projectsInventorySkeleton" role="status" aria-label="Loading project inventory" aria-busy="true">
4559
5122
  <div class="project-inventory-skeleton-row">
4560
5123
  <div class="project-inventory-skeleton-line title"></div>
@@ -4574,8 +5137,7 @@
4574
5137
  </div>
4575
5138
  </div>
4576
5139
  <details class="card project-advanced-surface">
4577
- <summary>Advanced Project invitations</summary>
4578
- <div class="section-meta">Use the legacy invitation flow when the recipient does not have an Identity yet.</div>
5140
+ <summary>Invite someone</summary>
4579
5141
  <div class="section-actions" id="projectShareFlowMount"></div>
4580
5142
  </details>
4581
5143
  </div>
@@ -4592,39 +5154,33 @@
4592
5154
 
4593
5155
  <!-- ── Tab: Advanced ───────────────────────────────────── -->
4594
5156
  <div class="tab-panel" id="tab-advanced" hidden>
4595
- <div class="card">
4596
- <div class="section-header advanced-legacy-header">
4597
- <div>
4598
- <h2>Advanced</h2>
4599
- <div class="section-meta">Device sync, legacy Team and Space setup, and coordinator administration.</div>
4600
- </div>
4601
- <div class="section-actions" aria-label="Advanced sections" role="group">
4602
- <button class="settings-button" id="advancedSyncButton" type="button" aria-pressed="true">Sync</button>
4603
- <button class="settings-button" id="advancedTeamsButton" type="button" aria-pressed="false">Coordinator Administration</button>
4604
- </div>
4605
- </div>
4606
- </div>
5157
+ <h2 class="advanced-heading">Advanced</h2>
5158
+ <div id="advancedTabsMount"></div>
4607
5159
 
4608
- <div id="advancedSyncContent">
5160
+ <div id="advancedSyncContent" role="tabpanel" aria-labelledby="advancedSyncButton">
4609
5161
 
4610
5162
  <!-- Sub-view: main Sync surface. Toggled by syncViewController and
4611
5163
  app compatibility routing for canonical and legacy hashes. -->
4612
5164
  <div id="syncMainView">
4613
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
+
4614
5175
  <!-- 1. Needs attention + team setup/status -->
4615
5176
  <div class="card" id="syncTeamCard">
4616
5177
  <div class="section-header">
4617
5178
  <div class="section-header-title">
4618
- <h2>Team sync</h2>
5179
+ <h2>Join a team</h2>
4619
5180
  <span class="sync-online-badge" id="syncOnlineBadge" hidden role="status" aria-live="polite"></span>
4620
5181
  </div>
4621
- <div class="section-actions">
4622
- <button class="settings-button" id="syncShareProjectsButton" type="button">Share projects</button>
4623
- <button class="settings-button" id="syncNowButton">Sync now</button>
4624
- <a class="sync-subview-link" href="#advanced/sync/diagnostics">View diagnostics &rarr;</a>
4625
- </div>
4626
5182
  </div>
4627
- <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>
4628
5184
  <div class="sync-skeleton" id="syncTeamSkeleton" role="status" aria-label="Loading team sync">
4629
5185
  <div class="sync-skeleton-line medium"></div>
4630
5186
  <div class="sync-skeleton-block"></div>
@@ -4634,10 +5190,9 @@
4634
5190
  <div id="syncSetupPanel">
4635
5191
  <div id="syncJoinSection">
4636
5192
  <h3 class="settings-group-title">Join a team</h3>
4637
- <div class="section-meta">Have an invite? Paste it here.</div>
4638
- <div class="actor-create-row" id="syncJoinPanel">
4639
- <label for="syncJoinInvite" class="sr-only">Team invite or pairing payload</label>
4640
- <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>
4641
5196
  <div id="syncProjectInviteReview" role="region" aria-labelledby="syncProjectInviteReviewHeading" hidden>
4642
5197
  <h4 id="syncProjectInviteReviewHeading" tabindex="-1">Review project invitation</h4>
4643
5198
  <div class="section-meta" id="syncProjectInviteContext"></div>
@@ -4646,6 +5201,15 @@
4646
5201
  <label for="syncRecipientDeviceName">This device</label>
4647
5202
  <input class="feed-search" id="syncRecipientDeviceName" maxlength="120" />
4648
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>
4649
5213
  <button class="settings-button" id="syncJoinButton">Review invite</button>
4650
5214
  </div>
4651
5215
  </div>
@@ -4661,19 +5225,24 @@
4661
5225
  </div>
4662
5226
  </div>
4663
5227
 
4664
- <!-- 2. People & devices -->
5228
+ <!-- 2. People and devices -->
4665
5229
  <div class="card" style="animation-delay: 0.04s">
4666
- <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>
4667
5234
 
4668
- <h3 class="settings-group-title">Project sharing</h3>
4669
- <div class="section-meta" id="syncProjectShareOperationsMeta">Loading project sharing status…</div>
4670
- <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>
4671
5240
 
4672
- <details class="project-inventory-details" style="margin-top: 20px">
5241
+ <details class="project-inventory-details" id="manualDeviceIdentityControls" style="margin-top: 20px">
4673
5242
  <summary>Manual device and identity controls</summary>
4674
5243
 
4675
5244
  <h3 class="settings-group-title">People</h3>
4676
- <div class="section-meta" id="syncActorsMeta">Create and rename people here. Assign each device below.</div>
5245
+ <div class="section-meta" id="syncActorsMeta"></div>
4677
5246
  <div class="actor-create-row">
4678
5247
  <div class="sync-labeled-field">
4679
5248
  <label for="syncActorCreateInput" class="sync-labeled-field-caption">Person name</label>
@@ -4694,21 +5263,6 @@
4694
5263
  <div class="device-row-skeleton"><span class="skel-pip"></span><span class="skel-name"></span><span class="skel-chip"></span></div>
4695
5264
  <div class="device-row-skeleton"><span class="skel-pip"></span><span class="skel-name"></span><span class="skel-chip"></span></div>
4696
5265
  </div>
4697
-
4698
- <h3 class="settings-group-title" style="margin-top: 20px">Connect another device</h3>
4699
- <div class="section-meta">Share this command on the new device to join it to the team.</div>
4700
- <div class="actor-create-row">
4701
- <div id="syncPairingDisclosureMount" style="display: contents"></div>
4702
- </div>
4703
- <div id="syncPairingPanelMount" style="display: contents"></div>
4704
- </details>
4705
-
4706
- <div id="syncSharingReview" hidden>
4707
- <h3 class="settings-group-title" style="margin-top: 20px">What teammates will receive</h3>
4708
- <div class="section-meta" id="syncSharingReviewMeta"></div>
4709
- <div class="actor-list" id="syncSharingReviewList"></div>
4710
- </div>
4711
-
4712
5266
  <div id="syncLegacyClaims" hidden>
4713
5267
  <h3 class="settings-group-title" style="margin-top: 20px">Legacy device history</h3>
4714
5268
  <div class="peer-meta" id="syncLegacyClaimsMeta"></div>
@@ -4718,6 +5272,7 @@
4718
5272
  <button class="sync-legacy-button" id="syncLegacyClaimButton">Attach device history</button>
4719
5273
  </div>
4720
5274
  </div>
5275
+ </details>
4721
5276
  </div>
4722
5277
 
4723
5278
  </div><!-- /#syncMainView -->
@@ -4739,7 +5294,8 @@
4739
5294
  </label>
4740
5295
  </div>
4741
5296
  </div>
4742
- <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>
4743
5299
  <div class="sync-skeleton" id="syncDiagSkeleton" role="status" aria-label="Loading diagnostics">
4744
5300
  <div class="sync-skeleton-line long"></div>
4745
5301
  <div class="sync-skeleton-line medium"></div>
@@ -4754,30 +5310,21 @@
4754
5310
  </div><!-- /#syncDiagnosticsView -->
4755
5311
  </div><!-- /#advancedSyncContent -->
4756
5312
 
4757
- <div id="advancedTeamsContent" hidden>
5313
+ <div id="advancedTeamsContent" role="tabpanel" aria-labelledby="advancedTeamsButton" hidden>
4758
5314
  <div class="card">
4759
- <aside
4760
- aria-labelledby="coordinatorAdminLegacyNoticeTitle"
4761
- class="coordinator-admin-inline-warning coordinator-admin-legacy-notice"
4762
- role="note"
4763
- >
4764
- <div class="coordinator-admin-legacy-notice-copy">
4765
- <h3 id="coordinatorAdminLegacyNoticeTitle" tabindex="-1">Looking for Team settings?</h3>
4766
- <div class="peer-submeta">
4767
- Manage Team members, names, and Project access in Sharing. Use this page only for older coordinator groups and Spaces.
4768
- </div>
4769
- </div>
4770
- <button class="settings-button" id="coordinatorAdminOpenSharing" type="button">Open Sharing</button>
4771
- </aside>
4772
- <details class="advanced-administration-disclosure" open>
4773
- <summary>Coordinator Administration</summary>
4774
- <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>
4775
5322
  <div id="coordinatorAdminMount"></div>
4776
5323
  </details>
4777
5324
  </div>
4778
5325
  </div>
4779
5326
  </div>
4780
5327
 
4781
- <script src="/assets/app.js?v=38689c7c378b"></script>
5328
+ <script src="/assets/app.js?v=a52e5e81ae2c"></script>
4782
5329
  </body>
4783
5330
  </html>