@crewlethq/ui 0.37.0 → 0.38.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 (210) hide show
  1. package/README.md +58 -0
  2. package/dist/Accordion/index.js +1 -1
  3. package/dist/AgentHandoffPanel/index.js +5 -5
  4. package/dist/AppShell/index.d.ts +1 -0
  5. package/dist/AppShell/index.js +5 -3
  6. package/dist/{AppShell-JTSEOA57.css → AppShell-NDU4XMGF.css} +51 -6
  7. package/dist/ArrangeList/index.js +4 -4
  8. package/dist/ArtifactBar/index.js +9 -7
  9. package/dist/ArtifactCard/index.js +2 -2
  10. package/dist/ArtifactCover/index.js +3 -3
  11. package/dist/ArtifactMakeRow/ArtifactMakeRow.d.ts +3 -1
  12. package/dist/ArtifactMakeRow/index.d.ts +1 -0
  13. package/dist/ArtifactMakeRow/index.js +2 -1
  14. package/dist/{ArtifactMakeRow-XBA2MPSY.css → ArtifactMakeRow-6UX2LTF7.css} +49 -6
  15. package/dist/AuthLayout/index.js +2 -2
  16. package/dist/AvatarPicker/index.js +8 -6
  17. package/dist/Canvas/index.js +4 -3
  18. package/dist/CanvasBoard/index.js +7 -6
  19. package/dist/CanvasToolbar/index.js +6 -5
  20. package/dist/Card/index.js +1 -1
  21. package/dist/{Card-QOVASQNU.css → Card-G2ZGT5Z6.css} +43 -0
  22. package/dist/ChangeMark/index.js +4 -3
  23. package/dist/Checkbox/index.js +3 -3
  24. package/dist/ChoiceList/index.d.ts +1 -0
  25. package/dist/ChoiceList/index.js +2 -1
  26. package/dist/{ChoiceList-EA2W6MOS.css → ChoiceList-KFYFAECP.css} +26 -4
  27. package/dist/Combobox/index.d.ts +1 -0
  28. package/dist/Combobox/index.js +6 -5
  29. package/dist/{Combobox-4FUVYIE7.css → Combobox-YDONYDTM.css} +2 -1
  30. package/dist/CommandPalette/index.d.ts +1 -0
  31. package/dist/CommandPalette/index.js +7 -6
  32. package/dist/{CommandPalette-7CFGVBND.css → CommandPalette-TOZYLWLE.css} +5 -1
  33. package/dist/CommentThread/index.js +5 -5
  34. package/dist/Composer/index.js +3 -3
  35. package/dist/{Composer-PXITWNEK.css → Composer-TXULCPPV.css} +1 -1
  36. package/dist/ConfirmField/index.js +3 -3
  37. package/dist/DataTable/index.js +7 -7
  38. package/dist/DataView/index.js +12 -12
  39. package/dist/DatasetSource/index.d.ts +1 -0
  40. package/dist/DatasetSource/index.js +3 -2
  41. package/dist/{DatasetSource-SMGX4PS5.css → DatasetSource-FFKTD3ZU.css} +16 -1
  42. package/dist/DateTimePicker/index.js +4 -4
  43. package/dist/{DateTimePicker-2IVTKFV2.css → DateTimePicker-3A7JIIVL.css} +3 -3
  44. package/dist/DescriptionList/DescriptionList.d.ts +12 -1
  45. package/dist/DescriptionList/index.js +1 -1
  46. package/dist/{DescriptionList-IXMRCSMK.css → DescriptionList-DEZISDLQ.css} +8 -1
  47. package/dist/Disclosure/index.js +1 -1
  48. package/dist/{Disclosure-VKBJJIZ7.css → Disclosure-P4FH3C35.css} +28 -2
  49. package/dist/DocTabsEditor/index.js +6 -6
  50. package/dist/Document/index.js +2 -2
  51. package/dist/{Document-YFWTWXJP.css → Document-TZ2NBLOR.css} +2 -2
  52. package/dist/{Editor-HORWMUM3.js → Editor-QV4JP242.js} +6 -6
  53. package/dist/FactList/index.js +4 -3
  54. package/dist/FollowBanner/index.js +3 -2
  55. package/dist/HitArea/hitArea.d.ts +7 -0
  56. package/dist/HitArea/index.d.ts +2 -0
  57. package/dist/HitArea/index.js +2 -0
  58. package/dist/HitArea-QUOS6ZDJ.css +35 -0
  59. package/dist/HuePicker/index.js +4 -3
  60. package/dist/Input/index.js +2 -2
  61. package/dist/{Input-ABGOFENS.css → Input-OQZBCRX5.css} +9 -4
  62. package/dist/Layer/index.js +2 -1
  63. package/dist/LinkInterstitial/index.js +4 -3
  64. package/dist/ListInput/index.js +5 -5
  65. package/dist/Listbox/index.js +3 -2
  66. package/dist/{Listbox-6WJNJQVQ.css → Listbox-NQV6E3FS.css} +3 -0
  67. package/dist/LivePreview/index.js +1 -1
  68. package/dist/{LivePreview-BROGKR4N.css → LivePreview-KQEDMQCY.css} +13 -0
  69. package/dist/MarkdownEditor/index.js +8 -6
  70. package/dist/Menu/index.js +3 -2
  71. package/dist/MergeConflicts/index.js +5 -4
  72. package/dist/Modal/index.js +3 -2
  73. package/dist/OrgTable/index.js +4 -3
  74. package/dist/Popover/index.js +3 -2
  75. package/dist/PresenterView/index.js +4 -3
  76. package/dist/PricingCard/index.js +2 -2
  77. package/dist/PrincipalPicker/index.js +7 -6
  78. package/dist/RichEditor/index.js +1 -1
  79. package/dist/SegmentedControl/index.d.ts +1 -0
  80. package/dist/SegmentedControl/index.js +4 -3
  81. package/dist/{SegmentedControl-FLI45IOW.css → SegmentedControl-B7XCUOML.css} +9 -2
  82. package/dist/Select/index.d.ts +1 -0
  83. package/dist/Select/index.js +5 -4
  84. package/dist/{Select-W3CHTZXP.css → Select-F526HLNR.css} +5 -4
  85. package/dist/ShareDialog/index.js +7 -6
  86. package/dist/SheetColumnEditor/index.js +12 -11
  87. package/dist/SheetGrid/index.js +9 -8
  88. package/dist/{SheetGrid-YRDXTIIZ.css → SheetGrid-XK7T7M34.css} +9 -4
  89. package/dist/Shortcut/index.js +3 -2
  90. package/dist/SidebarNav/index.d.ts +1 -0
  91. package/dist/SidebarNav/index.js +2 -1
  92. package/dist/{SidebarNav-KF66MLOM.css → SidebarNav-7SGUZYKK.css} +21 -2
  93. package/dist/SlideCompare/index.js +4 -3
  94. package/dist/SlideFilmstrip/index.js +6 -5
  95. package/dist/SlideGrid/index.js +4 -3
  96. package/dist/SlideStage/index.js +3 -2
  97. package/dist/SourceEditor/index.js +2 -2
  98. package/dist/{SourceEditor-QAYE2JS6.css → SourceEditor-OKPWPFXK.css} +1 -1
  99. package/dist/StatGroup/StatGroup.d.ts +11 -7
  100. package/dist/StatGroup/index.js +1 -1
  101. package/dist/StatGroup-DOFHX5QJ.css +168 -0
  102. package/dist/Switcher/index.js +8 -8
  103. package/dist/TableCells/index.js +2 -2
  104. package/dist/Tabs/index.d.ts +1 -0
  105. package/dist/Tabs/index.js +2 -1
  106. package/dist/{Tabs-MMZXV5EF.css → Tabs-WIF7457H.css} +20 -3
  107. package/dist/Tag/index.js +1 -1
  108. package/dist/{Tag-SRGTK5KI.css → Tag-2DQOVE6W.css} +15 -5
  109. package/dist/TagsInput/index.js +6 -6
  110. package/dist/{TagsInput-7EGBBXHS.css → TagsInput-CLFHP6I2.css} +1 -1
  111. package/dist/ThemeGallery/index.js +4 -3
  112. package/dist/ThemeSwitcher/index.js +5 -4
  113. package/dist/TimeWindowPicker/index.js +8 -7
  114. package/dist/{TimeWindowPicker-DEFDV77Z.css → TimeWindowPicker-I3HXC74I.css} +3 -3
  115. package/dist/Toaster/index.js +2 -1
  116. package/dist/Toolbar/index.js +3 -2
  117. package/dist/Tooltip/index.js +3 -2
  118. package/dist/TreeCanvas/index.js +5 -4
  119. package/dist/TreeGrid/index.js +3 -2
  120. package/dist/VersionCompare/index.js +5 -4
  121. package/dist/{chunk-CCAXYHQS.js → chunk-2QZ2VPHR.js} +3 -1
  122. package/dist/chunk-2YTOOH3A.js +4 -0
  123. package/dist/{chunk-QWNVSR6G.js → chunk-3KYVFG47.js} +1 -1
  124. package/dist/{chunk-H5NOLRGH.js → chunk-3V5T5K5H.js} +1 -1
  125. package/dist/{chunk-BIQDJOJZ.js → chunk-3ZUINC7C.js} +2 -2
  126. package/dist/{chunk-K4VP6ZKE.js → chunk-4BJK7FE5.js} +1 -1
  127. package/dist/chunk-4ISUIS6F.js +3 -0
  128. package/dist/{chunk-FG4O64DV.js → chunk-4L2BWSHR.js} +5 -5
  129. package/dist/{chunk-PLTCDSTU.js → chunk-4LRAJXHL.js} +1 -1
  130. package/dist/{chunk-4ZJLOKSS.js → chunk-5BUOMF6N.js} +2 -2
  131. package/dist/{chunk-47JQAGRV.js → chunk-66X5WDKE.js} +1 -1
  132. package/dist/{chunk-66NGUD5S.js → chunk-6NNY5WBF.js} +8 -7
  133. package/dist/{chunk-5RT5O4JR.js → chunk-7CGPPAYR.js} +1 -1
  134. package/dist/{chunk-F73MC7EZ.js → chunk-7KHM2FZH.js} +2 -2
  135. package/dist/{chunk-VL6CUNSX.js → chunk-7SDUKCNW.js} +4 -1
  136. package/dist/{chunk-JML75PGJ.js → chunk-A23KDROH.js} +3 -3
  137. package/dist/{chunk-PJIPUEJ3.js → chunk-AXS6MBNH.js} +1 -1
  138. package/dist/{chunk-2FPENTCF.js → chunk-AYHIF6DH.js} +1 -1
  139. package/dist/{chunk-J6ON5SYE.js → chunk-B5J23C73.js} +1 -1
  140. package/dist/{chunk-7VAUGG6B.js → chunk-B5UHX5UC.js} +2 -2
  141. package/dist/{chunk-AOLCZDZ6.js → chunk-BH52LIY6.js} +5 -5
  142. package/dist/{chunk-WX2NIG4G.js → chunk-BJI3RFXG.js} +1 -1
  143. package/dist/{chunk-JXRI5YD2.js → chunk-BT5H2THK.js} +2 -1
  144. package/dist/{chunk-FHHYXZSP.js → chunk-C7OKDYBH.js} +2 -2
  145. package/dist/{chunk-JBUMD6DS.js → chunk-CFGGE3HO.js} +1 -1
  146. package/dist/{chunk-WYKWXRJ4.js → chunk-CQFQGAZI.js} +1 -1
  147. package/dist/{chunk-GMLAKNFY.js → chunk-D2OL3ZSS.js} +1 -1
  148. package/dist/{chunk-D7GNNID2.js → chunk-D3EJSLCL.js} +2 -2
  149. package/dist/{chunk-BUVCV3WI.js → chunk-D6FEHY5G.js} +3 -2
  150. package/dist/{chunk-4BYHAOHH.js → chunk-DAERKOOG.js} +3 -2
  151. package/dist/{chunk-PGZ2R3ON.js → chunk-DYB66CNM.js} +23 -7
  152. package/dist/{chunk-PPFX6GRK.js → chunk-EAEJ7CDM.js} +6 -3
  153. package/dist/{chunk-WZGYIVYH.js → chunk-EAQLI2SO.js} +4 -2
  154. package/dist/{chunk-GYBDPCRC.js → chunk-ECGGQX2H.js} +2 -2
  155. package/dist/{chunk-RH2NCQBZ.js → chunk-ETVEGR2Y.js} +2 -2
  156. package/dist/{chunk-SUXP4OBT.js → chunk-F4LPQA4E.js} +1 -1
  157. package/dist/{chunk-KYZMN6I6.js → chunk-FBW3Q2OY.js} +2 -2
  158. package/dist/{chunk-JQLS3MZB.js → chunk-FWBKMPNR.js} +1 -1
  159. package/dist/{chunk-OOWPSBIS.js → chunk-GMW4ZHST.js} +3 -3
  160. package/dist/{chunk-R25RGPUB.js → chunk-H5XTJ7GJ.js} +2 -3
  161. package/dist/{chunk-6ZJ3N7QI.js → chunk-I33UIUZD.js} +1 -1
  162. package/dist/{chunk-GRYZ5EP3.js → chunk-IPWU6ERC.js} +14 -3
  163. package/dist/{chunk-W3HYWD63.js → chunk-JZPK4IXR.js} +16 -9
  164. package/dist/{chunk-K3IJQNB7.js → chunk-KHJIEPZV.js} +3 -2
  165. package/dist/{chunk-GFV4LJHH.js → chunk-KYIAFNU7.js} +1 -1
  166. package/dist/{chunk-F2XSYBKH.js → chunk-MFS6F2P7.js} +4 -1
  167. package/dist/chunk-MICRGE3J.js +1 -0
  168. package/dist/{chunk-PGRPNDWM.js → chunk-NR4CPM4T.js} +1 -1
  169. package/dist/{chunk-5WDXPHEW.js → chunk-NRBAXRWE.js} +1 -1
  170. package/dist/{chunk-YSGLEHND.js → chunk-NUZHC6MM.js} +14 -2
  171. package/dist/{chunk-WGD2HX2A.js → chunk-OED6LUWE.js} +1 -1
  172. package/dist/{chunk-MICH6QSJ.js → chunk-OGXHZHRX.js} +1 -1
  173. package/dist/{chunk-OHA6WSAG.js → chunk-OTCXRJ7D.js} +1 -1
  174. package/dist/{chunk-N5SKHIAP.js → chunk-PAQXOP2M.js} +8 -6
  175. package/dist/{chunk-KJW2AS57.js → chunk-PEUGPAKH.js} +1 -1
  176. package/dist/{chunk-IPAU6FLH.js → chunk-PPHTIKZO.js} +1 -1
  177. package/dist/{chunk-44WJLPQS.js → chunk-PT6WKXKW.js} +2 -2
  178. package/dist/{chunk-P6WFZDKS.js → chunk-PWG3VHRQ.js} +2 -2
  179. package/dist/{chunk-EAKC24BW.js → chunk-R2IBCEU6.js} +16 -4
  180. package/dist/{chunk-HOIZ6MIS.js → chunk-RLJXVFEH.js} +1 -1
  181. package/dist/{chunk-NQGPD6NX.js → chunk-RMEBFYL7.js} +1 -1
  182. package/dist/{chunk-APDKUGSH.js → chunk-S27UBCVX.js} +5 -4
  183. package/dist/{chunk-XEGZHHRH.js → chunk-SVGARBDY.js} +1 -1
  184. package/dist/{chunk-UWGUKMBK.js → chunk-SYBYFQTY.js} +2 -2
  185. package/dist/{chunk-IUYUS2SO.js → chunk-TYONQSOK.js} +2 -2
  186. package/dist/{chunk-DQSXWQMJ.js → chunk-U3ILLCR2.js} +1 -1
  187. package/dist/{chunk-L4WZSVMT.js → chunk-UB6MLXUL.js} +3 -3
  188. package/dist/{chunk-EARDAJQY.js → chunk-UWRBD2YO.js} +2 -2
  189. package/dist/{chunk-F23N4MVU.js → chunk-UXYEOWG5.js} +1 -1
  190. package/dist/{chunk-UCCC7YVZ.js → chunk-W7PAIVAP.js} +4 -2
  191. package/dist/{chunk-T5RQGI6O.js → chunk-X3UYTAOG.js} +1 -1
  192. package/dist/{chunk-EOQFPZEE.js → chunk-XBURIXHO.js} +2 -2
  193. package/dist/{chunk-VKKUGZ3G.js → chunk-XQZ6EWOE.js} +8 -5
  194. package/dist/{chunk-TVRBQMIX.js → chunk-YPMGP2X4.js} +6 -6
  195. package/dist/{chunk-GS7ZTHPF.js → chunk-YQG4PZGC.js} +7 -7
  196. package/dist/{chunk-5QXRI35B.js → chunk-ZK3VYY7L.js} +1 -1
  197. package/dist/{chunk-2QEDJSJC.js → chunk-ZMDYQ2HH.js} +1 -1
  198. package/dist/{chunk-27GD7LVR.js → chunk-ZMWXE4GT.js} +1 -1
  199. package/dist/{chunk-RIAZM6L3.js → chunk-ZNOXQACX.js} +1 -1
  200. package/dist/generated/index.d.ts +1 -0
  201. package/dist/generated/index.js +106 -104
  202. package/dist/index.js +106 -104
  203. package/dist/styles.css +508 -102
  204. package/dist/utils/focusModality.d.ts +17 -1
  205. package/dist/utils/index.d.ts +1 -1
  206. package/dist/utils/index.js +1 -1
  207. package/package.json +3 -3
  208. package/dist/StatGroup-PADTJCUQ.css +0 -86
  209. package/dist/chunk-WKEPORNM.js +0 -2
  210. /package/dist/{chunk-PNNYVN52.js → chunk-4QQ3MND5.js} +0 -0
