@crewlethq/ui 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +40 -4
  2. package/dist/AccessDeniedCard/index.js +2 -2
  3. package/dist/AppShell/index.js +2 -2
  4. package/dist/ArrangeBoard/ArrangeBoard.d.ts +32 -0
  5. package/dist/ArrangeBoard/index.d.ts +3 -0
  6. package/dist/ArrangeBoard/index.js +2 -0
  7. package/dist/ArrangeBoard-MQE35P6Z.css +80 -0
  8. package/dist/ArrangeFrame/ArrangeFrame.d.ts +82 -0
  9. package/dist/ArrangeFrame/index.d.ts +5 -0
  10. package/dist/ArrangeFrame/index.js +5 -0
  11. package/dist/ArrangeFrame/useGridResize.d.ts +66 -0
  12. package/dist/ArrangeFrame-3PLZAG22.css +329 -0
  13. package/dist/ArrangeGroup/ArrangeGroup.d.ts +42 -0
  14. package/dist/ArrangeGroup/index.d.ts +3 -0
  15. package/dist/ArrangeGroup/index.js +4 -0
  16. package/dist/ArrangeGroup-SHFHA7BE.css +170 -0
  17. package/dist/ArrangeList/ArrangeList.d.ts +64 -0
  18. package/dist/ArrangeList/index.d.ts +3 -0
  19. package/dist/ArrangeList/index.js +10 -0
  20. package/dist/ArrangeList-NNRTDFI5.css +94 -0
  21. package/dist/ArtifactCard/index.js +2 -2
  22. package/dist/AuthLayout/index.js +2 -2
  23. package/dist/AvatarPicker/index.js +4 -4
  24. package/dist/Canvas/index.js +2 -2
  25. package/dist/Card/index.js +1 -1
  26. package/dist/Checkbox/index.js +3 -3
  27. package/dist/Combobox/index.js +4 -4
  28. package/dist/CommandPalette/index.js +6 -6
  29. package/dist/CommentThread/CommentThread.d.ts +85 -0
  30. package/dist/CommentThread/index.d.ts +3 -0
  31. package/dist/CommentThread/index.js +16 -0
  32. package/dist/CommentThread-7VXOFTZO.css +90 -0
  33. package/dist/Composer/index.js +3 -3
  34. package/dist/ConfirmField/index.js +3 -3
  35. package/dist/ConflictNote/ConflictNote.d.ts +42 -0
  36. package/dist/ConflictNote/index.d.ts +3 -0
  37. package/dist/ConflictNote/index.js +4 -0
  38. package/dist/ConflictNote-DH77PYF7.css +27 -0
  39. package/dist/DataTable/index.js +8 -8
  40. package/dist/DataView/index.js +13 -13
  41. package/dist/DateTimePicker/index.js +3 -3
  42. package/dist/DiffView/DiffView.d.ts +59 -0
  43. package/dist/DiffView/diff.d.ts +97 -0
  44. package/dist/DiffView/index.d.ts +5 -0
  45. package/dist/DiffView/index.js +3 -0
  46. package/dist/DiffView-RVLIHTKG.css +91 -0
  47. package/dist/Divider/Divider.d.ts +15 -0
  48. package/dist/Divider/index.d.ts +3 -0
  49. package/dist/Divider/index.js +2 -0
  50. package/dist/Divider-3Z77ZAJH.css +37 -0
  51. package/dist/HuePicker/HuePicker.d.ts +16 -4
  52. package/dist/HuePicker/index.js +2 -2
  53. package/dist/{HuePicker-5QIUR6L7.css → HuePicker-PAIGH6LR.css} +6 -0
  54. package/dist/IconTile/IconTile.d.ts +23 -0
  55. package/dist/IconTile/index.d.ts +3 -0
  56. package/dist/IconTile/index.js +2 -0
  57. package/dist/IconTile-4GNWTLAW.css +30 -0
  58. package/dist/Input/index.js +2 -2
  59. package/dist/LinkInterstitial/index.js +4 -4
  60. package/dist/ListInput/index.js +5 -5
  61. package/dist/MarkdownEditor/index.js +2 -2
  62. package/dist/Menu/index.js +2 -2
  63. package/dist/Modal/Modal.d.ts +20 -0
  64. package/dist/Modal/index.js +3 -3
  65. package/dist/{Modal-RQAYGG4L.css → Modal-XOSV6FAH.css} +14 -0
  66. package/dist/Note/Note.d.ts +23 -0
  67. package/dist/Note/index.d.ts +3 -0
  68. package/dist/Note/index.js +2 -0
  69. package/dist/Note-RT4L6VUT.css +58 -0
  70. package/dist/OrgTable/index.js +5 -5
  71. package/dist/PeopleRail/PeopleRail.d.ts +52 -0
  72. package/dist/PeopleRail/index.d.ts +3 -0
  73. package/dist/PeopleRail/index.js +11 -0
  74. package/dist/PeopleRail-R64WVOSH.css +75 -0
  75. package/dist/PinTile/PinTile.d.ts +37 -0
  76. package/dist/PinTile/index.d.ts +3 -0
  77. package/dist/PinTile/index.js +4 -0
  78. package/dist/PinTile-IIA25MNZ.css +141 -0
  79. package/dist/PresenceStack/index.js +1 -1
  80. package/dist/PrincipalPicker/index.js +5 -5
  81. package/dist/Reorder/index.d.ts +2 -0
  82. package/dist/Reorder/index.js +4 -0
  83. package/dist/Reorder/useReorder.d.ts +138 -0
  84. package/dist/ShareDialog/index.js +7 -7
  85. package/dist/SheetGrid/index.js +5 -5
  86. package/dist/StatGroup/StatGroup.d.ts +7 -1
  87. package/dist/StatGroup/index.js +1 -1
  88. package/dist/{StatGroup-HVG6O62W.css → StatGroup-PADTJCUQ.css} +7 -0
  89. package/dist/Switcher/index.js +8 -8
  90. package/dist/TableCells/TableCells.d.ts +153 -0
  91. package/dist/TableCells/index.d.ts +3 -0
  92. package/dist/TableCells/index.js +10 -0
  93. package/dist/TableCells-3VN5N2M3.css +104 -0
  94. package/dist/TagsInput/index.js +3 -3
  95. package/dist/TimeWindowPicker/index.js +5 -5
  96. package/dist/TreeCanvas/index.js +3 -3
  97. package/dist/TreeGrid/index.js +2 -2
  98. package/dist/VersionCompare/VersionCompare.d.ts +70 -0
  99. package/dist/VersionCompare/index.d.ts +3 -0
  100. package/dist/VersionCompare/index.js +11 -0
  101. package/dist/VersionCompare-UUZOPTQO.css +68 -0
  102. package/dist/chunk-35XVR5JQ.js +81 -0
  103. package/dist/chunk-63WJLRB2.js +24 -0
  104. package/dist/{chunk-L4ZLXYPO.js → chunk-6A7P6II6.js} +1 -1
  105. package/dist/chunk-6KWNXIDE.js +18 -0
  106. package/dist/chunk-6MIXD6IW.js +49 -0
  107. package/dist/chunk-73QBUUYX.js +102 -0
  108. package/dist/{chunk-NZY77ZDU.js → chunk-7FQEUNHX.js} +4 -4
  109. package/dist/{chunk-2TZATTIU.js → chunk-7IJARUIF.js} +18 -5
  110. package/dist/{chunk-A7EBCHEG.js → chunk-A4VMJMXJ.js} +1 -1
  111. package/dist/chunk-AIVZVKYZ.js +126 -0
  112. package/dist/{chunk-76FXDZAZ.js → chunk-AJESMWJS.js} +4 -4
  113. package/dist/chunk-BVWSLXTY.js +187 -0
  114. package/dist/chunk-DEJHAOC5.js +279 -0
  115. package/dist/{chunk-ERV5BUS3.js → chunk-EIGEIT4O.js} +3 -3
  116. package/dist/chunk-EZBLOUWX.js +176 -0
  117. package/dist/chunk-FFMCMSJB.js +1 -0
  118. package/dist/{chunk-LFZ45HV2.js → chunk-G3EEUNZQ.js} +1 -1
  119. package/dist/{chunk-2YR5ZPQ3.js → chunk-HTCJSUIZ.js} +3 -3
  120. package/dist/{chunk-75CLJNDQ.js → chunk-I6NZKJGK.js} +1 -1
  121. package/dist/chunk-IXJHTFXG.js +17 -0
  122. package/dist/{chunk-3UAA4IWJ.js → chunk-JEDWC3GI.js} +1 -1
  123. package/dist/{chunk-QVAFL2LE.js → chunk-JXRI5YD2.js} +3 -3
  124. package/dist/{chunk-ZFH7H7GS.js → chunk-LOLELDBW.js} +1 -1
  125. package/dist/chunk-MUGM7SEG.js +88 -0
  126. package/dist/chunk-N4GFRW5C.js +96 -0
  127. package/dist/{chunk-KVT3TJVG.js → chunk-OIMAK5AE.js} +6 -6
  128. package/dist/chunk-QO7QEQKV.js +24 -0
  129. package/dist/{chunk-BOW2VUCH.js → chunk-T7ICFXEC.js} +1 -1
  130. package/dist/{chunk-2OLCUNG7.js → chunk-TBIZSQHB.js} +1 -1
  131. package/dist/{chunk-4U3GQ7D2.js → chunk-TODND5AD.js} +1 -1
  132. package/dist/chunk-UO7JZVCO.js +35 -0
  133. package/dist/{chunk-IFKBDRNJ.js → chunk-UXELEORU.js} +3 -3
  134. package/dist/{chunk-6NIMZ5XC.js → chunk-VJLYGPPE.js} +1 -1
  135. package/dist/{chunk-7QFAORCY.js → chunk-WHZFDS62.js} +1 -1
  136. package/dist/chunk-XJ2QEBMM.js +277 -0
  137. package/dist/{chunk-PA4CYTBY.js → chunk-XU4ZUGLE.js} +19 -4
  138. package/dist/{chunk-T3ZWBZ65.js → chunk-YSJYWQSP.js} +2 -2
  139. package/dist/{chunk-CXBAIVYZ.js → chunk-YSY6UJ4F.js} +1 -1
  140. package/dist/{chunk-EG6NYWVK.js → chunk-YZCJ63JF.js} +1 -1
  141. package/dist/generated/index.d.ts +15 -0
  142. package/dist/generated/index.js +89 -74
  143. package/dist/index.js +89 -74
  144. package/dist/styles.css +1533 -70
  145. package/package.json +3 -3
  146. package/dist/chunk-EXHQ2QVW.js +0 -1
  147. package/dist/{chunk-AQCV62K6.js → chunk-7ZNKEPLN.js} +1 -1
  148. package/dist/{chunk-OYOQU7O5.js → chunk-EDGCPVVD.js} +1 -1
  149. package/dist/{chunk-FYXRWBJJ.js → chunk-J2G4HGQM.js} +1 -1
  150. package/dist/{chunk-NS7BVLL3.js → chunk-JULMZNGT.js} +1 -1
  151. package/dist/{chunk-5NVKTB6E.js → chunk-L4H7SSWF.js} +1 -1
  152. package/dist/{chunk-ESKP3TXM.js → chunk-MSSZHDZI.js} +0 -0
  153. package/dist/{chunk-4GB57WIT.js → chunk-Q55TXPA3.js} +1 -1
  154. package/dist/{chunk-B2Z2CDM5.js → chunk-T5TFZ2JB.js} +1 -1
  155. package/dist/{chunk-AMH67MLM.js → chunk-TXAFKH2A.js} +1 -1
