@crewlethq/ui 0.55.0 → 0.57.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 (315) hide show
  1. package/README.md +97 -4
  2. package/dist/Accordion/index.js +2 -2
  3. package/dist/AgentHandoffPanel/index.js +14 -9
  4. package/dist/AppShell/AppShell.d.ts +84 -1
  5. package/dist/AppShell/ResizeHandle.d.ts +74 -0
  6. package/dist/AppShell/index.d.ts +7 -2
  7. package/dist/AppShell/index.js +6 -4
  8. package/dist/AppShell/regions.d.ts +36 -0
  9. package/dist/AppShell/storedWidth.d.ts +47 -0
  10. package/dist/{AppShell-5LPXYUV3.css → AppShell-ZVCJRGXH.css} +172 -1
  11. package/dist/ArrangeFrame/index.js +2 -2
  12. package/dist/ArrangeList/index.js +5 -5
  13. package/dist/ArtifactBar/ArtifactBar.d.ts +13 -2
  14. package/dist/ArtifactBar/index.js +9 -8
  15. package/dist/{ArtifactBar-UMZCTARR.css → ArtifactBar-LEBMR35Y.css} +19 -1
  16. package/dist/ArtifactCard/index.js +6 -6
  17. package/dist/ArtifactNameCell/ArtifactNameCell.d.ts +7 -1
  18. package/dist/ArtifactNameCell/index.js +1 -1
  19. package/dist/ArtifactPanel/ArtifactPanel.d.ts +11 -17
  20. package/dist/ArtifactPanel/index.d.ts +3 -0
  21. package/dist/ArtifactPanel/index.js +8 -2
  22. package/dist/ArtifactPanel-TN4FFK2F.css +43 -0
  23. package/dist/AvatarPicker/index.js +9 -8
  24. package/dist/Button/index.js +2 -1
  25. package/dist/{Button-UWKBTKYD.css → Button-VXJ7M5XF.css} +9 -32
  26. package/dist/Canvas/index.js +5 -4
  27. package/dist/CanvasBoard/index.js +7 -6
  28. package/dist/CanvasToolbar/index.js +6 -5
  29. package/dist/ChangeList/ChangeList.d.ts +114 -0
  30. package/dist/ChangeList/index.d.ts +3 -0
  31. package/dist/ChangeList/index.js +10 -0
  32. package/dist/ChangeList-CB2DLR5S.css +151 -0
  33. package/dist/ChatThread/ChatThread.d.ts +53 -0
  34. package/dist/ChatThread/index.d.ts +3 -0
  35. package/dist/ChatThread/index.js +6 -0
  36. package/dist/ChatThread-52KMDXHB.css +58 -0
  37. package/dist/Checkbox/index.js +4 -4
  38. package/dist/CodeBlock/index.js +5 -4
  39. package/dist/ColorField/index.js +4 -4
  40. package/dist/ColorSwatch/index.js +5 -4
  41. package/dist/Combobox/index.js +5 -5
  42. package/dist/CommandPalette/index.js +9 -8
  43. package/dist/CommentThread/index.js +9 -7
  44. package/dist/Composer/Composer.d.ts +39 -2
  45. package/dist/Composer/index.js +5 -4
  46. package/dist/Composer-JSGTOW3F.css +192 -0
  47. package/dist/ConfirmField/index.js +4 -4
  48. package/dist/ConflictNote/index.js +3 -2
  49. package/dist/ContrastHelp/index.js +2 -2
  50. package/dist/Copyable/index.js +4 -3
  51. package/dist/DataGrid/driving.d.ts +48 -0
  52. package/dist/DataGrid/index.d.ts +2 -0
  53. package/dist/DataGrid/index.js +8 -7
  54. package/dist/DataTable/index.js +10 -9
  55. package/dist/DataView/index.js +14 -13
  56. package/dist/DatasetSource/index.js +2 -2
  57. package/dist/DateTimePicker/index.js +4 -3
  58. package/dist/DiffList/DiffList.d.ts +12 -3
  59. package/dist/DiffList/index.d.ts +1 -1
  60. package/dist/DiffList/index.js +1 -1
  61. package/dist/{DiffList-3EX64AAE.css → DiffList-GE6YBRLJ.css} +53 -0
  62. package/dist/Disclosure/anatomy.d.ts +14 -1
  63. package/dist/Disclosure/index.js +2 -2
  64. package/dist/{Disclosure-P4FH3C35.css → Disclosure-FVMA4RW2.css} +36 -0
  65. package/dist/DocTabsEditor/index.js +8 -7
  66. package/dist/DownloadButton/DownloadButton.d.ts +21 -4
  67. package/dist/DownloadButton/index.d.ts +1 -1
  68. package/dist/DownloadButton/index.js +4 -3
  69. package/dist/EditingStatus/index.js +2 -2
  70. package/dist/{Editor-GNKMX3VF.js → Editor-S4HARQ7V.js} +8 -7
  71. package/dist/EntityList/EntityList.d.ts +37 -0
  72. package/dist/EntityList/index.d.ts +3 -0
  73. package/dist/EntityList/index.js +10 -0
  74. package/dist/EntityList-XIICECVC.css +55 -0
  75. package/dist/ErrorBoundary/index.js +3 -2
  76. package/dist/FileDrop/index.js +3 -2
  77. package/dist/FollowBanner/index.js +3 -2
  78. package/dist/HuePicker/index.js +8 -7
  79. package/dist/IconButton/IconButton.d.ts +6 -1
  80. package/dist/IconButton/index.js +1 -1
  81. package/dist/{IconButton-K24JQHLF.css → IconButton-6WA7UEBJ.css} +44 -21
  82. package/dist/IconTile/IconTile.d.ts +8 -2
  83. package/dist/IconTile/index.js +1 -1
  84. package/dist/{IconTile-4GNWTLAW.css → IconTile-G52XZVR4.css} +3 -0
  85. package/dist/InlineEditor/index.js +6 -5
  86. package/dist/Input/index.js +3 -3
  87. package/dist/LinkInterstitial/index.js +6 -5
  88. package/dist/ListInput/index.js +7 -6
  89. package/dist/LogoSlot/index.js +4 -3
  90. package/dist/MarkdownEditor/index.js +8 -7
  91. package/dist/Menu/index.js +4 -3
  92. package/dist/MergeConflicts/index.js +8 -7
  93. package/dist/MessageBubble/MessageBubble.d.ts +34 -0
  94. package/dist/MessageBubble/index.d.ts +3 -0
  95. package/dist/MessageBubble/index.js +2 -0
  96. package/dist/MessageBubble-GKO6X3QG.css +71 -0
  97. package/dist/Modal/index.js +5 -4
  98. package/dist/OpenInAppCard/OpenInAppCard.d.ts +44 -0
  99. package/dist/OpenInAppCard/index.d.ts +3 -0
  100. package/dist/OpenInAppCard/index.js +15 -0
  101. package/dist/OpenInAppCard-CKHCK7DO.css +24 -0
  102. package/dist/OrgTable/index.js +3 -3
  103. package/dist/PeekRail/PeekHost.d.ts +90 -0
  104. package/dist/PeekRail/PeekRail.d.ts +83 -0
  105. package/dist/PeekRail/activation.d.ts +30 -0
  106. package/dist/PeekRail/index.d.ts +8 -0
  107. package/dist/PeekRail/index.js +8 -0
  108. package/dist/PeekRail-4L5YUQMW.css +95 -0
  109. package/dist/PeopleRail/index.js +4 -3
  110. package/dist/PinTile/index.js +2 -2
  111. package/dist/PresenterView/index.js +5 -4
  112. package/dist/PrincipalPicker/index.js +6 -6
  113. package/dist/ProposalCard/ProposalCard.d.ts +183 -0
  114. package/dist/ProposalCard/index.d.ts +3 -0
  115. package/dist/ProposalCard/index.js +17 -0
  116. package/dist/ProposalCard-23575F4C.css +29 -0
  117. package/dist/ReceiptStrip/ReceiptStrip.d.ts +78 -0
  118. package/dist/ReceiptStrip/index.d.ts +3 -0
  119. package/dist/ReceiptStrip/index.js +5 -0
  120. package/dist/ReceiptStrip-IIRKRTBG.css +93 -0
  121. package/dist/RefusalCard/RefusalCard.d.ts +34 -0
  122. package/dist/RefusalCard/index.d.ts +3 -0
  123. package/dist/RefusalCard/index.js +10 -0
  124. package/dist/RefusalCard-UM67F5HB.css +8 -0
  125. package/dist/RelativeTime/clock.d.ts +0 -6
  126. package/dist/RelativeTime/index.js +1 -1
  127. package/dist/ResizeHandle-2UNSZ4ZQ.css +59 -0
  128. package/dist/ResultTableCard/ResultTableCard.d.ts +64 -0
  129. package/dist/ResultTableCard/index.d.ts +3 -0
  130. package/dist/ResultTableCard/index.js +16 -0
  131. package/dist/ResultTableCard-HZRUDNTX.css +40 -0
  132. package/dist/ReviewList/index.js +2 -2
  133. package/dist/RichEditor/index.js +3 -2
  134. package/dist/RunChip/RunChip.d.ts +53 -0
  135. package/dist/RunChip/index.d.ts +3 -0
  136. package/dist/RunChip/index.js +10 -0
  137. package/dist/RunChip-I2S4VZ3R.css +43 -0
  138. package/dist/SandboxedFrame/index.js +3 -2
  139. package/dist/SegmentedControl/index.js +7 -6
  140. package/dist/SelectionBar/index.js +4 -3
  141. package/dist/SendButton/SendButton.d.ts +38 -0
  142. package/dist/SendButton/index.d.ts +2 -0
  143. package/dist/SendButton/index.js +4 -0
  144. package/dist/SetupWizard/index.js +6 -5
  145. package/dist/ShareDialog/index.js +8 -7
  146. package/dist/SheetColumnEditor/index.js +13 -12
  147. package/dist/SheetGrid/index.js +7 -6
  148. package/dist/SidePanel/SidePanel.d.ts +137 -0
  149. package/dist/SidePanel/SidePanelBase.d.ts +59 -0
  150. package/dist/SidePanel/index.d.ts +5 -0
  151. package/dist/SidePanel/index.js +11 -0
  152. package/dist/SidePanel-ERBUIELD.css +235 -0
  153. package/dist/SlideCompare/index.js +3 -2
  154. package/dist/SlideFilmstrip/index.js +7 -6
  155. package/dist/SlideNav/index.js +2 -2
  156. package/dist/Spinner/Spinner.d.ts +35 -0
  157. package/dist/Spinner/index.d.ts +3 -0
  158. package/dist/Spinner/index.js +2 -0
  159. package/dist/Spinner-XZ2TVYE5.css +46 -0
  160. package/dist/StatusCard/StatusCard.d.ts +59 -0
  161. package/dist/StatusCard/index.d.ts +3 -0
  162. package/dist/StatusCard/index.js +9 -0
  163. package/dist/StatusCard-6RPEE6UU.css +62 -0
  164. package/dist/StepList-A4YVU4JI.css +119 -0
  165. package/dist/Stepper/StepList.d.ts +72 -0
  166. package/dist/Stepper/index.d.ts +3 -0
  167. package/dist/Stepper/index.js +2 -1
  168. package/dist/SuggestionRow/SuggestionRow.d.ts +45 -0
  169. package/dist/SuggestionRow/index.d.ts +3 -0
  170. package/dist/SuggestionRow/index.js +3 -0
  171. package/dist/SuggestionRow-OKBGNHSS.css +102 -0
  172. package/dist/Switcher/index.js +9 -8
  173. package/dist/Table/Table.d.ts +23 -2
  174. package/dist/Table/index.d.ts +1 -1
  175. package/dist/Table/index.js +1 -1
  176. package/dist/{Table-TGCS4C3F.css → Table-RUYMMWXT.css} +49 -0
  177. package/dist/TableCells/index.js +2 -2
  178. package/dist/Tabs/index.js +6 -5
  179. package/dist/TagsInput/index.js +4 -4
  180. package/dist/ThemeGallery/index.js +2 -2
  181. package/dist/ThemeSwitcher/index.js +8 -7
  182. package/dist/ThemeToggle/index.js +2 -2
  183. package/dist/TimeRangePicker/TimeRangePicker.d.ts +121 -0
  184. package/dist/TimeRangePicker/index.d.ts +2 -0
  185. package/dist/TimeRangePicker/index.js +23 -0
  186. package/dist/TimeWindowPicker/index.js +8 -7
  187. package/dist/Toaster/Toaster.d.ts +27 -3
  188. package/dist/Toaster/index.d.ts +2 -2
  189. package/dist/Toaster/index.js +1 -1
  190. package/dist/{Toaster-C6BQ7L6I.css → Toaster-MX7TBMC3.css} +32 -11
  191. package/dist/TreeCanvas/index.js +6 -5
  192. package/dist/TreeGrid/index.js +2 -2
  193. package/dist/VersionCompare/index.js +9 -8
  194. package/dist/VersionTimeline/index.js +4 -3
  195. package/dist/WidgetFrame/index.js +2 -2
  196. package/dist/{chunk-KHKZPZHO.js → chunk-272Y3YMV.js} +3 -3
  197. package/dist/{chunk-LACA4JGC.js → chunk-2BQYODY3.js} +1 -1
  198. package/dist/{chunk-CCPOLCZL.js → chunk-2TTFDRR3.js} +2 -2
  199. package/dist/{chunk-4BJK7FE5.js → chunk-3EYSYEXP.js} +1 -1
  200. package/dist/chunk-3LI4TRUR.js +22 -0
  201. package/dist/{chunk-ATCHK6LC.js → chunk-3NQS6KYG.js} +1 -1
  202. package/dist/{chunk-V2N3BMOT.js → chunk-45KMH3E3.js} +11 -4
  203. package/dist/{chunk-ZMBPEHYH.js → chunk-4CBGIRVU.js} +1 -1
  204. package/dist/{chunk-DFW5PDU5.js → chunk-4OINEWR4.js} +1 -1
  205. package/dist/{chunk-5XKI4ITH.js → chunk-56P72ZBE.js} +4 -4
  206. package/dist/{chunk-J24Q4HTD.js → chunk-5NT6OIPP.js} +13 -3
  207. package/dist/{chunk-O2KT7HBD.js → chunk-5OMV75GE.js} +3 -3
  208. package/dist/{chunk-6RMZH7P7.js → chunk-672GLRBU.js} +2 -2
  209. package/dist/{chunk-MFXN46NN.js → chunk-67F2AM4R.js} +3 -3
  210. package/dist/{chunk-NQCY44B3.js → chunk-67MW366X.js} +2 -2
  211. package/dist/{chunk-URV6MGWT.js → chunk-6KLK7E76.js} +2 -2
  212. package/dist/{chunk-ZFM5L7M4.js → chunk-6NJW5KSX.js} +2 -2
  213. package/dist/{chunk-A4GFEMVI.js → chunk-6T6V5565.js} +1 -1
  214. package/dist/{chunk-THDGBD6Y.js → chunk-AKFHMLEX.js} +1 -1
  215. package/dist/{chunk-CNGHOTHV.js → chunk-AWSFK2IK.js} +2 -2
  216. package/dist/{chunk-HQJ24WPM.js → chunk-AZ5BKSGV.js} +1 -1
  217. package/dist/chunk-BLPT6GHV.js +31 -0
  218. package/dist/chunk-C3FX7ZSU.js +30 -0
  219. package/dist/{chunk-LDGQIDIZ.js → chunk-CGT4R7LW.js} +64 -2
  220. package/dist/chunk-CIYHSTIF.js +182 -0
  221. package/dist/chunk-CZNG3V6L.js +55 -0
  222. package/dist/{chunk-DM4JG4M5.js → chunk-D5OSP3KI.js} +3 -3
  223. package/dist/{chunk-BTHQFWMG.js → chunk-DOPPU6TZ.js} +4 -4
  224. package/dist/{chunk-AC22RZKC.js → chunk-DRT4L4WC.js} +17 -5
  225. package/dist/chunk-EA23JG6R.js +9 -0
  226. package/dist/{chunk-WHL3XZCK.js → chunk-EBG3V4MK.js} +6 -6
  227. package/dist/{chunk-5JDHMDMQ.js → chunk-EDNZHW4K.js} +57 -7
  228. package/dist/{chunk-E6HXFFWO.js → chunk-EGL24VY5.js} +2 -2
  229. package/dist/{chunk-7SHAFLEX.js → chunk-ES4HR34Y.js} +2 -2
  230. package/dist/chunk-EVWTLFKI.js +102 -0
  231. package/dist/chunk-FA44M2YT.js +25 -0
  232. package/dist/{chunk-LKBZV5IT.js → chunk-FLTMDSC3.js} +1 -1
  233. package/dist/{chunk-XANKR3EP.js → chunk-FXQLNETQ.js} +2 -2
  234. package/dist/{chunk-G22NPQG4.js → chunk-GCASX3FD.js} +4 -4
  235. package/dist/{chunk-OGXHZHRX.js → chunk-GG4QZWMQ.js} +2 -2
  236. package/dist/{chunk-XP7EXNKF.js → chunk-GPW4M4OI.js} +2 -2
  237. package/dist/chunk-GZMEWWXW.js +78 -0
  238. package/dist/{chunk-OG6CL3EB.js → chunk-HD4QJ2SI.js} +3 -2
  239. package/dist/{chunk-SYY26XBX.js → chunk-HGCDJOEF.js} +2 -2
  240. package/dist/chunk-HGYHWWA5.js +54 -0
  241. package/dist/{chunk-ZS63CFDO.js → chunk-HL4CPLEK.js} +7 -7
  242. package/dist/{chunk-BEHFTRMZ.js → chunk-HNK43Z3P.js} +23 -5
  243. package/dist/{chunk-UO7JZVCO.js → chunk-HVEDVKXL.js} +1 -1
  244. package/dist/{chunk-FS4IH7VB.js → chunk-I7VG6RQE.js} +2 -2
  245. package/dist/{chunk-3RCHEFIL.js → chunk-ICJRP6QW.js} +2 -2
  246. package/dist/{chunk-YRIZAIU6.js → chunk-IDQBSMMZ.js} +2 -2
  247. package/dist/chunk-JILNCBBS.js +27 -0
  248. package/dist/{chunk-W5GM452Z.js → chunk-JJ3NOBJ6.js} +5 -5
  249. package/dist/chunk-JLRXCKTS.js +97 -0
  250. package/dist/{chunk-OJCVVCAZ.js → chunk-JMMS2PQU.js} +1 -1
  251. package/dist/{chunk-IVAR7NRW.js → chunk-JS2TRHBF.js} +3 -3
  252. package/dist/{chunk-3CZ7XAVY.js → chunk-KS7YIJ4S.js} +10 -6
  253. package/dist/{chunk-MU5KH3JF.js → chunk-LQ6AGUDL.js} +2 -2
  254. package/dist/chunk-LXYSWQNE.js +214 -0
  255. package/dist/chunk-LZXY6IMO.js +68 -0
  256. package/dist/{chunk-EKLEYNGR.js → chunk-MYX4XABB.js} +3 -3
  257. package/dist/{chunk-PM3JVNRY.js → chunk-N3ISZVLK.js} +1 -1
  258. package/dist/chunk-NEHSV55H.js +119 -0
  259. package/dist/{chunk-LLHO4FJK.js → chunk-NHJQXDHA.js} +1 -1
  260. package/dist/{chunk-F6CKQX5D.js → chunk-NK3D66PB.js} +2 -2
  261. package/dist/{chunk-RHPBTE3F.js → chunk-NQGZRMUG.js} +1 -1
  262. package/dist/chunk-NVZCANJ5.js +3 -0
  263. package/dist/{chunk-RRO7UEYU.js → chunk-OHBXOEP3.js} +1 -1
  264. package/dist/{chunk-USVUSO3S.js → chunk-OHG7762N.js} +1 -1
  265. package/dist/{chunk-OBUQVGEG.js → chunk-OJ2QULVH.js} +1 -1
  266. package/dist/{chunk-ITTECHM4.js → chunk-OOZ5AGPS.js} +5 -5
  267. package/dist/{chunk-BZXY2L2D.js → chunk-OYAXKHVW.js} +1 -1
  268. package/dist/{chunk-WQQ5T5SA.js → chunk-OZIBNFLO.js} +1 -1
  269. package/dist/{chunk-DFK5EQTU.js → chunk-PDTEPN4D.js} +1 -1
  270. package/dist/chunk-PIYJNCN7.js +124 -0
  271. package/dist/{chunk-ZVV2VERB.js → chunk-Q6R6EUQ4.js} +3 -3
  272. package/dist/chunk-QYEOGGVS.js +161 -0
  273. package/dist/{chunk-NWGGH2LN.js → chunk-QZ4B72FP.js} +3 -3
  274. package/dist/chunk-RV2FGESF.js +98 -0
  275. package/dist/{chunk-TQ3C3Q7V.js → chunk-S5C64PTT.js} +1 -1
  276. package/dist/chunk-SDSBVVLL.js +45 -0
  277. package/dist/{chunk-ZNOXQACX.js → chunk-T4D7RZNI.js} +2 -2
  278. package/dist/{chunk-TDVPYBNL.js → chunk-TA72CURM.js} +1 -1
  279. package/dist/{chunk-WXOYHVWG.js → chunk-TD3UHDFY.js} +4 -4
  280. package/dist/{chunk-H7FUQCQY.js → chunk-TDQZ4LB5.js} +8 -6
  281. package/dist/chunk-TFGCNBWP.js +64 -0
  282. package/dist/{chunk-TMM32U7D.js → chunk-TKS7FTTO.js} +2 -2
  283. package/dist/{chunk-NKHS2RQ2.js → chunk-U5PJSGHG.js} +1 -1
  284. package/dist/{chunk-7CGPPAYR.js → chunk-UV4LOQ3E.js} +1 -1
  285. package/dist/{chunk-ON2E46DX.js → chunk-VRNUKH2W.js} +1 -1
  286. package/dist/{chunk-XX2VQE55.js → chunk-WBRC3MNE.js} +1 -1
  287. package/dist/{chunk-NTZQN7OR.js → chunk-WBTCOFMZ.js} +2 -2
  288. package/dist/chunk-WDIVALLP.js +51 -0
  289. package/dist/{chunk-QMIWMLFI.js → chunk-WOW5SCEK.js} +1 -1
  290. package/dist/chunk-XODESBSR.js +250 -0
  291. package/dist/{chunk-EJWPYEG4.js → chunk-XRZGGB6I.js} +1 -1
  292. package/dist/{chunk-34C7NYIQ.js → chunk-Y73BQL74.js} +1 -1
  293. package/dist/{chunk-KIRQZG3G.js → chunk-YCGZK2E4.js} +1 -1
  294. package/dist/{chunk-5TK3C6RG.js → chunk-YCZ2FBKA.js} +1 -1
  295. package/dist/{chunk-TV2QW6GX.js → chunk-YEURM24I.js} +3 -3
  296. package/dist/{chunk-34ANLQW2.js → chunk-YGC7BFX2.js} +211 -9
  297. package/dist/{chunk-IW55G7XG.js → chunk-YNRKVY7X.js} +11 -1
  298. package/dist/{chunk-LFHCXZO5.js → chunk-Z3GDMNMU.js} +3 -3
  299. package/dist/{chunk-LQPU5O3B.js → chunk-Z7PJF6F3.js} +3 -3
  300. package/dist/{chunk-HDHL773Z.js → chunk-ZH4MJM73.js} +1 -1
  301. package/dist/generated/index.d.ts +17 -0
  302. package/dist/generated/index.js +140 -121
  303. package/dist/index.js +140 -121
  304. package/dist/styles.css +1887 -218
  305. package/dist/utils/index.js +1 -1
  306. package/dist/utils/useDownload.d.ts +6 -0
  307. package/package.json +3 -3
  308. package/dist/ArtifactPanel-KKUUIPEU.css +0 -159
  309. package/dist/Composer-TXULCPPV.css +0 -99
  310. package/dist/chunk-4E5MWUUJ.js +0 -48
  311. package/dist/chunk-FZVJDJFN.js +0 -54
  312. package/dist/chunk-IXJHTFXG.js +0 -17
  313. package/dist/chunk-NBDN5JZV.js +0 -123
  314. package/dist/{chunk-UTESMBPL.js → chunk-ESUZ27TS.js} +1 -1
  315. /package/dist/{chunk-55MPFB2U.js → chunk-EWTPXRRM.js} +0 -0