package/dist/styles.css CHANGED
@@ -702,7 +702,7 @@
702
702
  }
703
703
 
704
704
 
705
- /* AppShell-JTSEOA57.css */
705
+ /* AppShell-NDU4XMGF.css */
706
706
  /*
707
707
  * The application frame: a rail on the FRAME, and the screen on a SHEET that
708
708
  * floats beside it.
@@ -851,10 +851,11 @@
851
851
  /* The same gutter the nav takes, so what the foot says lines up with the rows
852
852
  above it rather than sitting further out. */
853
853
  .crewlet-app-shell__rail-foot {
854
+ --crewlet-rail-foot-gap: var(--spacing-1);
854
855
  flex: none;
855
856
  display: flex;
856
857
  flex-direction: column;
857
- gap: var(--spacing-1);
858
+ gap: var(--crewlet-rail-foot-gap);
858
859
  padding: var(--spacing-2) var(--size-nav-gutter);
859
860
  border-top: 1px solid var(--color-border-default);
860
861
  }
@@ -885,7 +886,9 @@
885
886
  * compact density cannot take the target under it.
886
887
  *
887
888
  * And the boundary is TRANSPARENT rather than absent, spending one pixel of
888
- * that step rather than adding one on top of it. A button carries one at every
889
+ * that step rather than adding one on top of it. It spends a pixel of the row
890
+ * pad too: added to it, the boundary stood the row's mark and words a pixel
891
+ * right of every nav glyph and word above them. A button carries one at every
889
892
  * variant so that a bordered variant and a borderless one stand the same
890
893
  * height, and the row this package draws carries the same one for the same
891
894
  * reason: without it the two rows in one foot are 34px and 36px, and the
@@ -900,7 +903,7 @@
900
903
  width: 100%;
901
904
  min-width: 0;
902
905
  min-height: var(--size-row-sm);
903
- padding: calc(var(--spacing-2) - 1px) var(--size-nav-row-pad);
906
+ padding: calc(var(--spacing-2) - 1px) calc(var(--size-nav-row-pad) - 1px);
904
907
  border: 1px solid transparent;
905
908
  border-radius: var(--radius-md);
906
909
  background: transparent;
@@ -914,6 +917,10 @@
914
917
 
915
918
  .crewlet-app-shell__rail-row--action,
916
919
  .crewlet-app-shell__rail-foot > .crewlet-btn {
920
+ /* Half the foot's gap to each neighbour, so the rows' targets meet
921
+ (HitArea.css), across the row's 1px border; the account row below
922
+ reaches back the same way. */
923
+ --crewlet-hit-area-block: calc(var(--crewlet-rail-foot-gap, 0px) / 2 + 1px);
917
924
  cursor: pointer;
918
925
  transition:
919
926
  background var(--motion-duration-fast) var(--motion-easing-default),
@@ -1127,13 +1134,22 @@
1127
1134
  overflow: hidden;
1128
1135
  }
1129
1136
 