package/dist/styles.css CHANGED
@@ -1267,6 +1267,691 @@ a.crewlet-account-row__who:focus-visible {
1267
1267
  }
1268
1268
 
1269
1269
 
1270
+ /* ArrangeBoard-MQE35P6Z.css */
1271
+ /*
1272
+ * ArrangeBoard: the ground under a page being arranged. Two layers, both
1273
+ * under every block (the board is its own stacking context, so they sit above
1274
+ * its background and below its content): the hatch on `::after`, and the
1275
+ * column lanes on `::before`, shown only while a block is carried or resized.
1276
+ */
1277
+
1278
+ .crewlet-arrange-board {
1279
+ --crewlet-arrange-board-gap: var(--spacing-4);
1280
+ /* The hatch, as one value: the ground below and the notes standing on it
1281
+ draw the same lines. */
1282
+ --crewlet-arrange-board-hatch: repeating-linear-gradient(
1283
+ -45deg,
1284
+ var(--color-border-hatch) 0 1px,
1285
+ transparent 1px var(--spacing-2)
1286
+ );
1287
+
1288
+ min-width: 0;
1289
+ }
1290
+
1291
+ .crewlet-arrange-board.is-editing {
1292
+ position: relative;
1293
+ isolation: isolate;
1294
+ margin-inline: calc(var(--spacing-3) * -1);
1295
+ padding: var(--spacing-5) var(--spacing-3);
1296
+ border-radius: var(--radius-xl);
1297
+ }
1298
+
1299
+ /* Room to land below the last block while one is carried out of a group:
1300
+ a page made only of groups otherwise has no bare stretch of its own. */
1301
+ .crewlet-arrange-board.is-editing:has(.crewlet-arrange-group__body [data-reorder='dragging']) {
1302
+ padding-bottom: var(--spacing-11);
1303
+ }
1304
+
1305
+ /* The hatch: its own ink, the strong hairline's held back to 60%, one
1306
+ diagonal every half step, so the cards standing on it stay the loudest
1307
+ thing on the page. */
1308
+ .crewlet-arrange-board.is-editing::after {
1309
+ content: '';
1310
+ position: absolute;
1311
+ inset: 0;
1312
+ z-index: -1;
1313
+ border-radius: inherit;
1314
+ background: var(--crewlet-arrange-board-hatch);
1315
+ pointer-events: none;
1316
+ }
1317
+
1318
+ /* A note is an annotation on the ground, not a card on it: while the page is
1319
+ arranged its paper shows the hatch through, inside a group as well, where
1320
+ the group's own surface hides the ground. */
1321
+ .crewlet-arrange-board.is-editing .crewlet-note {
1322
+ background: var(--crewlet-arrange-board-hatch), var(--crewlet-note-paper);
1323
+ }
1324
+
1325
+ /* The lanes: one tile per column and its gap, as wide as the grid, so the
1326
+ twelfth tile's gap falls outside the board and is not drawn. */
1327
+ .crewlet-arrange-board.is-editing::before {
1328
+ content: '';
1329
+ position: absolute;
1330
+ inset: 0 var(--spacing-3);
1331
+ background: linear-gradient(
1332
+ to right,
1333
+ var(--color-brand-accent-soft) 0 calc(100% - var(--crewlet-arrange-board-gap)),
1334
+ transparent 0
1335
+ )
1336
+ 0 0 / calc((100% + var(--crewlet-arrange-board-gap)) / var(--crewlet-arrange-board-columns)) 100%
1337
+ repeat-x;
1338
+ opacity: 0;
1339
+ pointer-events: none;
1340
+ transition: opacity var(--motion-duration-base) var(--motion-easing-default);
1341
+ }
1342
+ .crewlet-arrange-board.is-editing:has([data-reorder='dragging'], .crewlet-arrange-frame.is-resizing)::before {
1343
+ opacity: 1;
1344
+ }
1345
+
1346
+ @media (prefers-reduced-motion: reduce) {
1347
+ .crewlet-arrange-board.is-editing::before {
1348
+ transition: none;
1349
+ }
1350
+ }
1351
+
1352
+
1353
+ /* ArrangeFrame-3PLZAG22.css */
1354
+ /*
1355
+ * ArrangeFrame: a block of a page being arranged.
1356
+ *
1357
+ * Off, the frame is layout only. Editing, the block keeps its own look at
1358
+ * rest; hovered or focused, one accent ring is drawn over its own edge and
1359
+ * its toolbar and resize handle appear. Every piece of chrome floats, so a
1360
+ * block is the same size while arranging as afterwards.
1361
+ */
1362
+
1363
+ .crewlet-arrange-frame {
1364
+ /* The corner every ring and bracket follows: a card's own. */
1365
+ --crewlet-arrange-frame-radius: var(--radius-lg);
1366
+ /* How far outside the block its ring is drawn; the chrome sits on the ring. */
1367
+ --crewlet-arrange-frame-outset: 0px;
1368
+
1369
+ position: relative;
1370
+ display: flex;
1371
+ flex-direction: column;
1372
+ min-width: 0;
1373
+ border-radius: var(--crewlet-arrange-frame-radius);
1374
+ }
1375
+
1376
+ .crewlet-arrange-frame__content {
1377
+ display: flex;
1378
+ flex: 1 1 auto;
1379
+ flex-direction: column;
1380
+ min-width: 0;
1381
+ min-height: 0;
1382
+ }
1383
+ .crewlet-arrange-frame__content > * {
1384
+ flex: 1 1 auto;
1385
+ min-height: 0;
1386
+ }
1387
+
1388
+ /* A height of the reader's: the content scrolls inside it. */
1389
+ .crewlet-arrange-frame.is-fixed-height .crewlet-arrange-frame__content > * {
1390
+ overflow: auto;
1391
+ overscroll-behavior: contain;
1392
+ }
1393
+
1394
+ /* ---- Editing ---------------------------------------------------------- */
1395
+
1396
+ /* The block itself is what moves: focused, its ring is its focus mark. The
1397
+ transparent outline is the one forced-colors mode paints in its place. */
1398
+ .crewlet-arrange-frame.is-editing:focus-visible {
1399
+ outline: 2px solid transparent;
1400
+ }
1401
+
1402
+ /* The surface is what a pointer moves a block by. */
1403
+ .crewlet-arrange-frame.is-editing:not(.is-container) {
1404
+ cursor: grab;
1405
+ }
1406
+ .crewlet-arrange-frame.is-editing:not(.is-container):active {
1407
+ cursor: grabbing;
1408
+ }
1409
+ .crewlet-arrange-frame.is-editing:not(.is-container) > .crewlet-arrange-frame__content {
1410
+ user-select: none;
1411
+ }
1412
+
1413
+ /*
1414
+ * THE ONE RING, over the block's own edge, on the innermost block the
1415
+ * pointer or the focus is in. A hairline drawn exactly over the block's own
1416
+ * 1px border, so the border turns to the accent rather than a second, heavier
1417
+ * line appearing around it.
1418
+ *
1419
+ * IT IS A LAYER OF ITS OWN, above the content. An outline is painted with the
1420
+ * block, under any content that is positioned or scrolls (a card with a fixed
1421
+ * height scrolls its list), and that content covered it. Positioned after the
1422
+ * content with no depth of its own, it paints over the content and under the
1423
+ * toolbar and the handle, which are raised.
1424
+ */
1425
+ .crewlet-arrange-frame.is-editing::after {
1426
+ content: '';
1427
+ position: absolute;
1428
+ inset: calc(var(--crewlet-arrange-frame-outset) * -1);
1429
+ box-sizing: border-box;
1430
+ border: 1px solid transparent;
1431
+ border-radius: inherit;
1432
+ pointer-events: none;
1433
+ }
1434
+ .crewlet-arrange-frame.is-editing:is(:hover, :focus-visible, :has(:focus-visible)):not(
1435
+ :has(.crewlet-arrange-frame:is(:hover, :focus-visible, :has(:focus-visible)))
1436
+ )::after,
1437
+ .crewlet-arrange-frame.is-selected::after,
1438
+ .crewlet-arrange-frame.is-resizing::after {
1439
+ border-color: var(--color-brand-accent);
1440
+ }
1441
+
1442
+ /* A block with no surface of its own takes its ring a step outside it. */
1443
+ .crewlet-arrange-frame.is-bare {
1444
+ --crewlet-arrange-frame-radius: var(--radius-md);
1445
+ --crewlet-arrange-frame-outset: var(--spacing-1);
1446
+ }
1447
+
1448
+ /* Carried, the block is the hole it leaves. */
1449
+ .crewlet-arrange-frame.is-editing[data-reorder='dragging']::after {
1450
+ border-style: dashed;
1451
+ border-color: var(--color-brand-accent);
1452
+ }
1453
+ .crewlet-arrange-frame[data-reorder='dragging'] > .crewlet-arrange-frame__content {
1454
+ opacity: 0.3;
1455
+ }
1456
+
1457
+ /* Where a block from another list will land: a bar of the accent in the gap
1458
+ before the block it will precede. */
1459
+ .crewlet-arrange-frame[data-reorder-target='before']::before {
1460
+ content: '';
1461
+ position: absolute;
1462
+ top: 0;
1463
+ bottom: 0;
1464
+ left: calc(var(--spacing-2) * -1 - 2px);
1465
+ width: 3px;
1466
+ border-radius: var(--radius-pill);
1467
+ background: var(--color-brand-accent);
1468
+ }
1469
+
1470
+ /* ...or after the last block, when it will land at the end. */
1471
+ .crewlet-arrange-frame[data-reorder-target='after']::before {
1472
+ content: '';
1473
+ position: absolute;
1474
+ top: 0;
1475
+ right: calc(var(--spacing-2) * -1 - 2px);
1476
+ bottom: 0;
1477
+ width: 3px;
1478
+ border-radius: var(--radius-pill);
1479
+ background: var(--color-brand-accent);
1480
+ }
1481
+
1482
+ /* Beside a block that spans its row, the bar runs along the gap above it,
1483
+ or below it when it is the last. */
1484
+ .crewlet-arrange-frame[data-reorder-line='horizontal'][data-reorder-target]::before {
1485
+ top: auto;
1486
+ right: 0;
1487
+ bottom: auto;
1488
+ left: 0;
1489
+ width: auto;
1490
+ height: 3px;
1491
+ }
1492
+ .crewlet-arrange-frame[data-reorder-line='horizontal'][data-reorder-target='before']::before {
1493
+ top: calc(var(--spacing-2) * -1 - 2px);
1494
+ }
1495
+ .crewlet-arrange-frame[data-reorder-line='horizontal'][data-reorder-target='after']::before {
1496
+ bottom: calc(var(--spacing-2) * -1 - 2px);
1497
+ }
1498
+
1499
+ /* Just added: one pulse of the accent around it. */
1500
+ .crewlet-arrange-frame.is-fresh {
1501
+ animation: crewlet-arrange-frame-fresh calc(var(--motion-duration-slow) * 4) var(--motion-easing-out) 1;
1502
+ }
1503
+ @keyframes crewlet-arrange-frame-fresh {
1504
+ 0%,
1505
+ 40% {
1506
+ box-shadow: 0 0 0 4px var(--color-brand-accent-soft);
1507
+ }
1508
+ 100% {
1509
+ box-shadow: 0 0 0 0 transparent;
1510
+ }
1511
+ }
1512
+
1513
+ /* ---- The toolbar -------------------------------------------------------- */
1514
+
1515
+ /* On the block's top edge, half outside it: clear of a card's own header
1516
+ links, and of the block above, which is a row gap away. */
1517
+ .crewlet-arrange-frame__bar {
1518
+ position: absolute;
1519
+ top: calc(var(--crewlet-arrange-frame-outset) * -1);
1520
+ right: var(--spacing-3);
1521
+ z-index: var(--z-index-raised);
1522
+ display: flex;
1523
+ align-items: center;
1524
+ gap: 2px;
1525
+ padding: 2px;
1526
+ border: 1px solid var(--color-border-default);
1527
+ border-radius: var(--radius-md);
1528
+ background: var(--color-surface-elevated);
1529
+ box-shadow: var(--shadow-md);
1530
+ transform: translateY(-50%);
1531
+ }
1532
+
1533
+ .crewlet-arrange-frame__sep:first-child {
1534
+ display: none;
1535
+ }
1536
+ .crewlet-arrange-frame__sep {
1537
+ align-self: stretch;
1538
+ width: 1px;
1539
+ margin: 3px 2px;
1540
+ background: var(--color-border-default);
1541
+ }
1542
+
1543
+ /* ---- Resize handles ------------------------------------------------------- */
1544
+
1545
+ .crewlet-arrange-frame__resize {
1546
+ position: absolute;
1547
+ z-index: var(--z-index-raised);
1548
+ padding: 0;
1549
+ border: 0;
1550
+ background: none;
1551
+ color: var(--color-text-tertiary);
1552
+ touch-action: none;
1553
+ }
1554
+ .crewlet-arrange-frame__grip {
1555
+ position: absolute;
1556
+ transition: background-color var(--motion-duration-fast) var(--motion-easing-default),
1557
+ border-color var(--motion-duration-fast) var(--motion-easing-default);
1558
+ }
1559
+ .crewlet-arrange-frame__resize:hover,
1560
+ .crewlet-arrange-frame__resize:focus-visible,
1561
+ .crewlet-arrange-frame.is-resizing .crewlet-arrange-frame__resize {
1562
+ color: var(--color-brand-accent);
1563
+ }
1564
+ .crewlet-arrange-frame__resize:focus-visible {
1565
+ outline: 2px solid var(--color-focus);
1566
+ outline-offset: 0;
1567
+ border-radius: var(--radius-sm);
1568
+ }
1569
+
1570
+ /* BOTH WAYS: a bracket in the corner, following the card's own radius. */
1571
+ .crewlet-arrange-frame__resize.is-corner {
1572
+ right: calc(var(--crewlet-arrange-frame-outset) * -1);
1573
+ bottom: calc(var(--crewlet-arrange-frame-outset) * -1);
1574
+ width: 22px;
1575
+ height: 22px;
1576
+ cursor: nwse-resize;
1577
+ }
1578
+ .crewlet-arrange-frame__resize.is-corner > .crewlet-arrange-frame__grip {
1579
+ right: 4px;
1580
+ bottom: 4px;
1581
+ width: 10px;
1582
+ height: 10px;
1583
+ border-right: 2px solid currentColor;
1584
+ border-bottom: 2px solid currentColor;
1585
+ border-bottom-right-radius: calc(var(--crewlet-arrange-frame-radius) - 4px);
1586
+ }
1587
+
1588
+ /* WIDTH ONLY: a grip on the right edge, the handle of a column splitter,
1589
+ in the corner bracket's colour and ringed in the page's ground so it reads
1590
+ over the card's border. */
1591
+ .crewlet-arrange-frame__resize.is-edge {
1592
+ top: 50%;
1593
+ right: calc(-7px - var(--crewlet-arrange-frame-outset));
1594
+ width: 14px;
1595
+ height: 36px;
1596
+ cursor: ew-resize;
1597
+ transform: translateY(-50%);
1598
+ }
1599
+ .crewlet-arrange-frame__resize.is-edge > .crewlet-arrange-frame__grip {
1600
+ top: 4px;
1601
+ bottom: 4px;
1602
+ left: 4px;
1603
+ width: 6px;
1604
+ border-radius: var(--radius-pill);
1605
+ background: currentColor;
1606
+ box-shadow: 0 0 0 2px var(--color-surface-background);
1607
+ }
1608
+
1609
+ /* ---- What shows when ---------------------------------------------------- */
1610
+
1611
+ /* The toolbar and the handle belong to the innermost block hovered or
1612
+ focused, and stay while its menu is open or it is being resized. */
1613
+ .crewlet-arrange-frame__bar,
1614
+ .crewlet-arrange-frame__resize {
1615
+ opacity: 0;
1616
+ pointer-events: none;
1617
+ transition: opacity var(--motion-duration-fast) var(--motion-easing-default);
1618
+ }
1619
+ .crewlet-arrange-frame.is-editing:is(:hover, :focus-visible, :has(:focus-visible)):not(
1620
+ :has(.crewlet-arrange-frame:is(:hover, :focus-visible, :has(:focus-visible)))
1621
+ )
1622
+ > :is(.crewlet-arrange-frame__bar, .crewlet-arrange-frame__resize),
1623
+ .crewlet-arrange-frame.is-editing > .crewlet-arrange-frame__bar:has([aria-expanded='true']),
1624
+ .crewlet-arrange-frame.is-editing:has(> .crewlet-arrange-frame__bar [aria-expanded='true'])
1625
+ > .crewlet-arrange-frame__resize,
1626
+ .crewlet-arrange-frame.is-resizing > :is(.crewlet-arrange-frame__bar, .crewlet-arrange-frame__resize) {
1627
+ opacity: 1;
1628
+ pointer-events: auto;
1629
+ }
1630
+ /* A touch screen has no hover to reveal them with. */
1631
+ @media (hover: none) {
1632
+ .crewlet-arrange-frame.is-editing > :is(.crewlet-arrange-frame__bar, .crewlet-arrange-frame__resize) {
1633
+ opacity: 1;
1634
+ pointer-events: auto;
1635
+ }
1636
+ }
1637
+
1638
+ /* ---- While resizing ------------------------------------------------------- */
1639
+
1640
+ /* The columns of the grid the block sits on, across its row. */
1641
+ .crewlet-arrange-frame__guides {
1642
+ position: absolute;
1643
+ top: 0;
1644
+ bottom: 0;
1645
+ z-index: var(--z-index-raised);
1646
+ display: grid;
1647
+ pointer-events: none;
1648
+ }
1649
+ .crewlet-arrange-frame__guides > span {
1650
+ border-inline: 1px dashed var(--color-brand-accent);
1651
+ background: var(--color-brand-accent-soft);
1652
+ opacity: 0.3;
1653
+ }
1654
+
1655
+ /* The size it will land at, over the middle of the block. */
1656
+ .crewlet-arrange-frame__size {
1657
+ position: absolute;
1658
+ top: 50%;
1659
+ left: 50%;
1660
+ z-index: calc(var(--z-index-raised) + 1);
1661
+ padding: var(--spacing-1) var(--spacing-3);
1662
+ border-radius: var(--radius-pill);
1663
+ background: var(--color-surface-inverse);
1664
+ color: var(--color-text-inverse);
1665
+ font-size: var(--font-size-xs);
1666
+ font-weight: var(--font-weight-medium);
1667
+ font-variant-numeric: tabular-nums;
1668
+ white-space: nowrap;
1669
+ transform: translate(-50%, -50%);
1670
+ pointer-events: none;
1671
+ }
1672
+
1673
+ @media (prefers-reduced-motion: reduce) {
1674
+ .crewlet-arrange-frame__bar,
1675
+ .crewlet-arrange-frame__resize,
1676
+ .crewlet-arrange-frame__grip {
1677
+ transition: none;
1678
+ }
1679
+ .crewlet-arrange-frame.is-fresh {
1680
+ animation: none;
1681
+ }
1682
+ }
1683
+
1684
+
1685
+ /* ArrangeGroup-SHFHA7BE.css */
1686
+ /*
1687
+ * ArrangeGroup: a titled band of blocks. The hue is the header's; the body
1688
+ * stays the page's ground, so the cards inside keep their own contrast.
1689
+ */
1690
+
1691
+ .crewlet-arrange-group {
1692
+ --crewlet-arrange-group-band: var(--color-surface-subtle);
1693
+ --crewlet-arrange-group-line: var(--color-border-default);
1694
+ --crewlet-arrange-group-ink: var(--color-text-primary);
1695
+ --crewlet-arrange-group-mark: var(--color-border-strong);
1696
+
1697
+ display: flex;
1698
+ flex-direction: column;
1699
+ min-width: 0;
1700
+ border: 1px solid var(--crewlet-arrange-group-line);
1701
+ border-radius: var(--radius-lg);
1702
+ background: var(--color-surface-background);
1703
+ overflow: clip;
1704
+ }
1705
+
1706
+ .crewlet-arrange-group--purple { --crewlet-arrange-group-band: var(--color-node-purple-fill); --crewlet-arrange-group-line: var(--color-node-purple-line); --crewlet-arrange-group-ink: var(--color-node-purple-ink); --crewlet-arrange-group-mark: var(--color-node-purple); }
1707
+ .crewlet-arrange-group--cyan { --crewlet-arrange-group-band: var(--color-node-cyan-fill); --crewlet-arrange-group-line: var(--color-node-cyan-line); --crewlet-arrange-group-ink: var(--color-node-cyan-ink); --crewlet-arrange-group-mark: var(--color-node-cyan); }
1708
+ .crewlet-arrange-group--green { --crewlet-arrange-group-band: var(--color-node-green-fill); --crewlet-arrange-group-line: var(--color-node-green-line); --crewlet-arrange-group-ink: var(--color-node-green-ink); --crewlet-arrange-group-mark: var(--color-node-green); }
1709
+ .crewlet-arrange-group--amber { --crewlet-arrange-group-band: var(--color-node-amber-fill); --crewlet-arrange-group-line: var(--color-node-amber-line); --crewlet-arrange-group-ink: var(--color-node-amber-ink); --crewlet-arrange-group-mark: var(--color-node-amber); }
1710
+ .crewlet-arrange-group--rose { --crewlet-arrange-group-band: var(--color-node-rose-fill); --crewlet-arrange-group-line: var(--color-node-rose-line); --crewlet-arrange-group-ink: var(--color-node-rose-ink); --crewlet-arrange-group-mark: var(--color-node-rose); }
1711
+ .crewlet-arrange-group--blue { --crewlet-arrange-group-band: var(--color-node-blue-fill); --crewlet-arrange-group-line: var(--color-node-blue-line); --crewlet-arrange-group-ink: var(--color-node-blue-ink); --crewlet-arrange-group-mark: var(--color-node-blue); }
1712
+
1713
+ .crewlet-arrange-group__head {
1714
+ display: flex;
1715
+ align-items: center;
1716
+ gap: var(--spacing-2);
1717
+ min-height: var(--size-row-lg);
1718
+ padding: var(--spacing-1) var(--spacing-3) var(--spacing-1) var(--spacing-2);
1719
+ border-bottom: 1px solid var(--crewlet-arrange-group-line);
1720
+ background: var(--crewlet-arrange-group-band);
1721
+ }
1722
+ .crewlet-arrange-group.is-collapsed .crewlet-arrange-group__head {
1723
+ border-bottom-color: transparent;
1724
+ }
1725
+
1726
+ .crewlet-arrange-group__toggle {
1727
+ display: inline-flex;
1728
+ flex: 0 1 auto;
1729
+ align-items: center;
1730
+ gap: var(--spacing-2);
1731
+ min-width: 0;
1732
+ min-height: var(--size-row-sm);
1733
+ padding: 0 var(--spacing-2);
1734
+ border: 0;
1735
+ border-radius: var(--radius-sm);
1736
+ background: none;
1737
+ color: var(--crewlet-arrange-group-ink);
1738
+ font: inherit;
1739
+ cursor: pointer;
1740
+ }
1741
+ /* Editing, the toggle is the chevron alone, a square of its own, so its
1742
+ hover never runs into the name field beside it. */
1743
+ .crewlet-arrange-group__toggle.is-icon {
1744
+ flex: 0 0 auto;
1745
+ justify-content: center;
1746
+ width: var(--size-row-sm);
1747
+ padding: 0;
1748
+ }
1749
+ .crewlet-arrange-group__toggle:hover {
1750
+ background: var(--color-surface-hover);
1751
+ }
1752
+ .crewlet-arrange-group__toggle:focus-visible {
1753
+ outline: 2px solid var(--color-focus);
1754
+ outline-offset: 0;
1755
+ }
1756
+
1757
+ .crewlet-arrange-group__chevron {
1758
+ flex-shrink: 0;
1759
+ transition: transform var(--motion-duration-fast) var(--motion-easing-default);
1760
+ }
1761
+ .crewlet-arrange-group.is-collapsed .crewlet-arrange-group__chevron {
1762
+ transform: rotate(-90deg);
1763
+ }
1764
+
1765
+ .crewlet-arrange-group__title,
1766
+ .crewlet-arrange-group__title-field {
1767
+ overflow: hidden;
1768
+ font-size: var(--font-size-md);
1769
+ font-weight: var(--font-weight-semibold);
1770
+ letter-spacing: var(--font-letter-spacing-tight);
1771
+ color: var(--crewlet-arrange-group-ink);
1772
+ text-overflow: ellipsis;
1773
+ white-space: nowrap;
1774
+ }
1775
+
1776
+ /* Editing, the name is typed where it is read: the title itself, which
1777
+ shows it is a field on hover and takes a ring when focused. */
1778
+ .crewlet-arrange-group__title-field {
1779
+ /* As wide as the name, so the count sits just after it. */
1780
+ field-sizing: content;
1781
+ min-width: 3ch;
1782
+ max-width: 100%;
1783
+ height: var(--size-row-sm);
1784
+ padding: 0 var(--spacing-2);
1785
+ border: 1px dashed transparent;
1786
+ border-radius: var(--radius-sm);
1787
+ background: transparent;
1788
+ font-family: inherit;
1789
+ cursor: text;
1790
+ transition: border-color var(--motion-duration-fast) var(--motion-easing-default),
1791
+ background-color var(--motion-duration-fast) var(--motion-easing-default);
1792
+ }
1793
+ .crewlet-arrange-group__title-field:hover {
1794
+ border-color: var(--crewlet-arrange-group-mark);
1795
+ }
1796
+ /* The ring is drawn over the field's own edge, never beside it. */
1797
+ .crewlet-arrange-group__title-field:focus-visible {
1798
+ outline: 2px solid var(--color-focus);
1799
+ outline-offset: -1px;
1800
+ border-style: solid;
1801
+ border-color: var(--color-focus);
1802
+ background: var(--color-surface-background);
1803
+ }
1804
+ .crewlet-arrange-group__title-field::placeholder {
1805
+ color: var(--color-text-tertiary);
1806
+ font-weight: var(--font-weight-regular);
1807
+ }
1808
+
1809
+ .crewlet-arrange-group__count {
1810
+ flex-shrink: 0;
1811
+ }
1812
+
1813
+ .crewlet-arrange-group__actions {
1814
+ display: inline-flex;
1815
+ align-items: center;
1816
+ gap: var(--spacing-1);
1817
+ margin-inline-start: auto;
1818
+ }
1819
+
1820
+ .crewlet-arrange-group__body {
1821
+ display: grid;
1822
+ grid-template-columns: repeat(var(--crewlet-arrange-columns, 12), minmax(0, 1fr));
1823
+ gap: var(--spacing-4);
1824
+ align-items: stretch;
1825
+ padding: var(--spacing-4);
1826
+ min-height: 5rem;
1827
+ }
1828
+ .crewlet-arrange-group__body[data-reorder-over='true'] {
1829
+ background: var(--color-brand-accent-soft);
1830
+ }
1831
+
1832
+ .crewlet-arrange-group__empty {
1833
+ display: flex;
1834
+ grid-column: 1 / -1;
1835
+ align-items: center;
1836
+ justify-content: center;
1837
+ min-height: 4rem;
1838
+ border: 1px dashed var(--color-border-strong);
1839
+ border-radius: var(--radius-md);
1840
+ font-size: var(--font-size-sm);
1841
+ color: var(--color-text-tertiary);
1842
+ pointer-events: none;
1843
+ }
1844
+
1845
+ @media (prefers-reduced-motion: reduce) {
1846
+ .crewlet-arrange-group__chevron,
1847
+ .crewlet-arrange-group__title-field {
1848
+ transition: none;
1849
+ }
1850
+ }
1851
+
1852
+ /* Arranging, the header is what a pointer moves the group by. */
1853
+ .crewlet-arrange-frame[draggable='true'] > .crewlet-arrange-frame__content > .crewlet-arrange-group > .crewlet-arrange-group__head {
1854
+ cursor: grab;
1855
+ }
1856
+
1857
+
1858
+ /* ArrangeList-NNRTDFI5.css */
1859
+ /*
1860
+ * ArrangeList: rows a reader puts in order and switches on and off.
1861
+ *
1862
+ * The row is a quiet inset band rather than a card: a panel holding eight of
1863
+ * them is a list, and eight bordered boxes read as eight separate objects.
1864
+ */
1865
+
1866
+ .crewlet-arrange-list {
1867
+ display: flex;
1868
+ flex-direction: column;
1869
+ gap: var(--spacing-1);
1870
+ margin: 0;
1871
+ padding: 0;
1872
+ list-style: none;
1873
+ }
1874
+
1875
+ .crewlet-arrange-list__item {
1876
+ display: flex;
1877
+ align-items: center;
1878
+ gap: var(--spacing-2);
1879
+ min-height: var(--size-row-lg);
1880
+ padding: var(--spacing-1) var(--spacing-2) var(--spacing-1) var(--spacing-1);
1881
+ border: 1px solid transparent;
1882
+ border-radius: var(--radius-md);
1883
+ background: var(--color-surface-subtle);
1884
+ transition: background-color var(--motion-duration-fast) var(--motion-easing-default),
1885
+ border-color var(--motion-duration-fast) var(--motion-easing-default);
1886
+ }
1887
+
1888
+ .crewlet-arrange-list__item:hover {
1889
+ border-color: var(--color-border-default);
1890
+ }
1891
+
1892
+ /* The row being carried is a gap in the list, outlined where it will land. */
1893
+ .crewlet-arrange-list__item[data-reorder='dragging'] {
1894
+ border-style: dashed;
1895
+ border-color: var(--color-border-strong);
1896
+ background: transparent;
1897
+ }
1898
+ .crewlet-arrange-list__item[data-reorder='dragging'] > * {
1899
+ opacity: 0.4;
1900
+ }
1901
+
1902
+ .crewlet-arrange-list__handle {
1903
+ flex-shrink: 0;
1904
+ cursor: grab;
1905
+ color: var(--color-text-tertiary);
1906
+ }
1907
+ .crewlet-arrange-list__handle:active {
1908
+ cursor: grabbing;
1909
+ }
1910
+
1911
+ .crewlet-arrange-list__label {
1912
+ display: inline-flex;
1913
+ align-items: center;
1914
+ gap: var(--spacing-2);
1915
+ }
1916
+
1917
+ .crewlet-arrange-list__icon {
1918
+ display: inline-flex;
1919
+ flex-shrink: 0;
1920
+ color: var(--color-text-secondary);
1921
+ }
1922
+
1923
+ /* The toggle takes the row's width, so its label is the row's target. */
1924
+ .crewlet-arrange-list__toggle {
1925
+ flex: 1 1 auto;
1926
+ min-width: 0;
1927
+ }
1928
+
1929
+ /* Off, the words step back; the switch itself already says off. */
1930
+ .crewlet-arrange-list__item.is-off .crewlet-arrange-list__icon,
1931
+ .crewlet-arrange-list__item.is-off .crewlet-switch__label,
1932
+ .crewlet-arrange-list__item.is-off .crewlet-checkbox__label {
1933
+ color: var(--color-text-tertiary);
1934
+ }
1935
+
1936
+ .crewlet-arrange-list__trailing {
1937
+ display: inline-flex;
1938
+ flex-shrink: 0;
1939
+ align-items: center;
1940
+ }
1941
+
1942
+ .crewlet-arrange-list__moves {
1943
+ display: inline-flex;
1944
+ flex-shrink: 0;
1945
+ gap: 2px;
1946
+ }
1947
+
1948
+ @media (prefers-reduced-motion: reduce) {
1949
+ .crewlet-arrange-list__item {
1950
+ transition: none;
1951
+ }
1952
+ }
1953
+
1954
+
1270
1955
  /* ArtifactCard-EXVAEBV6.css */