package/dist/styles.css CHANGED
@@ -702,7 +702,7 @@
702
702
  }
703
703
 
704
704
 
705
- /* AppShell-5LPXYUV3.css */
705
+ /* AppShell-ZVCJRGXH.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.
@@ -731,6 +731,25 @@
731
731
  .crewlet-app-shell {
732
732
  --crewlet-app-shell-rail: var(--size-shell-rail);
733
733
  --crewlet-app-shell-topbar: var(--size-shell-topbar);
734
+ /* What stands on the frame to the sheet's left: the rail's column, or
735
+ nothing where there is no rail or the rail is a drawer. The aside's cap
736
+ below subtracts it, so it is one name for both. */
737
+ --crewlet-app-shell-beside: var(--crewlet-app-shell-rail);
738
+ /* THE ASIDE'S TRACK, while it is a column: the panel's width and the inset
739
+ it is held off the window's edge by, capped so the sheet keeps the
740
+ host's floor (`--crewlet-app-shell-aside-reserve`, the page's sheet with
741
+ its own inset and hairlines). The host publishes both widths on this
742
+ element; with no reserve the panel takes the width it was given. */
743
+ --crewlet-app-shell-aside-track: calc(
744
+ min(
745
+ var(--crewlet-app-shell-aside),
746
+ max(
747
+ 0px,
748
+ 100% - var(--crewlet-app-shell-beside) - var(--crewlet-app-shell-aside-reserve, 0px) - var(--size-shell-inset)
749
+ )
750
+ ) +
751
+ var(--size-shell-inset)
752
+ );
734
753
  /* Where the drawer's veil sits while it is open. The shell replaces it with
735
754
  the surface's own place in the layer band; this default only has to clear
736
755
  the page chrome for the moment before that lands. */
@@ -761,10 +780,22 @@
761
780
  * beaten the narrow block's one.
762
781
  */
763
782
  .crewlet-app-shell--no-rail {
783
+ --crewlet-app-shell-beside: 0px;
764
784
  grid-template-columns: minmax(0, 1fr);
765
785
  padding-left: var(--size-shell-inset);
766
786
  }
767
787
 
788
+ /* THE ASIDE AS A COLUMN: a third track, mirroring the rail. The page's sheet
789
+ keeps its column and is only narrower, so nothing under the bar moves but
790
+ its end edge. */
791
+ .crewlet-app-shell[data-aside='column'] {
792
+ grid-template-columns: var(--crewlet-app-shell-rail) minmax(0, 1fr) var(--crewlet-app-shell-aside-track);
793
+ }
794
+
795
+ .crewlet-app-shell--no-rail[data-aside='column'] {
796
+ grid-template-columns: minmax(0, 1fr) var(--crewlet-app-shell-aside-track);
797
+ }
798
+
768
799
  /* The skip link, drawn only while it holds focus, over everything. */