1137
+ /*
1138
+ * THE BAR'S INSET IS THE CONTENT'S, so a page's first line starts under the
1139
+ * bar's title and its cards end under the bar's last control. It stood 16px
1140
+ * from each edge over a content column inset 20px, and at its end the
1141
+ * content also gives up the scroller's gutter, which the bar, not scrolling,
1142
+ * did not: with scrollbars drawn in the layout every page's actions ended
1143
+ * 15px past the cards under them. The gutter is measured by the shell
1144
+ * (`--crewlet-app-shell-gutter`, 0 where scrollbars overlay the content).
1145
+ */
1130
1146
  .crewlet-app-shell__topbar {
1131
1147
  display: flex;
1132
1148
  align-items: center;
1133
1149
  gap: var(--spacing-3);
1134
1150
  flex: none;
1135
1151
  height: var(--crewlet-app-shell-topbar);
1136
- padding: 0 var(--spacing-4);
1152
+ padding: 0 calc(var(--spacing-5) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-5);
1137
1153
  border-bottom: 1px solid var(--color-border-default);
1138
1154
  background: var(--color-surface-background);
1139
1155
  }
@@ -1316,7 +1332,12 @@
1316
1332
  }
1317
1333
 
1318
1334
  /* THE TOP BAR'S GUTTER, 16px: the content's 12px stood every page's first
1319
- line 4px left of the title and the controls over it. */
1335
+ line 4px left of the title and the controls over it. The bar and the
1336
+ content take it together. */
1337
+ .crewlet-app-shell__topbar {
1338
+ padding: 0 calc(var(--spacing-4) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-4);
1339
+ }
1340
+
1320
1341
  .crewlet-app-shell__content {
1321
1342
  padding: var(--spacing-4) var(--spacing-4) var(--spacing-9);
1322
1343
  }
@@ -1340,11 +1361,12 @@
1340
1361
  * the controls off the rail.
1341
1362
  */
1342
1363
  .crewlet-account-row {
1364
+ --crewlet-account-row-pad: var(--spacing-1);
1343
1365
  display: flex;
1344
1366
  align-items: center;
1345
1367
  gap: var(--spacing-1);
1346
1368
  min-width: 0;
1347
- padding: var(--spacing-1) 0;
1369
+ padding: var(--crewlet-account-row-pad) 0;
1348
1370
  }
1349
1371
 
1350
1372
  .crewlet-account-row__who {
@@ -1361,6 +1383,29 @@
1361
1383
  transition: background var(--motion-duration-fast) var(--motion-easing-default);
1362
1384
  }
1363
1385
 
1386
+ /*
1387
+ * In the rail's foot, the account row reaches up across its own padding to
1388
+ * half the foot's gap, to meet the row above (HitArea.css).
1389
+ *
1390
+ * AND IT STANDS ON THE NAV'S COLUMNS: the avatar centred on the column every
1391
+ * nav glyph is centred on, and the name starting on the line every nav word
1392
+ * starts on. On a 4px inset with an 8px gap a 26px avatar stood 2px left of
1393
+ * the glyphs above it and the name 2px right of their words. The avatar's box
1394
+ * takes a nav glyph's width (`sm`, 14px) and the badge is centred over it, so
1395
+ * whatever size of badge a caller hands the row, it is centred where a glyph
1396
+ * is, and the row takes the nav row's pad and its glyph-to-word gap.
1397
+ */
1398
+ .crewlet-app-shell__rail-foot .crewlet-account-row__who {
1399
+ --crewlet-hit-area-block-start: calc(var(--crewlet-rail-foot-gap) / 2 + var(--crewlet-account-row-pad));
1400
+ gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
1401
+ padding-inline-start: var(--size-nav-row-pad);
1402
+ }
1403
+
1404
+ .crewlet-app-shell__rail-foot .crewlet-account-row__avatar {
1405
+ justify-content: center;
1406
+ width: 14px;
1407
+ }
1408
+
1364
1409
  /* The row as the reader's menu button: a button drawn as the link is. */