1271
1956
  /*
1272
1957
  * A card in a gallery: the preview on top at a fixed ratio, so a grid of them
@@ -5522,6 +6207,99 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5522
6207
  }
5523
6208
 
5524
6209
 
6210
+ /* CommentThread-7VXOFTZO.css */
6211
+ /* CommentThread: a document's remarks, one per row with a hairline between,
6212
+ then the field to add one. */
6213
+ .crewlet-comment-thread {
6214
+ display: flex;
6215
+ flex-direction: column;
6216
+ gap: var(--spacing-3);
6217
+ min-width: 0;
6218
+ }
6219
+
6220
+ .crewlet-comment-thread__heading {
6221
+ display: flex;
6222
+ align-items: center;
6223
+ gap: var(--spacing-2);
6224
+ margin: 0;
6225
+ color: var(--color-text-primary);
6226
+ font-size: var(--font-size-sm);
6227
+ font-weight: var(--font-weight-semibold);
6228
+ }
6229
+
6230
+ .crewlet-comment-thread__empty,
6231
+ .crewlet-comment-thread__hint {
6232
+ margin: 0;
6233
+ color: var(--color-text-tertiary);
6234
+ font-size: var(--font-size-compact);
6235
+ }
6236
+
6237
+ .crewlet-comment-thread__list {
6238
+ display: flex;
6239
+ flex-direction: column;
6240
+ margin: 0;
6241
+ padding: 0;
6242
+ list-style: none;
6243
+ }
6244
+
6245
+ .crewlet-comment-thread__comment {
6246
+ display: flex;
6247
+ flex-direction: column;
6248
+ gap: var(--spacing-2);
6249
+ min-width: 0;
6250
+ padding: var(--spacing-3) 0;
6251
+ border-bottom: 1px solid var(--color-border-default);
6252
+ }
6253
+
6254
+ .crewlet-comment-thread__head {
6255
+ display: flex;
6256
+ flex-wrap: wrap;
6257
+ align-items: center;
6258
+ gap: var(--spacing-2);
6259
+ min-width: 0;
6260
+ }
6261
+
6262
+ .crewlet-comment-thread__author {
6263
+ display: inline-flex;
6264
+ align-items: center;
6265
+ gap: var(--spacing-2);
6266
+ min-width: 0;
6267
+ }
6268
+
6269
+ .crewlet-comment-thread__name {
6270
+ overflow: hidden;
6271
+ color: var(--color-text-primary);
6272
+ font-weight: var(--font-weight-semibold);
6273
+ text-overflow: ellipsis;
6274
+ white-space: nowrap;
6275
+ }
6276
+
6277
+ .crewlet-comment-thread__meta {
6278
+ color: var(--color-text-tertiary);
6279
+ font-size: var(--font-size-xs);
6280
+ }
6281
+
6282
+ /* Reply sits at the row's far end, wherever the head wraps. */
6283
+ .crewlet-comment-thread__reply {
6284
+ margin-inline-start: auto;
6285
+ }
6286
+
6287
+ .crewlet-comment-thread__compose {
6288
+ display: flex;
6289
+ flex-direction: column;
6290
+ gap: var(--spacing-2);
6291
+ }
6292
+
6293
+ .crewlet-comment-thread__replying {
6294
+ display: flex;
6295
+ flex-wrap: wrap;
6296
+ align-items: center;
6297
+ gap: var(--spacing-2);
6298
+ color: var(--color-text-tertiary);
6299
+ font-size: var(--font-size-xs);
6300
+ }
6301
+
6302
+
5525
6303
  /* Composer-ABGJIAIR.css */