769
800
  .crewlet-app-shell__skip {
770
801
  position: fixed;
@@ -1295,8 +1326,22 @@
1295
1326
  * and a short one does not shift every element sideways by the scrollbar's
1296
1327
  * width, which reads as the page jumping on each move.
1297
1328
  */
1298
- .crewlet-app-shell__main {
1329
+ /*
1330
+ * THE BODY: the row under the bar that the scroller and a peek column share.
1331
+ * It takes the sheet's remaining height, and the scroller takes the row's
1332
+ * remaining width, so a sheet with no peek draws exactly as it did before the
1333
+ * row existed.
1334
+ */
1335
+ .crewlet-app-shell__body {
1336
+ display: flex;
1299
1337
  flex: 1 1 auto;
1338
+ min-width: 0;
1339
+ min-height: 0;
1340
+ }
1341
+
1342
+ .crewlet-app-shell__main {
1343
+ flex: 1 1 0%;
1344
+ min-width: 0;
1300
1345
  min-height: 0;
1301
1346
  overflow-y: auto;
1302
1347
  overflow-x: hidden;
@@ -1395,11 +1440,131 @@
1395
1440
  background: var(--color-surface-scrim);
1396
1441
  }
1397
1442
 
1443
+ /*
1444
+ * THE ASIDE: a second sheet on the frame, to the right of the page's, the
1445
+ * same ground, hairline and corner, held off the window's top, right and
1446
+ * bottom by the inset. The seam between the two sheets is the page sheet's
1447
+ * own end inset, and the grip stands in it (`ResizeHandle`, outside the
1448
+ * sheet that clips). The sheet clips what it holds to its corner, so the
1449
+ * panel inside runs square to its edges.
1450
+ */
1451
+ .crewlet-app-shell__aside {
1452
+ position: relative;
1453
+ display: flex;
1454
+ flex-direction: column;
1455
+ grid-column: -2 / -1;
1456
+ grid-row: 1;
1457
+ min-width: 0;
1458
+ min-height: 0;
1459
+ margin: var(--size-shell-inset) var(--size-shell-inset) var(--size-shell-inset) 0;
1460
+ }
1461
+
1462
+ /* The grip stands in the seam and over the sheet's hairline, which is the
1463
+ edge it moves. */
1464
+ .crewlet-app-shell__aside > .crewlet-resize-handle--left {
1465
+ left: calc((var(--crewlet-resize-handle-width) + 1px) * -1);
1466
+ width: calc(var(--crewlet-resize-handle-width) + 1px);
1467
+ }
1468
+
1469
+ .crewlet-app-shell__aside-sheet {
1470
+ display: flex;
1471
+ flex: 1 1 auto;
1472
+ flex-direction: column;
1473
+ min-width: 0;
1474
+ min-height: 0;
1475
+ border: 1px solid var(--color-border-default);
1476
+ border-radius: var(--radius-sheet);
1477
+ background: var(--color-surface-background);
1478
+ overflow: hidden;
1479
+ }
1480
+
1481
+ /* A dialog takes focus on itself only as the stack's last resort, so its
1482
+ own ring would draw round the whole panel; its content draws the focus.
1483
+ Transparent rather than none, so forced colours still draw one. */
1484
+ .crewlet-app-shell__aside:focus {
1485
+ outline: 2px solid transparent;
1486
+ }
1487
+
1488
+ /*
1489
+ * THE OVERLAY: over the page's end edge, lifted off it, behind a veil. It
1490
+ * keeps the column's corner and inset, so the panel is the same sheet in
1491
+ * both shapes and only its ground changes, and it never takes the whole
1492
+ * window: a strip of the page stays in view to say what it is over.
1493
+ */
1494
+ .crewlet-app-shell__aside[data-shape='overlay'] {
1495
+ position: fixed;
1496
+ top: 0;
1497
+ right: 0;
1498
+ bottom: 0;
1499
+ z-index: var(--z-index-overlay);
1500
+ width: min(var(--crewlet-app-shell-aside), calc(100vw - var(--spacing-10) - var(--size-shell-inset) * 2));
1501
+ }
1502
+
1503
+ .crewlet-app-shell__aside[data-shape='overlay'] > .crewlet-app-shell__aside-sheet {
1504
+ box-shadow: var(--shadow-xl);
1505
+ }
1506
+
1507
+ /* THE SHEET: the whole window on a phone, its inset, corner and hairline
1508
+ collapsed to nothing, as the page's sheet is under the shell step. */
1509
+ .crewlet-app-shell__aside[data-shape='sheet'] {
1510
+ position: fixed;
1511
+ inset: 0;
1512
+ z-index: var(--z-index-overlay);
1513
+ margin: 0;
1514
+ }
1515
+
1516
+ .crewlet-app-shell__aside[data-shape='sheet'] > .crewlet-app-shell__aside-sheet {
1517
+ border-width: 0;
1518
+ border-radius: 0;
1519
+ }
1520
+
1521
+ /* What a modal aside sits on: the dialog's ground, the application faded
1522
+ back into its own frame, rather than the rail drawer's darker scrim. */
1523
+ .crewlet-app-shell__aside-veil {
1524
+ background: var(--color-surface-veil);
1525
+ }
1526
+
1527
+ /*
1528
+ * AN ENTRANCE, never an exit: the panel arrives from the edge it stands on,
1529
+ * and leaves at once when it is closed, so a close is never a wait. The page
1530
+ * beside a column reflows at once, because a grid track that appears has no
1531
+ * width to start from.
1532
+ */
1533
+ @keyframes crewlet-app-shell-aside-in {
1534
+ from {
1535
+ opacity: 0;
1536
+ transform: translateX(var(--spacing-4));
1537
+ }
1538
+ }
1539
+
1540
+ @keyframes crewlet-app-shell-aside-slide {
1541
+ from {
1542
+ transform: translateX(calc(100% + var(--size-shell-inset)));
1543
+ }
1544
+ }
1545
+
1546
+ .crewlet-app-shell__aside[data-shape='column'] > .crewlet-app-shell__aside-sheet {
1547
+ animation: crewlet-app-shell-aside-in var(--motion-duration-slow) var(--motion-easing-emphasized);
1548
+ }
1549
+
1550
+ .crewlet-app-shell__aside[data-shape='overlay'],
1551
+ .crewlet-app-shell__aside[data-shape='sheet'] {
1552
+ animation: crewlet-app-shell-aside-slide var(--motion-duration-slow) var(--motion-easing-emphasized);
1553
+ }
1554
+
1398
1555
  @media (width < 1024px) {
1399
1556
  .crewlet-app-shell {
1557
+ --crewlet-app-shell-beside: 0px;
1400
1558
  grid-template-columns: minmax(0, 1fr);
1401
1559
  }
1402
1560
 
1561
+ /* The host decides the aside's shape, so a column it asks for under the
1562
+ step is still a column; the rail is a drawer here and takes no track. */
1563
+ .crewlet-app-shell[data-aside='column'],
1564
+ .crewlet-app-shell--no-rail[data-aside='column'] {
1565
+ grid-template-columns: minmax(0, 1fr) var(--crewlet-app-shell-aside-track);
1566
+ }
1567
+
1403
1568
  .crewlet-app-shell--no-rail {
1404
1569
  padding-left: 0;
1405
1570
  }
@@ -1490,6 +1655,12 @@
1490
1655
  .crewlet-app-shell__rail-status-mark--action {
1491
1656
  transition: none;
1492
1657
  }
1658
+
1659
+ .crewlet-app-shell__aside[data-shape='column'] > .crewlet-app-shell__aside-sheet,
1660
+ .crewlet-app-shell__aside[data-shape='overlay'],
1661
+ .crewlet-app-shell__aside[data-shape='sheet'] {
1662
+ animation: none;
1663
+ }
1493
1664
  }
1494
1665
 
1495
1666
  /* ── the account row ───────────────────────────────────────────────────── */
@@ -2490,7 +2661,7 @@ button.crewlet-account-row__who:focus-visible {
2490
2661
  }
2491
2662
 
2492
2663
 
2493
- /* ArtifactBar-UMZCTARR.css */
2664
+ /* ArtifactBar-LEBMR35Y.css */
2494
2665
  /*
2495
2666
  * One row, one hairline under it, the height of a large row. The lead (the
2496
2667
  * way back, the glyph, the title, the version) takes what the end leaves it
@@ -2503,7 +2674,7 @@ button.crewlet-account-row__who:focus-visible {
2503
2674
  * width the presence stack goes (the People control still counts who is
2504
2675
  * here), then the labelled tools' words, and under a phone's two panes the
2505
2676
  * views, the unlabelled tools and the kind's glyph fold away, the first two
2506
- * into More.
2677
+ * into More. The host's own control at the end (`end`) never folds.
2507
2678
  */
2508
2679
 
2509
2680
  .crewlet-artifact-bar {
@@ -2764,6 +2935,19 @@ button.crewlet-account-row__who:focus-visible {
2764
2935
  display: none;
2765
2936
  }
2766
2937
 
2938
+ /* THE HOST'S OWN CONTROL ENDS THE ROW (`end`), such as the Ask button every
2939
+ page bar ends with: a step further from the bar's own tools than they
2940
+ stand from each other, so it reads as the frame's rather than the
2941
+ artifact's. It never folds and never wraps; the title gives way to it. */
2942
+ .crewlet-artifact-bar__trail {
2943
+ display: inline-flex;
2944
+ flex: none;
2945
+ align-items: center;
2946
+ gap: var(--spacing-1);
2947
+ margin-inline-start: var(--spacing-1);
2948
+ white-space: nowrap;
2949
+ }
2950
+
2767
2951
  /* A rule between two groups of tools: the kind's, then every artifact's. */
2768
2952
  .crewlet-artifact-bar__rule {
2769
2953
  width: 1px;
@@ -2850,6 +3034,11 @@ button.crewlet-account-row__who:focus-visible {
2850
3034
  flex: none;
2851
3035
  }
2852
3036
 
3037
+ /* The phone's row is tight, and so is the host's control beside More. */
3038
+ .crewlet-artifact-bar__end > .crewlet-artifact-bar__trail {
3039
+ margin-inline-start: 0;
3040
+ }
3041
+
2853
3042
  .crewlet-artifact-bar__end > .crewlet-artifact-bar__status {
2854
3043
  display: block;
2855
3044
  flex: 0 1 auto;
@@ -3971,165 +4160,49 @@ a.crewlet-make-row__item:active {
3971
4160
  }
3972
4161
 
3973
4162
 
3974
- /* ArtifactPanel-KKUUIPEU.css */
4163
+ /* ArtifactPanel-TN4FFK2F.css */
3975
4164
  /*
3976
- * The workspace is a row: the artifact's body, then at most one panel. The
3977
- * body scrolls itself, so a panel beside it stays in view however far the
3978
- * artifact is read; the panel's own body scrolls under its head.
4165
+ * The artifact's presets of the side panel and its frame (`ArtifactPanel`,
4166
+ * `ArtifactWorkspace`). SidePanel.css draws them; what is here is only what
4167
+ * the artifact sets differently, and the names it has always published.
3979
4168
  *
3980
- * ONE HAIRLINE between the two, the panel's start edge, and none at the
3981
- * workspace's own edges: whatever frames the workspace already draws those.
4169
+ * Every rule names BOTH classes, so it outranks the side panel's own rule of
4170
+ * one class whichever of the two stylesheets a bundle puts first.
3982
4171
  */
3983
4172
 
3984
- .crewlet-artifact-workspace {
3985
- container: crewlet-artifact-workspace / inline-size;
3986
- position: relative;
3987
- display: flex;
3988
- min-width: 0;
3989
- min-height: 0;
4173
+ /* The workspace answers to its own container name as well as the frame's,
4174
+ so a page's `@container crewlet-artifact-workspace` query keeps matching. */
4175
+ .crewlet-side-panel-frame.crewlet-artifact-workspace {
4176
+ container-name: crewlet-side-panel-frame crewlet-artifact-workspace;
3990
4177
  }
3991
4178
 
3992
- .crewlet-artifact-workspace__body {
3993
- flex: 1 1 auto;
3994
- min-width: 0;
3995
- min-height: 0;
3996
- overflow: auto;
3997
- }
3998
-
3999
- /* EXPANDED, the panel is the workspace; the body stays mounted behind it. */
4000
- .crewlet-artifact-workspace[data-panel='expanded'] > .crewlet-artifact-workspace__body {
4001
- display: none;
4002
- }
4003
-
4004
- .crewlet-artifact-panel {
4179
+ .crewlet-side-panel.crewlet-artifact-panel {
4005
4180
  /* THE TEXT WIDTH, every panel of facts, a list or a form: three widths for
4006
4181
  those moved the artifact's edge 80px between Details and History. */
4007
4182
  --crewlet-artifact-panel-width: 22.5rem;
4008
- display: flex;
4009
- flex: none;
4010
- flex-direction: column;
4011
- width: var(--crewlet-artifact-panel-width);
4012
- min-height: 0;
4013
- border-left: 1px solid var(--color-border-default);
4014
- background: var(--color-surface-background);
4183
+ --crewlet-side-panel-width: var(--crewlet-artifact-panel-width);
4184
+ /* The head on the row step, under the artifact's own bar. */
4185
+ --crewlet-side-panel-head-height: var(--size-row-lg);
4015
4186
  }
4016
4187
 
4017
- .crewlet-artifact-panel--lg {
4188
+ .crewlet-side-panel.crewlet-artifact-panel--lg {
4018
4189
  --crewlet-artifact-panel-width: 36rem;
4019
4190
  }
4020
4191
 
4021
- .crewlet-artifact-panel[data-expanded] {
4022
- flex: 1 1 auto;
4023
- width: auto;
4024
- border-left: 0;
4025
- }
4026
-
4027
- .crewlet-artifact-panel__head {
4028
- display: flex;
4029
- flex: none;
4030
- align-items: center;
4031
- gap: var(--spacing-2);
4032
- height: var(--size-row-lg);
4033
- padding: 0 var(--spacing-2) 0 var(--spacing-4);
4034
- border-bottom: 1px solid var(--color-border-default);
4035
- }
4036
-
4037
- .crewlet-artifact-panel__icon {
4038
- display: inline-flex;
4039
- flex: none;
4040
- color: var(--color-text-tertiary);
4041
- }
4042
-
4043
- .crewlet-artifact-panel__title {
4044
- flex: 1 1 auto;
4045
- min-width: 0;
4046
- margin: 0;
4047
- overflow: hidden;
4048
- color: var(--color-text-primary);
4049
- font-size: var(--font-size-sm);
4050
- font-weight: var(--font-weight-semibold);
4051
- line-height: var(--font-line-height-snug);
4052
- text-overflow: ellipsis;
4053
- white-space: nowrap;
4054
- }
4055
-
4056
- .crewlet-artifact-panel__title:focus-visible {
4192
+ /* The heading rings when the keyboard reaches it, as it always has here. */
4193
+ .crewlet-side-panel__title.crewlet-artifact-panel__title:focus-visible {
4057
4194
  outline: 2px solid var(--color-focus);
4058
4195
  outline-offset: var(--size-focus-ring-inset-offset);
4059
4196
  border-radius: var(--radius-sm);
4060
4197
  }
4061
4198
 
4062
- .crewlet-artifact-panel__actions {
4063
- display: inline-flex;
4064
- flex: none;
4065
- align-items: center;
4066
- gap: var(--spacing-1);
4067
- }
4068
-
4069
- /* THE BODY'S INSET IS PUBLISHED (--crewlet-artifact-panel-inset) for content
4070
- that sticks to its scrollport: a sticky edge stops at the padding, so a
4071
- foot with `bottom: 0` left a band under it that the content scrolled
4072
- through; such a foot offsets itself by the inset to sit on the edge. */
4073
- .crewlet-artifact-panel__body {
4074
- /* THE PANEL'S OWN MEASURE, so what it holds folds to the panel's width
4075
- rather than the window's; and its sections head at the panel title's
4076
- step, a level under it and never louder than it. */
4077
- container: crewlet-artifact-panel / inline-size;
4078
- --crewlet-section-title-size: var(--font-size-sm);
4199
+ /* THE BODY'S INSET IS PUBLISHED under its own name too
4200
+ (--crewlet-artifact-panel-inset), which a sticky foot offsets itself by,
4201
+ and the body answers to its own container name. */
4202
+ .crewlet-side-panel__body.crewlet-artifact-panel__body {
4203
+ container-name: crewlet-side-panel crewlet-artifact-panel;
4079
4204
  --crewlet-artifact-panel-inset: var(--spacing-4);
4080
-
4081
- /* A COLUMN, so content that should fit the panel rather than scroll it
4082
- can: a child that sets `min-height: 0` shrinks to the room the body has
4083
- (a sheet's rows, whose grid then scrolls itself), and every other child
4084
- keeps its content's height and scrolls the body as before. */
4085
- display: flex;
4086
- flex-direction: column;
4087
- flex: 1 1 auto;
4088
- min-height: 0;
4089
- padding: var(--crewlet-artifact-panel-inset);
4090
- overflow: auto;
4091
- overscroll-behavior: contain;
4092
- }
4093
-
4094
- /* THE FOOT holds the panel's own commit, outside the scrolling body, so it
4095
- stays in reach at every scroll. Its inset is the body's. */
4096
- .crewlet-artifact-panel__foot {
4097
- flex: none;
4098
- padding: var(--spacing-3) var(--spacing-4);
4099
- border-top: 1px solid var(--color-border-default);
4100
- background: var(--color-surface-background);
4101
- }
4102
-
4103
- /* NOT ROOM FOR TWO COLUMNS: the panel slides over the artifact's end edge,
4104
- raised off it, rather than squeezing the artifact under a useful width. */
4105
- @container crewlet-artifact-workspace (width < 960px) {
4106
- .crewlet-artifact-panel {
4107
- position: absolute;
4108
- inset-block: 0;
4109
- inset-inline-end: 0;
4110
- z-index: var(--z-index-overlay);
4111
- width: min(var(--crewlet-artifact-panel-width), 100%);
4112
- /* THE DRAWER'S LIFT, the shell's own rail drawer's: the large step falls
4113
- below a box and left the panel's start edge reading as a cut through
4114
- the artifact rather than a sheet over it. */
4115
- box-shadow: var(--shadow-xl);
4116
- }
4117
-
4118
- .crewlet-artifact-panel[data-expanded] {
4119
- inset-inline-start: 0;
4120
- width: auto;
4121
- box-shadow: none;
4122
- }
4123
- }
4124
-
4125
- /* A PHONE: the panel is the screen until it is closed. */
4126
- @container crewlet-artifact-workspace (width < 640px) {
4127
- .crewlet-artifact-panel {
4128
- inset-inline-start: 0;
4129
- width: auto;
4130
- border-left: 0;
4131
- box-shadow: none;
4132
- }
4205
+ --crewlet-side-panel-inset: var(--crewlet-artifact-panel-inset);
4133
4206
  }
4134
4207
 
4135
4208
 
@@ -5346,7 +5419,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5346
5419
  }
5347
5420
 
5348
5421
 
5349
- /* Button-UWKBTKYD.css */
5422
+ /* Button-VXJ7M5XF.css */
5350
5423
  /*
5351
5424
  * The button, and the link drawn as one.
5352
5425
  *
@@ -5656,47 +5729,24 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5656
5729
  }
5657
5730
 
5658
5731
  /*
5659
- * Pending. The spinner takes the leading icon's place, so a button that has
5660
- * one neither moves nor changes width mid-action, and the label stays exactly
5661
- * as it was: a button whose text becomes "Saving" has stopped saying what it
5662
- * does.
5732
+ * Pending. The spinner (the package's one ring, `Spinner`) takes the leading
5733
+ * icon's place, so a button that has one neither moves nor changes width
5734
+ * mid-action, and the label stays exactly as it was: a button whose text
5735
+ * becomes "Saving" has stopped saying what it does. The ring's drawing, its
5736
+ * turn and its reduced-motion stop are Spinner.css's.
5737
+ *
5738
+ * A disabled button already reads as unavailable; a loading one should still
5739
+ * read as this button, mid-action.
5663
5740
  */
5664
- .crewlet-btn__spinner {
5665
- display: inline-block;
5666
- width: 1em;
5667
- height: 1em;
5668
- border: 2px solid currentColor;
5669
- border-right-color: transparent;
5670
- border-radius: var(--radius-circle);
5671
- opacity: 0.7;
5672
- animation: crewlet-btn-spin var(--motion-duration-slow) linear infinite;
5673
- flex: none;
5674
- }
5675
-
5676
- @keyframes crewlet-btn-spin {
5677
- to {
5678
- transform: rotate(360deg);
5679
- }
5680
- }
5681
-
5682
- /* A disabled button already reads as unavailable; a loading one should still
5683
- read as this button, mid-action. */
5684
5741
  .crewlet-btn--loading {
5685
5742
  cursor: progress;
5686
5743
  }
5687
5744
 
5688
- /*
5689
- * A spinner that cannot spin should not pretend to, and a colour change that
5690
- * cannot fade is still a colour change. The ring reads as pending either way.
5691
- */
5745
+ /* A colour change that cannot fade is still a colour change. */
5692
5746
  @media (prefers-reduced-motion: reduce) {
5693
5747
  .crewlet-btn {
5694
5748
  transition: none;
5695
5749
  }
5696
-
5697
- .crewlet-btn__spinner {
5698
- animation: none;
5699
- }
5700
5750
  }
5701
5751
 
5702
5752
 
@@ -7667,6 +7717,160 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7667
7717
  }
7668
7718
 
7669
7719
 
7720
+ /* ChangeList-CB2DLR5S.css */
7721
+ /*
7722
+ * What a change will do, as a before and after on PropertyList's grid: one
7723
+ * label column (as wide as the longest label, never under 92px) and one value
7724
+ * column, rows a spacing step apart with no rules, and the tones of DiffList.
7725
+ */
7726
+ .crewlet-change-list {
7727
+ display: flex;
7728
+ flex-direction: column;
7729
+ gap: var(--spacing-2);
7730
+ min-width: 0;
7731
+ }
7732
+
7733
+ /* The eyebrow register: a heading a reader passes over to reach the rows. */
7734
+ .crewlet-change-list__heading {
7735
+ font-size: var(--font-size-2xs);
7736
+ font-weight: var(--font-weight-medium);
7737
+ letter-spacing: var(--font-letter-spacing-wide);
7738
+ text-transform: uppercase;
7739
+ color: var(--color-text-tertiary);
7740
+ }
7741
+
7742
+ .crewlet-change-list__rows {
7743
+ display: grid;
7744
+ grid-template-columns: var(--crewlet-description-list-term, minmax(92px, max-content)) minmax(0, 1fr);
7745
+ gap: var(--spacing-2) var(--spacing-3);
7746
+ align-items: baseline;
7747
+ min-width: 0;
7748
+ margin: 0;
7749
+ font-size: var(--font-size-compact);
7750
+ }
7751
+
7752
+ .crewlet-change-list__row {
7753
+ display: grid;
7754
+ grid-column: 1 / -1;
7755
+ grid-template-columns: subgrid;
7756
+ align-items: baseline;
7757
+ min-width: 0;
7758
+ }
7759
+
7760
+ .crewlet-change-list__label {
7761
+ font-size: var(--font-size-xs);
7762
+ color: var(--color-text-tertiary);
7763
+ }
7764
+
7765
+ .crewlet-change-list__value {
7766
+ min-width: 0;
7767
+ margin: 0;
7768
+ color: var(--color-text-primary);
7769
+ overflow-wrap: anywhere;
7770
+ }
7771
+
7772
+ /* Long text takes the row's whole width under its label. */
7773
+ .crewlet-change-list__row--text > .crewlet-change-list__value {
7774
+ grid-column: 1 / -1;
7775
+ display: flex;
7776
+ flex-direction: column;
7777
+ gap: var(--spacing-1);
7778
+ }
7779
+
7780
+ .crewlet-change-list__fact {
7781
+ font-weight: var(--font-weight-medium);
7782
+ }
7783
+
7784
+ /*
7785
+ * A PAIR WRAPS AS A UNIT: the old value, then the arrow and the new value
7786
+ * together, which drop under the old value on a narrow card rather than
7787
+ * splitting the arrow from what it points at.
7788
+ */
7789
+ .crewlet-change-list__pair {
7790
+ display: inline-flex;
7791
+ flex-wrap: wrap;
7792
+ align-items: baseline;
7793
+ gap: var(--spacing-1);
7794
+ max-width: 100%;
7795
+ }
7796
+
7797
+ .crewlet-change-list__next {
7798
+ display: inline-flex;
7799
+ align-items: baseline;
7800
+ gap: var(--spacing-1);
7801
+ min-width: 0;
7802
+ }
7803
+
7804
+ .crewlet-change-list__arrow {
7805
+ flex: none;
7806
+ align-self: center;
7807
+ color: var(--color-text-tertiary);
7808
+ }
7809
+
7810
+ /* The old value: struck through in the tertiary ink. */
7811
+ .crewlet-change-list__from {
7812
+ color: var(--color-text-tertiary);
7813
+ text-decoration: line-through;
7814
+ text-decoration-thickness: 1px;
7815
+ }
7816
+
7817
+ /* The new value: the primary ink at medium weight, on the added tint. */
7818
+ .crewlet-change-list__to,
7819
+ .crewlet-change-list__inserted {
7820
+ padding: 0 var(--spacing-1);
7821
+ border-radius: var(--radius-xs);
7822
+ background: var(--color-feedback-success-soft);
7823
+ color: var(--color-text-primary);
7824
+ font-weight: var(--font-weight-medium);
7825
+ text-decoration: none;
7826
+ -webkit-box-decoration-break: clone;
7827
+ box-decoration-break: clone;
7828
+ }
7829
+
7830
+ /* A value taken away: struck through on the removed tint, in its ink. */
7831
+ .crewlet-change-list__removed {
7832
+ padding: 0 var(--spacing-1);
7833
+ border-radius: var(--radius-xs);
7834
+ background: var(--color-feedback-danger-soft);
7835
+ color: var(--color-feedback-danger-ink);
7836
+ text-decoration: line-through;
7837
+ text-decoration-thickness: 1px;
7838
+ }
7839
+
7840
+ /* A word diff: one compact paragraph, removed words struck in the danger ink. */
7841
+ .crewlet-change-list__words {
7842
+ margin: 0;
7843
+ line-height: var(--font-line-height-relaxed);
7844
+ color: var(--color-text-secondary);
7845
+ }
7846
+
7847
+ .crewlet-change-list__deleted {
7848
+ color: var(--color-feedback-danger-ink);
7849
+ text-decoration: line-through;
7850
+ text-decoration-thickness: 1px;
7851
+ }
7852
+
7853
+ /* The disclosure's padding hangs into the gutter, so its chevron sits on the text edge. */
7854
+ .crewlet-change-list__whole {
7855
+ margin-inline-start: calc(var(--spacing-2) * -1);
7856
+ }
7857
+
7858
+ .crewlet-change-list__note {
7859
+ display: block;
7860
+ margin-top: 2px;
7861
+ font-size: var(--font-size-2xs);
7862
+ color: var(--color-text-tertiary);
7863
+ }
7864
+
7865
+ /* Settled: the values step back; the tints stay, so the record is still there. */
7866
+ .crewlet-change-list--settled .crewlet-change-list__fact,
7867
+ .crewlet-change-list--settled .crewlet-change-list__to,
7868
+ .crewlet-change-list--settled .crewlet-change-list__inserted,
7869
+ .crewlet-change-list--settled .crewlet-change-list__value {
7870
+ color: var(--color-text-secondary);
7871
+ }
7872
+
7873
+
7670
7874
  /* ChangeMark-3VMTW7MT.css */
7671
7875
  /*
7672
7876
  * A change mark (ChangeMark.tsx): a notch in the top end corner of whatever
@@ -8870,6 +9074,67 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
8870
9074
  }
8871
9075
 
8872
9076
 
9077
+ /* ChatThread-52KMDXHB.css */
9078
+ /*
9079
+ * A conversation as it grows: the scroller, the items a spacing step and a
9080
+ * half apart on the panel's 16px inset, and the Jump to latest pill floating
9081
+ * over its foot.
9082
+ */
9083
+ .crewlet-chat-thread {
9084
+ position: relative;
9085
+ display: flex;
9086
+ flex: 1;
9087
+ flex-direction: column;
9088
+ min-height: 0;
9089
+ }
9090
+
9091
+ /*
9092
+ * THE BROWSER'S SCROLL ANCHORING IS OFF: it pins the content above the
9093
+ * reader's view, which fights a last child that keeps growing as an answer
9094
+ * streams in. ChatThread.tsx anchors to the end itself.
9095
+ */
9096
+ .crewlet-chat-thread__scroller {
9097
+ flex: 1;
9098
+ min-height: 0;
9099
+ overflow: auto;
9100
+ overflow-anchor: none;
9101
+ overscroll-behavior: contain;
9102
+ }
9103
+
9104
+ /* A ring inside the region, which an edge-to-edge scroller would otherwise clip. */
9105
+ .crewlet-chat-thread__scroller:focus-visible {
9106
+ outline: 2px solid var(--color-focus);
9107
+ outline-offset: var(--size-focus-ring-inset-offset);
9108
+ }
9109
+
9110
+ .crewlet-chat-thread__items {
9111
+ display: flex;
9112
+ flex-direction: column;
9113
+ gap: var(--spacing-3);
9114
+ min-width: 0;
9115
+ padding: var(--spacing-4);
9116
+ }
9117
+
9118
+ .crewlet-chat-thread__items > * {
9119
+ flex: none;
9120
+ }
9121
+
9122
+ /* The pill, centred a step above the thread's foot. */
9123
+ .crewlet-chat-thread__jump {
9124
+ position: absolute;
9125
+ bottom: var(--spacing-3);
9126
+ left: 50%;
9127
+ transform: translateX(-50%);
9128
+ box-shadow: var(--shadow-md);
9129
+ border-radius: var(--radius-pill);
9130
+ }
9131
+
9132
+ .crewlet-chat-thread__fresh {
9133
+ font-variant-numeric: tabular-nums;
9134
+ color: var(--color-text-secondary);
9135
+ }
9136
+
9137
+
8873
9138
  /* Checkbox-MB22OW6P.css */
8874
9139
  /*
8875
9140
  * Checkbox: a box, its label and its consequence as one target.
@@ -10449,7 +10714,7 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10449
10714
  }
10450
10715
 
10451
10716
 
10452
- /* Composer-TXULCPPV.css */
10717
+ /* Composer-JSGTOW3F.css */
10453
10718
  /*
10454
10719
  * A message written in place: the field and its footer strip in one box. The
10455
10720
  * BOX takes the focus ring every field in the package draws (see Input.css):
@@ -10459,17 +10724,34 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10459
10724
  * border to the accent AND lay a 2px soft halo outside it: two highlights for
10460
10725
  * one state, and the loudest edge on a page whose field was focused on load.
10461
10726
  */
10727
+ /*
10728
+ * THE FIELD'S EDGE, as every text field draws it: `--color-border-field`, the
10729
+ * step measured to 3:1 against the ground, stepping up to the control boundary
10730
+ * under the pointer. It drew `--color-border-strong`, which is 1.46:1, so the
10731
+ * box a person types in was the faintest edge on the panel.
10732
+ */
10462
10733
  .crewlet-composer {
10734
+ /* The edge's width, named because the nested send button's corner is
10735
+ derived from it (see .crewlet-composer__trailing). */
10736
+ --crewlet-composer-edge: 1px;
10737
+
10463
10738
  display: grid;
10464
10739
  overflow: hidden;
10465
- border: 1px solid var(--color-border-strong);
10740
+ border: var(--crewlet-composer-edge) solid var(--color-border-field);
10466
10741
  border-radius: var(--radius-md);
10467
10742
  background: var(--color-surface-background);
10468
10743
  transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
10469
10744
  }
10470
10745
 
10471
- .crewlet-composer:hover {
10472
- border-color: var(--color-border-strong-hover);
10746
+ .crewlet-composer:not(.is-disabled):hover {
10747
+ border-color: var(--color-border-control);
10748
+ }
10749
+
10750
+ /* The field and, in a chat composer, its send button on one row. */
10751
+ .crewlet-composer__row {
10752
+ display: flex;
10753
+ align-items: flex-end;
10754
+ min-width: 0;
10473
10755
  }
10474
10756
 
10475
10757
  /* Keyed on the FIELD, not :focus-within: the footer holds the send action,
@@ -10485,6 +10767,8 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10485
10767
  }
10486
10768
 
10487
10769
  .crewlet-composer .crewlet-composer__field {
10770
+ flex: 1;
10771
+ min-width: 0;
10488
10772
  min-height: 68px;
10489
10773
  max-height: 220px;
10490
10774
  padding: var(--spacing-2) var(--spacing-3);
@@ -10502,6 +10786,80 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10502
10786
  outline: none;
10503
10787
  }
10504
10788
 
10789
+ /*
10790
+ * A CHAT COMPOSER: the field and its send button share one row. The field
10791
+ * starts as one line exactly as tall as the button and its inset (so the
10792
+ * line sits centred beside it), grows to six lines and then scrolls, and the
10793
+ * button stays on the last line.
10794
+ */
10795
+ .crewlet-composer--inline .crewlet-composer__field {
10796
+ --crewlet-composer-line: calc(var(--font-line-height-normal) * var(--font-size-compact));
10797
+ --crewlet-composer-row: calc(var(--size-control-md) + var(--spacing-2));
10798
+
10799
+ min-height: var(--crewlet-composer-row);
10800
+ max-height: 140px;
10801
+ padding-block: max(0px, calc((var(--crewlet-composer-row) - var(--crewlet-composer-line)) / 2));
10802
+ }
10803
+
10804
+ /*
10805
+ * A PLACEHOLDER NEVER GROWS THE FIELD. It is one line of example or one word
10806
+ * of reason ("Offline"); wrapped to a second line it made the composer jump
10807
+ * taller the moment the connection dropped.
10808
+ */
10809
+ .crewlet-composer--inline .crewlet-composer__field::placeholder {
10810
+ overflow: hidden;
10811
+ text-overflow: ellipsis;
10812
+ white-space: nowrap;
10813
+ }
10814
+
10815
+ /*
10816
+ * THE SEND BUTTON NESTS IN THE BOX'S CORNER: inset by one spacing step, its
10817
+ * radius is the box's less that inset and the box's own edge, so the two
10818
+ * corners run parallel rather than a square sitting in a rounded box.
10819
+ */
10820
+ .crewlet-composer__trailing {
10821
+ display: flex;
10822
+ flex: none;
10823
+ align-items: center;
10824
+ gap: var(--spacing-1);
10825
+ padding: var(--spacing-1);
10826
+ }
10827
+
10828
+ .crewlet-composer__trailing .crewlet-icon-btn {
10829
+ border-radius: calc(var(--radius-md) - var(--spacing-1) - var(--crewlet-composer-edge));
10830
+ }
10831
+
10832
+ /*
10833
+ * WHAT TRAVELS WITH THE MESSAGE, above the field inside the box's edge: a row
10834
+ * of tags that wraps, on the field's own inset so a tag starts where the text
10835
+ * does.
10836
+ */
10837
+ .crewlet-composer__attachments {
10838
+ display: flex;
10839
+ flex-wrap: wrap;
10840
+ align-items: center;
10841
+ gap: var(--spacing-1);
10842
+ min-width: 0;
10843
+ padding: var(--spacing-2) var(--spacing-3) 0;
10844
+ }
10845
+
10846
+ /*
10847
+ * DISABLED, AS A FIELD IS: the whole box at the disabled field's 0.6 and the
10848
+ * not-allowed cursor, so it no longer reads as somewhere to type. Faded once:
10849
+ * the field and a disabled send button inside it keep their own opacity at 1,
10850
+ * or the box's fade and theirs would multiply into a control nobody can read.
10851
+ */
10852
+ .crewlet-composer.is-disabled {
10853
+ opacity: 0.6;
10854
+ cursor: not-allowed;
10855
+ }
10856
+
10857
+ .crewlet-composer.is-disabled .crewlet-composer__field.is-disabled,
10858
+ .crewlet-composer.is-disabled .crewlet-composer__trailing :disabled,
10859
+ .crewlet-composer.is-disabled .crewlet-composer__trailing [aria-disabled='true'] {
10860
+ opacity: 1;
10861
+ }
10862
+
10505
10863
  /* Past its cap the field scrolls rather than pushing the page. */
10506
10864
  .crewlet-composer .crewlet-composer__field.is-auto-resize {
10507
10865
  overflow-y: auto;
@@ -14614,7 +14972,7 @@ svg.crewlet-datetime__chevron {
14614
14972
  }
14615
14973
 
14616
14974
 
14617
- /* DiffList-3EX64AAE.css */
14975
+ /* DiffList-GE6YBRLJ.css */
14618
14976
  /* DiffList: one path per row, with its mark, its word and its tint.
14619
14977
 
14620
14978
  The tint is the soft step of the state the row is in and the text is the
@@ -14710,6 +15068,59 @@ svg.crewlet-datetime__chevron {
14710
15068
  color: var(--color-text-tertiary);
14711
15069
  }
14712
15070
 
15071
+ /*
15072
+ * STACKED: each path over its value, both wrapping, so a value is read rather
15073
+ * than cut by the 200px path track. `auto` is the same drawing under 480px of
15074
+ * the list's own width, which a window query cannot know: a list in a 420px
15075
+ * drawer on a wide screen is as narrow as one on a phone.
15076
+ */
15077
+ .crewlet-diff-list--auto {
15078
+ container: crewlet-diff-list / inline-size;
15079
+ }
15080
+
15081
+ .crewlet-diff-list--stacked .crewlet-diff-list__row {
15082
+ grid-template-columns: auto minmax(0, 1fr);
15083
+ row-gap: 0;
15084
+ }
15085
+
15086
+ .crewlet-diff-list--stacked .crewlet-diff-list__value {
15087
+ grid-column: 2;
15088
+ }
15089
+
15090
+ .crewlet-diff-list--stacked .crewlet-diff-list__path,
15091
+ .crewlet-diff-list--stacked .crewlet-diff-list__value,
15092
+ .crewlet-diff-list--stacked .crewlet-diff-list__from,
15093
+ .crewlet-diff-list--stacked .crewlet-diff-list__to {
15094
+ overflow: visible;
15095
+ white-space: normal;
15096
+ overflow-wrap: anywhere;
15097
+ }
15098
+
15099
+ .crewlet-diff-list--stacked .crewlet-diff-list__value {
15100
+ flex-wrap: wrap;
15101
+ }
15102
+
15103
+ @container crewlet-diff-list (width < 480px) {
15104
+ .crewlet-diff-list--auto .crewlet-diff-list__row {
15105
+ grid-template-columns: auto minmax(0, 1fr);
15106
+ row-gap: 0;
15107
+ }
15108
+
15109
+ .crewlet-diff-list--auto .crewlet-diff-list__value {
15110
+ grid-column: 2;
15111
+ flex-wrap: wrap;
15112
+ }
15113
+
15114
+ .crewlet-diff-list--auto .crewlet-diff-list__path,
15115
+ .crewlet-diff-list--auto .crewlet-diff-list__value,
15116
+ .crewlet-diff-list--auto .crewlet-diff-list__from,
15117
+ .crewlet-diff-list--auto .crewlet-diff-list__to {
15118
+ overflow: visible;
15119
+ white-space: normal;
15120
+ overflow-wrap: anywhere;
15121
+ }
15122
+ }
15123
+
14713
15124
 
14714
15125
  /* DiffView-RVLIHTKG.css */
14715
15126
  /* DiffView: a line diff, monospace and line-numbered on both sides.
@@ -14957,7 +15368,7 @@ svg.crewlet-datetime__chevron {
14957
15368
  }
14958
15369
 
14959
15370
 
14960
- /* Disclosure-P4FH3C35.css */
15371
+ /* Disclosure-FVMA4RW2.css */
14961
15372
  /*
14962
15373
  * The disclosure anatomy, declared once for every expander in the package.
14963
15374
  *
@@ -15063,6 +15474,32 @@ svg.crewlet-datetime__chevron {
15063
15474
  transform: rotate(0deg);
15064
15475
  }
15065
15476
 
15477
+ /*
15478
+ * NOTHING TO OPEN YET: the bar is words rather than a button, and the
15479
+ * chevron keeps its slot unpainted, so the mark after it does not move when
15480
+ * the section gains content and the chevron appears.
15481
+ */
15482
+ .crewlet-disclosure__chevron--reserved {
15483
+ visibility: hidden;
15484
+ }
15485
+
15486
+ .crewlet-disclosure__trigger--static {
15487
+ cursor: default;
15488
+ }
15489
+
15490
+ /* Words, so nothing answers the pointer. */
15491
+ .crewlet-disclosure__trigger--static:hover {
15492
+ background: none;
15493
+ color: var(--color-text-secondary);
15494
+ }
15495
+
15496
+ /* The section's state mark, between the chevron and the title. */
15497
+ .crewlet-disclosure__icon {
15498
+ display: inline-flex;
15499
+ flex: none;
15500
+ align-items: center;
15501
+ }
15502
+
15066
15503
  .crewlet-disclosure__title {
15067
15504
  min-width: 0;
15068
15505
  overflow: hidden;
@@ -15123,6 +15560,16 @@ svg.crewlet-datetime__chevron {
15123
15560
  color: var(--color-text-secondary);
15124
15561
  }
15125
15562
 
15563
+ /*
15564
+ * CLOSED IS HIDDEN. The panel closes with the `hidden` attribute, and the
15565
+ * browser's own `[hidden] { display: none }` is a user agent rule that any
15566
+ * author `display` outranks: the flex above drew every closed panel open,
15567
+ * under a trigger that said it was collapsed.
15568
+ */
15569
+ .crewlet-disclosure__panel[hidden] {
15570
+ display: none;
15571
+ }
15572
+
15126
15573
  /* ---- Sizes and variants ------------------------------------------------ */
15127
15574
 
15128
15575
  /*
@@ -16158,6 +16605,64 @@ svg.crewlet-datetime__chevron {
16158
16605
  }
16159
16606
 
16160
16607
 
16608
+ /* EntityList-XIICECVC.css */
16609
+ /* One row per person, seat or record, divided by hairlines, on the card's 16px inset. */
16610
+ .crewlet-entity-list__rows {
16611
+ display: flex;
16612
+ flex-direction: column;
16613
+ margin: 0;
16614
+ padding: 0;
16615
+ list-style: none;
16616
+ }
16617
+
16618
+ .crewlet-entity-list__row {
16619
+ display: flex;
16620
+ align-items: center;
16621
+ gap: var(--spacing-3);
16622
+ min-width: 0;
16623
+ min-height: var(--size-row-lg);
16624
+ padding: var(--spacing-2) var(--spacing-4);
16625
+ }
16626
+
16627
+ .crewlet-entity-list__row + .crewlet-entity-list__row {
16628
+ border-top: 1px solid var(--color-border-default);
16629
+ }
16630
+
16631
+ .crewlet-entity-list__avatar {
16632
+ display: inline-flex;
16633
+ flex: none;
16634
+ color: var(--color-text-tertiary);
16635
+ }
16636
+
16637
+ .crewlet-entity-list__words {
16638
+ display: flex;
16639
+ flex: 1;
16640
+ flex-direction: column;
16641
+ min-width: 0;
16642
+ }
16643
+
16644
+ .crewlet-entity-list__name {
16645
+ overflow: hidden;
16646
+ font-size: var(--font-size-compact);
16647
+ font-weight: var(--font-weight-medium);
16648
+ color: var(--color-text-primary);
16649
+ text-overflow: ellipsis;
16650
+ white-space: nowrap;
16651
+ }
16652
+
16653
+ .crewlet-entity-list__fact {
16654
+ font-size: var(--font-size-xs);
16655
+ color: var(--color-text-tertiary);
16656
+ }
16657
+
16658
+ /* The row's own link, its ghost padding pulled out to the card's text edge. */
16659
+ .crewlet-entity-list__action {
16660
+ display: inline-flex;
16661
+ flex: none;
16662
+ margin-inline-end: calc(-1 * (var(--spacing-2) + 1px));
16663
+ }
16664
+
16665
+
16161
16666
  /* ErrorBoundary-U2PA3LY2.css */
16162
16667
  /*
16163
16668
  * The default fallback: a quiet block on the inset surface rather than a red
@@ -17080,7 +17585,7 @@ button.crewlet-finding-list__row:focus-visible {
17080
17585
  }
17081
17586
 
17082
17587
 
17083
- /* IconButton-K24JQHLF.css */
17588
+ /* IconButton-6WA7UEBJ.css */
17084
17589
  /*
17085
17590
  * IconButton: a square icon-only control.
17086
17591
  *
@@ -17177,6 +17682,24 @@ button.crewlet-finding-list__row:focus-visible {
17177
17682
  height: var(--font-size-xl);
17178
17683
  }
17179
17684
 
17685
+ /*
17686
+ * primary: the accent square, the primary Button's fill, hover and press with
17687
+ * no room for a label. One per surface, for the control that is the decision
17688
+ * there (a composer's Send); every other icon-only control stays a ghost.
17689
+ */
17690
+ .crewlet-icon-btn--primary {
17691
+ background: var(--color-brand-accent);
17692
+ color: var(--color-text-on-accent);
17693
+ }
17694
+
17695
+ .crewlet-icon-btn--primary:hover:not(:disabled):not([aria-disabled='true']) {
17696
+ background: var(--color-brand-accent-hover);
17697
+ }
17698
+
17699
+ .crewlet-icon-btn--primary:active:not(:disabled):not([aria-disabled='true']) {
17700
+ background: var(--color-brand-accent-active);
17701
+ }
17702
+
17180
17703
  /*
17181
17704
  * secondary: the bordered square. The same surface, boundary and states as a
17182
17705
  * secondary Button, for an icon-only control that has to read as a control
@@ -17199,27 +17722,6 @@ button.crewlet-finding-list__row:focus-visible {
17199
17722
  background: var(--color-surface-pressed);
17200
17723
  }
17201
17724
 
17202
- /*
17203
- * THE PLACE THE READER IS ON (`IconButtonLink current`): the selected
17204
- * treatment a nav row draws, the lifted ground inside the default hairline,
17205
- * drawn on the square's own transparent boundary so nothing moves. With an
17206
- * edge to draw, its ring covers the edge, as the bordered squares' does.
17207
- */
17208
- a.crewlet-icon-btn {
17209
- text-decoration: none;
17210
- }
17211
-
17212
- .crewlet-icon-btn--current,
17213
- .crewlet-icon-btn--current:hover {
17214
- background: var(--color-surface-elevated);
17215
- border-color: var(--color-border-default);
17216
- color: var(--color-text-primary);
17217
- }
17218
-
17219
- .crewlet-icon-btn--current:focus-visible {
17220
- outline-offset: var(--size-focus-ring-inset-offset);
17221
- }
17222
-
17223
17725
  /* ghost: transparent, neutral ink, a mild tint on hover. */
17224
17726
  .crewlet-icon-btn--ghost {
17225
17727
  color: var(--color-text-secondary);
@@ -17264,6 +17766,32 @@ a.crewlet-icon-btn {
17264
17766
  border-color: var(--color-brand-accent);
17265
17767
  }
17266
17768
 
17769
+ /*
17770
+ * THE PLACE THE READER IS ON (`IconButtonLink current`): the selected
17771
+ * treatment a nav row draws, the lifted ground inside the default hairline,
17772
+ * drawn on the square's own transparent boundary so nothing moves. With an
17773
+ * edge to draw, its ring covers the edge, as the bordered squares' does.
17774
+ *
17775
+ * AFTER EVERY VARIANT, on purpose. The two tie on specificity, so the later
17776
+ * rule wins: written above the variants, a ghost square's secondary ink (and
17777
+ * a ghost-brand's tertiary one) followed it and won, and the place the reader
17778
+ * was on was drawn in the ink of every other square in the row.
17779
+ */
17780
+ a.crewlet-icon-btn {
17781
+ text-decoration: none;
17782
+ }
17783
+
17784
+ .crewlet-icon-btn--current,
17785
+ .crewlet-icon-btn--current:hover:not(:disabled):not([aria-disabled='true']) {
17786
+ background: var(--color-surface-elevated);
17787
+ border-color: var(--color-border-default);
17788
+ color: var(--color-text-primary);
17789
+ }
17790
+
17791
+ .crewlet-icon-btn--current:focus-visible {
17792
+ outline-offset: var(--size-focus-ring-inset-offset);
17793
+ }
17794
+
17267
17795
  /* A toggle that is on, drawn from the state a screen reader is already told. */
17268
17796
  .crewlet-icon-btn[aria-pressed='true'] {
17269
17797
  background: var(--color-brand-accent-soft);
@@ -17277,7 +17805,7 @@ a.crewlet-icon-btn {
17277
17805
  }
17278
17806
 
17279
17807
 
17280
- /* IconTile-4GNWTLAW.css */
17808
+ /* IconTile-G52XZVR4.css */
17281
17809
  /*
17282
17810
  * IconTile: a glyph on a tinted square. Each hue pairs its fill and its ink
17283
17811
  * from one measured family (`--color-node-*`); left out, the brand accent's
@@ -17302,6 +17830,9 @@ a.crewlet-icon-btn {
17302
17830
  .crewlet-icon-tile--sm { --crewlet-icon-tile-size: var(--size-row-sm); }
17303
17831
  .crewlet-icon-tile--lg { --crewlet-icon-tile-size: var(--size-row-lg); border-radius: var(--radius-lg); }
17304
17832
 
17833
+ /* A place or a record rather than a kind: the raised ground, the secondary ink. */
17834
+ .crewlet-icon-tile--neutral { --crewlet-icon-tile-fill: var(--color-surface-elevated); --crewlet-icon-tile-ink: var(--color-text-secondary); }
17835
+
17305
17836
  .crewlet-icon-tile--purple { --crewlet-icon-tile-fill: var(--color-node-purple-fill); --crewlet-icon-tile-ink: var(--color-node-purple-ink); }
17306
17837
  .crewlet-icon-tile--cyan { --crewlet-icon-tile-fill: var(--color-node-cyan-fill); --crewlet-icon-tile-ink: var(--color-node-cyan-ink); }
17307
17838
  .crewlet-icon-tile--green { --crewlet-icon-tile-fill: var(--color-node-green-fill); --crewlet-icon-tile-ink: var(--color-node-green-ink); }
@@ -21058,6 +21589,80 @@ a.crewlet-icon-btn {
21058
21589
  }
21059
21590
 
21060
21591
 
21592
+ /* MessageBubble-GKO6X3QG.css */
21593
+ /*
21594
+ * One message: the bubble on its writer's side, and what it carried and its
21595
+ * quiet foot under it, on the same side, a spacing step below.
21596
+ */
21597
+ .crewlet-message {
21598
+ display: flex;
21599
+ flex-direction: column;
21600
+ gap: var(--spacing-1);
21601
+ min-width: 0;
21602
+ max-width: 85%;
21603
+ }
21604
+
21605
+ .crewlet-message--self {
21606
+ align-self: flex-end;
21607
+ align-items: flex-end;
21608
+ }
21609
+
21610
+ .crewlet-message--other {
21611
+ align-self: flex-start;
21612
+ align-items: flex-start;
21613
+ }
21614
+
21615
+ .crewlet-message__bubble {
21616
+ max-width: 100%;
21617
+ padding: var(--spacing-2) var(--spacing-3);
21618
+ font-size: var(--font-size-compact);
21619
+ line-height: var(--font-line-height-normal);
21620
+ color: var(--color-text-primary);
21621
+ overflow-wrap: anywhere;
21622
+ white-space: pre-wrap;
21623
+ }
21624
+
21625
+ /* The reader's own: the raised ground, no edge, the tail at the end corner. */
21626
+ .crewlet-message--self .crewlet-message__bubble {
21627
+ border-radius: var(--radius-lg) var(--radius-lg) var(--radius-xs) var(--radius-lg);
21628
+ background: var(--color-surface-elevated);
21629
+ }
21630
+
21631
+ /* Anybody else's: the card ground inside a hairline, the tail at the start corner. */
21632
+ .crewlet-message--other .crewlet-message__bubble {
21633
+ border: 1px solid var(--color-border-default);
21634
+ border-radius: var(--radius-lg) var(--radius-lg) var(--radius-lg) var(--radius-xs);
21635
+ background: var(--color-surface-subtle);
21636
+ }
21637
+
21638
+ .crewlet-message__attachment,
21639
+ .crewlet-message__footer {
21640
+ display: flex;
21641
+ flex-wrap: wrap;
21642
+ align-items: center;
21643
+ gap: var(--spacing-2);
21644
+ font-size: var(--font-size-xs);
21645
+ color: var(--color-text-tertiary);
21646
+ }
21647
+
21648
+ .crewlet-message--enter {
21649
+ animation: crewlet-message-enter var(--motion-duration-moderate) var(--motion-easing-out);
21650
+ }
21651
+
21652
+ @keyframes crewlet-message-enter {
21653
+ from {
21654
+ opacity: 0;
21655
+ transform: translateY(var(--spacing-1));
21656
+ }
21657
+ }
21658
+
21659
+ @media (prefers-reduced-motion: reduce) {
21660
+ .crewlet-message--enter {
21661
+ animation: none;
21662
+ }
21663
+ }
21664
+
21665
+
21061
21666
  /* Meter-ZZRFUEOH.css */
21062
21667
  /*
21063
21668
  * The meter.
@@ -22218,6 +22823,33 @@ a.crewlet-icon-btn {
22218
22823
  }
22219
22824
 
22220
22825
 
22826
+ /* OpenInAppCard-CKHCK7DO.css */
22827
+ /* The place: its tile, then its name over where it lives. */
22828
+ .crewlet-open-in-app-card__place {
22829
+ display: flex;
22830
+ align-items: center;
22831
+ gap: var(--spacing-3);
22832
+ min-width: 0;
22833
+ }
22834
+
22835
+ .crewlet-open-in-app-card__words {
22836
+ display: flex;
22837
+ flex-direction: column;
22838
+ min-width: 0;
22839
+ }
22840
+
22841
+ .crewlet-open-in-app-card__title {
22842
+ overflow-wrap: anywhere;
22843
+ font-weight: var(--font-weight-medium);
22844
+ color: var(--color-text-primary);
22845
+ }
22846
+
22847
+ .crewlet-open-in-app-card__path {
22848
+ font-size: var(--font-size-xs);
22849
+ color: var(--color-text-tertiary);
22850
+ }
22851
+
22852
+
22221
22853
  /* OrgLabel-R5KY7C3W.css */
22222
22854
  /*
22223
22855
  * What a node of an org chart and a row of an org table both say
@@ -23391,6 +24023,104 @@ a.crewlet-icon-btn {
23391
24023
  }
23392
24024
 
23393
24025
 
24026
+ /* PeekRail-4L5YUQMW.css */
24027
+ /*
24028
+ * The peek (`PeekRail`): a rail beside the list it was opened from, on the
24029
+ * subtle ground, with a bar at the page bar's height and a scrolling body.
24030
+ *
24031
+ * Its shape is an attribute with one value (`data-shape`), decided by the
24032
+ * host, so there is no width at which it is both a column and a drawer, or
24033
+ * neither. Its width is one variable (`--crewlet-peek-rail-width`), written
24034
+ * on the rail by the component, so the column and the drawer read the same
24035
+ * value and cannot disagree about how wide it is.
24036
+ */
24037
+
24038
+ .crewlet-peek-rail {
24039
+ position: relative;
24040
+ display: flex;
24041
+ flex-direction: column;
24042
+ min-width: 0;
24043
+ min-height: 0;
24044
+ background: var(--color-surface-subtle);
24045
+ border-left: 1px solid var(--color-border-hover);
24046
+ }
24047
+
24048
+ /*
24049
+ * A COLUMN beside the scroller: the reader's width, capped at what leaves the
24050
+ * list its floor (`--crewlet-peek-rail-reserve`, the gutter, the padding, any
24051
+ * section column and the list). At the threshold the host decided the column
24052
+ * at, the cap is exactly the resting width, so the column never opens
24053
+ * narrower than the width it was decided at.
24054
+ */
24055
+ .crewlet-peek-rail[data-shape='column'] {
24056
+ flex: none;
24057
+ width: min(var(--crewlet-peek-rail-width), max(0px, 100% - var(--crewlet-peek-rail-reserve, 0px)));
24058
+ }
24059
+
24060
+ /* The grip straddles the rail's hairline, a little narrower than the frame's
24061
+ seam, since it stands over one line rather than in a gap. */
24062
+ .crewlet-peek-rail > .crewlet-resize-handle--left {
24063
+ --crewlet-resize-handle-width: calc(var(--spacing-1) + var(--spacing-1) / 2);
24064
+ left: calc(var(--crewlet-resize-handle-width) / -2);
24065
+ }
24066
+
24067
+ /* The bar stands at the page bar's height, so the two lines meet. */
24068
+ .crewlet-peek-rail__bar {
24069
+ display: flex;
24070
+ flex: none;
24071
+ align-items: center;
24072
+ gap: var(--spacing-1);
24073
+ height: var(--size-shell-topbar);
24074
+ padding: 0 var(--spacing-2);
24075
+ border-bottom: 1px solid var(--color-border-hover);
24076
+ }
24077
+
24078
+ .crewlet-peek-rail__spacer {
24079
+ flex: 1 1 auto;
24080
+ }
24081
+
24082
+ /* THE PEEK'S OWN SCROLLER, and a SIZE container for the reason the shell's
24083
+ `main` is one: a record inside a peek is bounded by what the peek shows
24084
+ (`100cqb`), and with no size container between it and the root `cqb`
24085
+ falls back to the viewport, which counts the peek's bar as view. Its
24086
+ height is the flex column's, never its content's, so containing it costs
24087
+ nothing. */
24088
+ .crewlet-peek-rail__body {
24089
+ container: crewlet-peek-rail / size;
24090
+ flex: 1 1 auto;
24091
+ min-height: 0;
24092
+ overflow-y: auto;
24093
+ padding: 0 var(--spacing-4) var(--spacing-6);
24094
+ }
24095
+
24096
+ /*
24097
+ * THE DRAWER: below the host's threshold the rail slides over the page
24098
+ * behind a veil, and a fixed box takes no room, so the page stays one column
24099
+ * under it. No grip: there is no list beside it to give way.
24100
+ */
24101
+ /*
24102
+ * Beside an aside column the drawer and its veil stop at the page sheet's
24103
+ * edge (`--crewlet-app-shell-aside-occupied`, measured by the shell), so the
24104
+ * peek stands over the page, next to the aside, rather than over the aside.
24105
+ */
24106
+ .crewlet-peek-rail[data-shape='drawer'] {
24107
+ position: fixed;
24108
+ top: 0;
24109
+ right: var(--crewlet-app-shell-aside-occupied, 0px);
24110
+ bottom: 0;
24111
+ z-index: var(--z-index-overlay);
24112
+ width: min(var(--crewlet-peek-rail-width), 92vw);
24113
+ box-shadow: var(--shadow-md);
24114
+ }
24115
+
24116
+ .crewlet-peek-rail__veil {
24117
+ position: fixed;
24118
+ inset: 0 var(--crewlet-app-shell-aside-occupied, 0px) 0 0;
24119
+ z-index: calc(var(--z-index-overlay) - 1);
24120
+ background: var(--color-surface-veil);
24121
+ }
24122
+
24123
+
23394
24124
  /* PeopleRail-SZGHZXVT.css */
23395
24125
  /* PeopleRail: a raised column of everybody present, one row a person, the
23396
24126
  name over what they are doing and the controls at the row's end. */
@@ -24530,6 +25260,38 @@ button.crewlet-presence-stack__member:focus-visible {
24530
25260
  }
24531
25261
 
24532
25262
 
25263
+ /* ProposalCard-23575F4C.css */
25264
+ /*
25265
+ * A proposed change. The card, its head, its strip and its foot are
25266
+ * StatusCard's; only the note's register is said here: the consequence is a
25267
+ * quieter sentence than the summary it follows.
25268
+ */
25269
+ .crewlet-proposal-card__note {
25270
+ color: var(--color-text-secondary);
25271
+ }
25272
+
25273
+ /* WHY THE PRIMARY IS HELD, on a line of its own above the decision and at
25274
+ its end, in the foot's quiet register, so it wraps rather than pushing the
25275
+ buttons apart. */
25276
+ .crewlet-proposal-card__blocked {
25277
+ flex: 1 1 100%;
25278
+ margin: 0;
25279
+ color: var(--color-text-secondary);
25280
+ font-size: var(--font-size-compact);
25281
+ text-align: end;
25282
+ }
25283
+
25284
+ /* WHY THE LAST DECISION WAS REFUSED, on a line of its own above the
25285
+ decision and at its end, as the held primary's reason is: the refusal
25286
+ strip's own inline drawing, which wraps rather than widening the row. */
25287
+ .crewlet-proposal-card__refusal {
25288
+ display: flex;
25289
+ flex: 1 1 100%;
25290
+ justify-content: flex-end;
25291
+ text-align: end;
25292
+ }
25293
+
25294
+
24533
25295
  /* Prose-BTXNFT2Q.css */
24534
25296
  /*
24535
25297
  * Natural language: the proportional face, real leading, a bounded measure.
@@ -24851,6 +25613,113 @@ button.crewlet-presence-stack__member:focus-visible {
24851
25613
  }
24852
25614
 
24853
25615
 
25616
+ /* ReceiptStrip-IIRKRTBG.css */
25617
+ /*
25618
+ * A card's foot strip: the card's hairline above it, a tint under the words,
25619
+ * the mark on the first line. The tints are the soft step of the tone under
25620
+ * its ink step, the pairing the palette suite measures; the quiet strip is
25621
+ * the inset ground under the secondary ink.
25622
+ */
25623
+ .crewlet-receipt-strip {
25624
+ display: grid;
25625
+ grid-template-columns: auto minmax(0, 1fr) auto;
25626
+ align-items: start;
25627
+ gap: var(--spacing-2);
25628
+ padding: var(--spacing-2) var(--spacing-4);
25629
+ border-top: 1px solid var(--color-border-default);
25630
+ font-size: var(--font-size-compact);
25631
+ line-height: var(--font-line-height-normal);
25632
+ }
25633
+
25634
+ .crewlet-receipt-strip--success {
25635
+ background: var(--color-feedback-success-soft);
25636
+ color: var(--color-feedback-success-ink);
25637
+ }
25638
+
25639
+ .crewlet-receipt-strip--neutral {
25640
+ background: var(--color-surface-inset);
25641
+ color: var(--color-text-secondary);
25642
+ }
25643
+
25644
+ .crewlet-receipt-strip--info {
25645
+ background: var(--color-feedback-info-soft);
25646
+ color: var(--color-feedback-info-ink);
25647
+ }
25648
+
25649
+ .crewlet-receipt-strip--warning {
25650
+ background: var(--color-feedback-warning-soft);
25651
+ color: var(--color-feedback-warning-ink);
25652
+ }
25653
+
25654
+ .crewlet-receipt-strip--danger {
25655
+ background: var(--color-feedback-danger-soft);
25656
+ color: var(--color-feedback-danger-ink);
25657
+ }
25658
+
25659
+ /* The 16px mark, centred on the first line of the words beside it. */
25660
+ .crewlet-receipt-strip__icon {
25661
+ display: inline-flex;
25662
+ align-items: center;
25663
+ height: calc(var(--font-size-compact) * var(--font-line-height-normal));
25664
+ }
25665
+
25666
+ .crewlet-receipt-strip__text {
25667
+ display: flex;
25668
+ flex-direction: column;
25669
+ min-width: 0;
25670
+ overflow-wrap: anywhere;
25671
+ }
25672
+
25673
+ /* The actions keep the strip's ink, so a ghost button reads as part of it. */
25674
+ .crewlet-receipt-strip__actions {
25675
+ display: flex;
25676
+ flex-wrap: wrap;
25677
+ align-items: center;
25678
+ gap: var(--spacing-1);
25679
+ margin-block: calc(var(--spacing-1) * -1);
25680
+ }
25681
+
25682
+ .crewlet-receipt-strip__actions .crewlet-btn--ghost {
25683
+ color: inherit;
25684
+ }
25685
+
25686
+ /*
25687
+ * THE INLINE REFUSAL, under the control that caused it: the sentence in the
25688
+ * danger ink, the hint in the secondary ink, the actions beside them, wrapping
25689
+ * onto a second line rather than widening the row.
25690
+ */
25691
+ .crewlet-refusal-strip {
25692
+ display: flex;
25693
+ flex-wrap: wrap;
25694
+ align-items: center;
25695
+ gap: var(--spacing-1) var(--spacing-2);
25696
+ max-width: 40rem;
25697
+ font-size: var(--font-size-compact);
25698
+ color: var(--color-feedback-danger-ink);
25699
+ overflow-wrap: anywhere;
25700
+ }
25701
+
25702
+ .crewlet-refusal-strip__hint {
25703
+ font-size: var(--font-size-xs);
25704
+ color: var(--color-text-secondary);
25705
+ }
25706
+
25707
+ .crewlet-refusal-strip--foot .crewlet-refusal-strip__hint {
25708
+ color: inherit;
25709
+ }
25710
+
25711
+
25712
+ /* RefusalCard-UM67F5HB.css */
25713
+ /* The first sentence carries the weight; "Nothing changed." closes in the secondary ink. */
25714
+ .crewlet-refusal-card__heading {
25715
+ font-weight: var(--font-weight-medium);
25716
+ }
25717
+
25718
+ .crewlet-refusal-card__nothing {
25719
+ color: var(--color-text-secondary);
25720
+ }
25721
+
25722
+
24854
25723
  /* RelatedRow-2FVS6QQA.css */
24855
25724
  /* RelatedRow: the glyphs in the quiet ink; everything else is the kit's card. */
24856
25725
  .crewlet-related-row__glyph {
@@ -24873,6 +25742,111 @@ button.crewlet-presence-stack__member:focus-visible {
24873
25742
  }
24874
25743
 
24875
25744
 
25745
+ /* ResizeHandle-2UNSZ4ZQ.css */
25746
+ /*
25747
+ * The grip between a panel and the page beside it (`ResizeHandle`).
25748
+ *
25749
+ * DRAWN AS NOTHING AT REST. It stands in a seam that is already drawn (the
25750
+ * frame's inset between two sheets, a panel's hairline), so a handle of its
25751
+ * own would be a second line beside one. It washes in the soft accent under
25752
+ * the pointer, under keyboard focus and for the whole of a drag.
25753
+ *
25754
+ * ITS DRAWN WIDTH IS THE SEAM'S (`--crewlet-resize-handle-width`, the frame's
25755
+ * inset), and its target is the 24px floor whatever that width is: the
25756
+ * hit area reaches half the difference out on each side, so a seam of 8px
25757
+ * is still a target a finger can find.
25758
+ *
25759
+ * Placed by whoever holds it: the shell's aside and a side panel put it on
25760
+ * their own start edge. Absolute, so it takes no room in the layout it sizes.
25761
+ */
25762
+ .crewlet-resize-handle {
25763
+ --crewlet-resize-handle-width: var(--size-shell-inset);
25764
+ --crewlet-hit-area-inline: max(0px, calc((var(--size-target-min) - var(--crewlet-resize-handle-width)) / 2));
25765
+ position: absolute;
25766
+ top: 0;
25767
+ bottom: 0;
25768
+ z-index: var(--z-index-raised);
25769
+ width: var(--crewlet-resize-handle-width);
25770
+ border-radius: var(--radius-xs);
25771
+ background: transparent;
25772
+ cursor: col-resize;
25773
+ /* A touch drags the edge rather than scrolling the page under it. */
25774
+ touch-action: none;
25775
+ transition: background var(--motion-duration-fast) var(--motion-easing-default);
25776
+ }
25777
+
25778
+ /* On a panel's left edge it stands outside the panel, in the seam before it. */
25779
+ .crewlet-resize-handle--left {
25780
+ left: calc(var(--crewlet-resize-handle-width) * -1);
25781
+ }
25782
+
25783
+ .crewlet-resize-handle--right {
25784
+ right: calc(var(--crewlet-resize-handle-width) * -1);
25785
+ }
25786
+
25787
+ .crewlet-resize-handle:hover,
25788
+ .crewlet-resize-handle:focus-visible,
25789
+ .crewlet-resize-handle[data-dragging] {
25790
+ background: var(--color-brand-accent-soft);
25791
+ }
25792
+
25793
+ /* Inside its own box: it draws no edge, and the seam it stands in is the
25794
+ two neighbours' edges, which a ring set outward would run over. */
25795
+ .crewlet-resize-handle:focus-visible {
25796
+ outline: 2px solid var(--color-focus);
25797
+ outline-offset: var(--size-focus-ring-inset-offset);
25798
+ }
25799
+
25800
+ @media (prefers-reduced-motion: reduce) {
25801
+ .crewlet-resize-handle {
25802
+ transition: none;
25803
+ }
25804
+ }
25805
+
25806
+
25807
+ /* ResultTableCard-HZRUDNTX.css */
25808
+ /*
25809
+ * A result in a card. The card, its head and its foot are StatusCard's and
25810
+ * the table is Table's, drawn flush; what a result adds is the column model:
25811
+ * the first column takes the room the figures leave and ends a long name in
25812
+ * an ellipsis, and the figures never wrap.
25813
+ */
25814
+ .crewlet-result-table-card__table .crewlet-table__table {
25815
+ table-layout: auto;
25816
+ font-variant-numeric: tabular-nums;
25817
+ }
25818
+
25819
+ .crewlet-result-table-card__table td:first-child {
25820
+ width: 100%;
25821
+ max-width: 0;
25822
+ overflow: hidden;
25823
+ text-overflow: ellipsis;
25824
+ white-space: nowrap;
25825
+ overflow-wrap: normal;
25826
+ }
25827
+
25828
+ .crewlet-result-table-card__table .crewlet-table__cell--end {
25829
+ white-space: nowrap;
25830
+ }
25831
+
25832
+ /*
25833
+ * THE DOWNLOADS ARE SPANS AROUND A BUTTON (the status region beside each is
25834
+ * a sibling of its button), so the foot's ghost outdent is stated for them
25835
+ * here: the first one's padding and edge are pulled out so its glyph sits on
25836
+ * the card's text edge.
25837
+ */
25838
+ .crewlet-result-table-card .crewlet-status-card__actions > .crewlet-result-table-card__download:first-child {
25839
+ margin-inline-start: calc(-1 * (var(--spacing-2) + 1px));
25840
+ }
25841
+
25842
+ /* The link stands at the foot's far end, its own padding pulled out to the edge. */
25843
+ .crewlet-result-table-card__link {
25844
+ display: inline-flex;
25845
+ margin-inline-start: auto;
25846
+ margin-inline-end: calc(-1 * (var(--spacing-2) + 1px));
25847
+ }
25848
+
25849
+
24876
25850
  /* ReviewList-TIN6C2JN.css */
24877
25851
  /*
24878
25852
  * ReviewList: a setup's parts in one bordered box, a row each, before the
@@ -25414,6 +26388,52 @@ button.crewlet-presence-stack__member:focus-visible {
25414
26388
  }
25415
26389
 
25416
26390
 
26391
+ /* RunChip-I2S4VZ3R.css */
26392
+ /*
26393
+ * A request's state on the disclosure trigger. Only what differs from the
26394
+ * disclosure is said here: the trigger is as wide as its words (not the whole
26395
+ * row), its padding hangs into the gutter so the chevron sits on the text
26396
+ * edge, its figures are tabular so a ticking time does not shake the row, and
26397
+ * the title takes the state's tone.
26398
+ */
26399
+ .crewlet-run-chip {
26400
+ display: flex;
26401
+ flex-direction: column;
26402
+ align-items: flex-start;
26403
+ gap: var(--spacing-1);
26404
+ min-width: 0;
26405
+ }
26406
+
26407
+ .crewlet-run-chip .crewlet-run-chip__trigger {
26408
+ flex: none;
26409
+ width: auto;
26410
+ max-width: calc(100% + var(--spacing-2));
26411
+ margin-inline-start: calc(var(--spacing-2) * -1);
26412
+ font-variant-numeric: tabular-nums;
26413
+ }
26414
+
26415
+ .crewlet-run-chip__separator {
26416
+ color: var(--color-text-tertiary);
26417
+ }
26418
+
26419
+ /* The state's tone, in the title's ink, at rest and under the pointer. */
26420
+ .crewlet-run-chip--waiting .crewlet-run-chip__trigger,
26421
+ .crewlet-run-chip--waiting .crewlet-run-chip__trigger:hover {
26422
+ color: var(--color-feedback-warning-ink);
26423
+ }
26424
+
26425
+ .crewlet-run-chip--failed .crewlet-run-chip__trigger,
26426
+ .crewlet-run-chip--failed .crewlet-run-chip__trigger:hover {
26427
+ color: var(--color-feedback-danger-ink);
26428
+ }
26429
+
26430
+ /* The steps it opens fill the thread's width under it. */
26431
+ .crewlet-run-chip__panel {
26432
+ align-self: stretch;
26433
+ min-width: 0;
26434
+ }
26435
+
26436
+
25417
26437
  /* SandboxedFrame-P5NASXB7.css */
25418
26438
  /*
25419
26439
  * The frame fills the box it is given. The page around it does not scroll
@@ -28364,6 +29384,244 @@ svg.crewlet-select__chevron {
28364
29384
  }
28365
29385
 
28366
29386
 
29387
+ /* SidePanel-ERBUIELD.css */
29388
+ /*
29389
+ * A side panel and the frame that lays it beside the content or over it
29390
+ * (`SidePanel`, `SidePanelFrame`, and their artifact presets).
29391
+ *
29392
+ * The frame is a row: the content, then at most one panel. The content
29393
+ * scrolls itself, so a panel beside it stays in view however far it is read;
29394
+ * the panel's own body scrolls under its head.
29395
+ *
29396
+ * ONE HAIRLINE between the two, the panel's start edge, and none at the
29397
+ * frame's own edges: whatever holds the frame already draws those.
29398
+ */
29399
+
29400
+ .crewlet-side-panel-frame {
29401
+ container: crewlet-side-panel-frame / inline-size;
29402
+ position: relative;
29403
+ display: flex;
29404
+ min-width: 0;
29405
+ min-height: 0;
29406
+ }
29407
+
29408
+ .crewlet-side-panel-frame__body {
29409
+ flex: 1 1 auto;
29410
+ min-width: 0;
29411
+ min-height: 0;
29412
+ overflow: auto;
29413
+ }
29414
+
29415
+ /* EXPANDED, the panel is the frame; the content stays mounted behind it, so
29416
+ a page's state survives the look at its data. */
29417
+ .crewlet-side-panel-frame[data-panel='expanded'] > .crewlet-side-panel-frame__body {
29418
+ display: none;
29419
+ }
29420
+
29421
+ /*
29422
+ * THE PANEL. Its width is one variable (`--crewlet-side-panel-width`), which
29423
+ * the `width` prop sets on the element itself, and its head stands at the page
29424
+ * bar's height (`--crewlet-side-panel-head-height`), so beside the shell's bar
29425
+ * the two lines meet. Positioned, so the grip on its start edge has a box to
29426
+ * stand against.
29427
+ */
29428
+ .crewlet-side-panel {
29429
+ --crewlet-side-panel-width: 26.25rem;
29430
+ --crewlet-side-panel-head-height: var(--size-shell-topbar);
29431
+ --crewlet-side-panel-inset: var(--spacing-4);
29432
+ position: relative;
29433
+ display: flex;
29434
+ flex: none;
29435
+ flex-direction: column;
29436
+ width: var(--crewlet-side-panel-width);
29437
+ min-height: 0;
29438
+ border-left: 1px solid var(--color-border-default);
29439
+ background: var(--color-surface-background);
29440
+ }
29441
+
29442
+ /* IN THE SHELL'S ASIDE the panel fills the aside's sheet, which draws the
29443
+ edge, the corner and the ground, and whose track is the width. */
29444
+ .crewlet-side-panel--fill {
29445
+ flex: 1 1 auto;
29446
+ width: auto;
29447
+ border-left: 0;
29448
+ background: transparent;
29449
+ }
29450
+
29451
+ .crewlet-side-panel[data-expanded] {
29452
+ flex: 1 1 auto;
29453
+ width: auto;
29454
+ border-left: 0;
29455
+ }
29456
+
29457
+ /* The grip straddles the panel's hairline, which is the edge it moves. */
29458
+ .crewlet-side-panel > .crewlet-resize-handle--left {
29459
+ left: calc(var(--crewlet-resize-handle-width) / -2);
29460
+ }
29461
+
29462
+ /*
29463
+ * THE HEAD: the mark, the title, and the actions at the end. The title keeps
29464
+ * what the actions leave it and truncates, so the actions never wrap. Its
29465
+ * start inset is the body's, so the mark stands on the line the body's
29466
+ * content starts on.
29467
+ */
29468
+ .crewlet-side-panel__head {
29469
+ display: flex;
29470
+ flex: none;
29471
+ align-items: center;
29472
+ gap: var(--spacing-2);
29473
+ height: var(--crewlet-side-panel-head-height);
29474
+ padding: 0 var(--spacing-2) 0 var(--spacing-4);
29475
+ border-bottom: 1px solid var(--color-border-default);
29476
+ }
29477
+
29478
+ .crewlet-side-panel__icon {
29479
+ display: inline-flex;
29480
+ flex: none;
29481
+ color: var(--color-text-tertiary);
29482
+ }
29483
+
29484
+ .crewlet-side-panel__title {
29485
+ flex: 1 1 auto;
29486
+ min-width: 0;
29487
+ margin: 0;
29488
+ overflow: hidden;
29489
+ color: var(--color-text-primary);
29490
+ font-size: var(--font-size-sm);
29491
+ font-weight: var(--font-weight-semibold);
29492
+ line-height: var(--font-line-height-snug);
29493
+ text-overflow: ellipsis;
29494
+ white-space: nowrap;
29495
+ }
29496
+
29497
+ /* THE HEADING TAKES FOCUS WITHOUT A RING. It is focused so a screen reader
29498
+ announces what opened, and it is not a control: a ring round a title reads
29499
+ as something to press. Transparent rather than none, so forced colours,
29500
+ which draw every outline in the system colour, still show where focus is. */
29501
+ .crewlet-side-panel__title--quiet:focus-visible {
29502
+ outline: 2px solid transparent;
29503
+ }
29504
+
29505
+ /* Named for assistive technology only, where the mark beside it says it. */
29506
+ .crewlet-side-panel__title--hidden {
29507
+ position: absolute;
29508
+ width: 1px;
29509
+ height: 1px;
29510
+ overflow: hidden;
29511
+ clip-path: inset(50%);
29512
+ white-space: nowrap;
29513
+ }
29514
+
29515
+ .crewlet-side-panel__actions {
29516
+ display: inline-flex;
29517
+ flex: none;
29518
+ align-items: center;
29519
+ gap: var(--spacing-1);
29520
+ margin-left: auto;
29521
+ }
29522
+
29523
+ /* THE BODY'S INSET IS PUBLISHED (--crewlet-side-panel-inset) for content
29524
+ that sticks to its scrollport: a sticky edge stops at the padding, so a
29525
+ foot with `bottom: 0` would leave a band under it that the content
29526
+ scrolled through; such a foot offsets itself by the inset to sit on the
29527
+ edge. */
29528
+ .crewlet-side-panel__body {
29529
+ /* THE PANEL'S OWN MEASURE, so what it holds folds to the panel's width
29530
+ rather than the window's; and its sections head at the panel title's
29531
+ step, a level under it and never louder than it. */
29532
+ container: crewlet-side-panel / inline-size;
29533
+ --crewlet-section-title-size: var(--font-size-sm);
29534
+
29535
+ /* A COLUMN, so content that should fit the panel rather than scroll it
29536
+ can: a child that sets `min-height: 0` shrinks to the room the body has,
29537
+ and every other child keeps its content's height and scrolls the body. */
29538
+ display: flex;
29539
+ flex-direction: column;
29540
+ flex: 1 1 auto;
29541
+ min-height: 0;
29542
+ padding: var(--crewlet-side-panel-inset);
29543
+ overflow: auto;
29544
+ overscroll-behavior: contain;
29545
+ }
29546
+
29547
+ /* FLUSH, the body draws no inset of its own: what it holds owns its edges
29548
+ (a chat thread that scrolls and insets itself). The published inset reads 0
29549
+ inside it, so anything that offsets itself by the inset follows. */
29550
+ .crewlet-side-panel__body--flush {
29551
+ --crewlet-side-panel-inset: 0px;
29552
+ }
29553
+
29554
+ /* THE FOOT holds the panel's own commit, outside the scrolling body, so it
29555
+ stays in reach at every scroll. Its inset is the body's. */
29556
+ .crewlet-side-panel__foot {
29557
+ flex: none;
29558
+ padding: var(--spacing-3) var(--spacing-4);
29559
+ border-top: 1px solid var(--color-border-default);
29560
+ background: var(--color-surface-background);
29561
+ }
29562
+
29563
+ /* ── shapes the host decides ─────────────────────────────────────────── */
29564
+
29565
+ /* A COLUMN keeps the content its floor: a width dragged in a wide frame is
29566
+ capped at what leaves the content `--crewlet-side-panel-reserve` wide. */
29567
+ .crewlet-side-panel-frame[data-shape='column'] > .crewlet-side-panel:not([data-expanded]) {
29568
+ width: min(var(--crewlet-side-panel-width), max(0px, 100% - var(--crewlet-side-panel-reserve, 0px)));
29569
+ }
29570
+
29571
+ /* A DRAWER slides over the content's end edge, raised off it, rather than
29572
+ squeezing the content under a useful width. */
29573
+ .crewlet-side-panel-frame[data-shape='drawer'] > .crewlet-side-panel:not([data-expanded]) {
29574
+ position: absolute;
29575
+ inset-block: 0;
29576
+ inset-inline-end: 0;
29577
+ z-index: var(--z-index-overlay);
29578
+ width: min(var(--crewlet-side-panel-width), 100%);
29579
+ /* THE DRAWER'S LIFT, the shell's own rail drawer's: a smaller step left
29580
+ the panel's start edge reading as a cut through the content rather than
29581
+ a sheet over it. */
29582
+ box-shadow: var(--shadow-xl);
29583
+ }
29584
+
29585
+ /* A SHEET is the frame until it is closed. */
29586
+ .crewlet-side-panel-frame[data-shape='sheet'] > .crewlet-side-panel {
29587
+ position: absolute;
29588
+ inset: 0;
29589
+ z-index: var(--z-index-overlay);
29590
+ width: auto;
29591
+ border-left: 0;
29592
+ }
29593
+
29594
+ /* ── shapes the frame measures (no `shape`) ─────────────────────────── */
29595
+
29596
+ /* NOT ROOM FOR TWO COLUMNS: the drawer, as above. */
29597
+ @container crewlet-side-panel-frame (width < 960px) {
29598
+ .crewlet-side-panel-frame[data-shape='auto'] > .crewlet-side-panel {
29599
+ position: absolute;
29600
+ inset-block: 0;
29601
+ inset-inline-end: 0;
29602
+ z-index: var(--z-index-overlay);
29603
+ width: min(var(--crewlet-side-panel-width), 100%);
29604
+ box-shadow: var(--shadow-xl);
29605
+ }
29606
+
29607
+ .crewlet-side-panel-frame[data-shape='auto'] > .crewlet-side-panel[data-expanded] {
29608
+ inset-inline-start: 0;
29609
+ width: auto;
29610
+ box-shadow: none;
29611
+ }
29612
+ }
29613
+
29614
+ /* A PHONE: the panel is the frame until it is closed. */
29615
+ @container crewlet-side-panel-frame (width < 640px) {
29616
+ .crewlet-side-panel-frame[data-shape='auto'] > .crewlet-side-panel {
29617
+ inset-inline-start: 0;
29618
+ width: auto;
29619
+ border-left: 0;
29620
+ box-shadow: none;
29621
+ }
29622
+ }
29623
+
29624
+
28367
29625
  /* SidebarNav-YI74SPDC.css */
28368
29626
  /*
28369
29627
  * The rail's navigation.
@@ -29986,6 +31244,55 @@ svg.crewlet-select__chevron {
29986
31244
  }
29987
31245
 
29988
31246
 
31247
+ /* Spinner-XZ2TVYE5.css */
31248
+ /*
31249
+ * The package's one ring. See Spinner.tsx for why it is inline-block, why it
31250
+ * stays open when it stops, and why its ink is the current colour.
31251
+ */
31252
+ .crewlet-spinner {
31253
+ display: inline-block;
31254
+ box-sizing: border-box;
31255
+ flex: none;
31256
+ width: 1em;
31257
+ height: 1em;
31258
+ border: 2px solid currentColor;
31259
+ border-right-color: transparent;
31260
+ border-radius: var(--radius-circle);
31261
+ opacity: 0.7;
31262
+ animation: crewlet-spinner-turn var(--motion-duration-slow) linear infinite;
31263
+ }
31264
+
31265
+ /* The glyph scale of @crewlethq/icons: xs 12px, sm 14px, md 16px. */
31266
+ .crewlet-spinner--xs {
31267
+ width: var(--font-size-xs);
31268
+ height: var(--font-size-xs);
31269
+ }
31270
+
31271
+ .crewlet-spinner--sm {
31272
+ width: var(--font-size-sm);
31273
+ height: var(--font-size-sm);
31274
+ }
31275
+
31276
+ .crewlet-spinner--md {
31277
+ width: var(--font-size-md);
31278
+ height: var(--font-size-md);
31279
+ }
31280
+
31281
+ @keyframes crewlet-spinner-turn {
31282
+ to {
31283
+ transform: rotate(360deg);
31284
+ }
31285
+ }
31286
+
31287
+ /* It stops, and keeps its open quarter: a closed ring reads as an empty status
31288
+ circle, the open one still reads as pending. */
31289
+ @media (prefers-reduced-motion: reduce) {
31290
+ .crewlet-spinner {
31291
+ animation: none;
31292
+ }
31293
+ }
31294
+
31295
+
29989
31296
  /* StatCard-HAA3F5GX.css */
29990
31297
  /*
29991
31298
  * The stat tile.
@@ -30479,6 +31786,71 @@ svg.crewlet-select__chevron {
30479
31786
  }
30480
31787
 
30481
31788
 
31789
+ /* StatusCard-6RPEE6UU.css */
31790
+ /*
31791
+ * A record with a state. The card, its head, its body and its foot are
31792
+ * Card's; only what a status card adds is said here.
31793
+ */
31794
+
31795
+ /* The body holds a sentence, a list and a note, one gap apart. */
31796
+ .crewlet-status-card__body {
31797
+ display: flex;
31798
+ flex-direction: column;
31799
+ gap: var(--spacing-3);
31800
+ min-width: 0;
31801
+ font-size: var(--font-size-compact);
31802
+ line-height: var(--font-line-height-normal);
31803
+ color: var(--color-text-primary);
31804
+ }
31805
+
31806
+ .crewlet-status-card__body > p {
31807
+ margin: 0;
31808
+ }
31809
+
31810
+ /* Settled: the body steps back so the strip at the foot reads first. */
31811
+ .crewlet-status-card--settled .crewlet-status-card__body {
31812
+ color: var(--color-text-secondary);
31813
+ }
31814
+
31815
+ /* The strip fills its flush footer edge to edge. */
31816
+ .crewlet-status-card__strip {
31817
+ display: block;
31818
+ }
31819
+
31820
+ /*
31821
+ * THE FOOT'S ONE RULE. A decision ends the row; utilities start it, with a
31822
+ * ghost button at either end pulled out by its padding and edge so its glyph
31823
+ * sits on the card's text edge.
31824
+ */
31825
+ .crewlet-status-card__actions {
31826
+ flex-wrap: wrap;
31827
+ container: crewlet-status-card-actions / inline-size;
31828
+ }
31829
+
31830
+ .crewlet-status-card__actions--end {
31831
+ justify-content: flex-end;
31832
+ }
31833
+
31834
+ .crewlet-status-card__actions--start {
31835
+ justify-content: flex-start;
31836
+ }
31837
+
31838
+ .crewlet-status-card__actions--start > .crewlet-btn--ghost.crewlet-btn--small:first-child {
31839
+ margin-inline-start: calc(-1 * (var(--spacing-2) + 1px));
31840
+ }
31841
+
31842
+ .crewlet-status-card__actions--start > .crewlet-btn--ghost.crewlet-btn--small:last-child {
31843
+ margin-inline-end: calc(-1 * (var(--spacing-2) + 1px));
31844
+ }
31845
+
31846
+ /* A decision on a narrow card (a phone sheet): its buttons share the row as blocks. */
31847
+ @container crewlet-status-card-actions (width < 328px) {
31848
+ .crewlet-status-card__actions--end > .crewlet-btn {
31849
+ flex: 1 1 0;
31850
+ }
31851
+ }
31852
+
31853
+
30482
31854
  /* StatusDot-7OMCQCZF.css */
30483
31855
  /*
30484
31856
  * The status dot: a 7px mark in its tone's fill, beside the word it belongs
@@ -30668,6 +32040,128 @@ svg.crewlet-select__chevron {
30668
32040
  }
30669
32041
 
30670
32042
 
32043
+ /* StepList-A4YVU4JI.css */
32044
+ /*
32045
+ * A request's steps: a well on the inset ground, an ordered list of steps
32046
+ * each on a three-track grid (the 16px state column, the words, the
32047
+ * duration), every track aligned to the label's first line.
32048
+ */
32049
+
32050
+ /*
32051
+ * A STATE'S MARK, shared with the run chip: a 16px box, the mark centred in
32052
+ * it at the glyph's 14px, inked by state. The box's height is the line it
32053
+ * stands on (`--crewlet-step-mark-line`), so it sits on that line's middle.
32054
+ */
32055
+ .crewlet-step-mark {
32056
+ display: inline-flex;
32057
+ flex: none;
32058
+ align-items: center;
32059
+ justify-content: center;
32060
+ width: var(--font-size-md);
32061
+ height: var(--crewlet-step-mark-line, var(--font-size-md));
32062
+ }
32063
+
32064
+ .crewlet-step-mark--running {
32065
+ color: var(--color-text-secondary);
32066
+ }
32067
+
32068
+ .crewlet-step-mark--done {
32069
+ color: var(--color-feedback-success-ink);
32070
+ }
32071
+
32072
+ .crewlet-step-mark--failed {
32073
+ color: var(--color-feedback-danger-ink);
32074
+ }
32075
+
32076
+ .crewlet-step-mark--waiting {
32077
+ color: var(--color-feedback-warning-ink);
32078
+ }
32079
+
32080
+ .crewlet-step-mark--refused,
32081
+ .crewlet-step-mark--stopped {
32082
+ color: var(--color-text-tertiary);
32083
+ }
32084
+
32085
+ .crewlet-step-list {
32086
+ --crewlet-step-list-line: calc(var(--font-size-compact) * var(--font-line-height-normal));
32087
+
32088
+ display: flex;
32089
+ flex-direction: column;
32090
+ gap: var(--spacing-1);
32091
+ min-width: 0;
32092
+ padding: var(--spacing-2) var(--spacing-3);
32093
+ border-radius: var(--radius-md);
32094
+ background: var(--color-surface-inset);
32095
+ }
32096
+
32097
+ .crewlet-step-list__summary {
32098
+ font-size: var(--font-size-xs);
32099
+ font-variant-numeric: tabular-nums;
32100
+ color: var(--color-text-tertiary);
32101
+ }
32102
+
32103
+ .crewlet-step-list__steps {
32104
+ display: flex;
32105
+ flex-direction: column;
32106
+ gap: var(--spacing-2);
32107
+ margin: 0;
32108
+ padding: 0;
32109
+ list-style: none;
32110
+ }
32111
+
32112
+ .crewlet-step-list__step {
32113
+ --crewlet-step-mark-line: var(--crewlet-step-list-line);
32114
+
32115
+ display: grid;
32116
+ grid-template-columns: var(--font-size-md) minmax(0, 1fr) auto;
32117
+ align-items: start;
32118
+ gap: var(--spacing-2);
32119
+ font-size: var(--font-size-compact);
32120
+ line-height: var(--crewlet-step-list-line);
32121
+ color: var(--color-text-primary);
32122
+ }
32123
+
32124
+ .crewlet-step-list__text {
32125
+ display: flex;
32126
+ flex-direction: column;
32127
+ min-width: 0;
32128
+ }
32129
+
32130
+ .crewlet-step-list__label {
32131
+ overflow-wrap: anywhere;
32132
+ }
32133
+
32134
+ /*
32135
+ * WHAT THE STEP ASKED FOR, in the mono face. Each piece between separators is
32136
+ * one inline block, so a line breaks only between pieces (at a space, or
32137
+ * after `/`, `?` or `&`) and a piece wraps inside itself only when it alone
32138
+ * is wider than the line.
32139
+ */
32140
+ .crewlet-step-list__detail {
32141
+ display: block;
32142
+ font-family: var(--font-family-mono);
32143
+ font-size: var(--font-size-2xs);
32144
+ line-height: var(--font-line-height-snug);
32145
+ font-variant-ligatures: none;
32146
+ color: var(--color-text-tertiary);
32147
+ }
32148
+
32149
+ .crewlet-step-list__piece {
32150
+ display: inline-block;
32151
+ max-width: 100%;
32152
+ overflow-wrap: anywhere;
32153
+ }
32154
+
32155
+ .crewlet-step-list__duration {
32156
+ font-family: var(--font-family-mono);
32157
+ font-size: var(--font-size-2xs);
32158
+ line-height: var(--crewlet-step-list-line);
32159
+ font-variant-numeric: tabular-nums;
32160
+ color: var(--color-text-tertiary);
32161
+ white-space: nowrap;
32162
+ }
32163
+
32164
+
30671
32165
  /* Stepper-QEJI5RGX.css */
30672
32166
  /*
30673
32167
  * The stepper: where a sequence has got to (Stepper.tsx).
@@ -31026,6 +32520,111 @@ svg.crewlet-select__chevron {
31026
32520
  }
31027
32521
 
31028
32522
 
32523
+ /* SuggestionRow-OKBGNHSS.css */
32524
+ /*
32525
+ * A suggestion, in the list row's grammar: the medium row height, a spacing
32526
+ * step by a step and a half, the hover tint, and the inset focus ring that a
32527
+ * row inside a clipped card can still show.
32528
+ */
32529
+ .crewlet-suggestion-list {
32530
+ display: flex;
32531
+ flex-direction: column;
32532
+ min-width: 0;
32533
+ margin: 0;
32534
+ padding: 0;
32535
+ list-style: none;
32536
+ }
32537
+
32538
+ .crewlet-suggestion-list--divided {
32539
+ overflow: hidden;
32540
+ border: 1px solid var(--color-border-default);
32541
+ border-radius: var(--radius-lg);
32542
+ background: var(--color-surface-subtle);
32543
+ }
32544
+
32545
+ .crewlet-suggestion-list--divided > .crewlet-suggestion-list__item + .crewlet-suggestion-list__item {
32546
+ border-top: 1px solid var(--color-border-default);
32547
+ }
32548
+
32549
+ .crewlet-suggestion-row {
32550
+ display: flex;
32551
+ align-items: center;
32552
+ gap: var(--spacing-3);
32553
+ width: 100%;
32554
+ min-width: 0;
32555
+ min-height: var(--size-row-md);
32556
+ padding: var(--spacing-2) var(--spacing-3);
32557
+ border: 0;
32558
+ border-radius: var(--radius-xs);
32559
+ background: none;
32560
+ color: var(--color-text-primary);
32561
+ font: inherit;
32562
+ text-align: left;
32563
+ cursor: pointer;
32564
+ transition: background var(--motion-duration-fast) var(--motion-easing-default);
32565
+ }
32566
+
32567
+ .crewlet-suggestion-list--divided .crewlet-suggestion-row {
32568
+ border-radius: 0;
32569
+ }
32570
+
32571
+ .crewlet-suggestion-row:hover {
32572
+ background: var(--color-surface-hover);
32573
+ }
32574
+
32575
+ .crewlet-suggestion-row:focus-visible {
32576
+ outline: 2px solid var(--color-focus);
32577
+ outline-offset: var(--size-focus-ring-inset-offset);
32578
+ }
32579
+
32580
+ .crewlet-suggestion-row:disabled {
32581
+ cursor: not-allowed;
32582
+ color: var(--color-text-tertiary);
32583
+ }
32584
+
32585
+ .crewlet-suggestion-row:disabled:hover {
32586
+ background: none;
32587
+ }
32588
+
32589
+ .crewlet-suggestion-row__icon {
32590
+ display: inline-flex;
32591
+ flex: none;
32592
+ color: var(--color-text-tertiary);
32593
+ }
32594
+
32595
+ .crewlet-suggestion-row__icon .crewlet-glyph {
32596
+ width: var(--font-size-sm);
32597
+ height: var(--font-size-sm);
32598
+ }
32599
+
32600
+ .crewlet-suggestion-row__words {
32601
+ display: flex;
32602
+ flex: 1 1 auto;
32603
+ flex-direction: column;
32604
+ min-width: 0;
32605
+ }
32606
+
32607
+ .crewlet-suggestion-row__detail {
32608
+ font-size: var(--font-size-xs);
32609
+ color: var(--color-text-tertiary);
32610
+ }
32611
+
32612
+ .crewlet-suggestion-row__trail {
32613
+ display: inline-flex;
32614
+ flex: none;
32615
+ align-items: center;
32616
+ gap: var(--spacing-2);
32617
+ margin-inline-start: auto;
32618
+ color: var(--color-text-tertiary);
32619
+ }
32620
+
32621
+ @media (prefers-reduced-motion: reduce) {
32622
+ .crewlet-suggestion-row {
32623
+ transition: none;
32624
+ }
32625
+ }
32626
+
32627
+
31029
32628
  /* Switch-66RAQCRE.css */
31030
32629
  /*
31031
32630
  * Switch: a setting that takes effect as it moves.
@@ -31556,7 +33155,7 @@ b.crewlet-switcher__match {
31556
33155
  }
31557
33156
 
31558
33157
 
31559
- /* Table-TGCS4C3F.css */
33158
+ /* Table-RUYMMWXT.css */
31560
33159
  /*
31561
33160
  * Table: the operator's table, on the elements a table is made of.
31562
33161
  *
@@ -31677,6 +33276,55 @@ b.crewlet-switcher__match {
31677
33276
  * a control.
31678
33277
  */
31679
33278
 
33279
+ /* A column of figures stands against the end, its heading over its numbers. */
33280
+ .crewlet-table__table .crewlet-table__cell--end {
33281
+ text-align: right;
33282
+ font-variant-numeric: tabular-nums;
33283
+ }
33284
+
33285
+ /*
33286
+ * THE TOTAL ROW, fenced from the rows it sums by the same hairline and set at
33287
+ * medium weight. Its first cell heads the row, so it is a th and is reset to
33288
+ * the body's register rather than the header's micro-label.
33289
+ */
33290
+ .crewlet-table__table tfoot th,
33291
+ .crewlet-table__table tfoot td {
33292
+ position: static;
33293
+ height: var(--size-row-md);
33294
+ padding: var(--spacing-2) var(--spacing-3);
33295
+ border-top: 1px solid var(--color-border-default);
33296
+ border-bottom: none;
33297
+ background: none;
33298
+ font-size: inherit;
33299
+ font-weight: var(--font-weight-medium);
33300
+ letter-spacing: normal;
33301
+ text-transform: none;
33302
+ text-align: left;
33303
+ color: var(--color-text-primary);
33304
+ vertical-align: middle;
33305
+ }
33306
+
33307
+ /*
33308
+ * IN A CARD, the card is the frame: no edge, corner or ground of the table's
33309
+ * own, and the outer cells take the card's 16px inset so every row lines up
33310
+ * with the card's title.
33311
+ */
33312
+ .crewlet-table--flush {
33313
+ background: none;
33314
+ border: none;
33315
+ border-radius: 0;
33316
+ }
33317
+
33318
+ .crewlet-table--flush .crewlet-table__table th:first-child,
33319
+ .crewlet-table--flush .crewlet-table__table td:first-child {
33320
+ padding-left: var(--spacing-4);
33321
+ }
33322
+
33323
+ .crewlet-table--flush .crewlet-table__table th:last-child,
33324
+ .crewlet-table--flush .crewlet-table__table td:last-child {
33325
+ padding-right: var(--spacing-4);
33326
+ }
33327
+
31680
33328
  .crewlet-table__empty {
31681
33329
  padding: var(--spacing-7) var(--spacing-3);
31682
33330
  text-align: center;
@@ -34375,7 +36023,7 @@ svg.crewlet-time-window__tick {
34375
36023
  }
34376
36024
 
34377
36025
 
34378
- /* Toaster-C6BQ7L6I.css */
36026
+ /* Toaster-MX7TBMC3.css */
34379
36027
  /*
34380
36028
  * The toast stack, drawn as the first release drew it (24a60c3): a dark strip
34381
36029
  * on the page's deepest ground with the large shadow and the rim light, a
@@ -34392,35 +36040,45 @@ svg.crewlet-time-window__tick {
34392
36040
  * reduced motion gets no wash and still gets the toast taken away.
34393
36041
  */
34394
36042
  .crewlet-toaster {
36043
+ /*
36044
+ * THE HOST'S INSET: room on the stack's own side and edge that something
36045
+ * else occupies, such as a panel beside the page or a phone sheet's foot.
36046
+ * Set by `inset` on the Toaster (or by the host on these two properties)
36047
+ * and added to the window inset below, so the stack stands beside the
36048
+ * panel rather than over it. Zero by default.
36049
+ */
36050
+ --crewlet-toaster-inset-inline: 0px;
36051
+ --crewlet-toaster-inset-block: 0px;
36052
+
34395
36053
  position: fixed;
34396
36054
  z-index: var(--z-index-toast);
34397
36055
  display: flex;
34398
36056
  flex-direction: column;
34399
36057
  gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
34400
- width: min(380px, calc(100vw - 2 * var(--spacing-6)));
36058
+ width: min(380px, calc(100vw - 2 * var(--spacing-6) - var(--crewlet-toaster-inset-inline)));
34401
36059
  /* The stack itself takes no presses, so the screen under it stays live
34402
36060
  while nothing is up; each toast takes them back for its own strip. */
34403
36061
  pointer-events: none;
34404
36062
  }
34405
36063
 
34406
36064
  .crewlet-toaster--bottom-right {
34407
- bottom: var(--spacing-6);
34408
- right: var(--spacing-6);
36065
+ bottom: calc(var(--spacing-6) + var(--crewlet-toaster-inset-block));
36066
+ right: calc(var(--spacing-6) + var(--crewlet-toaster-inset-inline));
34409
36067
  }
34410
36068
 
34411
36069
  .crewlet-toaster--top-right {
34412
- top: var(--spacing-6);
34413
- right: var(--spacing-6);
36070
+ top: calc(var(--spacing-6) + var(--crewlet-toaster-inset-block));
36071
+ right: calc(var(--spacing-6) + var(--crewlet-toaster-inset-inline));
34414
36072
  }
34415
36073
 
34416
36074
  .crewlet-toaster--bottom-left {
34417
- bottom: var(--spacing-6);
34418
- left: var(--spacing-6);
36075
+ bottom: calc(var(--spacing-6) + var(--crewlet-toaster-inset-block));
36076
+ left: calc(var(--spacing-6) + var(--crewlet-toaster-inset-inline));
34419
36077
  }
34420
36078
 
34421
36079
  .crewlet-toaster--top-left {
34422
- top: var(--spacing-6);
34423
- left: var(--spacing-6);
36080
+ top: calc(var(--spacing-6) + var(--crewlet-toaster-inset-block));
36081
+ left: calc(var(--spacing-6) + var(--crewlet-toaster-inset-inline));
34424
36082
  }
34425
36083
 
34426
36084
  .crewlet-toast {
@@ -34658,12 +36316,23 @@ svg.crewlet-time-window__tick {
34658
36316
 
34659
36317
  .crewlet-toaster--bottom-right,
34660
36318
  .crewlet-toaster--bottom-left {
34661
- bottom: var(--spacing-3);
36319
+ bottom: calc(var(--spacing-3) + var(--crewlet-toaster-inset-block));
34662
36320
  }
34663
36321
 
34664
36322
  .crewlet-toaster--top-right,
34665
36323
  .crewlet-toaster--top-left {
34666
- top: var(--spacing-3);
36324
+ top: calc(var(--spacing-3) + var(--crewlet-toaster-inset-block));
36325
+ }
36326
+
36327
+ /* Across the width, the host's inline inset still keeps its own side clear. */
36328
+ .crewlet-toaster--bottom-right,
36329
+ .crewlet-toaster--top-right {
36330
+ right: calc(var(--spacing-3) + var(--crewlet-toaster-inset-inline));
36331
+ }
36332
+
36333
+ .crewlet-toaster--bottom-left,
36334
+ .crewlet-toaster--top-left {
36335
+ left: calc(var(--spacing-3) + var(--crewlet-toaster-inset-inline));
34667
36336
  }
34668
36337
  }
34669
36338