1365
1410
  button.crewlet-account-row__who {
1366
1411
  width: 100%;
@@ -3299,7 +3344,7 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3299
3344
  .crewlet-kind--sheet { --crewlet-kind-hue: var(--color-artifact-kind-sheet); --crewlet-kind-fill: var(--color-artifact-kind-sheet-fill); --crewlet-kind-line: var(--color-artifact-kind-sheet-line); --crewlet-kind-ink: var(--color-artifact-kind-sheet-ink); }
3300
3345
 
3301
3346
 
3302
- /* ArtifactMakeRow-XBA2MPSY.css */
3347
+ /* ArtifactMakeRow-6UX2LTF7.css */
3303
3348
  /*
3304
3349
  * The "Start a new artifact" tray.
3305
3350
  *
@@ -3310,9 +3355,16 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3310
3355
  *
3311
3356
  * THE TRAY SIZES ITSELF BY ITS OWN WIDTH, never the window's: it sits in a
3312
3357
  * page column a sidebar narrows, so three steps are container queries on the
3313
- * tray. Under 560px three across in two lines; from 560px the six in one
3314
- * line, each its mark over its name, so a long name is never cut; from 920px
3315
- * the mark beside the name and what the kind is for under it.
3358
+ * tray. Under 560px three across, each its mark over its name; from 560px
3359
+ * every kind in one line, still mark over name, so a long name is never cut;
3360
+ * from 920px the mark beside the name and what the kind is for under it.
3361
+ *
3362
+ * AND BY ITS OWN COUNT. A reader is offered the kinds their company runs, so
3363
+ * a tray holds five as often as six, and a grid fixed at six columns left an
3364
+ * empty sixth of dotted field at the end of the line, and three across left a
3365
+ * hole after the fifth. The line takes one column per kind
3366
+ * (`--crewlet-make-row-count`, set from the items), and the narrow tray fills
3367
+ * its rows by the count (`data-count`): see the narrow step below.
3316
3368
  */
3317
3369
 
3318
3370
  .crewlet-make-row {
@@ -3328,9 +3380,10 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3328
3380
  }
3329
3381
 
3330
3382
  .crewlet-make-row__list {
3383
+ --crewlet-make-row-gap: var(--spacing-1);
3331
3384
  display: grid;
3332
- grid-template-columns: repeat(3, minmax(0, 1fr));
3333
- gap: var(--spacing-1);
3385
+ grid-template-columns: repeat(6, minmax(0, 1fr));
3386
+ gap: var(--crewlet-make-row-gap);
3334
3387
  margin: 0;
3335
3388
  padding: var(--spacing-1);
3336
3389
  list-style: none;
@@ -3355,6 +3408,10 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3355
3408
  color: var(--color-text-primary);
3356
3409
  text-decoration: none;
3357
3410
  outline: none;
3411
+ /* Half the gap to each neighbour, so the targets meet (HitArea.css), and
3412
+ the 1px border the reach is measured inside of. */
3413
+ --crewlet-hit-area-block: calc(var(--crewlet-make-row-gap) / 2 + 1px);
3414
+ --crewlet-hit-area-inline: calc(var(--crewlet-make-row-gap) / 2 + 1px);
3358
3415
  transition:
3359
3416
  background-color var(--motion-duration-fast) var(--motion-easing-out),
3360
3417
  border-color var(--motion-duration-fast) var(--motion-easing-out),
@@ -3406,9 +3463,40 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3406
3463
  line-height: 1.35;
3407
3464
  }
3408
3465
 
3466
+ /*
3467
+ * THE NARROW TRAY, on six tracks, each kind two of them: three a row. A last
3468
+ * row that is short is centred under the full one rather than left with a
3469
+ * hole after it, so five kinds stand three and two, the two in the middle.
3470
+ * Two and four kinds stand two a row, which fills every row, and one kind
3471
+ * takes the tray.
3472
+ */
3473
+ @container (width < 560px) {
3474
+ .crewlet-make-row__cell {
3475
+ grid-column: span 2;
3476
+ }
3477
+
3478
+ /* One kind short of a full last row: the first of the two moves in a track. */
3479
+ .crewlet-make-row__cell:nth-child(3n + 1):nth-last-child(2) {
3480
+ grid-column: 2 / span 2;
3481
+ }
3482
+
3483
+ /* A last row of one stands in the middle. */
3484
+ .crewlet-make-row__cell:nth-child(3n + 1):last-child {
3485
+ grid-column: 3 / span 2;
3486
+ }
3487
+
3488
+ .crewlet-make-row__list:is([data-count='2'], [data-count='4']) > .crewlet-make-row__cell {
3489
+ grid-column: span 3;
3490
+ }
3491
+
3492
+ .crewlet-make-row__list[data-count='1'] > .crewlet-make-row__cell {
3493
+ grid-column: span 6;
3494
+ }
3495
+ }
3496
+
3409
3497
  @container (width >= 560px) {
3410
3498
  .crewlet-make-row__list {
3411
- grid-template-columns: repeat(6, minmax(0, 1fr));
3499
+ grid-template-columns: repeat(var(--crewlet-make-row-count, 6), minmax(0, 1fr));
3412
3500
  }
3413
3501
 
3414
3502
  .crewlet-make-row__item {
@@ -6178,7 +6266,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6178
6266
  }
6179
6267
 
6180
6268
 
6181
- /* Card-QOVASQNU.css */
6269
+ /* Card-G2ZGT5Z6.css */
6182
6270
  /*
6183
6271
  * Card, THE surface. Everything on a screen is a card, a row inside one, or a
6184
6272
  * control.
@@ -6633,6 +6721,49 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6633
6721
  min-width: 0;
6634
6722
  }
6635
6723
 
6724
+ /*
6725
+ * ON A NARROW CARD THE SUBTITLE TAKES A LINE OF ITS OWN, under the title and
6726
+ * the card's controls, and wraps there rather than ending.
6727
+ *
6728
+ * One line is right while the subtitle has room to say something beside the
6729
+ * title. In a card under 480px wide it had none: on a phone an Agent seats
6730
+ * card drew "Resets today at midnight, the week…" in 202px of a 361px
6731
+ * sentence, and the half it cut was the half that said when. On its own line
6732
+ * the subtitle has the head's whole width, and the title and the controls
6733
+ * keep the first.
6734
+ *
6735
+ * THE CARD IS THE CONTAINER, and only a card whose head has a subtitle, since
6736
+ * that is the one card this changes. Inline-size containment takes a card's
6737
+ * width from where it stands, never from its contents, which is how a panel
6738
+ * is laid out anyway; a card that sized itself to its contents (a tile in a
6739
+ * row that does not stretch it) and carried no subtitle is untouched.
6740
+ *
6741
+ * THE NAME BLOCK TAKES THE FIRST LINE'S ROOM rather than its own width. With
6742
+ * the row free to wrap, a title wider than what the controls leave would
6743
+ * otherwise push the controls onto a second line; from a zero basis it grows
6744
+ * into the room they leave and clips there, exactly as the one-line head does.
6745
+ */
6746
+ .crewlet-card:has(> .crewlet-card__header > .crewlet-card__subtitle) {
6747
+ container: crewlet-card / inline-size;
6748
+ }
6749
+
6750
+ @container crewlet-card (width < 480px) {
6751
+ .crewlet-card__header:has(> .crewlet-card__subtitle) {
6752
+ flex-wrap: wrap;
6753
+ row-gap: var(--spacing-1);
6754
+ }
6755
+
6756
+ .crewlet-card__header:has(> .crewlet-card__subtitle) > .crewlet-card__header-main {
6757
+ flex: 1 1 0;
6758
+ }
6759
+
6760
+ .crewlet-card__header > .crewlet-card__subtitle {
6761
+ order: 1;
6762
+ flex: 1 1 100%;
6763
+ white-space: normal;
6764
+ }
6765
+ }
6766
+
6636
6767
  .crewlet-card__description {
6637
6768
  margin: 0;
6638
6769
  font-size: var(--font-size-compact);
@@ -8005,7 +8136,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8005
8136
  }
8006
8137
 
8007
8138
 
8008
- /* ChoiceList-EA2W6MOS.css */
8139
+ /* ChoiceList-KFYFAECP.css */
8009
8140
  /*
8010
8141
  * A short list of answers in one bordered box: a radio, the label with a line
8011
8142
  * of detail under it, and a tag at the row's end. The selected row takes the
@@ -8016,8 +8147,10 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8016
8147
  .crewlet-choice-list {
8017
8148
  /* The platform's radio, sized here so a panel can line up with the text beside it. */
8018
8149
  --crewlet-choice-list-radio-size: 13px;
8150
+ /* The step between two answers. Every row's pointer target reaches half of it. */
8151
+ --crewlet-choice-list-gap: var(--spacing-1);
8019
8152
  display: grid;
8020
- gap: var(--spacing-1);
8153
+ gap: var(--crewlet-choice-list-gap);
8021
8154
  padding: var(--spacing-1);
8022
8155
  border: 1px solid var(--color-border-strong);
8023
8156
  border-radius: var(--radius-md);
@@ -8030,21 +8163,24 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8030
8163
 
8031
8164
  .crewlet-choice-list__group {
8032
8165
  display: grid;
8033
- gap: var(--spacing-1);
8166
+ gap: var(--crewlet-choice-list-gap);
8034
8167
  }
8035
8168
 
8036
8169
  .crewlet-choice-list__item {
8037
8170
  display: grid;
8038
- gap: var(--spacing-1);
8171
+ gap: var(--crewlet-choice-list-gap);
8039
8172
  }
8040
8173
 
8041
8174
  /* The "Something else" a list ends with, set apart by a dashed rule. */
8042
8175
  .crewlet-choice-list__item.is-separated {
8043
- padding-top: var(--spacing-1);
8176
+ --crewlet-choice-list-rule-pad: var(--spacing-1);
8177
+ padding-top: var(--crewlet-choice-list-rule-pad);
8044
8178
  border-top: 1px dashed var(--color-border-strong);
8045
8179
  }
8046
8180
 
8047
8181
  .crewlet-choice-list__row {
8182
+ /* Half the step to each neighbour, so the targets meet (HitArea.css). */
8183
+ --crewlet-hit-area-block: calc(var(--crewlet-choice-list-gap) / 2);
8048
8184
  display: grid;
8049
8185
  grid-template-columns: auto minmax(0, 1fr) auto;
8050
8186
  align-items: start;
@@ -8055,6 +8191,23 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8055
8191
  transition: background-color var(--motion-duration-fast) var(--motion-easing-default);
8056
8192
  }
8057
8193
 
8194
+ /*
8195
+ * THE ANSWER AFTER THE RULE reaches up across it, so the pointer leaving the
8196
+ * row above lands on this one rather than on the rule: the dashed line sets
8197
+ * the answer apart for the eye, and is no gap for the hand.
8198
+ */
8199
+ .crewlet-choice-list__item.is-separated > .crewlet-choice-list__row {
8200
+ --crewlet-hit-area-block-start: calc(var(--crewlet-choice-list-gap) / 2 + var(--crewlet-choice-list-rule-pad) + 1px);
8201
+ }
8202
+
8203
+ /*
8204
+ * A ROW WITH ITS PANEL OPEN reaches nothing downward: the panel is part of the
8205
+ * answer and holds controls of its own, which the row must not cover.
8206
+ */
8207
+ .crewlet-choice-list__item:has(> .crewlet-choice-list__panel) > .crewlet-choice-list__row {
8208
+ --crewlet-hit-area-block-end: 0px;
8209
+ }
8210
+
8058
8211
  /* A choice with a picture: the radio, the picture, the words, the tag. The
8059
8212
  picture centres on the label and its detail together. */
8060
8213
  .crewlet-choice-list__row.has-media {
@@ -8378,7 +8531,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8378
8531
  }
8379
8532
 
8380
8533
 
8381
- /* Combobox-4FUVYIE7.css */
8534
+ /* Combobox-YDONYDTM.css */
8382
8535
  /*
8383
8536
  * Combobox: a field that offers completions.
8384
8537
  *
@@ -8405,9 +8558,10 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8405
8558
  overflow-y: auto;
8406
8559
  overscroll-behavior: contain;
8407
8560
  padding: var(--spacing-1);
8561
+ --crewlet-listbox-gap: 1px;
8408
8562
  display: flex;
8409
8563
  flex-direction: column;
8410
- gap: 1px;
8564
+ gap: var(--crewlet-listbox-gap);
8411
8565
  /*
8412
8566
  * OPAQUE, and the product's own panel surface: a translucent list over a
8413
8567
  * form puts two sets of words in the same place, and the words underneath
@@ -8461,7 +8615,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8461
8615
  }
8462
8616
 
8463
8617
 
8464
- /* CommandPalette-7CFGVBND.css */
8618
+ /* CommandPalette-TOZYLWLE.css */
8465
8619
  /*
8466
8620
  * The command palette: a field, an optional row of scopes, one scroller
8467
8621
  * holding the lead and the list, and a key legend.
@@ -8627,10 +8781,11 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8627
8781
  * draw and no slider to measure, and the bar is each tab's own edge.
8628
8782
  */
8629
8783
  .crewlet-palette__scopes {
8784
+ --crewlet-palette-scope-gap: var(--spacing-4);
8630
8785
  flex-shrink: 0;
8631
8786
  display: flex;
8632
8787
  align-items: stretch;
8633
- gap: var(--spacing-4);
8788
+ gap: var(--crewlet-palette-scope-gap);
8634
8789
  min-height: var(--size-row-md);
8635
8790
  padding-inline: var(--spacing-4);
8636
8791
  border-bottom: 1px solid var(--color-border-default);
@@ -8659,6 +8814,9 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8659
8814
  font-weight: var(--font-weight-medium);
8660
8815
  white-space: nowrap;
8661
8816
  cursor: pointer;
8817
+ /* Half the gap to each neighbour, so the scopes' targets meet (HitArea.css).
8818
+ The row's own inline padding holds the reach at either end. */
8819
+ --crewlet-hit-area-inline: calc(var(--crewlet-palette-scope-gap) / 2);
8662
8820
  }
8663
8821
 
8664
8822
  .crewlet-palette__scope:hover,
@@ -8873,7 +9031,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8873
9031
  }
8874
9032
 
8875
9033
 
8876
- /* Composer-PXITWNEK.css */
9034
+ /* Composer-TXULCPPV.css */
8877
9035
  /*
8878
9036
  * A message written in place: the field and its footer strip in one box. The
8879
9037
  * BOX takes the focus ring every field in the package draws (see Input.css):
@@ -8903,7 +9061,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8903
9061
  outline-offset: -1px;
8904
9062
  }
8905
9063
 
8906
- :root[data-crewlet-focus='pointer'] .crewlet-composer:has(.crewlet-composer__field:focus-visible) {
9064
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-composer:has(.crewlet-composer__field:focus-visible) {
8907
9065
  outline-width: 1px;
8908
9066
  outline-color: var(--color-border-selected);
8909
9067
  }
@@ -11939,7 +12097,7 @@ body.crewlet-data-table-resizing {
11939
12097
  }
11940
12098
 
11941
12099
 
11942
- /* DatasetSource-SMGX4PS5.css */
12100
+ /* DatasetSource-FFKTD3ZU.css */
11943
12101
  /*
11944
12102
  * DatasetSource: one entry of a dashboard's Sources rail. The title and its
11945
12103
  * source kind, the definition, then where the rows stand, how many there are
@@ -11975,6 +12133,20 @@ body.crewlet-data-table-resizing {
11975
12133
 
11976
12134
  button.crewlet-dataset-source__summary {
11977
12135
  cursor: pointer;
12136
+ /* Half the list's gap to each neighbour, so the entries' targets meet
12137
+ (HitArea.css), across the entry's 1px boundary and the summary's own. */
12138
+ --crewlet-hit-area-block: calc(var(--crewlet-dataset-source-list-gap, 0px) / 2 + 2px);
12139
+ }
12140
+
12141
+ /* The list has no padding, so its first and last entries reach nothing past
12142
+ it; and an open entry's preview holds controls the summary must not cover. */
12143
+ .crewlet-dataset-source-list__item:first-child button.crewlet-dataset-source__summary {
12144
+ --crewlet-hit-area-block-start: 0px;
12145
+ }
12146
+
12147
+ .crewlet-dataset-source-list__item:last-child button.crewlet-dataset-source__summary,
12148
+ .crewlet-dataset-source--open > button.crewlet-dataset-source__summary {
12149
+ --crewlet-hit-area-block-end: 0px;
11978
12150
  }
11979
12151
 