5526
6304
  /*
5527
6305
  * A message written in place: the field and its footer strip in one box. The
@@ -5613,6 +6391,36 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5613
6391
  }
5614
6392
 
5615
6393
 
6394
+ /* ConflictNote-DH77PYF7.css */
6395
+ /* ConflictNote: a refused write's sentence in the danger ink, with its glyph
6396
+ so the colour is never the only carrier, and its controls beside it. */
6397
+ .crewlet-conflict-note {
6398
+ display: flex;
6399
+ flex-wrap: wrap;
6400
+ align-items: center;
6401
+ gap: var(--spacing-1) var(--spacing-2);
6402
+ max-width: 40rem;
6403
+ color: var(--color-feedback-danger-ink);
6404
+ font-size: var(--font-size-compact);
6405
+ overflow-wrap: anywhere;
6406
+ }
6407
+
6408
+ .crewlet-conflict-note__glyph {
6409
+ flex: none;
6410
+ }
6411
+
6412
+ .crewlet-conflict-note__text {
6413
+ flex: 1 1 16rem;
6414
+ min-width: 0;
6415
+ }
6416
+
6417
+ .crewlet-conflict-note__actions {
6418
+ display: inline-flex;
6419
+ flex-wrap: wrap;
6420
+ gap: var(--spacing-1);
6421
+ }
6422
+
6423
+
5616
6424
  /* Container-3TSKMGNI.css */