11980
12152
  button.crewlet-dataset-source__summary:hover {
@@ -12100,9 +12272,10 @@ button.crewlet-dataset-source__summary:focus-visible {
12100
12272
  }
12101
12273
 
12102
12274
  .crewlet-dataset-source-list {
12275
+ --crewlet-dataset-source-list-gap: var(--spacing-1);
12103
12276
  display: flex;
12104
12277
  flex-direction: column;
12105
- gap: var(--spacing-1);
12278
+ gap: var(--crewlet-dataset-source-list-gap);
12106
12279
  margin: 0;
12107
12280
  padding: 0;
12108
12281
  list-style: none;
@@ -12113,7 +12286,7 @@ button.crewlet-dataset-source__summary:focus-visible {
12113
12286
  }
12114
12287
 
12115
12288
 
12116
- /* DateTimePicker-2IVTKFV2.css */
12289
+ /* DateTimePicker-3A7JIIVL.css */
12117
12290
  /*
12118
12291
  * DateTimePicker: a Select-shaped trigger over a calendar dialog.
12119
12292
  *
@@ -12172,8 +12345,8 @@ button.crewlet-dataset-source__summary:focus-visible {
12172
12345
  }
12173
12346
 
12174
12347
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
12175
- :root[data-crewlet-focus='pointer'] .crewlet-datetime:focus-visible,
12176
- :root[data-crewlet-focus='pointer'] .crewlet-datetime.is-open {
12348
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-datetime:focus-visible,
12349
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-datetime.is-open {
12177
12350
  outline-width: 1px;
12178
12351
  outline-color: var(--color-border-selected);
12179
12352
  }
@@ -12305,7 +12478,7 @@ svg.crewlet-datetime__chevron {
12305
12478
  }
12306
12479
 
12307
12480
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
12308
- :root[data-crewlet-focus='pointer'] .crewlet-datetime__time-input:focus-visible {
12481
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-datetime__time-input:focus-visible {
12309
12482
  outline-width: 1px;
12310
12483
  outline-color: var(--color-border-selected);
12311
12484
  }
@@ -12334,18 +12507,25 @@ svg.crewlet-datetime__chevron {
12334
12507
  }
12335
12508
 
12336
12509
 
12337
- /* DescriptionList-IXMRCSMK.css */
12510
+ /* DescriptionList-DEZISDLQ.css */
12338
12511
  /*
12339
12512
  * Metadata pairs on one grid.
12340
12513
  *
12341
12514
  * The term track is `minmax(120px, max-content)`: wide enough that short terms
12342
12515
  * line up with each other, and free to grow for a long one rather than
12343
12516
  * wrapping it into two lines beside a one-word value.
12517
+ *
12518
+ * ONE LIST'S TRACK IS ITS OWN, which is wrong for a page of them. Four cards
12519
+ * of limits stacked on one page each sized the column to their own longest
12520
+ * term, so their values started at four different places and the cards did
12521
+ * not read as one table. `--crewlet-description-list-term` names the track
12522
+ * instead, and it is inherited: set once on the page (or passed to each list
12523
+ * as `termWidth`), every list under it shares one column.
12344
12524
  */
12345
12525
 
12346
12526
  .crewlet-description-list {
12347
12527
  display: grid;
12348
- grid-template-columns: minmax(120px, max-content) 1fr;
12528
+ grid-template-columns: var(--crewlet-description-list-term, minmax(120px, max-content)) 1fr;
12349
12529
  gap: var(--spacing-2) var(--spacing-4);
12350
12530
  margin: 0;
12351
12531
  font-size: var(--font-size-compact);
@@ -12611,7 +12791,7 @@ svg.crewlet-datetime__chevron {
12611
12791
  }
12612
12792
 
12613
12793
 
12614
- /* Disclosure-VKBJJIZ7.css */
12794
+ /* Disclosure-P4FH3C35.css */
12615
12795
  /*
12616
12796
  * The disclosure anatomy, declared once for every expander in the package.
12617
12797
  *
@@ -12729,9 +12909,35 @@ svg.crewlet-datetime__chevron {
12729
12909
  font-variant-ligatures: none;
12730
12910
  }
12731
12911
 
12732
- /* A fact inside the button: quieter than the title it belongs to. */
12912
+ /*
12913
+ * A fact inside the button: quieter than the title it belongs to, and the
12914
+ * first thing to give up room when the row runs short.
12915
+ *
12916
+ * IT USED TO TAKE NONE. `flex: none` held a fact at its full width while the
12917
+ * title, which may shrink, was the only thing that could, so a long fact (a
12918
+ * log's replay mode, generation, range and size, beside a status badge in the
12919
+ * actions) took the whole trigger: the title shrank to nothing, so a row no
12920
+ * longer said which log it was, and the fact ran out of the button and under
12921
+ * the badge beside it.
12922
+ *
12923
+ * A HUNDRED TO THE TITLE'S ONE, as a card's subtitle gives way to its title:
12924
+ * two items that may shrink give up space in proportion to their widths, so
12925
+ * at that ratio the fact absorbs effectively all of it, and ends in an
12926
+ * ellipsis, before the title gives up a pixel. The fact is still the button's
12927
+ * name in full; only its drawing is cut.
12928
+ *
12929
+ * NEVER TO NOTHING. The floor is one glyph wide, because a fact is often a
12930
+ * mark (a failed call's glyph beside a tool's name), and a mark that shrank
12931
+ * to nothing would say nothing at all. A long fact keeps an ellipsis there,
12932
+ * which says a fact was cut. Once the fact is at its floor the title shrinks
12933
+ * and ends in its own ellipsis.
12934
+ */
12733
12935
  .crewlet-disclosure__meta {
12734
- flex: none;
12936
+ flex: 0 100 auto;
12937
+ min-width: 1.5em;
12938
+ overflow: hidden;
12939
+ text-overflow: ellipsis;
12940
+ white-space: nowrap;
12735
12941
  color: var(--color-text-tertiary);
12736
12942
  font-size: var(--font-size-xs);
12737
12943
  }
@@ -13022,7 +13228,7 @@ svg.crewlet-datetime__chevron {
13022
13228
  }
13023
13229
 
13024
13230
 
13025
- /* Document-YFWTWXJP.css */
13231
+ /* Document-TZ2NBLOR.css */
13026
13232
  /*
13027
13233
  * Rendered markdown, set as a document (Document.tsx).
13028
13234
  *
@@ -13398,7 +13604,7 @@ svg.crewlet-datetime__chevron {
13398
13604
  outline: 2px solid transparent;
13399
13605
  }
13400
13606
 
13401
- :root[data-crewlet-focus='pointer'] .crewlet-document-title-field:focus-visible {
13607
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-document-title-field:focus-visible {
13402
13608
  border-block-end-color: var(--color-border-selected);
13403
13609
  box-shadow: none;
13404
13610
  }
@@ -13411,7 +13617,7 @@ svg.crewlet-datetime__chevron {
13411
13617
  box-shadow: 0 1px 0 var(--color-feedback-danger);
13412
13618
  }
13413
13619
 
13414
- :root[data-crewlet-focus='pointer'] .crewlet-document-title-field[aria-invalid='true']:focus-visible {
13620
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-document-title-field[aria-invalid='true']:focus-visible {
13415
13621
  border-block-end-color: var(--color-feedback-danger);
13416
13622
  }
13417
13623
 
@@ -14214,6 +14420,44 @@ button.crewlet-finding-list__row:focus-visible {
14214
14420
  }
14215
14421
 
14216
14422
 
14423
+ /* HitArea-QUOS6ZDJ.css */
14424
+ /*
14425
+ * A ROW'S TARGET RUNS TO ITS NEIGHBOUR'S. The rows of one list are drawn a
14426
+ * step apart, and the gap between them belonged to no row: a pointer crossing
14427
+ * the list slowly met the list itself there, so the hand turned into the arrow
14428
+ * and the hover fill went out between every two rows and came back on the
14429
+ * next, which a reader sees as the cursor flickering. Each row that carries
14430
+ * this class reaches half the gap on each side with an empty `::after`, so the
14431
+ * targets meet in the middle of every gap and the drawn rows keep their
14432
+ * spacing. The pseudo-element is part of its row: it takes the row's cursor,
14433
+ * makes the row `:hover`, and a press on it is a press on the row.
14434
+ *
14435
+ * The reach is set on the ROW, from the gap its list is laid out with, as
14436
+ * `--crewlet-hit-area-block` and `--crewlet-hit-area-inline` (each side may be
14437
+ * set alone with the `-start` and `-end` forms). A row that sets none reaches
14438
+ * nowhere. It stays inside the list's own padding, so no scroller grows.
14439
+ *
14440
+ * IT IS MEASURED FROM THE ROW'S PADDING EDGE, which is where an absolutely
14441
+ * placed box starts, so a row drawn with a border (a transparent one
14442
+ * included) adds the border's width to its reach.
14443
+ *
14444
+ * `position: relative` is at zero specificity, so a row positioned on purpose
14445
+ * keeps its own position and is still the pseudo-element's containing block.
14446
+ */
14447
+ :where(.crewlet-hit-area) {
14448
+ position: relative;
14449
+ }
14450
+
14451
+ .crewlet-hit-area::after {
14452
+ content: '';
14453
+ position: absolute;
14454
+ top: calc(var(--crewlet-hit-area-block-start, var(--crewlet-hit-area-block, 0px)) * -1);
14455
+ bottom: calc(var(--crewlet-hit-area-block-end, var(--crewlet-hit-area-block, 0px)) * -1);
14456
+ inset-inline-start: calc(var(--crewlet-hit-area-inline-start, var(--crewlet-hit-area-inline, 0px)) * -1);
14457
+ inset-inline-end: calc(var(--crewlet-hit-area-inline-end, var(--crewlet-hit-area-inline, 0px)) * -1);
14458
+ }
14459
+
14460
+
14217
14461
  /* HuePicker-PAIGH6LR.css */
14218
14462
  /*
14219
14463
  * A hue's swatch: the hue itself, as a dot beside its name. The name carries
@@ -14999,7 +15243,7 @@ button.crewlet-finding-list__row:focus-visible {
14999
15243
  }
15000
15244
 
15001
15245
 
15002
- /* Input-ABGOFENS.css */
15246
+ /* Input-OQZBCRX5.css */
15003
15247
  /*
15004
15248
  * The form row: Input, Textarea, Label, FormField, FormRow, FormSection and
15005
15249
  * ReadOnlyField.
@@ -15126,8 +15370,13 @@ button.crewlet-finding-list__row:focus-visible {
15126
15370
  * round it before anybody had touched a key. A refused field keeps its own
15127
15371
  * colour under a pointer too (below). A document that tracks nothing keeps
15128
15372
  * the keyboard's ring.
15373
+ *
15374
+ * The modality is matched inside :where(), here and in every field's narrowing
15375
+ * rule, so it narrows a ring and never outranks a variant's own: at the
15376
+ * attribute's specificity it beat `.crewlet-input--command`, and the palette's
15377
+ * borderless search field drew a square accent hairline round its text.
15129
15378
  */
15130
- :root[data-crewlet-focus='pointer'] .crewlet-input:has(.crewlet-input__control:focus-visible) {
15379
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-input:has(.crewlet-input__control:focus-visible) {
15131
15380
  outline-width: 1px;
15132
15381
  outline-color: var(--color-border-selected);
15133
15382
  }
@@ -15152,7 +15401,7 @@ button.crewlet-finding-list__row:focus-visible {
15152
15401
  outline-color: var(--color-feedback-danger);
15153
15402
  }
15154
15403
 
15155
- :root[data-crewlet-focus='pointer'] .crewlet-input.is-error:has(.crewlet-input__control:focus-visible) {
15404
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-input.is-error:has(.crewlet-input__control:focus-visible) {
15156
15405
  outline-color: var(--color-feedback-danger);
15157
15406
  }
15158
15407
 
@@ -15397,7 +15646,7 @@ button.crewlet-finding-list__row:focus-visible {
15397
15646
  }
15398
15647
 
15399
15648
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
15400
- :root[data-crewlet-focus='pointer'] .crewlet-textarea:focus-visible {
15649
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-textarea:focus-visible {
15401
15650
  outline-width: 1px;
15402
15651
  outline-color: var(--color-border-selected);
15403
15652
  }
@@ -15410,7 +15659,7 @@ button.crewlet-finding-list__row:focus-visible {
15410
15659
  outline-color: var(--color-feedback-danger);
15411
15660
  }
15412
15661
 
15413
- :root[data-crewlet-focus='pointer'] .crewlet-textarea.is-error:focus-visible {
15662
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-textarea.is-error:focus-visible {
15414
15663
  outline-color: var(--color-feedback-danger);
15415
15664
  }
15416
15665
 
@@ -16632,7 +16881,7 @@ button.crewlet-finding-list__row:focus-visible {
16632
16881
  }
16633
16882
 
16634
16883
 
16635
- /* Listbox-6WJNJQVQ.css */
16884
+ /* Listbox-NQV6E3FS.css */
16636
16885
  /*
16637
16886
  * The listbox register: one look for every list a field offers.
16638
16887
  *
@@ -16707,6 +16956,9 @@ button.crewlet-finding-list__row:focus-visible {
16707
16956
  cursor: pointer;
16708
16957
  /* A row is chosen by the arrows as often as by the pointer, so the highlight
16709
16958
  lands with no transition: a fade would lag a held arrow key. */
16959
+ /* Where a list sets its rows apart, each row's target reaches half the gap
16960
+ (HitArea.css), so the pointer never falls between two of them. */
16961
+ --crewlet-hit-area-block: calc(var(--crewlet-listbox-gap, 0px) / 2);
16710
16962
  }
16711
16963
 
16712
16964
  /*
@@ -16848,7 +17100,7 @@ button.crewlet-finding-list__row:focus-visible {
16848
17100
  }
16849
17101
 
16850
17102
 
16851
- /* LivePreview-BROGKR4N.css */
17103
+ /* LivePreview-KQEDMQCY.css */
16852
17104
  /*
16853
17105
  * A live preview: the stand-in, the still copy of what the content drew and
16854
17106
  * the live layer it is drawn in, stacked in that order in one box. The box
@@ -16903,6 +17155,19 @@ button.crewlet-finding-list__row:focus-visible {
16903
17155
  transition: none !important;
16904
17156
  }
16905
17157
 
17158
+ /* NOR DOES ANYTHING IN IT SCROLL: a copy of a box that scrolled (a sheet
17159
+ wider than the card, a long list) is a picture of its first view, so it
17160
+ draws no scrollbar. Shown, the bar sat across the card as a stray band.
17161
+ The live layer it is copied from draws none either, so what is laid out
17162
+ there (a sheet's room for a bar included) is what the copy shows. */
17163
+ :is(.crewlet-live-preview__live, .crewlet-live-preview__still) * {
17164
+ scrollbar-width: none !important;
17165
+ }
17166
+
17167
+ :is(.crewlet-live-preview__live, .crewlet-live-preview__still) *::-webkit-scrollbar {
17168
+ display: none;
17169
+ }
17170
+
16906
17171
  /* THE LIVE LAYER renders out of sight: content that is copied is never seen
16907
17172
  live, only its copy is. A frame's page is kept rather than copied, so a
16908
17173
  framed preview's live layer is what fades in once it has drawn. */
@@ -21832,7 +22097,7 @@ button.crewlet-presence-stack__member:focus-visible {
21832
22097
  }
21833
22098
 
21834
22099
 
21835
- /* SegmentedControl-FLI45IOW.css */
22100
+ /* SegmentedControl-B7XCUOML.css */
21836
22101
  /*
21837
22102
  * SegmentedControl: the pill row, drawn with the Tabs classes.
21838
22103
  *
@@ -21860,8 +22125,10 @@ button.crewlet-presence-stack__member:focus-visible {
21860
22125
  * equal weight in a file that happens to come later takes them back.
21861
22126
  */
21862
22127
  .crewlet-tabs.crewlet-segmented--cards {
22128
+ --crewlet-tabs-gap: var(--spacing-2);
22129
+ --crewlet-tabs-row-gap: var(--spacing-2);
21863
22130
  display: grid;
21864
- gap: var(--spacing-2);
22131
+ gap: var(--crewlet-tabs-gap);
21865
22132
  width: 100%;
21866
22133
  align-items: stretch;
21867
22134
  }
@@ -21872,6 +22139,9 @@ button.crewlet-presence-stack__member:focus-visible {
21872
22139
  * surface inside a panel of the same surface reads as a second panel.
21873
22140
  */
21874
22141
  .crewlet-segmented--cards .crewlet-segmented__option {
22142
+ /* A card's 1px border is inside the reach (HitArea.css). */
22143
+ --crewlet-hit-area-inline: calc(var(--crewlet-tabs-gap) / 2 + 1px);
22144
+ --crewlet-hit-area-block: calc(var(--crewlet-tabs-row-gap) / 2 + 1px);
21875
22145
  justify-content: flex-start;
21876
22146
  text-align: left;
21877
22147
  /* A sentence under a name is a sentence: it wraps rather than being cut. */
@@ -21916,7 +22186,8 @@ button.crewlet-presence-stack__member:focus-visible {
21916
22186
  /* No gap between ROWS: each chip's target already overhangs its drawing by
21917
22187
  half a step above and below, so two rows' drawings stand a whole step
21918
22188
  apart while their targets meet. */
21919
- gap: 0 var(--spacing-1);
22189
+ --crewlet-tabs-gap: var(--spacing-1);
22190
+ gap: 0 var(--crewlet-tabs-gap);
21920
22191
  }
21921
22192
 
21922
22193
  /*
@@ -22020,6 +22291,7 @@ button.crewlet-presence-stack__member:focus-visible {
22020
22291
  * every option stays visible and inside the focus ring's room.
22021
22292
  */
22022
22293
  .crewlet-tabs--pill.crewlet-segmented {
22294
+ --crewlet-tabs-row-gap: var(--crewlet-tabs-gap);
22023
22295
  flex-wrap: wrap;
22024
22296
  min-width: 0;
22025
22297
  max-width: 100%;
@@ -22138,7 +22410,7 @@ button.crewlet-presence-stack__member:focus-visible {
22138
22410
  }
22139
22411
 
22140
22412
 
22141
- /* Select-W3CHTZXP.css */
22413
+ /* Select-F526HLNR.css */
22142
22414
  /*
22143
22415
  * Select: one chrome over two controls, and the product's only dropdown.
22144
22416
  *
@@ -22217,7 +22489,7 @@ button.crewlet-presence-stack__member:focus-visible {
22217
22489
  }
22218
22490
 
22219
22491
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
22220
- :root[data-crewlet-focus='pointer'] .crewlet-select:focus-within {
22492
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-select:focus-within {
22221
22493
  outline-width: 1px;
22222
22494
  outline-color: var(--color-border-selected);
22223
22495
  }
@@ -22280,7 +22552,7 @@ button.crewlet-presence-stack__member:focus-visible {
22280
22552
  outline-color: var(--color-feedback-danger);
22281
22553
  }
22282
22554
 
22283
- :root[data-crewlet-focus='pointer'] .crewlet-select.is-error:focus-within {
22555
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-select.is-error:focus-within {
22284
22556
  outline-color: var(--color-feedback-danger);
22285
22557
  }
22286
22558
 
@@ -22427,9 +22699,10 @@ svg.crewlet-select__chevron {
22427
22699
  }
22428
22700
 
22429
22701
  .crewlet-select__group {
22702
+ --crewlet-listbox-gap: 1px;
22430
22703
  display: flex;
22431
22704
  flex-direction: column;
22432
- gap: 1px;
22705
+ gap: var(--crewlet-listbox-gap);
22433
22706
  }
22434
22707
 
22435
22708
  .crewlet-select__option {
@@ -22582,7 +22855,7 @@ svg.crewlet-select__chevron {
22582
22855
  }
22583
22856
 
22584
22857
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
22585
- :root[data-crewlet-focus='pointer'] .crewlet-select__search:focus-within {
22858
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-select__search:focus-within {
22586
22859
  outline-width: 1px;
22587
22860
  outline-color: var(--color-border-selected);
22588
22861
  }
@@ -22857,7 +23130,7 @@ svg.crewlet-select__chevron {
22857
23130
  }
22858
23131
 
22859
23132
 
22860
- /* SheetGrid-YRDXTIIZ.css */
23133
+ /* SheetGrid-XK7T7M34.css */
22861
23134
  /*
22862
23135
  * The editable sheet (SheetGrid.tsx) and its cells (cells.tsx).
22863
23136
  *
@@ -23309,16 +23582,21 @@ svg.crewlet-select__chevron {
23309
23582
  /* ADD COLUMN stands beside the header row, outside the grid's roles: the
23310
23583
  scroller lays the grid and the control side by side, the grid's last track
23311
23584
  still takes the slack up to the control, and the control sticks to the top
23312
- with the header while the rows scroll under it. */
23585
+ with the header while the rows scroll under it. Its track is the control's
23586
+ own square plus an inset on each side, so the square never fills the track
23587
+ edge to edge. THE GRID GROWS INTO WHATEVER THE CONTROL LEAVES rather than
23588
+ into a width assumed for it: held to 100% less an assumed width, it
23589
+ overflowed by the difference whenever the control drew wider, and the
23590
+ sheet scrolled sideways by a few pixels. */
23313
23591
  .crewlet-sheet-grid__scroller--add-column {
23314
- --crewlet-sheet-add-column-width: var(--size-target-min);
23592
+ --crewlet-sheet-add-column-width: calc(var(--size-control-sm) + 2 * var(--spacing-1));
23315
23593
  display: flex;
23316
23594
  align-items: flex-start;
23317
23595
  }
23318
23596
 
23319
23597
  .crewlet-sheet-grid__scroller--add-column > .crewlet-sheet-grid__grid {
23320
- flex: 0 0 auto;
23321
- min-width: calc(100% - var(--crewlet-sheet-add-column-width));
23598
+ flex: 1 0 auto;
23599
+ min-width: 0;
23322
23600
  }
23323
23601
 
23324
23602
  .crewlet-sheet-grid__add-column {
@@ -23713,7 +23991,7 @@ svg.crewlet-select__chevron {
23713
23991
  }
23714
23992
 
23715
23993
 
23716
- /* SidebarNav-KF66MLOM.css */
23994
+ /* SidebarNav-7SGUZYKK.css */
23717
23995
  /*
23718
23996
  * The rail's navigation.
23719
23997
  *
@@ -23744,9 +24022,12 @@ svg.crewlet-select__chevron {
23744
24022
  * old step, so the gap is paid for many times over by the row it sits beside.
23745
24023
  */
23746
24024
  .crewlet-nav-group {
24025
+ --crewlet-nav-group-gap: calc(var(--spacing-1) / 2);
24026
+ /* What a row reaches across (HitArea.css): its own list's gap. */
24027
+ --crewlet-nav-row-gap: var(--crewlet-nav-group-gap);
23747
24028
  display: flex;
23748
24029
  flex-direction: column;
23749
- gap: calc(var(--spacing-1) / 2);
24030
+ gap: var(--crewlet-nav-group-gap);
23750
24031
  min-width: 0;
23751
24032
  }
23752
24033
 
@@ -23891,6 +24172,20 @@ svg.crewlet-select__chevron {
23891
24172
  transition:
23892
24173
  background var(--motion-duration-fast) var(--motion-easing-default),
23893
24174
  color var(--motion-duration-fast) var(--motion-easing-default);
24175
+ /* Half the gap to each neighbour, so the targets meet (HitArea.css). */
24176
+ --crewlet-hit-area-block: calc(var(--crewlet-nav-row-gap, 0px) / 2);
24177
+ }
24178
+
24179
+ /*
24180
+ * AN OPEN ROW AND ITS FIRST NESTED ROW ABUT, with no gap between them to
24181
+ * cross, so neither reaches into the other.
24182
+ */
24183
+ .crewlet-nav-item:has(> .crewlet-nav-item__children:not([hidden])) > .crewlet-nav-item__head > .crewlet-nav-item__row {
24184
+ --crewlet-hit-area-block-end: 0px;
24185
+ }
24186
+
24187
+ .crewlet-nav-item__children > .crewlet-nav-item:first-child > .crewlet-nav-item__head > .crewlet-nav-item__row {
24188
+ --crewlet-hit-area-block-start: 0px;
23894
24189
  }
23895
24190
 
23896
24191
  .crewlet-nav-item__row:hover {
@@ -24102,9 +24397,11 @@ svg.crewlet-select__chevron {
24102
24397
  * rail keeps for the one count that asks the reader to act.
24103
24398
  */
24104
24399
  .crewlet-nav-item__children {
24400
+ --crewlet-nav-children-gap: var(--spacing-1);
24401
+ --crewlet-nav-row-gap: var(--crewlet-nav-children-gap);
24105
24402
  display: flex;
24106
24403
  flex-direction: column;
24107
- gap: var(--spacing-1);
24404
+ gap: var(--crewlet-nav-children-gap);
24108
24405
  margin-left: var(--size-nav-row-pad);
24109
24406
  padding-left: var(--spacing-2);
24110
24407
  border-left: 1px solid var(--color-border-default);
@@ -25136,7 +25433,7 @@ svg.crewlet-select__chevron {
25136
25433
  }
25137
25434
 
25138
25435
 
25139
- /* SourceEditor-QAYE2JS6.css */
25436
+ /* SourceEditor-OKPWPFXK.css */
25140
25437
  /*
25141
25438
  * Source text written in place: a gutter of line numbers beside a real
25142
25439
  * textarea, and the marks a checker placed drawn behind the text. The gutter,
@@ -25176,7 +25473,7 @@ svg.crewlet-select__chevron {
25176
25473
  outline-offset: -1px;
25177
25474
  }
25178
25475
 
25179
- :root[data-crewlet-focus='pointer'] .crewlet-source-editor:has(.crewlet-source-editor__field:focus-visible) {
25476
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-source-editor:has(.crewlet-source-editor__field:focus-visible) {
25180
25477
  outline-width: 1px;
25181
25478
  outline-color: var(--color-border-selected);
25182
25479
  }
@@ -25540,7 +25837,7 @@ svg.crewlet-select__chevron {
25540
25837
  .crewlet-statcard--info .crewlet-statcard__value { color: var(--color-feedback-info-ink); }
25541
25838
 
25542
25839
 
25543
- /* StatGroup-PADTJCUQ.css */
25840
+ /* StatGroup-DOFHX5QJ.css */
25544
25841
  /*
25545
25842
  * A row of stat tiles.
25546
25843
  *
@@ -25548,11 +25845,29 @@ svg.crewlet-select__chevron {
25548
25845
  * tiles appeared and vanished moved every number on the page for a reason that
25549
25846
  * had nothing to do with the numbers, which is exactly what a reader watching
25550
25847
  * a live board is trying not to have happen.
25848
+ *
25849
+ * IT FOLDS BY ITS OWN WIDTH, never the window's. The row used to drop to two
25850
+ * columns under a 1024px viewport, but a row's width is whatever its column
25851
+ * leaves it: beside the rail and a settings column at exactly 1024 a
25852
+ * four-column row was 489px wide, its tiles about 120px each, and its figures
25853
+ * were cut ("Not s…", "1.6 …"), while on a phone a three-column row folded to
25854
+ * two and left its third tile alone on a row of its own. So the row is a size
25855
+ * container, and the tiles take their place from the row's own width.
25856
+ *
25857
+ * TWELVE TRACKS, AND EACH TILE SPANS ITS SHARE. A container query styles what
25858
+ * is inside the container, never the container itself, so the row cannot
25859
+ * change its own column count by its own width. Its tiles can change how many
25860
+ * of its twelve tracks they span, which is the same layout: twelve divides by
25861
+ * every count a row takes (one, two, three and four a row).
25862
+ *
25863
+ * The row's width comes from where it stands, as a block's does: inline-size
25864
+ * containment means its contents never widen it.
25551
25865
  */
25552
25866
 
25553
25867
  .crewlet-stat-group {
25868
+ container: crewlet-stat-group / inline-size;
25554
25869
  display: grid;
25555
- grid-template-columns: repeat(var(--crewlet-stat-group-cols, 4), minmax(0, 1fr));
25870
+ grid-template-columns: repeat(12, minmax(0, 1fr));
25556
25871
  /* The flush-panel recipe: the card's surface, its hairline and its 12px
25557
25872
  corner, flat as every card is, and `overflow: hidden`, which is what lets
25558
25873
  the tiles inside sit against the corners without their own hairlines
@@ -25563,8 +25878,19 @@ svg.crewlet-select__chevron {
25563
25878
  overflow: hidden;
25564
25879
  }
25565
25880
 
25566
- /* Inside another card: the card's surface and edge are the row's. */
25567
- .crewlet-stat-group--flush {
25881
+ /*
25882
+ * Inside another card: the card's surface and edge are the row's.
25883
+ *
25884
+ * A ROW STANDING IN A CARD IS FLUSH WHETHER OR NOT ITS CALLER SAID SO. Six
25885
+ * settings pages wrapped a row in a card without `flush`, and each drew the
25886
+ * row's own edge and 12px corner one pixel inside the card's: a box inside a
25887
+ * box, and inside a padded body a third frame. A row that is a card's content,
25888
+ * or its body's, is that card's row; `flush` is for a host that is not a
25889
+ * Card (a widget's frame, a panel of an application's own).
25890
+ */
25891
+ .crewlet-stat-group--flush,
25892
+ .crewlet-card > .crewlet-stat-group,
25893
+ .crewlet-card__body > .crewlet-stat-group {
25568
25894
  background: transparent;
25569
25895
  border: 0;
25570
25896
  border-radius: var(--radius-none);
@@ -25590,40 +25916,93 @@ svg.crewlet-select__chevron {
25590
25916
  }
25591
25917
 
25592
25918
  /*
25593
- * A hairline between columns, drawn on the tile that follows one.
25919
+ * Each tile spans its share of the twelve tracks: the row's `columns`, set on
25920
+ * it as `--crewlet-stat-group-cols`, a row.
25921
+ */
25922
+ .crewlet-stat-group > * {
25923
+ grid-column: span calc(12 / var(--crewlet-stat-group-cols, 4));
25924
+ }
25925
+
25926
+ /*
25927
+ * The hairlines between tiles: one before every tile that does not start a
25928
+ * row, and one above every tile that is not on the first.
25594
25929
  *
25595
25930
  * NAMED TWICE, ON PURPOSE. The rule above clears the tile's own border and
25596
25931
  * weighs two classes, so a one-class selector here loses to it and the row
25597
25932
  * of numbers runs together with nothing between the columns. The first
25598
- * selector matches whatever a caller puts in the row; the second weighs the
25599
- * same as the rule it has to beat, and sits after it.
25933
+ * selector of each pair matches whatever a caller puts in the row; the second
25934
+ * weighs at least as much as the rule it has to beat, and sits after it.
25600
25935
  */
25601
25936
  .crewlet-stat-group > * + *,
25602
25937
  .crewlet-stat-group > .crewlet-statcard + .crewlet-statcard {
25603
25938
  border-left: 1px solid var(--color-border-default);
25604
25939
  }
25605
25940
 
25941
+ .crewlet-stat-group[data-columns='2'] > :nth-child(2n + 1),
25942
+ .crewlet-stat-group[data-columns='2'] > .crewlet-statcard:nth-child(2n + 1),
25943
+ .crewlet-stat-group[data-columns='3'] > :nth-child(3n + 1),
25944
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard:nth-child(3n + 1),
25945
+ .crewlet-stat-group[data-columns='4'] > :nth-child(4n + 1),
25946
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(4n + 1) {
25947
+ border-left: 0;
25948
+ }
25949
+
25950
+ .crewlet-stat-group[data-columns='2'] > :nth-child(n + 3),
25951
+ .crewlet-stat-group[data-columns='2'] > .crewlet-statcard:nth-child(n + 3),
25952
+ .crewlet-stat-group[data-columns='3'] > :nth-child(n + 4),
25953
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard:nth-child(n + 4),
25954
+ .crewlet-stat-group[data-columns='4'] > :nth-child(n + 5),
25955
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(n + 5) {
25956
+ border-top: 1px solid var(--color-border-default);
25957
+ }
25958
+
25606
25959
  /*
25607
- * Two columns under the shell breakpoint, which is where the engine drops its
25608
- * own stat row, and strictly under it, as the shell switches. The step is
25609
- * 1024px, a 236px rail, the 8px inset and a 780px floor for the sheet, and it
25610
- * is the width at which the shell stops holding the page beside the rail. The
25611
- * rules are written for the general case rather than per column count: the
25612
- * first tile of each pair loses its left hairline, and everything on the
25613
- * second row and below gains a top one.
25960
+ * FOUR A ROW FOLD TO TWO under 640px of row (the phone breakpoint's number):
25961
+ * four tiles of 160px is the narrowest at which a six-character figure and a
25962
+ * two-word label still stand on one line each. Two by two keeps every row
25963
+ * full.
25614
25964
  */
25615
- @media (width < 1024px) {
25616
- .crewlet-stat-group {
25617
- grid-template-columns: repeat(2, minmax(0, 1fr));
25965
+ @container crewlet-stat-group (width < 640px) {
25966
+ .crewlet-stat-group[data-columns='4'] > *,
25967
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard {
25968
+ grid-column: span 6;
25618
25969
  }
25619
25970
 
25620
- .crewlet-stat-group > *:nth-child(odd),
25621
- .crewlet-stat-group > .crewlet-statcard:nth-child(odd) {
25971
+ .crewlet-stat-group[data-columns='4'] > :nth-child(odd),
25972
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(odd) {
25622
25973
  border-left: 0;
25623
25974
  }
25624
25975
 
25625
- .crewlet-stat-group > *:nth-child(n + 3),
25626
- .crewlet-stat-group > .crewlet-statcard:nth-child(n + 3) {
25976
+ .crewlet-stat-group[data-columns='4'] > :nth-child(even),
25977
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(even) {
25978
+ border-left: 1px solid var(--color-border-default);
25979
+ }
25980
+
25981
+ .crewlet-stat-group[data-columns='4'] > :nth-child(n + 3),
25982
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(n + 3) {
25983
+ border-top: 1px solid var(--color-border-default);
25984
+ }
25985
+ }
25986
+
25987
+ /*
25988
+ * THREE A ROW STACK under 480px of row (the small breakpoint's number), at the
25989
+ * same 160px a tile. Folded to two, three tiles stood two and one, the last
25990
+ * alone at double width and a different height, which read as a tile that had
25991
+ * failed to load; one a row leaves no row short.
25992
+ */
25993
+ @container crewlet-stat-group (width < 480px) {
25994
+ .crewlet-stat-group[data-columns='3'] > *,
25995
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard {
25996
+ grid-column: span 12;
25997
+ }
25998
+
25999
+ .crewlet-stat-group[data-columns='3'] > *,
26000
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard + .crewlet-statcard {
26001
+ border-left: 0;
26002
+ }
26003
+
26004
+ .crewlet-stat-group[data-columns='3'] > :nth-child(n + 2),
26005
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard:nth-child(n + 2) {
25627
26006
  border-top: 1px solid var(--color-border-default);
25628
26007
  }
25629
26008
  }
@@ -26806,7 +27185,7 @@ b.crewlet-switcher__match {
26806
27185
  }
26807
27186
 
26808
27187
 
26809
- /* Tabs-MMZXV5EF.css */
27188
+ /* Tabs-WIF7457H.css */
26810
27189
  /*
26811
27190
  * The pill register: Tabs and SegmentedControl.
26812
27191
  *
@@ -26837,8 +27216,9 @@ b.crewlet-switcher__match {
26837
27216
  * row is reachable by the arrow keys either way.
26838
27217
  */
26839
27218
  .crewlet-tabs--underline {
27219
+ --crewlet-tabs-gap: var(--spacing-2);
26840
27220
  display: flex;
26841
- gap: var(--spacing-2);
27221
+ gap: var(--crewlet-tabs-gap);
26842
27222
  border-bottom: 1px solid var(--color-border-default);
26843
27223
  position: relative;
26844
27224
  width: 100%;
@@ -26912,8 +27292,9 @@ b.crewlet-switcher__match {
26912
27292
  */
26913
27293
  .crewlet-tabs--pill {
26914
27294
  --crewlet-tabs-pill-inset: 1px;
27295
+ --crewlet-tabs-gap: var(--crewlet-tabs-pill-inset);
26915
27296
 
26916
- gap: var(--crewlet-tabs-pill-inset);
27297
+ gap: var(--crewlet-tabs-gap);
26917
27298
  padding: var(--crewlet-tabs-pill-inset);
26918
27299
  background: var(--color-surface-elevated);
26919
27300
  border: 1px solid var(--color-border-default);
@@ -26974,6 +27355,20 @@ b.crewlet-switcher__match {
26974
27355
  background-color var(--motion-duration-fast) var(--motion-easing-default),
26975
27356
  color var(--motion-duration-fast) var(--motion-easing-default),
26976
27357
  box-shadow var(--motion-duration-fast) var(--motion-easing-default);
27358
+ /* Half the gap to each neighbour, so the targets meet (HitArea.css). A row
27359
+ that wraps reaches across its rows' gap too. */
27360
+ --crewlet-hit-area-inline: calc(var(--crewlet-tabs-gap, 0px) / 2);
27361
+ --crewlet-hit-area-block: calc(var(--crewlet-tabs-row-gap, 0px) / 2);
27362
+ }
27363
+
27364
+ /* The row's two ends reach nothing past it: the underline row is a scroller,
27365
+ and a target past its last tab would be width it scrolls by. */
27366
+ .crewlet-tabs__tab:first-child {
27367
+ --crewlet-hit-area-inline-start: 0px;
27368
+ }
27369
+
27370
+ .crewlet-tabs__tab:last-child {
27371
+ --crewlet-hit-area-inline-end: 0px;
26977
27372
  }
26978
27373
 
26979
27374
  /*
@@ -27120,9 +27515,10 @@ b.crewlet-switcher__match {
27120
27515
  * (FilterChip draws the same pair).
27121
27516
  */
27122
27517
  .crewlet-tabs--chip {
27518
+ --crewlet-tabs-gap: calc(var(--spacing-1) / 2);
27123
27519
  display: inline-flex;
27124
27520
  align-items: center;
27125
- gap: calc(var(--spacing-1) / 2);
27521
+ gap: var(--crewlet-tabs-gap);
27126
27522
  }
27127
27523
 
27128
27524
  .crewlet-tabs--chip .crewlet-tabs__tab {
@@ -27238,7 +27634,7 @@ b.crewlet-switcher__match {
27238
27634
  }
27239
27635
 
27240
27636
 
27241
- /* Tag-SRGTK5KI.css */
27637
+ /* Tag-2DQOVE6W.css */
27242
27638
  /*
27243
27639
  * The tag: a small pill naming a state, a category or a value.
27244
27640
  *
@@ -27518,12 +27914,22 @@ b.crewlet-switcher__match {
27518
27914
  --crewlet-tag-line: var(--color-border-strong-hover);
27519
27915
  }
27520
27916
 
27521
- /* The neutral outline is the engine's `.badge.outline`: the hairline step as
27522
- the boundary, and the tertiary ink, which is a quieter register than the
27523
- tinted outlines keep. It is the appearance for a value that is not a state
27524
- at all, so it says less than its neighbours on purpose. */
27917
+ /*
27918
+ * The neutral outline: the neutral pill's own boundary with no fill, and the
27919
+ * tertiary ink, which is a quieter register than the tinted outlines keep. It
27920
+ * is the appearance for a value that is not a state at all, so it says less
27921
+ * than its neighbours on purpose, by its ink and its empty ground.
27922
+ *
27923
+ * NOT BY A FAINTER EDGE. It used to take the plain hairline, the line that
27924
+ * finds a card, and on the card it so often stands on that line measured
27925
+ * 1.07:1 in dark: Limits' "Off" beside a filled "Default", an audit row's
27926
+ * machine and open, a tool's "builtin", all read as loose words rather than
27927
+ * as pills. The strong step is the edge the neutral soft pill already draws
27928
+ * (1.49:1 dark, 1.52:1 light on the card), so the two neutral pills differ by
27929
+ * their fill alone and both read as pills.
27930
+ */
27525
27931
  .crewlet-tag--neutral.crewlet-tag--outline {
27526
- border-color: var(--color-border-default);
27932
+ border-color: var(--color-border-strong);
27527
27933
  --crewlet-tag-ink: var(--color-text-tertiary);
27528
27934
  }
27529
27935
 
@@ -27817,7 +28223,7 @@ b.crewlet-switcher__match {
27817
28223
  }
27818
28224
 
27819
28225
 
27820
- /* TagsInput-7EGBBXHS.css */
28226
+ /* TagsInput-CLFHP6I2.css */
27821
28227
  /*
27822
28228
  * TagsInput: several values in one field.
27823
28229
  *
@@ -27897,7 +28303,7 @@ b.crewlet-switcher__match {
27897
28303
  }
27898
28304
 
27899
28305
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
27900
- :root[data-crewlet-focus='pointer'] .crewlet-tags-input__box:focus-visible {
28306
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-tags-input__box:focus-visible {
27901
28307
  outline-width: 1px;
27902
28308
  outline-color: var(--color-border-selected);
27903
28309
  }
@@ -28547,7 +28953,7 @@ b.crewlet-switcher__match {
28547
28953
  }
28548
28954
 
28549
28955
 
28550
- /* TimeWindowPicker-DEFDV77Z.css */
28956
+ /* TimeWindowPicker-I3HXC74I.css */
28551
28957
  /*
28552
28958
  * TimeWindowPicker: one trigger over one panel.
28553
28959
  *
@@ -28602,8 +29008,8 @@ b.crewlet-switcher__match {
28602
29008
  }
28603
29009
 
28604
29010
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
28605
- :root[data-crewlet-focus='pointer'] .crewlet-time-window:focus-visible,
28606
- :root[data-crewlet-focus='pointer'] .crewlet-time-window.is-open {
29011
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-time-window:focus-visible,
29012
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-time-window.is-open {
28607
29013
  outline-width: 1px;
28608
29014
  outline-color: var(--color-border-selected);
28609
29015
  }
@@ -28880,7 +29286,7 @@ svg.crewlet-time-window__tick {
28880
29286
  }
28881
29287
 
28882
29288
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
28883
- :root[data-crewlet-focus='pointer'] .crewlet-time-window__masked:has(.crewlet-time-window__masked-input:focus-visible) {
29289
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-time-window__masked:has(.crewlet-time-window__masked-input:focus-visible) {
28884
29290
  outline-width: 1px;
28885
29291
  outline-color: var(--color-border-selected);
28886
29292
  }