5617
6425
  /*
5618
6426
  * Container, the centred content measure. One max-width scale shared by every
@@ -8754,6 +9562,100 @@ svg.crewlet-datetime__chevron {
8754
9562
  }
8755
9563
 
8756
9564
 
9565
+ /* DiffView-RVLIHTKG.css */
9566
+ /* DiffView: a line diff, monospace and line-numbered on both sides.
9567
+
9568
+ A changed line is marked three ways, a tint, a drawn mark and a word read
9569
+ in its place, because colour alone is not a signal and a printed or
9570
+ forced-colours render loses the tint entirely. The tint is the soft step of
9571
+ the state and the mark the matching ink step, the pairing the palette suite
9572
+ measures. */
9573
+ .crewlet-diff-view {
9574
+ overflow: hidden;
9575
+ border: 1px solid var(--color-border-default);
9576
+ border-radius: var(--radius-sm);
9577
+ font-family: var(--font-family-mono);
9578
+ font-size: var(--font-size-xs);
9579
+ line-height: var(--font-line-height-normal);
9580
+ }
9581
+
9582
+ .crewlet-diff-view__section + .crewlet-diff-view__section,
9583
+ .crewlet-diff-view__skip + .crewlet-diff-view__line {
9584
+ border-top: 1px solid var(--color-border-default);
9585
+ }
9586
+
9587
+ /* A GAP SAYS WHAT IT STANDS FOR. Silently closed, a document edited at both
9588
+ ends looks like one rewritten in the middle. */
9589
+ .crewlet-diff-view__skip {
9590
+ padding: var(--spacing-1) var(--spacing-3);
9591
+ background: var(--color-surface-elevated);
9592
+ color: var(--color-text-tertiary);
9593
+ font-family: var(--font-family-sans);
9594
+ font-size: var(--font-size-xs);
9595
+ }
9596
+
9597
+ .crewlet-diff-view__line {
9598
+ display: grid;
9599
+ grid-template-columns: 3.5ch 3.5ch 2ch minmax(0, 1fr);
9600
+ gap: var(--spacing-2);
9601
+ padding: calc(var(--spacing-1) / 4) var(--spacing-3) calc(var(--spacing-1) / 4) var(--spacing-2);
9602
+ }
9603
+
9604
+ .crewlet-diff-view__number {
9605
+ color: var(--color-text-tertiary);
9606
+ text-align: right;
9607
+ user-select: none;
9608
+ font-variant-numeric: tabular-nums;
9609
+ }
9610
+
9611
+ .crewlet-diff-view__mark {
9612
+ text-align: center;
9613
+ user-select: none;
9614
+ }
9615
+
9616
+ .crewlet-diff-view__text {
9617
+ white-space: pre-wrap;
9618
+ overflow-wrap: anywhere;
9619
+ }
9620
+
9621
+ .crewlet-diff-view__line--add {
9622
+ background: var(--color-feedback-success-soft);
9623
+ }
9624
+
9625
+ .crewlet-diff-view__line--add .crewlet-diff-view__mark {
9626
+ color: var(--color-feedback-success-ink);
9627
+ }
9628
+
9629
+ .crewlet-diff-view__line--remove {
9630
+ background: var(--color-feedback-danger-soft);
9631
+ }
9632
+
9633
+ .crewlet-diff-view__line--remove .crewlet-diff-view__mark {
9634
+ color: var(--color-feedback-danger-ink);
9635
+ }
9636
+
9637
+ /* DiffSummary: the size of the change, in the same inks as its lines. */
9638
+ .crewlet-diff-summary {
9639
+ margin: 0;
9640
+ color: var(--color-text-secondary);
9641
+ font-size: var(--font-size-compact);
9642
+ }
9643
+
9644
+ .crewlet-diff-summary__added,
9645
+ .crewlet-diff-summary__removed {
9646
+ font-family: var(--font-family-mono);
9647
+ font-variant-numeric: tabular-nums;
9648
+ }
9649
+
9650
+ .crewlet-diff-summary__added {
9651
+ color: var(--color-feedback-success-ink);
9652
+ }
9653
+
9654
+ .crewlet-diff-summary__removed {
9655
+ color: var(--color-feedback-danger-ink);
9656
+ }
9657
+
9658
+
8757
9659
  /* Disclosure-VKBJJIZ7.css */
8758
9660
  /*
8759
9661
  * The disclosure anatomy, declared once for every expander in the package.
@@ -8933,6 +9835,46 @@ svg.crewlet-datetime__chevron {
8933
9835
  }
8934
9836
 
8935
9837
 
9838
+ /* Divider-3Z77ZAJH.css */
9839
+ /* Divider: a rule across its space, with its name at its start or in its middle. */
9840
+
9841
+ .crewlet-divider {
9842
+ display: flex;
9843
+ align-items: center;
9844
+ gap: var(--spacing-3);
9845
+ min-height: var(--size-row-sm);
9846
+ min-width: 0;
9847
+ }
9848
+ .crewlet-divider::before,
9849
+ .crewlet-divider::after {
9850
+ content: '';
9851
+ flex: 1 1 auto;
9852
+ border-top: 1px solid var(--color-border-strong);
9853
+ }
9854
+ /* One rule unless the words sit in the middle of it. */
9855
+ .crewlet-divider:not(.crewlet-divider--center)::before {
9856
+ display: none;
9857
+ }
9858
+ .crewlet-divider:not(.crewlet-divider--labelled)::before {
9859
+ display: block;
9860
+ }
9861
+ .crewlet-divider:not(.crewlet-divider--labelled)::after {
9862
+ display: none;
9863
+ }
9864
+
9865
+ .crewlet-divider__label {
9866
+ flex: 0 1 auto;
9867
+ overflow: hidden;
9868
+ font-size: var(--font-size-xs);
9869
+ font-weight: var(--font-weight-medium);
9870
+ letter-spacing: var(--font-letter-spacing-wide);
9871
+ color: var(--color-text-tertiary);
9872
+ text-transform: uppercase;
9873
+ text-overflow: ellipsis;
9874
+ white-space: nowrap;
9875
+ }
9876
+
9877
+
8936
9878
  /* Document-PQGXJHB7.css */
8937
9879
  /*
8938
9880
  * Rendered markdown, set as a document (Document.tsx).
@@ -9698,7 +10640,7 @@ svg.crewlet-datetime__chevron {
9698
10640
  }
9699
10641
 
9700
10642
 
9701
- /* HuePicker-5QIUR6L7.css */
10643
+ /* HuePicker-PAIGH6LR.css */
9702
10644
  /*
9703
10645
  * A hue's swatch: the hue itself, as a dot beside its name. The name carries
9704
10646
  * the choice; the dot is there so the row can be scanned for a colour.
@@ -9718,6 +10660,12 @@ svg.crewlet-datetime__chevron {
9718
10660
  .crewlet-hue-picker__swatch--rose { background: var(--color-node-rose); }
9719
10661
  .crewlet-hue-picker__swatch--blue { background: var(--color-node-blue); }
9720
10662
 
10663
+ /* No hue: a ring in the hairline, so the row still reads as swatches. */
10664
+ .crewlet-hue-picker__swatch--none {
10665
+ box-sizing: border-box;
10666
+ border: 1px solid var(--color-border-strong);
10667
+ }
10668
+
9721
10669
 
9722
10670
  /* IconButton-VYWP6SGW.css */
9723
10671
  /*
@@ -9895,6 +10843,39 @@ svg.crewlet-datetime__chevron {
9895
10843
  }
9896
10844
 
9897
10845
 
10846
+ /* IconTile-4GNWTLAW.css */
10847
+ /*
10848
+ * IconTile: a glyph on a tinted square. Each hue pairs its fill and its ink
10849
+ * from one measured family (`--color-node-*`); left out, the brand accent's
10850
+ * soft fill and ink. No edge: the tile sits inside a card that has one.
10851
+ */
10852
+ .crewlet-icon-tile {
10853
+ --crewlet-icon-tile-fill: var(--color-brand-accent-soft);
10854
+ --crewlet-icon-tile-ink: var(--color-brand-accent-ink);
10855
+ --crewlet-icon-tile-size: var(--size-row-md);
10856
+
10857
+ display: inline-flex;
10858
+ flex: none;
10859
+ align-items: center;
10860
+ justify-content: center;
10861
+ width: var(--crewlet-icon-tile-size);
10862
+ height: var(--crewlet-icon-tile-size);
10863
+ border-radius: var(--radius-md);
10864
+ background: var(--crewlet-icon-tile-fill);
10865
+ color: var(--crewlet-icon-tile-ink);
10866
+ }
10867
+
10868
+ .crewlet-icon-tile--sm { --crewlet-icon-tile-size: var(--size-row-sm); }
10869
+ .crewlet-icon-tile--lg { --crewlet-icon-tile-size: var(--size-row-lg); border-radius: var(--radius-lg); }
10870
+
10871
+ .crewlet-icon-tile--purple { --crewlet-icon-tile-fill: var(--color-node-purple-fill); --crewlet-icon-tile-ink: var(--color-node-purple-ink); }
10872
+ .crewlet-icon-tile--cyan { --crewlet-icon-tile-fill: var(--color-node-cyan-fill); --crewlet-icon-tile-ink: var(--color-node-cyan-ink); }
10873
+ .crewlet-icon-tile--green { --crewlet-icon-tile-fill: var(--color-node-green-fill); --crewlet-icon-tile-ink: var(--color-node-green-ink); }
10874
+ .crewlet-icon-tile--amber { --crewlet-icon-tile-fill: var(--color-node-amber-fill); --crewlet-icon-tile-ink: var(--color-node-amber-ink); }
10875
+ .crewlet-icon-tile--rose { --crewlet-icon-tile-fill: var(--color-node-rose-fill); --crewlet-icon-tile-ink: var(--color-node-rose-ink); }
10876
+ .crewlet-icon-tile--blue { --crewlet-icon-tile-fill: var(--color-node-blue-fill); --crewlet-icon-tile-ink: var(--color-node-blue-ink); }
10877
+
10878
+
9898
10879
  /* ImageUpload-NVGMN7DP.css */
9899
10880
  /*
9900
10881
  * ImageUpload, the click-to-upload affordance built on Avatar.
@@ -12670,7 +13651,7 @@ svg.crewlet-datetime__chevron {
12670
13651
  }
12671
13652
 
12672
13653
 
12673
- /* Modal-RQAYGG4L.css */
13654
+ /* Modal-XOSV6FAH.css */
12674
13655
  /*
12675
13656
  * The modal surface: the veil, the frame, and the three bands inside it.
12676
13657
  *
@@ -12730,6 +13711,12 @@ svg.crewlet-datetime__chevron {
12730
13711
  }
12731
13712
 
12732
13713
  /* Inside a LayerHost the overlay covers the host, not the window. */
13714
+ /* The page behind stays as it is: see `backdrop` in Modal.tsx. */
13715
+ .crewlet-modal-overlay--clear {
13716
+ background: transparent;
13717
+ backdrop-filter: none;
13718
+ }
13719
+
12733
13720
  .crewlet-modal-overlay--in-host {
12734
13721
  position: absolute;
12735
13722
  }
@@ -13049,6 +14036,14 @@ svg.crewlet-datetime__chevron {
13049
14036
  margin: calc(var(--spacing-1) * -1);
13050
14037
  }
13051
14038
 
14039
+ /* The step back leads the head, its glyph on the title's inline start, as
14040
+ the close control's sits on the head's end. */
14041
+ .crewlet-modal__back {
14042
+ flex-shrink: 0;
14043
+ margin-inline-start: calc(var(--spacing-2) * -1);
14044
+ margin-block: calc(var(--spacing-1) * -1);
14045
+ }
14046
+
13052
14047
  .crewlet-modal__body {
13053
14048
  flex: 1 1 auto;
13054
14049
  min-height: 0;
@@ -13276,6 +14271,67 @@ svg.crewlet-datetime__chevron {
13276
14271
  }
13277
14272
 
13278
14273
 
14274
+ /* Note-RT4L6VUT.css */
14275
+ /*
14276
+ * Note: words on a coloured paper. Each hue pairs its fill with its own ink.
14277
+ */
14278
+
14279
+ .crewlet-note {
14280
+ --crewlet-note-paper: var(--color-surface-subtle);
14281
+ --crewlet-note-edge: var(--color-border-default);
14282
+ --crewlet-note-ink: var(--color-text-primary);
14283
+
14284
+ box-sizing: border-box;
14285
+ min-width: 0;
14286
+ min-height: 0;
14287
+ padding: var(--spacing-4);
14288
+ overflow: auto;
14289
+ border: 1px solid var(--crewlet-note-edge);
14290
+ border-radius: var(--radius-lg);
14291
+ background: var(--crewlet-note-paper);
14292
+ color: var(--crewlet-note-ink);
14293
+ font-size: var(--font-size-sm);
14294
+ line-height: var(--font-line-height-normal);
14295
+ overflow-wrap: anywhere;
14296
+ }
14297
+
14298
+ .crewlet-note--purple { --crewlet-note-paper: var(--color-node-purple-fill); --crewlet-note-edge: var(--color-node-purple-line); --crewlet-note-ink: var(--color-node-purple-ink); }
14299
+ .crewlet-note--cyan { --crewlet-note-paper: var(--color-node-cyan-fill); --crewlet-note-edge: var(--color-node-cyan-line); --crewlet-note-ink: var(--color-node-cyan-ink); }
14300
+ .crewlet-note--green { --crewlet-note-paper: var(--color-node-green-fill); --crewlet-note-edge: var(--color-node-green-line); --crewlet-note-ink: var(--color-node-green-ink); }
14301
+ .crewlet-note--amber { --crewlet-note-paper: var(--color-node-amber-fill); --crewlet-note-edge: var(--color-node-amber-line); --crewlet-note-ink: var(--color-node-amber-ink); }
14302
+ .crewlet-note--rose { --crewlet-note-paper: var(--color-node-rose-fill); --crewlet-note-edge: var(--color-node-rose-line); --crewlet-note-ink: var(--color-node-rose-ink); }
14303
+ .crewlet-note--blue { --crewlet-note-paper: var(--color-node-blue-fill); --crewlet-note-edge: var(--color-node-blue-line); --crewlet-note-ink: var(--color-node-blue-ink); }
14304
+
14305
+ .crewlet-note--center {
14306
+ display: flex;
14307
+ flex-direction: column;
14308
+ justify-content: center;
14309
+ text-align: center;
14310
+ }
14311
+
14312
+ .crewlet-note--lg {
14313
+ font-size: var(--font-size-lg);
14314
+ font-weight: var(--font-weight-medium);
14315
+ letter-spacing: var(--font-letter-spacing-tight);
14316
+ }
14317
+
14318
+ /* Prose inside takes the note's ink, links included. */
14319
+ .crewlet-note :is(p, li, h2, h3, h4, strong, em) {
14320
+ color: inherit;
14321
+ }
14322
+ .crewlet-note a {
14323
+ color: inherit;
14324
+ text-decoration: underline;
14325
+ text-underline-offset: 2px;
14326
+ }
14327
+ .crewlet-note > :first-child {
14328
+ margin-top: 0;
14329
+ }
14330
+ .crewlet-note > :last-child {
14331
+ margin-bottom: 0;
14332
+ }
14333
+
14334
+
13279
14335
  /* ObjectHeader-UNVYM2KD.css */
13280
14336
  /*
13281
14337
  * The header of an object: its eyebrow, its head row and its fact line.
@@ -14512,94 +15568,316 @@ svg.crewlet-datetime__chevron {
14512
15568
  }
14513
15569
 
14514
15570
 
14515
- /* PageHeader-6EYWQXRE.css */
14516
- /*
14517
- * The head of a screen.
14518
- *
14519
- * THE OPERATOR'S TITLE, NOT THE MARKETING ONE. It was the 32px display step
14520
- * over a 16px sentence, which is the type a landing page opens with: on a
14521
- * screen whose job is to show a table it took a third of the first fold and
14522
- * pushed the rows a reader came for below it, and it said the screen's name
14523
- * twice as loudly as the shell's own bar says it. The 20px step over the
14524
- * compact sentence is the head every screen on the dashboard wears, and it
14525
- * leaves the content the largest thing on the page.
14526
- */
14527
-
14528
- .crewlet-page-header {
14529
- display: flex;
14530
- align-items: flex-end;
14531
- justify-content: space-between;
14532
- gap: var(--spacing-3);
14533
- flex-wrap: wrap;
14534
- min-width: 0;
15571
+ /* PageHeader-6EYWQXRE.css */
15572
+ /*
15573
+ * The head of a screen.
15574
+ *
15575
+ * THE OPERATOR'S TITLE, NOT THE MARKETING ONE. It was the 32px display step
15576
+ * over a 16px sentence, which is the type a landing page opens with: on a
15577
+ * screen whose job is to show a table it took a third of the first fold and
15578
+ * pushed the rows a reader came for below it, and it said the screen's name
15579
+ * twice as loudly as the shell's own bar says it. The 20px step over the
15580
+ * compact sentence is the head every screen on the dashboard wears, and it
15581
+ * leaves the content the largest thing on the page.
15582
+ */
15583
+
15584
+ .crewlet-page-header {
15585
+ display: flex;
15586
+ align-items: flex-end;
15587
+ justify-content: space-between;
15588
+ gap: var(--spacing-3);
15589
+ flex-wrap: wrap;
15590
+ min-width: 0;
15591
+ }
15592
+
15593
+ .crewlet-page-header__lead {
15594
+ display: flex;
15595
+ flex-direction: column;
15596
+ /* One step. The title and the sentence under it are ONE block: at the
15597
+ 8px step they read as a heading with a caption parked below it. */
15598
+ gap: var(--spacing-1);
15599
+ min-width: 0;
15600
+ /* Takes the row, so the actions wrap under the title rather than squeezing
15601
+ a long screen name into two words and an ellipsis. */
15602
+ flex: 1 1 auto;
15603
+ }
15604
+
15605
+ .crewlet-page-header__titles {
15606
+ display: flex;
15607
+ align-items: center;
15608
+ gap: var(--spacing-2);
15609
+ flex-wrap: wrap;
15610
+ min-width: 0;
15611
+ }
15612
+
15613
+ /*
15614
+ * THE TITLE KEEPS THE PAGE'S OWN LEADING. It is a heading element, and the
15615
+ * document baseline sets every heading at the tight step, which is the right
15616
+ * answer for a stack of headings in prose and the wrong one here: this is one
15617
+ * line above one sentence, and at 1.2 the two sit closer than the gap between
15618
+ * them, so the head reads as three lines of something rather than a title with
15619
+ * a caption. Declared here rather than left to the baseline because a screen
15620
+ * that renders the title in a `div` would otherwise draw a different head from
15621
+ * the one that renders it in an `h1`.
15622
+ */
15623
+ .crewlet-page-header__title {
15624
+ margin: 0;
15625
+ font-family: var(--font-family-display);
15626
+ font-size: var(--font-size-xl);
15627
+ font-weight: var(--font-weight-semibold);
15628
+ line-height: var(--font-line-height-normal);
15629
+ letter-spacing: var(--font-letter-spacing-tight);
15630
+ color: var(--color-text-primary);
15631
+ min-width: 0;
15632
+ }
15633
+
15634
+ .crewlet-page-header__badges {
15635
+ display: flex;
15636
+ align-items: center;
15637
+ gap: var(--spacing-2);
15638
+ flex-wrap: wrap;
15639
+ }
15640
+
15641
+ .crewlet-page-header__description {
15642
+ margin: 0;
15643
+ max-width: var(--size-measure);
15644
+ font-family: var(--font-family-sans);
15645
+ /* A sentence that answers "what is this screen for", read once. It is not
15646
+ body copy, and at the body step it competed with the table under it. */
15647
+ font-size: var(--font-size-compact);
15648
+ line-height: var(--font-line-height-normal);
15649
+ color: var(--color-text-tertiary);
15650
+ }
15651
+
15652
+ /* One step between actions, which is what keeps a run of buttons reading as
15653
+ one cluster at the end of the row rather than as three separate controls. */
15654
+ .crewlet-page-header__actions {
15655
+ display: flex;
15656
+ align-items: center;
15657
+ gap: var(--spacing-1);
15658
+ flex-wrap: wrap;
15659
+ }
15660
+
15661
+
15662
+ /* PeopleRail-R64WVOSH.css */
15663
+ /* PeopleRail: a raised column of everybody present, one row a person, the
15664
+ name over what they are doing and the controls at the row's end. */
15665
+ .crewlet-people-rail {
15666
+ display: flex;
15667
+ flex-direction: column;
15668
+ gap: var(--spacing-3);
15669
+ min-width: 0;
15670
+ padding: var(--spacing-3);
15671
+ border: 1px solid var(--color-border-default);
15672
+ border-radius: var(--radius-md);
15673
+ background: var(--color-surface-elevated);
15674
+ }
15675
+
15676
+ .crewlet-people-rail__head {
15677
+ display: flex;
15678
+ align-items: center;
15679
+ justify-content: space-between;
15680
+ gap: var(--spacing-2);
15681
+ }
15682
+
15683
+ .crewlet-people-rail__title {
15684
+ margin: 0;
15685
+ color: var(--color-text-primary);
15686
+ font-size: var(--font-size-sm);
15687
+ font-weight: var(--font-weight-semibold);
15688
+ }
15689
+
15690
+ .crewlet-people-rail__list {
15691
+ display: flex;
15692
+ flex-direction: column;
15693
+ gap: var(--spacing-2);
15694
+ margin: 0;
15695
+ padding: 0;
15696
+ list-style: none;
15697
+ }
15698
+
15699
+ .crewlet-people-rail__person {
15700
+ display: flex;
15701
+ align-items: center;
15702
+ gap: var(--spacing-2);
15703
+ min-width: 0;
15704
+ }
15705
+
15706
+ .crewlet-people-rail__text {
15707
+ display: flex;
15708
+ flex: 1;
15709
+ flex-direction: column;
15710
+ min-width: 0;
15711
+ }
15712
+
15713
+ .crewlet-people-rail__name {
15714
+ overflow: hidden;
15715
+ color: var(--color-text-primary);
15716
+ text-overflow: ellipsis;
15717
+ white-space: nowrap;
15718
+ }
15719
+
15720
+ .crewlet-people-rail__where {
15721
+ color: var(--color-text-tertiary);
15722
+ font-size: var(--font-size-compact);
15723
+ overflow-wrap: anywhere;
15724
+ }
15725
+
15726
+ .crewlet-people-rail__actions {
15727
+ display: flex;
15728
+ flex-wrap: wrap;
15729
+ justify-content: flex-end;
15730
+ gap: var(--spacing-1);
15731
+ }
15732
+
15733
+ .crewlet-people-rail__note {
15734
+ margin: 0;
15735
+ color: var(--color-text-tertiary);
15736
+ font-size: var(--font-size-compact);
15737
+ }
15738
+
15739
+
15740
+ /* PinTile-IIA25MNZ.css */
15741
+ /*
15742
+ * PinTile: one pinned thing, a link with its facts.
15743
+ *
15744
+ * A raised row rather than a card with a header: a shelf holds six of them,
15745
+ * and six headed cards are six sections where the reader wanted six links.
15746
+ */
15747
+
15748
+ .crewlet-pin-tile {
15749
+ position: relative;
15750
+ display: flex;
15751
+ align-items: center;
15752
+ gap: var(--spacing-3);
15753
+ min-width: 0;
15754
+ min-height: 56px;
15755
+ padding: var(--spacing-2) var(--spacing-2) var(--spacing-2) var(--spacing-3);
15756
+ border: 1px solid var(--color-border-default);
15757
+ border-radius: var(--radius-lg);
15758
+ background: var(--color-surface-elevated);
15759
+ transition: border-color var(--motion-duration-fast) var(--motion-easing-default),
15760
+ background-color var(--motion-duration-fast) var(--motion-easing-default);
15761
+ }
15762
+ .crewlet-pin-tile:hover {
15763
+ border-color: var(--color-border-hover);
15764
+ background: var(--color-surface-hover);
15765
+ }
15766
+ .crewlet-pin-tile:has(.crewlet-pin-tile__handle) {
15767
+ padding-inline-start: var(--spacing-1);
15768
+ }
15769
+
15770
+ .crewlet-pin-tile[data-reorder='dragging'] {
15771
+ border-style: dashed;
15772
+ border-color: var(--color-brand-accent);
15773
+ background: var(--color-brand-accent-soft);
15774
+ }
15775
+ .crewlet-pin-tile[data-reorder='dragging'] > * {
15776
+ opacity: 0.35;
15777
+ }
15778
+
15779
+ .crewlet-pin-tile__handle {
15780
+ position: relative;
15781
+ z-index: var(--z-index-raised);
15782
+ flex-shrink: 0;
15783
+ cursor: grab;
15784
+ color: var(--color-text-tertiary);
15785
+ }
15786
+
15787
+ .crewlet-pin-tile__leading {
15788
+ display: inline-flex;
15789
+ flex-shrink: 0;
15790
+ color: var(--color-text-secondary);
14535
15791
  }
14536
15792
 
14537
- .crewlet-page-header__lead {
15793
+ .crewlet-pin-tile__body {
14538
15794
  display: flex;
15795
+ flex: 1 1 auto;
14539
15796
  flex-direction: column;
14540
- /* One step. The title and the sentence under it are ONE block: at the
14541
- 8px step they read as a heading with a caption parked below it. */
14542
- gap: var(--spacing-1);
15797
+ gap: 2px;
14543
15798
  min-width: 0;
14544
- /* Takes the row, so the actions wrap under the title rather than squeezing
14545
- a long screen name into two words and an ellipsis. */
14546
- flex: 1 1 auto;
14547
15799
  }
14548
15800
 
14549
- .crewlet-page-header__titles {
15801
+ .crewlet-pin-tile__head {
14550
15802
  display: flex;
14551
15803
  align-items: center;
14552
15804
  gap: var(--spacing-2);
14553
- flex-wrap: wrap;
14554
15805
  min-width: 0;
14555
15806
  }
14556
15807
 
14557
- /*
14558
- * THE TITLE KEEPS THE PAGE'S OWN LEADING. It is a heading element, and the
14559
- * document baseline sets every heading at the tight step, which is the right
14560
- * answer for a stack of headings in prose and the wrong one here: this is one
14561
- * line above one sentence, and at 1.2 the two sit closer than the gap between
14562
- * them, so the head reads as three lines of something rather than a title with
14563
- * a caption. Declared here rather than left to the baseline because a screen
14564
- * that renders the title in a `div` would otherwise draw a different head from
14565
- * the one that renders it in an `h1`.
14566
- */
14567
- .crewlet-page-header__title {
14568
- margin: 0;
14569
- font-family: var(--font-family-display);
14570
- font-size: var(--font-size-xl);
14571
- font-weight: var(--font-weight-semibold);
14572
- line-height: var(--font-line-height-normal);
14573
- letter-spacing: var(--font-letter-spacing-tight);
15808
+ .crewlet-pin-tile__link {
15809
+ overflow: hidden;
15810
+ font-size: var(--font-size-sm);
15811
+ font-weight: var(--font-weight-medium);
14574
15812
  color: var(--color-text-primary);
14575
- min-width: 0;
15813
+ text-decoration: none;
15814
+ text-overflow: ellipsis;
15815
+ white-space: nowrap;
15816
+ }
15817
+ /* The tile's whole area, as the link's. */
15818
+ .crewlet-pin-tile__link::after {
15819
+ content: '';
15820
+ position: absolute;
15821
+ inset: 0;
15822
+ border-radius: inherit;
15823
+ }
15824
+ .crewlet-pin-tile__link:focus-visible {
15825
+ outline: 2px solid transparent;
15826
+ }
15827
+ /* The tile's ring, over its own edge, for the link that is its target. */
15828
+ .crewlet-pin-tile:has(.crewlet-pin-tile__link:focus-visible) {
15829
+ outline: 2px solid var(--color-focus);
15830
+ outline-offset: -1px;
14576
15831
  }
14577
15832
 
14578
- .crewlet-page-header__badges {
14579
- display: flex;
14580
- align-items: center;
14581
- gap: var(--spacing-2);
14582
- flex-wrap: wrap;
15833
+ .crewlet-pin-tile__status {
15834
+ display: inline-flex;
15835
+ flex-shrink: 0;
14583
15836
  }
14584
15837
 
14585
- .crewlet-page-header__description {
14586
- margin: 0;
14587
- max-width: var(--size-measure);
14588
- font-family: var(--font-family-sans);
14589
- /* A sentence that answers "what is this screen for", read once. It is not
14590
- body copy, and at the body step it competed with the table under it. */
14591
- font-size: var(--font-size-compact);
14592
- line-height: var(--font-line-height-normal);
15838
+ .crewlet-pin-tile__meta {
15839
+ overflow: hidden;
15840
+ font-size: var(--font-size-xs);
15841
+ color: var(--color-text-secondary);
15842
+ text-overflow: ellipsis;
15843
+ white-space: nowrap;
15844
+ }
15845
+ .crewlet-pin-tile__kind {
14593
15846
  color: var(--color-text-tertiary);
14594
15847
  }
14595
15848
 
14596
- /* One step between actions, which is what keeps a run of buttons reading as
14597
- one cluster at the end of the row rather than as three separate controls. */
14598
- .crewlet-page-header__actions {
14599
- display: flex;
14600
- align-items: center;
14601
- gap: var(--spacing-1);
14602
- flex-wrap: wrap;
15849
+ .crewlet-pin-tile__figure {
15850
+ flex-shrink: 0;
15851
+ font-size: var(--font-size-sm);
15852
+ font-weight: var(--font-weight-semibold);
15853
+ font-variant-numeric: tabular-nums;
15854
+ color: var(--color-text-primary);
15855
+ }
15856
+
15857
+ /* Above the stretched link, so it takes its own press. */
15858
+ .crewlet-pin-tile__unpin {
15859
+ position: relative;
15860
+ z-index: var(--z-index-raised);
15861
+ flex-shrink: 0;
15862
+ color: var(--color-brand-accent-ink);
15863
+ opacity: 0.55;
15864
+ transition: opacity var(--motion-duration-fast) var(--motion-easing-default);
15865
+ }
15866
+ .crewlet-pin-tile:hover .crewlet-pin-tile__unpin,
15867
+ .crewlet-pin-tile:focus-within .crewlet-pin-tile__unpin {
15868
+ opacity: 1;
15869
+ }
15870
+ @media (hover: none) {
15871
+ .crewlet-pin-tile__unpin {
15872
+ opacity: 1;
15873
+ }
15874
+ }
15875
+
15876
+ @media (prefers-reduced-motion: reduce) {
15877
+ .crewlet-pin-tile,
15878
+ .crewlet-pin-tile__unpin {
15879
+ transition: none;
15880
+ }
14603
15881
  }
14604
15882
 
14605
15883
 
@@ -18410,7 +19688,7 @@ svg.crewlet-select__chevron {
18410
19688
  .crewlet-statcard--info .crewlet-statcard__value { color: var(--color-feedback-info-ink); }
18411
19689
 
18412
19690
 
18413
- /* StatGroup-HVG6O62W.css */
19691
+ /* StatGroup-PADTJCUQ.css */
18414
19692
  /*
18415
19693
  * A row of stat tiles.
18416
19694
  *
@@ -18433,6 +19711,13 @@ svg.crewlet-select__chevron {
18433
19711
  overflow: hidden;
18434
19712
  }
18435
19713
 
19714
+ /* Inside another card: the card's surface and edge are the row's. */
19715
+ .crewlet-stat-group--flush {
19716
+ background: transparent;
19717
+ border: 0;
19718
+ border-radius: var(--radius-none);
19719
+ }
19720
+
18436
19721
  /*
18437
19722
  * A tile inside the row brings no surface of its own, whether or not its
18438
19723
  * caller remembered `flush`. The group draws one card and the hairlines
@@ -19556,6 +20841,113 @@ b.crewlet-switcher__match {
19556
20841
  }
19557
20842
 
19558
20843
 
20844
+ /* TableCells-3VN5N2M3.css */
20845
+ /* The read-only table cells. Each one holds a single line and shrinks inside
20846
+ its column (`min-width: 0`), so a long value is cut with an ellipsis and
20847
+ its whole text on the title rather than standing the row two lines tall. */
20848
+
20849
+ .crewlet-table-cell__truncate {
20850
+ min-width: 0;
20851
+ overflow: hidden;
20852
+ text-overflow: ellipsis;
20853
+ white-space: nowrap;
20854
+ }
20855
+
20856
+ /* AN IDENTIFIER IS ONE LINE, cut with its value on the title rather than
20857
+ broken at whichever character the column ran out on. Named with the link's
20858
+ class as well, so a linked identifier keeps the block box whatever order
20859
+ the two stylesheets load in. */
20860
+ .crewlet-table-cell__key,
20861
+ .crewlet-link.crewlet-table-cell__key {
20862
+ display: block;
20863
+ min-width: 0;
20864
+ overflow: hidden;
20865
+ text-overflow: ellipsis;
20866
+ white-space: nowrap;
20867
+ font-family: var(--font-family-mono);
20868
+ }
20869
+
20870
+ .crewlet-table-cell__number {
20871
+ font-variant-numeric: tabular-nums;
20872
+ white-space: nowrap;
20873
+ }
20874
+
20875
+ .crewlet-table-cell__date {
20876
+ color: var(--color-text-tertiary);
20877
+ white-space: nowrap;
20878
+ }
20879
+
20880
+ .crewlet-table-cell__entity,
20881
+ .crewlet-link.crewlet-table-cell__entity,
20882
+ .crewlet-table-cell__status,
20883
+ .crewlet-table-cell__text {
20884
+ display: inline-flex;
20885
+ align-items: center;
20886
+ gap: var(--spacing-2);
20887
+ min-width: 0;
20888
+ max-width: 100%;
20889
+ }
20890
+
20891
+ .crewlet-table-cell__status,
20892
+ .crewlet-table-cell__text {
20893
+ gap: calc(var(--spacing-1) * 1.5);
20894
+ }
20895
+
20896
+ .crewlet-table-cell__badge,
20897
+ .crewlet-table-cell__icon {
20898
+ display: inline-flex;
20899
+ flex: none;
20900
+ }
20901
+
20902
+ .crewlet-table-cell__icon {
20903
+ color: var(--color-text-tertiary);
20904
+ }
20905
+
20906
+ .crewlet-table-cell__glyph {
20907
+ display: inline-flex;
20908
+ flex: none;
20909
+ font-size: var(--font-size-xs);
20910
+ line-height: 1;
20911
+ /* The quiet state is still a mark, so it takes the tertiary step: the
20912
+ decoration step does not clear 3:1 on every ground. */
20913
+ color: var(--color-text-tertiary);
20914
+ }
20915
+
20916
+ .crewlet-table-cell__status--info .crewlet-table-cell__glyph {
20917
+ color: var(--color-feedback-info);
20918
+ }
20919
+
20920
+ .crewlet-table-cell__status--success .crewlet-table-cell__glyph {
20921
+ color: var(--color-feedback-success);
20922
+ }
20923
+
20924
+ .crewlet-table-cell__status--warning .crewlet-table-cell__glyph {
20925
+ color: var(--color-feedback-warning);
20926
+ }
20927
+
20928
+ .crewlet-table-cell__status--danger .crewlet-table-cell__glyph {
20929
+ color: var(--color-feedback-danger);
20930
+ }
20931
+
20932
+ .crewlet-table-cell__status--brand .crewlet-table-cell__glyph {
20933
+ color: var(--color-brand-accent);
20934
+ }
20935
+
20936
+ .crewlet-table-cell__tags {
20937
+ display: inline-flex;
20938
+ flex-wrap: wrap;
20939
+ align-items: center;
20940
+ gap: var(--spacing-1);
20941
+ min-width: 0;
20942
+ }
20943
+
20944
+ .crewlet-table-cell__more {
20945
+ color: var(--color-text-secondary);
20946
+ font-size: var(--font-size-xs);
20947
+ font-variant-numeric: tabular-nums;
20948
+ }
20949
+
20950
+
19559
20951
  /* Tabs-ITJYJFMU.css */
19560
20952
  /*
19561
20953
  * The pill register: Tabs and SegmentedControl.
@@ -23615,6 +25007,77 @@ svg.crewlet-time-window__tick {
23615
25007
  }
23616
25008
 
23617
25009
 
25010
+ /* VersionCompare-UUZOPTQO.css */
25011
+ /* VersionCompare: a head naming the two versions with the lens switch at its
25012
+ end, then the changes or the two versions. */
25013
+ .crewlet-version-compare {
25014
+ display: flex;
25015
+ flex-direction: column;
25016
+ gap: var(--spacing-3);
25017
+ min-width: 0;
25018
+ }
25019
+
25020
+ .crewlet-version-compare__head {
25021
+ display: flex;
25022
+ flex-wrap: wrap;
25023
+ align-items: center;
25024
+ gap: var(--spacing-2) var(--spacing-3);
25025
+ }
25026
+
25027
+ .crewlet-version-compare__titles {
25028
+ display: flex;
25029
+ flex: 1 1 16rem;
25030
+ flex-direction: column;
25031
+ gap: var(--spacing-1);
25032
+ min-width: 0;
25033
+ }
25034
+
25035
+ .crewlet-version-compare__title {
25036
+ margin: 0;
25037
+ color: var(--color-text-primary);
25038
+ font-size: var(--font-size-sm);
25039
+ font-weight: var(--font-weight-semibold);
25040
+ }
25041
+
25042
+ .crewlet-version-compare__description,
25043
+ .crewlet-version-compare__note {
25044
+ margin: 0;
25045
+ color: var(--color-text-tertiary);
25046
+ font-size: var(--font-size-compact);
25047
+ }
25048
+
25049
+ .crewlet-version-compare__changes,
25050
+ .crewlet-version-compare__versions {
25051
+ display: flex;
25052
+ flex-direction: column;
25053
+ gap: var(--spacing-3);
25054
+ min-width: 0;
25055
+ }
25056
+
25057
+ /* SIDE BY SIDE where there is room for two readable columns, and one above
25058
+ the other where there is not, decided by the width the panes are given
25059
+ rather than by the viewport, so a comparison in a side pane stacks too. */
25060
+ .crewlet-version-compare__panes {
25061
+ display: grid;
25062
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr));
25063
+ gap: var(--spacing-4);
25064
+ }
25065
+
25066
+ .crewlet-version-compare__pane {
25067
+ display: flex;
25068
+ flex-direction: column;
25069
+ gap: var(--spacing-2);
25070
+ min-width: 0;
25071
+ }
25072
+
25073
+ .crewlet-version-compare__pane-title {
25074
+ margin: 0;
25075
+ color: var(--color-text-primary);
25076
+ font-size: var(--font-size-sm);
25077
+ font-weight: var(--font-weight-semibold);
25078
+ }
25079
+
25080
+
23618
25081
  /* VersionTimeline-EBJ6MIPJ.css */
23619
25082
  /*
23620
25083
  * A version list beside the version on show. The row's main line is the