@crewlethq/ui 0.81.1 → 0.82.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 (389) hide show
  1. package/README.md +61 -4
  2. package/dist/Accordion/index.js +3 -3
  3. package/dist/ActionCard/ActionCard.d.ts +49 -0
  4. package/dist/ActionCard/index.d.ts +4 -0
  5. package/dist/ActionCard/index.js +2 -0
  6. package/dist/ActionCard-47WSZ2O5.css +110 -0
  7. package/dist/ActivityLine/ActivityLine.d.ts +27 -0
  8. package/dist/ActivityLine/index.d.ts +4 -0
  9. package/dist/ActivityLine/index.js +4 -0
  10. package/dist/ActivityLine-AMSERTOB.css +74 -0
  11. package/dist/AgentHandoffPanel/index.js +15 -15
  12. package/dist/AppShell/AccountRow.d.ts +14 -1
  13. package/dist/AppShell/AppShell.d.ts +53 -4
  14. package/dist/AppShell/ResizeHandle.d.ts +1 -1
  15. package/dist/AppShell/index.d.ts +1 -1
  16. package/dist/AppShell/index.js +8 -5
  17. package/dist/AppShell/railShape.d.ts +17 -0
  18. package/dist/{AppShell-2IBUS4TH.css → AppShell-F7RID4P4.css} +150 -0
  19. package/dist/ArrangeFrame/index.js +2 -2
  20. package/dist/ArrangeGroup/index.js +2 -2
  21. package/dist/ArrangeList/index.js +6 -6
  22. package/dist/ArtifactBar/index.js +11 -11
  23. package/dist/ArtifactCard/index.js +13 -13
  24. package/dist/ArtifactCover/index.js +3 -3
  25. package/dist/ArtifactKindIllustration/index.js +1 -1
  26. package/dist/ArtifactKinds-3EH4KR3F.css +18 -0
  27. package/dist/ArtifactMakeRow/index.js +1 -1
  28. package/dist/ArtifactNameCell/index.js +1 -1
  29. package/dist/ArtifactPanel/index.js +5 -5
  30. package/dist/AttachmentChip/index.js +2 -2
  31. package/dist/AuthLayout/index.js +5 -4
  32. package/dist/Avatar/Avatar.d.ts +30 -28
  33. package/dist/Avatar/AvatarStack.d.ts +2 -2
  34. package/dist/Avatar/index.d.ts +1 -1
  35. package/dist/Avatar/index.js +2 -2
  36. package/dist/{Avatar-VJSJGFRG.css → Avatar-MNE3WBZO.css} +56 -54
  37. package/dist/AvatarPicker/index.js +12 -12
  38. package/dist/{AvatarStack-7I3P7LCK.css → AvatarStack-KEHD3GWY.css} +16 -4
  39. package/dist/BrandLockup/BrandLockup.d.ts +6 -0
  40. package/dist/BrandLockup/index.js +2 -1
  41. package/dist/BriefCard/BriefCard.d.ts +23 -1
  42. package/dist/BriefCard/index.d.ts +2 -2
  43. package/dist/BriefCard/index.js +7 -7
  44. package/dist/{BriefCard-VKTH3BSW.css → BriefCard-QCL7MVUV.css} +26 -0
  45. package/dist/Canvas/index.js +6 -6
  46. package/dist/CanvasBoard/index.js +9 -9
  47. package/dist/CanvasToolbar/index.js +8 -8
  48. package/dist/Card/index.js +2 -2
  49. package/dist/ChangeList/index.js +5 -5
  50. package/dist/ChangeMark/index.js +4 -4
  51. package/dist/CharacterPicker/index.js +2 -2
  52. package/dist/ChatDay/ChatDay.d.ts +53 -0
  53. package/dist/ChatDay/index.d.ts +5 -0
  54. package/dist/ChatDay/index.js +3 -0
  55. package/dist/ChatDay-E3FF5HWF.css +116 -0
  56. package/dist/ChatDivider/ChatDivider.d.ts +31 -0
  57. package/dist/ChatDivider/index.d.ts +4 -0
  58. package/dist/ChatDivider/index.js +2 -0
  59. package/dist/ChatDivider-7ZNDL2PZ.css +76 -0
  60. package/dist/ChatMessage/ChatMessage.d.ts +111 -0
  61. package/dist/ChatMessage/index.d.ts +4 -0
  62. package/dist/ChatMessage/index.js +5 -0
  63. package/dist/ChatMessage-FH7VRVCH.css +304 -0
  64. package/dist/ChatScale-L4SIHSKL.css +42 -0
  65. package/dist/ChatThread/ChatThread.d.ts +33 -4
  66. package/dist/ChatThread/index.d.ts +1 -1
  67. package/dist/ChatThread/index.js +1 -1
  68. package/dist/{ChatThread-2KO3FZKQ.css → ChatThread-HAECJMP6.css} +17 -0
  69. package/dist/CheckGrid/index.js +6 -6
  70. package/dist/Checkbox/index.js +5 -5
  71. package/dist/ChipField/ChipField.d.ts +82 -0
  72. package/dist/ChipField/index.d.ts +4 -0
  73. package/dist/ChipField/index.js +9 -0
  74. package/dist/ChipField-D4CW6XFA.css +108 -0
  75. package/dist/ColorField/index.js +5 -5
  76. package/dist/Combobox/index.js +7 -7
  77. package/dist/CommandPalette/index.js +11 -11
  78. package/dist/CommentThread/index.js +14 -14
  79. package/dist/CompactNav/CompactNav.d.ts +175 -0
  80. package/dist/CompactNav/index.d.ts +4 -0
  81. package/dist/CompactNav/index.js +8 -0
  82. package/dist/CompactNav-CU2AQXBC.css +322 -0
  83. package/dist/Composer/Composer.d.ts +26 -2
  84. package/dist/Composer/index.d.ts +2 -1
  85. package/dist/Composer/index.js +7 -7
  86. package/dist/{Composer-HQIMTMRC.css → Composer-ZEGHEAFE.css} +71 -0
  87. package/dist/ConfirmField/index.js +5 -5
  88. package/dist/ContrastBadge/index.js +2 -2
  89. package/dist/ContrastHelp/index.js +6 -6
  90. package/dist/Count/Count.d.ts +24 -6
  91. package/dist/Count/index.d.ts +1 -1
  92. package/dist/Count/index.js +1 -1
  93. package/dist/{Count-ZJ6ID4ZU.css → Count-2HXBBYPO.css} +19 -0
  94. package/dist/DataGrid/index.js +8 -8
  95. package/dist/DataTable/index.js +10 -10
  96. package/dist/DataView/index.js +17 -17
  97. package/dist/DatasetSource/index.js +3 -3
  98. package/dist/DateTimePicker/index.js +5 -5
  99. package/dist/DeepWorkCard/index.js +10 -10
  100. package/dist/Disclosure/index.js +3 -3
  101. package/dist/DocTabsEditor/index.js +8 -8
  102. package/dist/Document/index.js +2 -2
  103. package/dist/EditingStatus/index.js +2 -2
  104. package/dist/{Editor-BXOWAV46.js → Editor-7EQWP3RN.js} +8 -8
  105. package/dist/EmojiPicker/EmojiPicker.d.ts +51 -0
  106. package/dist/EmojiPicker/emoji.d.ts +24 -0
  107. package/dist/EmojiPicker/index.d.ts +5 -0
  108. package/dist/EmojiPicker/index.js +13 -0
  109. package/dist/EmojiPicker-FMWYN2WX.css +63 -0
  110. package/dist/EntityChip/index.js +3 -3
  111. package/dist/EntityList/index.js +6 -6
  112. package/dist/FactList/index.js +4 -4
  113. package/dist/FolderTile/index.js +3 -3
  114. package/dist/FollowBanner/index.js +4 -4
  115. package/dist/HuePicker/index.js +8 -8
  116. package/dist/ImageUpload/ImageUpload.d.ts +6 -7
  117. package/dist/ImageUpload/index.js +3 -3
  118. package/dist/{ImageUpload-OWI7CCG7.css → ImageUpload-IFXZROFZ.css} +6 -37
  119. package/dist/InlineEditor/index.js +7 -7
  120. package/dist/Input/index.js +4 -4
  121. package/dist/Kbd/Kbd.d.ts +9 -0
  122. package/dist/Kbd/index.d.ts +1 -1
  123. package/dist/Kbd/index.js +1 -1
  124. package/dist/Layer/index.js +2 -2
  125. package/dist/LinkCard/LinkCard.d.ts +64 -0
  126. package/dist/LinkCard/index.d.ts +5 -0
  127. package/dist/LinkCard/index.js +5 -0
  128. package/dist/LinkCard-5I4MYU6I.css +155 -0
  129. package/dist/LinkInterstitial/index.js +6 -6
  130. package/dist/ListInput/index.js +8 -8
  131. package/dist/Listbox/index.js +3 -3
  132. package/dist/LogoSlot/index.js +3 -3
  133. package/dist/MarkdownEditor/format.d.ts +9 -1
  134. package/dist/MarkdownEditor/index.d.ts +2 -2
  135. package/dist/MarkdownEditor/index.js +9 -9
  136. package/dist/MentionChip/MentionChip.d.ts +25 -0
  137. package/dist/MentionChip/index.d.ts +3 -0
  138. package/dist/MentionChip/index.js +2 -0
  139. package/dist/MentionChip-W7MZZVRZ.css +42 -0
  140. package/dist/MentionMenu/MentionMenu.d.ts +82 -0
  141. package/dist/MentionMenu/index.d.ts +4 -0
  142. package/dist/MentionMenu/index.js +3 -0
  143. package/dist/MentionMenu-4NAQ45S4.css +65 -0
  144. package/dist/Menu/index.js +4 -4
  145. package/dist/MergeConflicts/index.js +8 -8
  146. package/dist/MessageActions/MessageActions.d.ts +58 -0
  147. package/dist/MessageActions/index.d.ts +4 -0
  148. package/dist/MessageActions/index.js +16 -0
  149. package/dist/MessageActions-Q4F5UH3S.css +73 -0
  150. package/dist/Modal/Modal.d.ts +12 -0
  151. package/dist/Modal/index.js +5 -5
  152. package/dist/{Modal-FYQYEI3N.css → Modal-GKUOO7PZ.css} +26 -1
  153. package/dist/OpenInAppCard/index.js +7 -7
  154. package/dist/OrgLabel/index.js +3 -3
  155. package/dist/OrgNode/index.js +4 -4
  156. package/dist/OrgTable/index.js +7 -7
  157. package/dist/PeekRail/index.js +1 -1
  158. package/dist/PeopleRail/index.js +4 -4
  159. package/dist/PersonRow/PersonRow.d.ts +70 -0
  160. package/dist/PersonRow/index.d.ts +3 -0
  161. package/dist/PersonRow/index.js +2 -0
  162. package/dist/PersonRow-V5GTPNVP.css +161 -0
  163. package/dist/Popover/index.js +3 -3
  164. package/dist/PresenceStack/index.js +3 -3
  165. package/dist/{PresenceStack-ZV67BH4V.css → PresenceStack-2DTYRADY.css} +4 -6
  166. package/dist/PresenterView/index.js +5 -5
  167. package/dist/PricingCard/index.js +2 -2
  168. package/dist/Principal/index.js +3 -3
  169. package/dist/PrincipalPicker/index.js +11 -11
  170. package/dist/ProposalCard/index.js +15 -15
  171. package/dist/ReactionBar/ReactionBar.d.ts +84 -0
  172. package/dist/ReactionBar/index.d.ts +4 -0
  173. package/dist/ReactionBar/index.js +15 -0
  174. package/dist/ReactionBar-XXI4V7XG.css +93 -0
  175. package/dist/RecordChip/index.js +4 -4
  176. package/dist/RefusalCard/index.js +6 -6
  177. package/dist/RelatedRow/index.js +3 -3
  178. package/dist/ResultTableCard/index.js +7 -7
  179. package/dist/ReviewList/index.js +2 -2
  180. package/dist/RichEditor/index.js +2 -2
  181. package/dist/RunChip/index.js +5 -5
  182. package/dist/SandboxedFrame/index.js +2 -2
  183. package/dist/SectionFrame/index.js +2 -2
  184. package/dist/SegmentedControl/index.js +7 -7
  185. package/dist/Select/index.js +4 -4
  186. package/dist/SelectionBar/index.js +6 -6
  187. package/dist/SetupWizard/index.js +6 -6
  188. package/dist/ShareDialog/index.js +11 -11
  189. package/dist/SheetColumnEditor/index.js +16 -16
  190. package/dist/SheetGrid/index.js +12 -12
  191. package/dist/Shortcut/index.js +3 -3
  192. package/dist/SidePanel/SidePanel.d.ts +10 -3
  193. package/dist/SidePanel/SidePanelBase.d.ts +3 -1
  194. package/dist/SidePanel/index.js +5 -5
  195. package/dist/{SidePanel-VXKUKLOJ.css → SidePanel-BKWT6Q6Z.css} +36 -0
  196. package/dist/SidebarNav/SidebarNav.d.ts +52 -3
  197. package/dist/SidebarNav/index.js +1 -1
  198. package/dist/{SidebarNav-VTQ3G4AE.css → SidebarNav-E7PZGGA6.css} +132 -7
  199. package/dist/Skeleton/index.js +1 -1
  200. package/dist/{Skeleton-7ZA5ETJM.css → Skeleton-GIXV3KK5.css} +3 -1
  201. package/dist/SlideCompare/index.js +5 -5
  202. package/dist/SlideFilmstrip/index.js +8 -8
  203. package/dist/SlideGrid/index.js +4 -4
  204. package/dist/SlideStage/index.js +3 -3
  205. package/dist/SourceEditor/index.js +2 -2
  206. package/dist/StatusCard/index.js +5 -5
  207. package/dist/Switcher/index.js +12 -12
  208. package/dist/TableCells/index.js +5 -5
  209. package/dist/Tabs/index.js +6 -6
  210. package/dist/Tag/Tag.d.ts +9 -2
  211. package/dist/Tag/index.js +1 -1
  212. package/dist/{Tag-JTJVZM2D.css → Tag-WLDOROB5.css} +24 -0
  213. package/dist/TagsInput/index.js +6 -6
  214. package/dist/ThemeGallery/index.js +5 -5
  215. package/dist/ThemeSwitcher/index.js +8 -8
  216. package/dist/ThinkingIndicator/ThinkingIndicator.d.ts +1 -1
  217. package/dist/ThinkingIndicator/index.js +1 -1
  218. package/dist/{ThinkingIndicator-JVF52N7L.css → ThinkingIndicator-S7ZL2C77.css} +10 -2
  219. package/dist/ThreadSummary/ThreadSummary.d.ts +43 -0
  220. package/dist/ThreadSummary/index.d.ts +4 -0
  221. package/dist/ThreadSummary/index.js +6 -0
  222. package/dist/ThreadSummary-AGR4NDMD.css +90 -0
  223. package/dist/TimeRangePicker/index.js +12 -12
  224. package/dist/TimeWindowPicker/index.js +10 -10
  225. package/dist/Toaster/index.js +2 -2
  226. package/dist/Toolbar/index.js +3 -3
  227. package/dist/Tooltip/Tooltip.d.ts +30 -3
  228. package/dist/Tooltip/index.js +3 -3
  229. package/dist/TreeCanvas/index.js +7 -7
  230. package/dist/TreeGrid/index.js +3 -3
  231. package/dist/ValueField/index.js +9 -9
  232. package/dist/VersionCompare/index.js +9 -9
  233. package/dist/VersionTimeline/index.js +4 -4
  234. package/dist/WidgetFrame/index.js +2 -2
  235. package/dist/{chunk-WCDPFTJZ.js → chunk-25JQNHTC.js} +92 -28
  236. package/dist/{chunk-ZKLEAK7M.js → chunk-2H6YDUR5.js} +7 -7
  237. package/dist/{chunk-7FF6CZW5.js → chunk-2KJCUCVE.js} +36 -8
  238. package/dist/{chunk-6LXS3X7A.js → chunk-2L4WHYMT.js} +1 -1
  239. package/dist/{chunk-6G6WHTC7.js → chunk-2O5CMV76.js} +1 -1
  240. package/dist/chunk-2TOGGCDM.js +50 -0
  241. package/dist/{chunk-7PJFUQMY.js → chunk-2ZSCHQOA.js} +1 -1
  242. package/dist/chunk-3BRXEMYT.js +46 -0
  243. package/dist/{chunk-H22SR76M.js → chunk-3H6OZUZ3.js} +1 -1
  244. package/dist/{chunk-VK45YJLH.js → chunk-3IWZVEXA.js} +2 -2
  245. package/dist/{chunk-I33UIUZD.js → chunk-3QQIGMY3.js} +49 -14
  246. package/dist/{chunk-NUZHC6MM.js → chunk-4ITETIGZ.js} +12 -1
  247. package/dist/{chunk-FQI62PIZ.js → chunk-4RYELYWG.js} +2 -2
  248. package/dist/{chunk-LCZULGMB.js → chunk-57BFL323.js} +2 -2
  249. package/dist/{chunk-73GUXYYE.js → chunk-5AHNW5CP.js} +1 -1
  250. package/dist/{chunk-FFGEJUAP.js → chunk-5ILRWUE7.js} +2 -2
  251. package/dist/{chunk-S5QJZOPL.js → chunk-5K5SZGBI.js} +1 -1
  252. package/dist/{chunk-LM6VYJTV.js → chunk-5YXMKZUA.js} +1 -1
  253. package/dist/{chunk-5XBNJNSO.js → chunk-65RFU7LF.js} +1 -1
  254. package/dist/{chunk-WKKWF277.js → chunk-6IOQWMYJ.js} +2 -2
  255. package/dist/{chunk-7MGXHCVK.js → chunk-6M2N6ETA.js} +1 -1
  256. package/dist/{chunk-OWHETZIU.js → chunk-6SFDL4QH.js} +1 -1
  257. package/dist/{chunk-JD7P2GJP.js → chunk-6YBBQAEM.js} +1 -1
  258. package/dist/{chunk-WK4FQPYW.js → chunk-77VOASOY.js} +5 -5
  259. package/dist/{chunk-UYF2B2TH.js → chunk-7ELFH3RJ.js} +1 -1
  260. package/dist/{chunk-CYYBE2MM.js → chunk-7U6PK242.js} +1 -1
  261. package/dist/{chunk-VG3SIJ3M.js → chunk-AFLS26AC.js} +2 -2
  262. package/dist/{chunk-JQEXAH7G.js → chunk-AMUXSJ2A.js} +2 -2
  263. package/dist/{chunk-4XF7ENQA.js → chunk-AOJ6ZA77.js} +2 -2
  264. package/dist/{chunk-TJIBTHWJ.js → chunk-B3X4DHRB.js} +2 -2
  265. package/dist/{chunk-BFM5G2Z6.js → chunk-BSAU7QRW.js} +1 -1
  266. package/dist/chunk-C4256UXE.js +21 -0
  267. package/dist/{chunk-4MRFLHJC.js → chunk-C46DDVTK.js} +1 -1
  268. package/dist/{chunk-5EFLA6BW.js → chunk-C75WZMXG.js} +2 -2
  269. package/dist/{chunk-YB64PWIN.js → chunk-C7UHDM7Y.js} +1 -1
  270. package/dist/{chunk-5BOFC5OP.js → chunk-CF4M6N6A.js} +20 -4
  271. package/dist/{chunk-ANTAQAR4.js → chunk-CMAZZY2I.js} +7 -1
  272. package/dist/{chunk-MLDTLZAO.js → chunk-D2GT3CR4.js} +3 -3
  273. package/dist/{chunk-57AKYFML.js → chunk-DD7RBNT4.js} +3 -3
  274. package/dist/{chunk-MUFBHVCT.js → chunk-DWQYV5AV.js} +2 -2
  275. package/dist/{chunk-CNEHFH2A.js → chunk-EAHEJNVJ.js} +1 -1
  276. package/dist/chunk-EALRMP7N.js +69 -0
  277. package/dist/{chunk-E35HYQMK.js → chunk-EBVZHVPD.js} +12 -5
  278. package/dist/{chunk-M73MMEZY.js → chunk-ED4A6Q24.js} +1 -1
  279. package/dist/{chunk-6LN64KGG.js → chunk-F7HZYTZT.js} +6 -3
  280. package/dist/{chunk-YQDRJZ5J.js → chunk-FKAJBN6G.js} +8 -8
  281. package/dist/{chunk-RTMNULTL.js → chunk-FLW5U7YS.js} +2 -2
  282. package/dist/{chunk-JMTBK55P.js → chunk-FVZPSTL2.js} +1 -1
  283. package/dist/{chunk-GHQG4VZA.js → chunk-G3CACE5L.js} +3 -3
  284. package/dist/{chunk-SNIPM6K7.js → chunk-G6ZFSUIH.js} +3 -3
  285. package/dist/chunk-GP5TNTZH.js +386 -0
  286. package/dist/{chunk-7KBNFFM3.js → chunk-GVPUCEWH.js} +6 -3
  287. package/dist/{chunk-6R334YT3.js → chunk-GZVAZ3LL.js} +2 -2
  288. package/dist/{chunk-KL6A7JGH.js → chunk-HA2PL7PA.js} +2 -2
  289. package/dist/{chunk-2IIHMJMZ.js → chunk-HCUECVZ3.js} +2 -2
  290. package/dist/{chunk-N2BF272H.js → chunk-HF5L56YQ.js} +1 -1
  291. package/dist/{chunk-Q2T4L6ML.js → chunk-HFOTRZFU.js} +4 -4
  292. package/dist/{chunk-2STOSJT3.js → chunk-HQFOZJQ4.js} +7 -7
  293. package/dist/chunk-HTBTAIH6.js +37 -0
  294. package/dist/{chunk-BRLZXYPA.js → chunk-I4IUX3JF.js} +1 -1
  295. package/dist/{chunk-BXCL6P5Z.js → chunk-I4PBFJGX.js} +1 -1
  296. package/dist/{chunk-ADGNISEI.js → chunk-IAP7APOX.js} +5 -5
  297. package/dist/{chunk-BT3GB7HC.js → chunk-IRONPJB4.js} +3 -3
  298. package/dist/chunk-ISQANI6Q.js +9 -0
  299. package/dist/chunk-IUBOLGHG.js +140 -0
  300. package/dist/{chunk-O222F2IX.js → chunk-IUWP2LSE.js} +6 -6
  301. package/dist/{chunk-3JXX5S3Z.js → chunk-IYI6HWKN.js} +3 -3
  302. package/dist/{chunk-R5OATXWU.js → chunk-JHQGNFN3.js} +36 -13
  303. package/dist/{chunk-CSXJIIO4.js → chunk-JV6JM6W6.js} +1 -1
  304. package/dist/{chunk-ZQEJSEPS.js → chunk-K6Y6CDEZ.js} +2 -2
  305. package/dist/chunk-K774LUN3.js +20 -0
  306. package/dist/{chunk-LOWQK2PB.js → chunk-KJR5X4II.js} +4 -4
  307. package/dist/{chunk-45M73G5A.js → chunk-KLAVEJIO.js} +4 -4
  308. package/dist/{chunk-53J2YNQA.js → chunk-L5VU3LZT.js} +1 -1
  309. package/dist/{chunk-VERJCAJ4.js → chunk-LBGKLYBY.js} +1 -1
  310. package/dist/{chunk-PRN5IP2R.js → chunk-LMEMH6DO.js} +1 -1
  311. package/dist/{chunk-I22MUEG7.js → chunk-LNQSNXGJ.js} +1 -1
  312. package/dist/chunk-LQRN2XZK.js +87 -0
  313. package/dist/{chunk-HEA6TERQ.js → chunk-LSOR77RZ.js} +1 -1
  314. package/dist/{chunk-222VILSP.js → chunk-LVJGN5II.js} +1 -1
  315. package/dist/{chunk-AYHIF6DH.js → chunk-LZNPL266.js} +1 -1
  316. package/dist/{chunk-R45VM5EX.js → chunk-MMV7NEAC.js} +1 -1
  317. package/dist/chunk-MPYRC3GO.js +244 -0
  318. package/dist/{chunk-37U3Z65B.js → chunk-MVMVMHYI.js} +1 -1
  319. package/dist/{chunk-MP7DGKB6.js → chunk-N2T7Y5KR.js} +2 -2
  320. package/dist/{chunk-NKBKQEKS.js → chunk-NFXCJGHG.js} +1 -1
  321. package/dist/{chunk-OZAZHM55.js → chunk-NKBKHOMU.js} +1 -1
  322. package/dist/{chunk-MGQKF7GK.js → chunk-NN475NAP.js} +1 -1
  323. package/dist/{chunk-6EWNMSS4.js → chunk-NNZRTR5M.js} +2 -2
  324. package/dist/{chunk-JT7WRPZ6.js → chunk-NTRKC2JV.js} +1 -1
  325. package/dist/{chunk-63GBSOLU.js → chunk-NXBCAXP5.js} +2 -2
  326. package/dist/{chunk-NR4CPM4T.js → chunk-NXFTCPF6.js} +1 -1
  327. package/dist/chunk-O3MYBNRO.js +80 -0
  328. package/dist/{chunk-RMEBFYL7.js → chunk-O6EV6GKI.js} +1 -1
  329. package/dist/{chunk-YL7AR6PR.js → chunk-O7KG4CXB.js} +3 -3
  330. package/dist/{chunk-FB3TCNQP.js → chunk-O7N6W52M.js} +3 -3
  331. package/dist/{chunk-2FMBZCFR.js → chunk-OAHRMR4U.js} +1 -1
  332. package/dist/chunk-ONHYFU7D.js +25 -0
  333. package/dist/{chunk-Z2MZTI3H.js → chunk-ONNXUS5Y.js} +1 -1
  334. package/dist/{chunk-T24HBEU6.js → chunk-OOOVL77Y.js} +1 -1
  335. package/dist/{chunk-CZQ7UITX.js → chunk-P6F3PE4V.js} +3 -3
  336. package/dist/{chunk-BLGBD2D2.js → chunk-P7HMY3BQ.js} +4 -4
  337. package/dist/{chunk-TPIMOGOZ.js → chunk-PEBQMX5X.js} +1 -1
  338. package/dist/{chunk-4TMBAOXK.js → chunk-PW57R4BN.js} +1 -1
  339. package/dist/chunk-PX5BOALQ.js +13 -0
  340. package/dist/{chunk-HQOEAUDJ.js → chunk-PXLS6JKL.js} +2 -2
  341. package/dist/{chunk-CFTBESST.js → chunk-Q6TCUSQA.js} +2 -2
  342. package/dist/{chunk-ZWXHTXZO.js → chunk-QGEDXYLB.js} +2 -2
  343. package/dist/{chunk-WTXCK46H.js → chunk-R2QBQ6NO.js} +1 -1
  344. package/dist/{chunk-OBPINJNO.js → chunk-SEKO6P3Y.js} +3 -3
  345. package/dist/{chunk-CLJGFOTV.js → chunk-SKGOKLJD.js} +31 -18
  346. package/dist/{chunk-KHJIEPZV.js → chunk-SM4P2SHB.js} +2 -2
  347. package/dist/{chunk-B2YSFWUG.js → chunk-SYVQXMLO.js} +9 -9
  348. package/dist/{chunk-UY3FWQWG.js → chunk-T4IEESXN.js} +128 -12
  349. package/dist/{chunk-TPCBPGSB.js → chunk-T7WESRZF.js} +3 -3
  350. package/dist/chunk-TDFLCUBE.js +6 -0
  351. package/dist/{chunk-Z6JKZI4E.js → chunk-TGCGLKD4.js} +1 -1
  352. package/dist/chunk-TRXTO3WC.js +114 -0
  353. package/dist/{chunk-H5XTJ7GJ.js → chunk-TUEM2XIW.js} +1 -1
  354. package/dist/{chunk-4AUTALJA.js → chunk-U2IQNDDR.js} +1 -1
  355. package/dist/{chunk-IVTQWOXV.js → chunk-ULYHDP7U.js} +1 -1
  356. package/dist/{chunk-DGSK4LLS.js → chunk-V6WDJUYK.js} +1 -1
  357. package/dist/{chunk-5CEQ3HLH.js → chunk-VGOWSOUA.js} +6 -6
  358. package/dist/{chunk-TKUAGWNR.js → chunk-WT3B76MG.js} +1 -1
  359. package/dist/{chunk-D7G2QGET.js → chunk-X3US25XJ.js} +1 -1
  360. package/dist/{chunk-GPFYITOF.js → chunk-X7VZQKIW.js} +1 -1
  361. package/dist/{chunk-L4HHWG4V.js → chunk-XA2QKGBJ.js} +3 -3
  362. package/dist/{chunk-HPI5J6AR.js → chunk-XGLMPPDW.js} +2 -2
  363. package/dist/{chunk-DV5L2GRY.js → chunk-XJMES7AE.js} +1 -1
  364. package/dist/{chunk-5NJMSYDZ.js → chunk-XNC3M4IN.js} +1 -1
  365. package/dist/{chunk-C667GCU7.js → chunk-XXDB6KPV.js} +6 -3
  366. package/dist/{chunk-EAIOXW2W.js → chunk-XY4O2XMR.js} +8 -14
  367. package/dist/{chunk-KTIQSSME.js → chunk-XZY6S3UC.js} +6 -3
  368. package/dist/{chunk-7KHM2FZH.js → chunk-YGRTX67J.js} +1 -1
  369. package/dist/{chunk-RIAPCEB5.js → chunk-YM77TZ7Q.js} +5 -5
  370. package/dist/{chunk-OQG4P5KU.js → chunk-YOJAGKTS.js} +2 -2
  371. package/dist/chunk-YP2FS6SH.js +54 -0
  372. package/dist/{chunk-LMQG3VPG.js → chunk-YQ7Q52XU.js} +1 -1
  373. package/dist/{chunk-G4CGDUCP.js → chunk-YRNNUCQP.js} +1 -1
  374. package/dist/{chunk-NHLNHH4J.js → chunk-ZB3E2Z4Y.js} +1 -1
  375. package/dist/{chunk-IL3XLDW7.js → chunk-ZDWAIVWL.js} +1 -1
  376. package/dist/{chunk-2PIH6JHJ.js → chunk-ZXTDWTXS.js} +1 -1
  377. package/dist/generated/index.d.ts +15 -0
  378. package/dist/generated/index.js +181 -164
  379. package/dist/index.js +181 -164
  380. package/dist/styles.css +2566 -138
  381. package/dist/utils/focusModality.d.ts +14 -0
  382. package/dist/utils/heldHint.d.ts +6 -0
  383. package/dist/utils/index.d.ts +1 -1
  384. package/dist/utils/index.js +1 -1
  385. package/package.json +3 -3
  386. package/dist/ArtifactKinds-O3CALPVX.css +0 -16
  387. package/dist/{chunk-PLNJEDGI.js → chunk-I4IO56EY.js} +1 -1
  388. package/dist/{chunk-CDFQ7MQK.js → chunk-KLWWNV25.js} +0 -0
  389. package/dist/{chunk-624X3RVA.js → chunk-O55JQ7BE.js} +1 -1
package/dist/styles.css CHANGED
@@ -109,6 +109,196 @@
109
109
  }
110
110
 
111
111
 
112
+ /* ActionCard-47WSZ2O5.css */
113
+ /*
114
+ * ActionCard: a first step offered as a picture, on an artifact kind's
115
+ * colour ground. The ground is the kind's own Ground steps (ArtifactKinds.css)
116
+ * laid over the card rung, which the palette suite holds to 4.5:1 for the
117
+ * primary text in every palette and both modes, with the kind's glow behind
118
+ * the drawing.
119
+ */
120
+
121
+ /*
122
+ * ONE ROW THAT SCROLLS SIDEWAYS when it runs out of width, so a phone shows
123
+ * two cards and part of the third (the part says there is more) instead of a
124
+ * tall stack. The block padding keeps the focus ring and the hover shadow
125
+ * inside the scroller's clip; the negative margin gives that space back to
126
+ * the layout. A host that runs the row to its container's edges sets the
127
+ * inline padding and `scroll-padding-inline` to its own inset.
128
+ */
129
+ .crewlet-action-cards {
130
+ display: flex;
131
+ gap: var(--spacing-2);
132
+ overflow-x: auto;
133
+ margin-block: calc(var(--spacing-1) * -1) calc(var(--spacing-2) * -1);
134
+ padding-block: var(--spacing-1) var(--spacing-2);
135
+ scroll-snap-type: x mandatory;
136
+ overscroll-behavior-x: contain;
137
+ scrollbar-width: none;
138
+ }
139
+
140
+ .crewlet-action-cards::-webkit-scrollbar {
141
+ display: none;
142
+ }
143
+
144
+ .crewlet-action-card {
145
+ --crewlet-action-card-ground: var(--crewlet-kind-ground);
146
+ position: relative;
147
+ display: flex;
148
+ flex: none;
149
+ flex-direction: column;
150
+ justify-content: space-between;
151
+ width: 148px;
152
+ height: 172px;
153
+ box-sizing: border-box;
154
+ overflow: hidden;
155
+ padding: var(--spacing-3) var(--spacing-3) 0;
156
+ /* The kind's hue itself is the edge: 3:1 or more on the sheet in every
157
+ palette and mode, where the kind's Line step measured 2.5:1. */
158
+ border: 1px solid var(--crewlet-kind-hue);
159
+ border-radius: var(--radius-lg);
160
+ background-color: var(--color-surface-subtle);
161
+ background-image:
162
+ radial-gradient(110% 64% at 50% 100%, var(--crewlet-kind-glow) 0%, transparent 72%),
163
+ linear-gradient(180deg, var(--crewlet-action-card-ground) 0%, var(--crewlet-kind-ground-end) 100%);
164
+ color: var(--color-text-primary);
165
+ font: inherit;
166
+ text-align: left;
167
+ cursor: pointer;
168
+ scroll-snap-align: start;
169
+ transition: box-shadow var(--motion-duration-fast) var(--motion-easing-default);
170
+ }
171
+
172
+ /* A QUIET HOVER: the ground deepens a step and a small shadow lifts the
173
+ card off the page. Nothing moves. */
174
+ .crewlet-action-card:hover {
175
+ --crewlet-action-card-ground: var(--crewlet-kind-ground-strong);
176
+ box-shadow: var(--shadow-sm);
177
+ }
178
+
179
+ /* The card draws its own edge, so the ring is drawn over it. */
180
+ .crewlet-action-card:focus-visible {
181
+ outline: 2px solid var(--color-focus);
182
+ outline-offset: var(--size-focus-ring-inset-offset);
183
+ }
184
+
185
+ /* The title at the medium weight, as every emphasis in a conversation is,
186
+ two lines at most at its width, balanced so neither line is one word. */
187
+ .crewlet-action-card__title {
188
+ max-width: 14ch;
189
+ font-size: var(--font-size-sm);
190
+ font-weight: var(--font-weight-medium);
191
+ line-height: var(--font-line-height-snug);
192
+ text-wrap: balance;
193
+ }
194
+
195
+ /* The drawing stands on the card's foot, still. */
196
+ .crewlet-action-card__art {
197
+ display: flex;
198
+ align-items: flex-end;
199
+ justify-content: center;
200
+ height: 100px;
201
+ margin: 0 calc(var(--spacing-3) * -1);
202
+ }
203
+
204
+ .crewlet-action-card__art .crewlet-kind-illustration {
205
+ width: 112px;
206
+ max-height: 96px;
207
+ margin-bottom: calc(var(--spacing-2) * -1);
208
+ filter: drop-shadow(0 6px 12px var(--crewlet-kind-line));
209
+ }
210
+
211
+ /* FORCED COLORS drops the ground; the hue's border stays as the card's edge. */
212
+ @media (forced-colors: active) {
213
+ .crewlet-action-card {
214
+ border-color: CanvasText;
215
+ }
216
+ }
217
+
218
+ @media (prefers-reduced-motion: reduce) {
219
+ .crewlet-action-card {
220
+ transition: none;
221
+ }
222
+ }
223
+
224
+
225
+ /* ActivityLine-AMSERTOB.css */
226
+ /*
227
+ * Who is typing and which agent is working, under a composer, in the meta
228
+ * step and the tertiary ink.
229
+ */
230
+
231
+ .crewlet-activity-line {
232
+ display: flex;
233
+ flex-wrap: wrap;
234
+ align-items: center;
235
+ gap: var(--spacing-1) var(--spacing-4);
236
+ min-height: 20px;
237
+ min-width: 0;
238
+ color: var(--color-text-tertiary);
239
+ font-size: var(--crewlet-chat-meta);
240
+ }
241
+
242
+ /* No piece is wider than the line: a long working status truncates. */
243
+ .crewlet-activity-line > * {
244
+ max-width: 100%;
245
+ }
246
+
247
+ /* The working line in the line's own step, over the indicator's. */
248
+ .crewlet-activity-line .crewlet-activity-line__working {
249
+ font-size: var(--crewlet-chat-meta);
250
+ }
251
+
252
+ .crewlet-activity-line__typing {
253
+ display: inline-flex;
254
+ align-items: center;
255
+ gap: var(--spacing-2);
256
+ }
257
+
258
+ .crewlet-activity-line__dots {
259
+ display: inline-flex;
260
+ gap: 2px;
261
+ }
262
+
263
+ .crewlet-activity-line__dots > i {
264
+ width: 4px;
265
+ height: 4px;
266
+ border-radius: var(--radius-circle);
267
+ background: currentColor;
268
+ animation: crewlet-activity-line-typing calc(var(--motion-duration-slow) * 4) var(--motion-easing-in-out) infinite;
269
+ }
270
+
271
+ .crewlet-activity-line__dots > i:nth-child(2) {
272
+ animation-delay: var(--motion-duration-base);
273
+ }
274
+
275
+ .crewlet-activity-line__dots > i:nth-child(3) {
276
+ animation-delay: var(--motion-duration-slow);
277
+ }
278
+
279
+ @keyframes crewlet-activity-line-typing {
280
+ 0%,
281
+ 60%,
282
+ 100% {
283
+ opacity: 0.3;
284
+ transform: none;
285
+ }
286
+
287
+ 30% {
288
+ opacity: 1;
289
+ transform: translateY(-2px);
290
+ }
291
+ }
292
+
293
+ /* Under reduced motion the dots hold still at full strength: the words say
294
+ who is typing. */
295
+ @media (prefers-reduced-motion: reduce) {
296
+ .crewlet-activity-line__dots > i {
297
+ animation: none;
298
+ }
299
+ }
300
+
301
+
112
302
  /* AddPill-FPM5RUKI.css */
113
303
  /*
114
304
  * The control that adds a child (AddPill.tsx).
@@ -754,7 +944,7 @@
754
944
  }
755
945
 
756
946
 
757
- /* AppShell-2IBUS4TH.css */
947
+ /* AppShell-F7RID4P4.css */
758
948
  /*
759
949
  * The application frame: a rail on the FRAME, and the screen on a SHEET that
760
950
  * floats beside it.
@@ -890,6 +1080,10 @@
890
1080
  * run the height of the window parallel to it, eight pixels off.
891
1081
  */
892
1082
  .crewlet-app-shell__rail {
1083
+ /* The fold control's containing block. Re-declared as `fixed` by the
1084
+ narrow block below, which comes later at the same weight, so the drawer
1085
+ keeps its layer. */
1086
+ position: relative;
893
1087
  display: flex;
894
1088
  flex-direction: column;
895
1089
  min-height: 0;
@@ -1475,6 +1669,24 @@
1475
1669
  height: 100%;
1476
1670
  }
1477
1671
 
1672
+ /*
1673
+ * A FLUSH SCREEN draws its own frame to the sheet's edges: the column gives up
1674
+ * its pad, its measure and its gap, and the scroller reserves no gutter, since
1675
+ * nothing in it scrolls and a strip at its end would cut the screen's own
1676
+ * edge. The column is the containing block for a `LayerHost` the screen
1677
+ * keeps, so its layers fill the screen rather than the window.
1678
+ */
1679
+ .crewlet-app-shell--fill-flush .crewlet-app-shell__main {
1680
+ scrollbar-gutter: auto;
1681
+ }
1682
+
1683
+ .crewlet-app-shell--fill-flush .crewlet-app-shell__content {
1684
+ position: relative;
1685
+ gap: 0;
1686
+ max-width: none;
1687
+ padding: 0;
1688
+ }
1689
+
1478
1690
  /* Hidden by default, revealed by the breakpoint below: the wide layout has the
1479
1691
  rail on screen already, so the control that opens it has nothing to do. */
1480
1692
  .crewlet-app-shell__toggle {
@@ -1624,6 +1836,107 @@
1624
1836
  animation: crewlet-app-shell-aside-slide var(--motion-duration-slow) var(--motion-easing-emphasized);
1625
1837
  }
1626
1838
 
1839
+ /*
1840
+ * THE COMPACT RAIL: the same track, narrowed to the compact column. One
1841
+ * variable is the rail's width for the grid, the aside's cap and the drawer
1842
+ * alike, so folding the rail is this one declaration. The shell writes the
1843
+ * attribute only where the layout is wide: the drawer under the step is
1844
+ * always the full list.
1845
+ */
1846
+ .crewlet-app-shell[data-rail='compact'] {
1847
+ --crewlet-app-shell-rail: var(--size-shell-rail-compact);
1848
+ }
1849
+
1850
+ /*
1851
+ * THE FOLD CONTROL stands over the compact column's centre, in the row under
1852
+ * the head, in both shapes, so it never moves under the pointer that pressed
1853
+ * it. Quiet until the rail is pointed at: the tertiary ink, which holds 3:1
1854
+ * on the frame, then the secondary, and the ghost's own primary under the
1855
+ * pointer.
1856
+ */
1857
+ .crewlet-app-shell__fold {
1858
+ position: absolute;
1859
+ top: calc(var(--size-shell-inset) + var(--crewlet-app-shell-topbar));
1860
+ left: calc((var(--size-shell-rail-compact) - var(--size-control-sm)) / 2);
1861
+ z-index: 1;
1862
+ display: inline-flex;
1863
+ }
1864
+
1865
+ .crewlet-app-shell__fold > .crewlet-icon-btn {
1866
+ color: var(--color-text-tertiary);
1867
+ }
1868
+
1869
+ .crewlet-app-shell__rail:hover > .crewlet-app-shell__fold > .crewlet-icon-btn:not(:hover) {
1870
+ color: var(--color-text-secondary);
1871
+ }
1872
+
1873
+ /*
1874
+ * THE MARK STANDS WHERE THE COMPACT RAIL'S DOES, in both shapes: centred over
1875
+ * the compact column, in the head. Full, the name follows it; compact, the
1876
+ * name is not drawn (the link keeps it as its name and title).
1877
+ */
1878
+ .crewlet-app-shell--foldable .crewlet-app-shell__rail-head > .crewlet-brand,
1879
+ .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-head > .crewlet-brand {
1880
+ padding-left: calc((var(--size-shell-rail-compact) - var(--crewlet-brand-mark)) / 2);
1881
+ }
1882
+
1883
+ .crewlet-app-shell[data-rail='compact'] .crewlet-brand__name,
1884
+ .crewlet-app-shell[data-rail='compact'] .crewlet-brand__context {
1885
+ display: none;
1886
+ }
1887
+
1888
+ /*
1889
+ * FULL, THE FIELD STARTS AFTER THE FOLD CONTROL, a step off it, on the row
1890
+ * the control stands in. The field holds its place at the top of the rail's
1891
+ * middle while the rows scroll under it, on the frame's own ground, so the
1892
+ * control beside it is always beside it.
1893
+ */
1894
+ /* The middle is a stacking context of its own, so the field pinned in it
1895
+ stands over the rows scrolling under it and the whole middle stands under
1896
+ the fold control, which is painted a step above the rail. */
1897
+ .crewlet-app-shell--foldable .crewlet-app-shell__rail-body {
1898
+ isolation: isolate;
1899
+ }
1900
+
1901
+ .crewlet-app-shell--foldable[data-rail='full'] .crewlet-app-shell__rail-search {
1902
+ position: sticky;
1903
+ top: 0;
1904
+ z-index: 1;
1905
+ padding-left: calc((var(--size-shell-rail-compact) + var(--size-control-sm)) / 2 + var(--spacing-2));
1906
+ background: var(--color-surface-frame);
1907
+ }
1908
+
1909
+ /* COMPACT, THE FOLD CONTROL HAS A ROW OF ITS OWN under the mark, which the
1910
+ head leaves room for, and the column of tiles starts under it. */
1911
+ .crewlet-app-shell--foldable[data-rail='compact'] .crewlet-app-shell__rail-head {
1912
+ margin-bottom: var(--size-control-sm);
1913
+ }
1914
+
1915
+ .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-body {
1916
+ padding: var(--spacing-1) 0;
1917
+ scrollbar-width: thin;
1918
+ }
1919
+
1920
+ /*
1921
+ * The compact foot: what the full foot holds, centred in the column, a step
1922
+ * apart: the status's dot, a Settings tile, the reader's face.
1923
+ */
1924
+ .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-foot {
1925
+ align-items: center;
1926
+ gap: var(--spacing-2);
1927
+ padding: var(--spacing-1) 0 var(--spacing-3);
1928
+ }
1929
+
1930
+ .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-foot > .crewlet-compact-nav {
1931
+ align-self: stretch;
1932
+ }
1933
+
1934
+ .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-foot > .crewlet-app-shell__rail-status {
1935
+ justify-content: center;
1936
+ min-width: 0;
1937
+ margin: 0;
1938
+ }
1939
+
1627
1940
  @media (width < 1024px) {
1628
1941
  .crewlet-app-shell {
1629
1942
  --crewlet-app-shell-beside: 0px;
@@ -1933,6 +2246,33 @@ button.crewlet-account-row__who:focus-visible {
1933
2246
  gap: var(--spacing-1);
1934
2247
  }
1935
2248
 
2249
+ /*
2250
+ * THE COMPACT ACCOUNT: the reader's face alone, centred in the compact rail's
2251
+ * foot, the face's own corner carrying the lift, the hover and the ring. It
2252
+ * keeps the row's link and menu rules above (hover, current, ring), with no
2253
+ * pad of its own, so the box is the face.
2254
+ */
2255
+ .crewlet-account-row--compact {
2256
+ justify-content: center;
2257
+ padding: 0;
2258
+ }
2259
+
2260
+ .crewlet-account-row__who--compact,
2261
+ .crewlet-app-shell__rail-foot .crewlet-account-row__who--compact {
2262
+ flex: none;
2263
+ width: auto;
2264
+ min-height: 0;
2265
+ padding: calc(var(--spacing-1) / 2);
2266
+ border-radius: var(--radius-md);
2267
+ }
2268
+
2269
+ /* The ring stands off the face, outside it: drawn inside, it would cover the
2270
+ face's own edge and status. */
2271
+ .crewlet-account-row__who.crewlet-account-row__who--compact:focus-visible {
2272
+ outline: 2px solid var(--color-focus);
2273
+ outline-offset: 2px;
2274
+ }
2275
+
1936
2276
  @media (prefers-reduced-motion: reduce) {
1937
2277
  .crewlet-account-row__who {
1938
2278
  transition: none;
@@ -4004,23 +4344,25 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
4004
4344
  }
4005
4345
 
4006
4346
 
4007
- /* ArtifactKinds-O3CALPVX.css */
4347
+ /* ArtifactKinds-3EH4KR3F.css */
4008
4348
  /*
4009
4349
  * A kind's colours, set once per kind on `--crewlet-kind-*` by its class
4010
- * (`crewlet-kind--<kind>`): the hue, its Fill and Line steps and the ink a
4011
- * glyph is drawn in. Every surface that tints by kind reads these, so a kind
4012
- * glyph in a bar, a card's badge and a Make row's tile repaint together with
4350
+ * (`crewlet-kind--<kind>`): the hue, its Fill and Line steps, the ink a
4351
+ * glyph is drawn in, and the Ground steps a card drawn ON the kind's colour
4352
+ * reads (its ground, the ground under the pointer, the ground at its foot
4353
+ * and the glow behind its drawing; ActionCard). Every surface that tints by
4354
+ * kind reads these, so a kind glyph in a bar, a card's badge and a Make row's tile repaint together with
4013
4355
  * the theme, and no surface spells a kind's colour of its own. A sheet of
4014
4356
  * its own, imported by each surface that tints, because the glyph's module
4015
4357
  * carries no stylesheet (a frame that draws one glyph takes nothing else).
4016
4358
  */
4017
- .crewlet-kind--doc { --crewlet-kind-hue: var(--color-artifact-kind-doc); --crewlet-kind-fill: var(--color-artifact-kind-doc-fill); --crewlet-kind-line: var(--color-artifact-kind-doc-line); --crewlet-kind-ink: var(--color-artifact-kind-doc-ink); }
4018
- .crewlet-kind--slides { --crewlet-kind-hue: var(--color-artifact-kind-slides); --crewlet-kind-fill: var(--color-artifact-kind-slides-fill); --crewlet-kind-line: var(--color-artifact-kind-slides-line); --crewlet-kind-ink: var(--color-artifact-kind-slides-ink); }
4019
- .crewlet-kind--design { --crewlet-kind-hue: var(--color-artifact-kind-design); --crewlet-kind-fill: var(--color-artifact-kind-design-fill); --crewlet-kind-line: var(--color-artifact-kind-design-line); --crewlet-kind-ink: var(--color-artifact-kind-design-ink); }
4020
- .crewlet-kind--dashboard { --crewlet-kind-hue: var(--color-artifact-kind-dashboard); --crewlet-kind-fill: var(--color-artifact-kind-dashboard-fill); --crewlet-kind-line: var(--color-artifact-kind-dashboard-line); --crewlet-kind-ink: var(--color-artifact-kind-dashboard-ink); }
4021
- .crewlet-kind--html { --crewlet-kind-hue: var(--color-artifact-kind-html); --crewlet-kind-fill: var(--color-artifact-kind-html-fill); --crewlet-kind-line: var(--color-artifact-kind-html-line); --crewlet-kind-ink: var(--color-artifact-kind-html-ink); }
4022
- .crewlet-kind--brand { --crewlet-kind-hue: var(--color-artifact-kind-brand); --crewlet-kind-fill: var(--color-artifact-kind-brand-fill); --crewlet-kind-line: var(--color-artifact-kind-brand-line); --crewlet-kind-ink: var(--color-artifact-kind-brand-ink); }
4023
- .crewlet-kind--sheet { --crewlet-kind-hue: var(--color-artifact-kind-sheet); --crewlet-kind-fill: var(--color-artifact-kind-sheet-fill); --crewlet-kind-line: var(--color-artifact-kind-sheet-line); --crewlet-kind-ink: var(--color-artifact-kind-sheet-ink); }
4359
+ .crewlet-kind--doc { --crewlet-kind-hue: var(--color-artifact-kind-doc); --crewlet-kind-fill: var(--color-artifact-kind-doc-fill); --crewlet-kind-line: var(--color-artifact-kind-doc-line); --crewlet-kind-ink: var(--color-artifact-kind-doc-ink); --crewlet-kind-ground: var(--color-artifact-kind-doc-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-doc-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-doc-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-doc-glow); }
4360
+ .crewlet-kind--slides { --crewlet-kind-hue: var(--color-artifact-kind-slides); --crewlet-kind-fill: var(--color-artifact-kind-slides-fill); --crewlet-kind-line: var(--color-artifact-kind-slides-line); --crewlet-kind-ink: var(--color-artifact-kind-slides-ink); --crewlet-kind-ground: var(--color-artifact-kind-slides-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-slides-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-slides-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-slides-glow); }
4361
+ .crewlet-kind--design { --crewlet-kind-hue: var(--color-artifact-kind-design); --crewlet-kind-fill: var(--color-artifact-kind-design-fill); --crewlet-kind-line: var(--color-artifact-kind-design-line); --crewlet-kind-ink: var(--color-artifact-kind-design-ink); --crewlet-kind-ground: var(--color-artifact-kind-design-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-design-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-design-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-design-glow); }
4362
+ .crewlet-kind--dashboard { --crewlet-kind-hue: var(--color-artifact-kind-dashboard); --crewlet-kind-fill: var(--color-artifact-kind-dashboard-fill); --crewlet-kind-line: var(--color-artifact-kind-dashboard-line); --crewlet-kind-ink: var(--color-artifact-kind-dashboard-ink); --crewlet-kind-ground: var(--color-artifact-kind-dashboard-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-dashboard-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-dashboard-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-dashboard-glow); }
4363
+ .crewlet-kind--html { --crewlet-kind-hue: var(--color-artifact-kind-html); --crewlet-kind-fill: var(--color-artifact-kind-html-fill); --crewlet-kind-line: var(--color-artifact-kind-html-line); --crewlet-kind-ink: var(--color-artifact-kind-html-ink); --crewlet-kind-ground: var(--color-artifact-kind-html-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-html-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-html-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-html-glow); }
4364
+ .crewlet-kind--brand { --crewlet-kind-hue: var(--color-artifact-kind-brand); --crewlet-kind-fill: var(--color-artifact-kind-brand-fill); --crewlet-kind-line: var(--color-artifact-kind-brand-line); --crewlet-kind-ink: var(--color-artifact-kind-brand-ink); --crewlet-kind-ground: var(--color-artifact-kind-brand-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-brand-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-brand-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-brand-glow); }
4365
+ .crewlet-kind--sheet { --crewlet-kind-hue: var(--color-artifact-kind-sheet); --crewlet-kind-fill: var(--color-artifact-kind-sheet-fill); --crewlet-kind-line: var(--color-artifact-kind-sheet-line); --crewlet-kind-ink: var(--color-artifact-kind-sheet-ink); --crewlet-kind-ground: var(--color-artifact-kind-sheet-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-sheet-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-sheet-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-sheet-glow); }
4024
4366
 
4025
4367
 
4026
4368
  /* ArtifactMakeRow-6UX2LTF7.css */
@@ -4560,7 +4902,7 @@ a.crewlet-make-row__item:active {
4560
4902
  }
4561
4903
 
4562
4904
 
4563
- /* Avatar-VJSJGFRG.css */
4905
+ /* Avatar-MNE3WBZO.css */
4564
4906
  /*
4565
4907
  * The identity badge.
4566
4908
  *
@@ -4569,9 +4911,10 @@ a.crewlet-make-row__item:active {
4569
4911
  * same eight families it also spent on phases and event categories, so one
4570
4912
  * amber meant "the execute phase", "the decision category" and "the Analyst"
4571
4913
  * at once. A hash of a name carries no information: rename the seat and its
4572
- * colour changes, which is the proof it never meant anything. Identity is the
4573
- * OUTLINE (a squircle for an agent, a circle for a person), the monogram and
4574
- * the name, and for an agent an operator gave one, its character and its hue.
4914
+ * colour changes, which is the proof it never meant anything. Identity is
4915
+ * what the face holds (a monogram set in the kind's face, a picture, or for an
4916
+ * agent an operator gave one, its character and its hue) and the name beside
4917
+ * it. Every face is ONE SHAPE, people and agents alike (see "the shape").
4575
4918
  *
4576
4919
  * A STATE IS A CORNER BADGE, NEVER A LINE ROUND THE PLATE. A ring in a state's
4577
4920
  * hue round a plate in the agent's own hue put two colours on a 32px mark and
@@ -4711,46 +5054,40 @@ a.crewlet-make-row__item:active {
4711
5054
  font-size: var(--font-size-sm);
4712
5055
  }
4713
5056
 
4714
- /* ── kinds ─────────────────────────────────────────────────────────────── */
5057
+ /* ── the shape ────────────────────────────────────────────────────────── */
4715
5058
 
4716
5059
  /*
4717
- * AN AGENT IS A SQUIRCLE, set in the mono face: what the engine runs, named
4718
- * the way a handle is written.
4719
- *
4720
- * THE CORNER MOVES WITH THE BOX, at 0.29 of it (`AVATAR_CORNER_RATIO` in the
4721
- * component, which the suite holds equal to this number): the approved
4722
- * design's 7px at 24 and 9px at 30, as one proportion. It is computed here from
4723
- * the size property every step and every numeric size sets, so there is ONE
4724
- * ladder. There used to be two, a step table here and a numeric table in the
4725
- * component, and they disagreed: `size={80}` drew a squarer badge than
4726
- * `size="lg"` at half its width.
5060
+ * ONE FACE SHAPE FOR PEOPLE AND AGENTS: a square with rounded corners, the
5061
+ * corner two ninths of the side (8px on a 36px face), never under the xs
5062
+ * radius on the smallest faces and never over the lg radius on the largest.
5063
+ * A person was a circle and an agent a squircle, so a row of people and
5064
+ * agents changed shape from face to face, and a list of members read as two
5065
+ * lists. One shape lines every face up on the same square and lets what the
5066
+ * face holds say who it is: a character on its hue, a picture, or initials
5067
+ * set in the kind's own face (below).
4727
5068
  *
4728
- * WHERE THE BROWSER DRAWS A SQUIRCLE, IT IS A WHOLE ONE. `corner-shape:
4729
- * squircle` is a superellipse of exponent 4, which at a given radius reaches
4730
- * much closer to the box's corner than a circular arc does: at the 45 degree
4731
- * point it stands 0.159 of the radius in from each edge, against 0.293 for an
4732
- * arc. Kept at 0.29 of the box, that corner would stand 0.046 of the box in,
4733
- * half the design's depth and a nearly square badge. At half the box it stands
4734
- * 0.0795 of the box in, against the design's 0.0849 (0.13px at 24px), with the
4735
- * continuous curvature a squircle is for. So the corner is the circle token
4736
- * there, and the fallback above is what every other browser draws.
5069
+ * THE CORNER MOVES WITH THE BOX, computed here from the size property every
5070
+ * step and every numeric size sets, so there is ONE ladder: `AVATAR_CORNER`
5071
+ * in the component states the same ratio and clamp for a caller that has to
5072
+ * round something else to match a face (ImageUpload, PresenceStack), and the
5073
+ * suite holds the two equal. No step rule sets a corner.
4737
5074
  */
4738
- .crewlet-avatar--agent {
4739
- border-radius: calc(var(--crewlet-avatar-size) * 0.29);
4740
- font-family: var(--font-family-mono);
5075
+ .crewlet-avatar {
5076
+ border-radius: clamp(var(--radius-xs), calc(var(--crewlet-avatar-size) * 2 / 9), var(--radius-lg));
4741
5077
  }
4742
5078
 
4743
- @supports (corner-shape: squircle) {
4744
- .crewlet-avatar--agent {
4745
- corner-shape: squircle;
4746
- border-radius: var(--radius-circle);
4747
- }
5079
+ /* ── kinds ─────────────────────────────────────────────────────────────── */
5080
+
5081
+ /*
5082
+ * The kind is said by the monogram's face: an agent's initials are set in the
5083
+ * mono face, the way a handle is written, and a person's in the sans face. A
5084
+ * character or a picture says it on its own.
5085
+ */
5086
+ .crewlet-avatar--agent {
5087
+ font-family: var(--font-family-mono);
4748
5088
  }
4749
5089
 
4750
- /* A PERSON IS A CIRCLE, set in the sans face, the round badge every member list
4751
- a reader has used already speaks. */
4752
5090
  .crewlet-avatar--human {
4753
- border-radius: var(--radius-circle);
4754
5091
  font-family: var(--font-family-sans);
4755
5092
  }
4756
5093
 
@@ -4780,16 +5117,22 @@ a.crewlet-make-row__item:active {
4780
5117
 
4781
5118
  /* ── tones ─────────────────────────────────────────────────────────────── */
4782
5119
 
5120
+ /*
5121
+ * A FACE'S OWN OUTLINE IS THE HAIRLINE (`--color-edge-hairline`), whatever it
5122
+ * holds: the neutral badge, a seeded tint, a character's plate. A row of faces
5123
+ * then reads as faces rather than as a row of framed boxes, where the strong
5124
+ * hairline and a hue's line drew each face as a tile. A reader who asked for
5125
+ * more contrast gets the control edge here, as the edge scale promises.
5126
+ */
4783
5127
  .crewlet-avatar--fallback {
4784
- border: 1px solid transparent;
5128
+ border: 1px solid var(--color-edge-hairline);
4785
5129
  }
4786
5130
 
4787
- /* The design's badge: the raised rung with the strong hairline round it and
4788
- the secondary ink, so a badge on a card reads as a mark standing on it
4789
- rather than as a hole in it. */
5131
+ /* The design's badge: the raised rung inside the face's hairline and the
5132
+ secondary ink, so a badge on a card reads as a mark standing on it rather
5133
+ than as a hole in it. */
4790
5134
  .crewlet-avatar--neutral {
4791
5135
  background: var(--color-surface-elevated);
4792
- border-color: var(--color-border-strong);
4793
5136
  color: var(--color-text-secondary);
4794
5137
  }
4795
5138
 
@@ -4817,7 +5160,7 @@ a.crewlet-make-row__item:active {
4817
5160
  * plate's sides, a tall one its top and its foot, and none touches the curve.
4818
5161
  */
4819
5162
  .crewlet-avatar--character {
4820
- border: 1px solid transparent;
5163
+ border: 1px solid var(--color-edge-hairline);
4821
5164
  }
4822
5165
 
4823
5166
  .crewlet-avatar__character {
@@ -4827,50 +5170,44 @@ a.crewlet-make-row__item:active {
4827
5170
  height: 74%;
4828
5171
  }
4829
5172
 
4830
- /* The plate an agent's hue is drawn on: the hue's fill, its line round the
4831
- badge and the hue itself as the character's ink. The fill is published as
5173
+ /* The plate an agent's hue is drawn on: the hue's fill inside the face's
5174
+ hairline, and the hue itself as the character's ink. The fill is published as
4832
5175
  `--crewlet-avatar-plate` and painted from it, because it is a TINT (12% of
4833
5176
  the hue over whatever the badge stands on), and a stack has to lay it over
4834
5177
  its own ground rather than over the badge behind it (AvatarStack.css). */
4835
5178
  .crewlet-avatar--hue-purple {
4836
5179
  --crewlet-avatar-plate: var(--color-node-purple-fill);
4837
5180
  background: var(--crewlet-avatar-plate);
4838
- border-color: var(--color-node-purple-line);
4839
5181
  color: var(--color-node-purple);
4840
5182
  }
4841
5183
 
4842
5184
  .crewlet-avatar--hue-cyan {
4843
5185
  --crewlet-avatar-plate: var(--color-node-cyan-fill);
4844
5186
  background: var(--crewlet-avatar-plate);
4845
- border-color: var(--color-node-cyan-line);
4846
5187
  color: var(--color-node-cyan);
4847
5188
  }
4848
5189
 
4849
5190
  .crewlet-avatar--hue-green {
4850
5191
  --crewlet-avatar-plate: var(--color-node-green-fill);
4851
5192
  background: var(--crewlet-avatar-plate);
4852
- border-color: var(--color-node-green-line);
4853
5193
  color: var(--color-node-green);
4854
5194
  }
4855
5195
 
4856
5196
  .crewlet-avatar--hue-amber {
4857
5197
  --crewlet-avatar-plate: var(--color-node-amber-fill);
4858
5198
  background: var(--crewlet-avatar-plate);
4859
- border-color: var(--color-node-amber-line);
4860
5199
  color: var(--color-node-amber);
4861
5200
  }
4862
5201
 
4863
5202
  .crewlet-avatar--hue-rose {
4864
5203
  --crewlet-avatar-plate: var(--color-node-rose-fill);
4865
5204
  background: var(--crewlet-avatar-plate);
4866
- border-color: var(--color-node-rose-line);
4867
5205
  color: var(--color-node-rose);
4868
5206
  }
4869
5207
 
4870
5208
  .crewlet-avatar--hue-blue {
4871
5209
  --crewlet-avatar-plate: var(--color-node-blue-fill);
4872
5210
  background: var(--crewlet-avatar-plate);
4873
- border-color: var(--color-node-blue-line);
4874
5211
  color: var(--color-node-blue);
4875
5212
  }
4876
5213
 
@@ -4884,7 +5221,7 @@ a.crewlet-make-row__item:active {
4884
5221
  * AN OUTLINE RATHER THAN THAT SHADOW PAIR, for three reasons. The gap is
4885
5222
  * TRANSPARENT, so the ring reads on whatever the badge stands on, where the
4886
5223
  * design's gap is the card's own fill and cuts a card-coloured band into any
4887
- * other ground. An outline follows the corner, the squircle's included, in
5224
+ * other ground. An outline follows the corner, the face's clamp included, in
4888
5225
  * every engine this package supports. And forced-colors mode keeps an outline
4889
5226
  * and drops every shadow, so the ring is still drawn for the readers who most
4890
5227
  * need a boundary.
@@ -4905,13 +5242,20 @@ a.crewlet-make-row__item:active {
4905
5242
  /*
4906
5243
  * THE FRAME is the face's own box, so a badge with a status takes exactly the
4907
5244
  * room one without takes: the corner badge hangs past it rather than growing
4908
- * it, and a row lays out the same either way. The badge is 0.42 of the box,
4909
- * never under 10px, which is the size its glyph stays a shape at.
5245
+ * it, and a row lays out the same either way.
5246
+ *
5247
+ * THE BADGE WHERE A READER LOOKS FOR PRESENCE: under a third of the face (0.3
5248
+ * of the box), hanging a twentieth of the box past its bottom-right corner,
5249
+ * with the notch (a gap of the ground round it) kept. At 36px that is an 11px
5250
+ * badge set 2px past the corner, the size and place of a presence dot, where
5251
+ * a badge at 0.42 of the box read as a second face. It never drops under
5252
+ * 10px, where its glyph stops being a shape, and always hangs at least a
5253
+ * pixel past the corner.
4910
5254
  */
4911
5255
  .crewlet-avatar-frame {
4912
- --crewlet-avatar-status-size: max(10px, calc(var(--crewlet-avatar-size) * 0.42));
4913
- --crewlet-avatar-status-overhang: 2px;
4914
- --crewlet-avatar-status-gap: 1.5px;
5256
+ --crewlet-avatar-status-size: max(10px, calc(var(--crewlet-avatar-size) * 0.3));
5257
+ --crewlet-avatar-status-overhang: max(1px, calc(var(--crewlet-avatar-size) * 0.05));
5258
+ --crewlet-avatar-status-gap: 2px;
4915
5259
  position: relative;
4916
5260
  display: inline-flex;
4917
5261
  flex: none;
@@ -5069,7 +5413,7 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
5069
5413
  }
5070
5414
 
5071
5415
 
5072
- /* AvatarStack-7I3P7LCK.css */
5416
+ /* AvatarStack-KEHD3GWY.css */
5073
5417
  /*
5074
5418
  * Several badges as one mark (AvatarStack.tsx).
5075
5419
  *
@@ -5078,7 +5422,8 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
5078
5422
  * badges standing in front of each other rather than as one blot. The ring is
5079
5423
  * a SHADOW rather than a border, because it has to fall outside the badge
5080
5424
  * without moving it, and it is decoration: forced-colors mode drops it and the
5081
- * badges' own hairlines still separate them.
5425
+ * badges' own borders, which that mode paints in the system ink, still
5426
+ * separate them.
5082
5427
  *
5083
5428
  * THE GROUND IS A VARIABLE because a stack stands on whatever it is put on,
5084
5429
  * and a cut-out in the sheet's colour on a card is a band of the wrong grey
@@ -5108,6 +5453,17 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
5108
5453
  box-shadow: 0 0 0 2px var(--crewlet-avatar-stack-ground);
5109
5454
  }
5110
5455
 
5456
+ /*
5457
+ * THE RING IS THE ONLY EDGE A STACKED FACE NEEDS. A face's own hairline inside
5458
+ * the ring drew each face as a framed tile, two edges a pixel apart, so a
5459
+ * stacked face (a member, or the face a member wraps) draws its border in no
5460
+ * colour. The border keeps its width, so the face keeps its box.
5461
+ */
5462
+ .crewlet-avatar-stack > .crewlet-avatar-stack__member.crewlet-avatar,
5463
+ .crewlet-avatar-stack > .crewlet-avatar-stack__member > .crewlet-avatar {
5464
+ border-color: transparent;
5465
+ }
5466
+
5111
5467
  /*
5112
5468
  * A BADGE IN FRONT HIDES THE ONE BEHIND IT. A hue's plate is a tint, 12% of
5113
5469
  * the hue over whatever the badge stands on, and in a stack that is partly
@@ -5135,9 +5491,9 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
5135
5491
  }
5136
5492
 
5137
5493
  /*
5138
- * THE COUNT OF THE REST. A PILL, where every badge is a squircle or a circle:
5139
- * it is a number rather than somebody, and drawn in either kind's outline it
5140
- * would read as one more agent or one more person. Otherwise it is the neutral
5494
+ * THE COUNT OF THE REST. A PILL, where every face is a rounded square: it is
5495
+ * a number rather than somebody, and drawn in a face's outline it would read
5496
+ * as one more agent or one more person. Otherwise it is the neutral
5141
5497
  * badge exactly (the raised rung, the strong hairline, the secondary ink), in
5142
5498
  * the sans face with tabular figures so "+9" and "+12" sit alike.
5143
5499
  */
@@ -5805,7 +6161,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5805
6161
  }
5806
6162
 
5807
6163
 
5808
- /* BriefCard-VKTH3BSW.css */
6164
+ /* BriefCard-QCL7MVUV.css */
5809
6165
  /*
5810
6166
  * A brief inside the product's status card: the verdict in the head, then one
5811
6167
  * line on what the page is about, the ranked rows that wait on the reader, a
@@ -5922,6 +6278,32 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5922
6278
  margin-inline: calc(-1 * var(--spacing-3));
5923
6279
  }
5924
6280
 
6281
+ /*
6282
+ * WHAT WAS SAID (a room's catch up): one point to a row, the sentence and its
6283
+ * citation, the press that opens the message it came from, at the row's end.
6284
+ * A quiet list with no markers, between the needs and the context.
6285
+ */
6286
+ .crewlet-brief-card__points {
6287
+ display: flex;
6288
+ flex-direction: column;
6289
+ gap: var(--spacing-1);
6290
+ margin: 0;
6291
+ padding: 0;
6292
+ list-style: none;
6293
+ }
6294
+
6295
+ .crewlet-brief-card__point {
6296
+ display: grid;
6297
+ grid-template-columns: minmax(0, 1fr) auto;
6298
+ align-items: baseline;
6299
+ gap: var(--spacing-3);
6300
+ padding-block: var(--spacing-1);
6301
+ }
6302
+
6303
+ .crewlet-brief-card__point-text {
6304
+ color: var(--color-text-primary);
6305
+ }
6306
+
5925
6307
 
5926
6308
  /* Button-GDEBGBX6.css */
5927
6309
  /*
@@ -9886,7 +10268,557 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
9886
10268
  }
9887
10269
 
9888
10270
 
9889
- /* ChatThread-2KO3FZKQ.css */
10271
+ /* ChatDay-E3FF5HWF.css */
10272
+ /*
10273
+ * ChatDay: a day of a conversation under its date, set on the conversation's
10274
+ * own scale (ChatScale.css).
10275
+ */
10276
+
10277
+ /* The day is the pill's range: pinned, the pill stays inside it, so the next
10278
+ day pushes it out from below. */
10279
+ .crewlet-chat-day {
10280
+ position: relative;
10281
+ display: flex;
10282
+ flex-direction: column;
10283
+ }
10284
+
10285
+ /*
10286
+ * THE PILL'S PLACE. A box as tall as the pill, first in the day, set so the
10287
+ * pill's middle is on the rule. Sticky in the day, it holds the pill a little
10288
+ * under the list's top edge for as long as the day is in view, and the day's
10289
+ * end pushes it out, a small gap above the next day's pill.
10290
+ *
10291
+ * ITS OWN MARGINS STAY POSITIVE. A sticky box may travel as far as its margin
10292
+ * box allows, so a negative margin here let the pill run past the end of its
10293
+ * day and sit on the next day's pill. The rule under it takes the overlap
10294
+ * instead, with a negative margin of its own, which moves nothing sticky.
10295
+ *
10296
+ * The box lets the pointer through to the rows beside the pill; the pill
10297
+ * takes it. It stands under a message's hover toolbar (which stands over the
10298
+ * rows and the pill alike) and over the rows and the New line.
10299
+ */
10300
+ .crewlet-chat-day__label {
10301
+ position: sticky;
10302
+ top: var(--crewlet-chat-day-pin);
10303
+ z-index: var(--z-index-sticky);
10304
+ display: flex;
10305
+ flex: none;
10306
+ justify-content: center;
10307
+ height: var(--crewlet-chat-day-pill);
10308
+ margin-top: calc(var(--crewlet-chat-day-gap) - var(--crewlet-chat-day-pill) / 2);
10309
+ pointer-events: none;
10310
+ /* A host that raises the pin (a banner arriving) moves the pinned pill
10311
+ down with it rather than jumping it. */
10312
+ transition: top var(--motion-duration-fast) var(--motion-easing-default);
10313
+ }
10314
+
10315
+ /*
10316
+ * THE DAY'S RULE: a hairline across the whole list with the day's gap under
10317
+ * it, in the flow like any row. It rises half a pill, so it runs through the
10318
+ * pill's middle.
10319
+ */
10320
+ .crewlet-chat-day__rule {
10321
+ position: relative;
10322
+ flex: none;
10323
+ height: 1px;
10324
+ margin: calc(var(--crewlet-chat-day-pill) / -2) 0 var(--crewlet-chat-day-gap);
10325
+ background: var(--color-edge-hairline);
10326
+ }
10327
+
10328
+ /* The New line on the day's rule covers the rule, as one line. */
10329
+ .crewlet-chat-day__rule > .crewlet-chat-divider--unread {
10330
+ position: absolute;
10331
+ inset: 0;
10332
+ }
10333
+
10334
+ /*
10335
+ * THE PILL floats over the rows: the transcript's own ground, ringed with the
10336
+ * hairline and a small shadow, so it reads as lifted off the messages it
10337
+ * passes over. The ring is a shadow, which forced colors drops, so a
10338
+ * transparent outline stands in for it there.
10339
+ */
10340
+ .crewlet-chat-day__pill {
10341
+ display: inline-flex;
10342
+ align-items: center;
10343
+ gap: var(--spacing-1);
10344
+ height: var(--crewlet-chat-day-pill);
10345
+ box-sizing: border-box;
10346
+ padding: 0 var(--spacing-3);
10347
+ border: 0;
10348
+ border-radius: var(--radius-pill);
10349
+ outline: 1px solid transparent;
10350
+ outline-offset: -1px;
10351
+ background-color: var(--crewlet-chat-ground);
10352
+ box-shadow:
10353
+ 0 0 0 1px var(--color-edge-hairline),
10354
+ var(--shadow-xs);
10355
+ color: var(--color-text-secondary);
10356
+ font: inherit;
10357
+ font-size: var(--font-size-xs);
10358
+ font-weight: var(--font-weight-medium);
10359
+ line-height: 1;
10360
+ white-space: nowrap;
10361
+ pointer-events: auto;
10362
+ }
10363
+
10364
+ /* A pill that opens a menu: its chevron sits a step closer to its edge. */
10365
+ .crewlet-chat-day__pill--button {
10366
+ padding-inline-end: var(--spacing-2);
10367
+ cursor: pointer;
10368
+ }
10369
+
10370
+ /* Under the pointer, and while its menu is open, the hover overlay laid on
10371
+ the pill's own ground. */
10372
+ .crewlet-chat-day__pill--button:hover,
10373
+ .crewlet-chat-day__pill--button[aria-expanded='true'] {
10374
+ background-image: linear-gradient(var(--color-surface-hover), var(--color-surface-hover));
10375
+ }
10376
+
10377
+ /* The pill draws its own ring, so focus is drawn over it, as one edge. */
10378
+ .crewlet-chat-day__pill--button:focus-visible {
10379
+ outline: 2px solid var(--color-focus);
10380
+ outline-offset: var(--size-focus-ring-inset-offset);
10381
+ }
10382
+
10383
+ @media (prefers-reduced-motion: reduce) {
10384
+ .crewlet-chat-day__label {
10385
+ transition: none;
10386
+ }
10387
+ }
10388
+
10389
+
10390
+ /* ChatDivider-7ZNDL2PZ.css */
10391
+ /*
10392
+ * ChatDivider: a line between the rows of a conversation, set on the
10393
+ * conversation's own scale (ChatScale.css).
10394
+ */
10395
+
10396
+ /* A quiet labelled rule: the words in the middle, a hairline either side. */
10397
+ .crewlet-chat-divider--date {
10398
+ display: flex;
10399
+ align-items: center;
10400
+ gap: var(--spacing-3);
10401
+ padding: var(--spacing-2) var(--crewlet-chat-pad-x);
10402
+ color: var(--color-text-tertiary);
10403
+ font-size: var(--crewlet-chat-meta);
10404
+ font-weight: var(--font-weight-regular);
10405
+ }
10406
+
10407
+ .crewlet-chat-divider--date::before,
10408
+ .crewlet-chat-divider--date::after {
10409
+ content: '';
10410
+ flex: 1;
10411
+ height: 1px;
10412
+ background: var(--color-border-default);
10413
+ }
10414
+
10415
+ .crewlet-chat-divider--date .crewlet-chat-divider__label {
10416
+ white-space: nowrap;
10417
+ }
10418
+
10419
+ /*
10420
+ * THE NEW LINE TAKES NO HEIGHT. A hairline across the whole list in the
10421
+ * danger hue, laid on the boundary between the last read message and the
10422
+ * first unread one, with "New" at its end on the transcript's ground, so it
10423
+ * reads over the rows it passes. Brought to the top of the view (scrolled to
10424
+ * as a target), it stops under the day's pinned pill rather than behind it.
10425
+ */
10426
+ .crewlet-chat-divider--unread {
10427
+ position: relative;
10428
+ z-index: var(--z-index-raised);
10429
+ height: 0;
10430
+ pointer-events: none;
10431
+ scroll-margin-top: calc(var(--crewlet-chat-day-pin) + var(--crewlet-chat-day-pill) + var(--spacing-3));
10432
+ }
10433
+
10434
+ .crewlet-chat-divider--unread::before {
10435
+ content: '';
10436
+ position: absolute;
10437
+ inset-inline: 0;
10438
+ top: 0;
10439
+ height: 1px;
10440
+ background: var(--color-feedback-danger);
10441
+ }
10442
+
10443
+ .crewlet-chat-divider--unread .crewlet-chat-divider__label {
10444
+ position: absolute;
10445
+ top: 0;
10446
+ right: var(--crewlet-chat-pad-x);
10447
+ padding: 0 var(--spacing-1);
10448
+ transform: translateY(-50%);
10449
+ background: var(--crewlet-chat-ground);
10450
+ color: var(--color-feedback-danger-ink);
10451
+ font-size: var(--font-size-xs);
10452
+ font-weight: var(--font-weight-medium);
10453
+ line-height: var(--font-line-height-normal);
10454
+ }
10455
+
10456
+ /*
10457
+ * FORCED COLORS drops the line's background, which is the whole line. A
10458
+ * border is the one edge the mode keeps, painted in its own text colour.
10459
+ */
10460
+ @media (forced-colors: active) {
10461
+ .crewlet-chat-divider--unread::before,
10462
+ .crewlet-chat-divider--date::before,
10463
+ .crewlet-chat-divider--date::after {
10464
+ border-top: 1px solid CanvasText;
10465
+ }
10466
+ }
10467
+
10468
+
10469
+ /* ChatMessage-FH7VRVCH.css */
10470
+ /*
10471
+ * One message in a transcript: a face in a gutter, the head line, the words
10472
+ * and a footer stack. Every size reads the conversation scale
10473
+ * (ChatScale.css); every edge and fill the quiet scale in @crewlethq/tokens.
10474
+ */
10475
+
10476
+ .crewlet-chat-message {
10477
+ /* Where the row's first line starts: the toolbar rests on it. */
10478
+ --crewlet-chat-row-top: var(--spacing-2);
10479
+ position: relative;
10480
+ display: grid;
10481
+ grid-template-columns: var(--crewlet-chat-avatar) minmax(0, 1fr);
10482
+ column-gap: var(--crewlet-chat-gap);
10483
+ padding: var(--crewlet-chat-row-top) var(--crewlet-chat-pad-x) var(--spacing-1);
10484
+ font-size: var(--crewlet-chat-text);
10485
+ line-height: var(--crewlet-chat-line);
10486
+ transition: background var(--motion-duration-fast) var(--motion-easing-default);
10487
+ /* A message the reader is taken to stops under the day's pinned pill. */
10488
+ scroll-margin-top: calc(var(--crewlet-chat-day-pin) + var(--crewlet-chat-day-pill) + var(--spacing-2));
10489
+ }
10490
+
10491
+ .crewlet-chat-message.is-continuation {
10492
+ --crewlet-chat-row-top: 1px;
10493
+ padding-bottom: 1px;
10494
+ }
10495
+
10496
+ .crewlet-chat-message:hover,
10497
+ .crewlet-chat-message:focus-visible,
10498
+ .crewlet-chat-message:has(:focus-visible),
10499
+ .crewlet-chat-message.is-active {
10500
+ background: var(--color-fill-row);
10501
+ }
10502
+
10503
+ .crewlet-chat-message:focus-visible {
10504
+ outline: 2px solid var(--color-focus);
10505
+ outline-offset: var(--size-focus-ring-inset-offset);
10506
+ }
10507
+
10508
+ /* A row that names the reader: its wash and the warning bar on its edge. It
10509
+ keeps its wash, and only its wash, under the pointer: the toolbar and the
10510
+ gutter's time say which row is pointed at, and a hover step laid over the
10511
+ wash took the row's quiet text under 4.5:1 on the darker palettes. */
10512
+ .crewlet-chat-message.is-mention,
10513
+ .crewlet-chat-message.is-mention:hover,
10514
+ .crewlet-chat-message.is-mention:focus-visible,
10515
+ .crewlet-chat-message.is-mention:has(:focus-visible),
10516
+ .crewlet-chat-message.is-mention.is-active {
10517
+ background: var(--crewlet-chat-mention);
10518
+ box-shadow: inset 2px 0 0 var(--color-feedback-warning);
10519
+ }
10520
+
10521
+ /* The row a link or a search opened at: a wash of the accent that fades back
10522
+ to whatever the row draws of its own (the mention wash included), so there
10523
+ is no last keyframe to name it. */
10524
+ .crewlet-chat-message.is-flash {
10525
+ animation: crewlet-chat-message-flash calc(var(--motion-duration-moderate) * 8) var(--motion-easing-out);
10526
+ }
10527
+
10528
+ @keyframes crewlet-chat-message-flash {
10529
+ 0%,
10530
+ 40% {
10531
+ background: var(--color-brand-accent-soft-strong);
10532
+ }
10533
+ }
10534
+
10535
+ .crewlet-chat-message.is-sending .crewlet-chat-message__body {
10536
+ color: var(--color-text-tertiary);
10537
+ }
10538
+
10539
+ /* The face starts a hairline under the top of the name's line box, so across
10540
+ the name and the first line of words it sits centred on the pair. It keeps
10541
+ its own height: stretched to the row, the face's button (and its focus
10542
+ ring) ran the full height of a long message. */
10543
+ .crewlet-chat-message__gutter {
10544
+ display: flex;
10545
+ align-items: flex-start;
10546
+ justify-content: center;
10547
+ padding-top: 2px;
10548
+ }
10549
+
10550
+ /* A face that opens the author's profile: the face is the whole control. */
10551
+ .crewlet-chat-message__gutter > button {
10552
+ display: inline-flex;
10553
+ padding: 0;
10554
+ border: 0;
10555
+ border-radius: var(--radius-md);
10556
+ background: transparent;
10557
+ cursor: pointer;
10558
+ }
10559
+
10560
+ .crewlet-chat-message__gutter > button:focus-visible {
10561
+ outline: 2px solid var(--color-focus);
10562
+ outline-offset: 2px;
10563
+ }
10564
+
10565
+ /* A continuation's time sits on the baseline of the first line of its words.
10566
+ The two are in different columns and set at different sizes, so the grid
10567
+ aligns them by baseline rather than by sharing a line height. It ends on
10568
+ the column's edge: a time is wider than a face, and centred it ran into the
10569
+ gap before the words. */
10570
+ .crewlet-chat-message.is-continuation > .crewlet-chat-message__gutter {
10571
+ justify-content: flex-end;
10572
+ padding-top: 0;
10573
+ }
10574
+
10575
+ .crewlet-chat-message.is-continuation > .crewlet-chat-message__gutter,
10576
+ .crewlet-chat-message.is-continuation > .crewlet-chat-message__main {
10577
+ align-self: baseline;
10578
+ }
10579
+
10580
+ .crewlet-chat-message__gutter-time {
10581
+ visibility: hidden;
10582
+ color: var(--color-text-tertiary);
10583
+ font-size: var(--font-size-2xs);
10584
+ font-variant-numeric: tabular-nums;
10585
+ line-height: 1;
10586
+ white-space: nowrap;
10587
+ }
10588
+
10589
+ .crewlet-chat-message:hover .crewlet-chat-message__gutter-time,
10590
+ .crewlet-chat-message:focus-visible .crewlet-chat-message__gutter-time,
10591
+ .crewlet-chat-message:has(:focus-visible) .crewlet-chat-message__gutter-time,
10592
+ .crewlet-chat-message.is-active .crewlet-chat-message__gutter-time {
10593
+ visibility: visible;
10594
+ }
10595
+
10596
+ .crewlet-chat-message__main {
10597
+ display: flex;
10598
+ flex-direction: column;
10599
+ min-width: 0;
10600
+ }
10601
+
10602
+ /* THE HEAD IS SET AS TEXT, not as a flex row. Every line of it, the first or
10603
+ one a narrow pane wraps the time onto, is held to one body line by the
10604
+ block's strut, and the smaller meta stands on the name's baseline inside
10605
+ it. As a wrapping flex row the line grew a pixel to fit the time's own
10606
+ line box, and a time wrapped alone got a short line of its own. */
10607
+ .crewlet-chat-message__head {
10608
+ min-width: 0;
10609
+ line-height: calc(var(--crewlet-chat-text) * var(--crewlet-chat-line));
10610
+ }
10611
+
10612
+ /* The gap follows each part, so a part a narrow pane wraps starts flush. */
10613
+ .crewlet-chat-message__head > * {
10614
+ white-space: nowrap;
10615
+ }
10616
+
10617
+ .crewlet-chat-message__head > :not(:last-child) {
10618
+ margin-inline-end: var(--spacing-2);
10619
+ }
10620
+
10621
+ /* A label beside the name ("Agent") is centred on the lower-case letters, as
10622
+ text sets an inline mark. */
10623
+ .crewlet-chat-message__head > .crewlet-tag {
10624
+ vertical-align: middle;
10625
+ }
10626
+
10627
+ .crewlet-chat-message__author {
10628
+ color: var(--color-text-primary);
10629
+ font-weight: var(--font-weight-medium);
10630
+ }
10631
+
10632
+ /* A name that opens the author's profile reads as the name, not a button. */
10633
+ .crewlet-chat-message__author > button {
10634
+ padding: 0;
10635
+ border: 0;
10636
+ border-radius: var(--radius-xs);
10637
+ background: transparent;
10638
+ color: inherit;
10639
+ font: inherit;
10640
+ cursor: pointer;
10641
+ }
10642
+
10643
+ .crewlet-chat-message__author > button:hover {
10644
+ text-decoration: underline;
10645
+ text-underline-offset: 2px;
10646
+ }
10647
+
10648
+ .crewlet-chat-message__author > button:focus-visible {
10649
+ outline: 2px solid var(--color-focus);
10650
+ outline-offset: 2px;
10651
+ }
10652
+
10653
+ /* Meta on the head shares the name's baseline. A line height of its own
10654
+ would sit its smaller text lower in a box as tall as the name's and grow
10655
+ the line by a pixel, so it takes none. */
10656
+ .crewlet-chat-message__time {
10657
+ color: var(--color-text-tertiary);
10658
+ font-size: var(--crewlet-chat-meta);
10659
+ font-variant-numeric: tabular-nums;
10660
+ line-height: 1;
10661
+ }
10662
+
10663
+ .crewlet-chat-message__body {
10664
+ min-width: 0;
10665
+ color: var(--color-text-primary);
10666
+ overflow-wrap: anywhere;
10667
+ }
10668
+
10669
+ /* Emphasis in a message is the semibold step, as it is everywhere else in
10670
+ the product: the browser's own bold read heavier than the names. */
10671
+ .crewlet-chat-message__body :is(b, strong) {
10672
+ font-weight: var(--font-weight-semibold);
10673
+ }
10674
+
10675
+ /* Previews, reactions and the thread line: one stack, one gap. */
10676
+ .crewlet-chat-message__footer {
10677
+ display: flex;
10678
+ flex-direction: column;
10679
+ align-items: flex-start;
10680
+ gap: var(--crewlet-chat-stack);
10681
+ margin-top: var(--crewlet-chat-stack);
10682
+ }
10683
+
10684
+ /* NO PIECE UNDER A MESSAGE IS WIDER THAN ITS COLUMN. Stacked on the start
10685
+ edge, each piece takes its one-line width, and an agent's working line set
10686
+ it wider than a phone's column: the transcript scrolled sideways. */
10687
+ .crewlet-chat-message__footer > * {
10688
+ max-width: 100%;
10689
+ }
10690
+
10691
+ /* THE TOOLBAR STANDS ON THE ROW'S FIRST LINE, over the row above, and over
10692
+ the day's pinned pill as well as the rows: a toolbar that slid under the
10693
+ pill lost its middle buttons wherever the two crossed. */
10694
+ .crewlet-chat-message__actions {
10695
+ position: absolute;
10696
+ top: calc(var(--crewlet-chat-row-top) - var(--crewlet-chat-toolbar));
10697
+ right: var(--crewlet-chat-pad-x);
10698
+ z-index: calc(var(--z-index-sticky) + var(--z-index-raised));
10699
+ opacity: 0;
10700
+ pointer-events: none;
10701
+ transition: opacity var(--motion-duration-fast) var(--motion-easing-default);
10702
+ }
10703
+
10704
+ .crewlet-chat-message:hover > .crewlet-chat-message__actions,
10705
+ .crewlet-chat-message:focus-visible > .crewlet-chat-message__actions,
10706
+ .crewlet-chat-message:has(:focus-visible) > .crewlet-chat-message__actions,
10707
+ .crewlet-chat-message.is-active > .crewlet-chat-message__actions {
10708
+ opacity: 1;
10709
+ pointer-events: auto;
10710
+ }
10711
+
10712
+ /* With no row above to stand over (see ChatMessage.tsx), or when the host
10713
+ asks, it is drawn inside the row's own head. */
10714
+ .crewlet-chat-message.has-actions-inside > .crewlet-chat-message__actions {
10715
+ top: var(--spacing-1);
10716
+ }
10717
+
10718
+ /* A row's quiet controls, the add-reaction pill among them, show while the
10719
+ row is pointed at or holds keyboard focus, and while their picker is open. */
10720
+ .crewlet-chat-message .crewlet-reaction--add {
10721
+ opacity: 0;
10722
+ }
10723
+
10724
+ .crewlet-chat-message:hover .crewlet-reaction--add,
10725
+ .crewlet-chat-message:has(:focus-visible) .crewlet-reaction--add,
10726
+ .crewlet-chat-message.is-active .crewlet-reaction--add,
10727
+ .crewlet-chat-message .crewlet-reaction--add[aria-expanded='true'] {
10728
+ opacity: 1;
10729
+ }
10730
+
10731
+ /* A TOUCH SCREEN HAS NO HOVER: a tap on the row (which focuses it) shows the
10732
+ toolbar, so replying in a thread, saving and the More menu are reached by
10733
+ touch as well as by pointer and keyboard. The add pill is always shown
10734
+ there, so a reaction is one tap away without finding the toolbar first. */
10735
+ @media (hover: none) {
10736
+ .crewlet-chat-message:focus-within > .crewlet-chat-message__actions {
10737
+ opacity: 1;
10738
+ pointer-events: auto;
10739
+ }
10740
+
10741
+ .crewlet-chat-message .crewlet-reaction--add {
10742
+ opacity: 1;
10743
+ }
10744
+ }
10745
+
10746
+ /* The line under a message that was not sent. */
10747
+ .crewlet-chat-message-failure {
10748
+ display: flex;
10749
+ flex-wrap: wrap;
10750
+ align-items: center;
10751
+ gap: var(--spacing-1);
10752
+ color: var(--color-feedback-danger-ink);
10753
+ font-size: var(--crewlet-chat-meta);
10754
+ line-height: var(--crewlet-chat-line);
10755
+ }
10756
+
10757
+ .crewlet-chat-message-failure__words {
10758
+ margin-inline-end: var(--spacing-1);
10759
+ }
10760
+
10761
+ @media (prefers-reduced-motion: reduce) {
10762
+ .crewlet-chat-message {
10763
+ transition: none;
10764
+ }
10765
+
10766
+ .crewlet-chat-message.is-flash {
10767
+ animation: none;
10768
+ }
10769
+
10770
+ .crewlet-chat-message__actions {
10771
+ transition: none;
10772
+ }
10773
+ }
10774
+
10775
+
10776
+ /* ChatScale-L4SIHSKL.css */
10777
+ /*
10778
+ * ONE SCALE FOR A CONVERSATION. Every part of a transcript reads from these:
10779
+ * the message rows, their toolbar, reactions and thread line, the day's rule
10780
+ * and pill, the New line and the link previews. A name, the words under it
10781
+ * and the box they were typed in are one size, and everything around them
10782
+ * (times, counts, the second lines of previews) is one step down. A surface
10783
+ * that wants a denser or roomier transcript sets them once, on itself.
10784
+ *
10785
+ * A sheet of its own, imported by every part that reads it, so a consumer
10786
+ * that imports one part (`@crewlethq/ui/ChatDay`) still gets the scale.
10787
+ */
10788
+ :root {
10789
+ /* The words: names, bodies and the message box, on one line height. */
10790
+ --crewlet-chat-text: var(--font-size-sm);
10791
+ --crewlet-chat-line: var(--font-line-height-normal);
10792
+ /* Times, counts, reactions and second lines: one step down. */
10793
+ --crewlet-chat-meta: var(--font-size-xs);
10794
+ /* The row's side inset, the face column, the gap after it, and the space
10795
+ between the pieces stacked under a message's words. */
10796
+ --crewlet-chat-pad-x: var(--spacing-5);
10797
+ --crewlet-chat-avatar: 36px;
10798
+ --crewlet-chat-gap: var(--spacing-3);
10799
+ --crewlet-chat-stack: 6px;
10800
+ /* One width for every link preview, so a stack of them shares both edges. */
10801
+ --crewlet-chat-card: 440px;
10802
+ /* A day: the pill's height, the room above and below its rule, and how far
10803
+ under the list's top edge the pill pins. A host with a bar floating over
10804
+ the list's top (an unread banner) moves the pin down past it. */
10805
+ --crewlet-chat-day-pill: 24px;
10806
+ --crewlet-chat-day-gap: var(--spacing-5);
10807
+ --crewlet-chat-day-pin: var(--spacing-3);
10808
+ /* The hover toolbar: a medium control, big enough to aim at while the
10809
+ pointer is passing, inside its inset and its hairline, twice. */
10810
+ --crewlet-chat-toolbar-inset: var(--spacing-1);
10811
+ --crewlet-chat-toolbar: calc(var(--size-control-md) + (var(--crewlet-chat-toolbar-inset) + 1px) * 2);
10812
+ /* The ground the transcript is set on. A host that sets it on another fill
10813
+ names that fill here, and everything lifted off the rows (the toolbar,
10814
+ the day's pill, the open thread line) is filled with it. */
10815
+ --crewlet-chat-ground: var(--color-surface-background);
10816
+ /* A row that names the reader: a light wash of the warning hue. */
10817
+ --crewlet-chat-mention: var(--color-feedback-warning-soft);
10818
+ }
10819
+
10820
+
10821
+ /* ChatThread-HAECJMP6.css */
9890
10822
  /*
9891
10823
  * A conversation as it grows: the scroller, the items a spacing step and a
9892
10824
  * half apart on the panel's 16px inset, and the Jump to latest pill in a row
@@ -9942,6 +10874,23 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
9942
10874
  flex: none;
9943
10875
  }
9944
10876
 
10877
+ /*
10878
+ * A SHORT TRANSCRIPT RESTS ON ITS FOOT (`rest="end"`), against the composer
10879
+ * under it, as a conversation's newest messages always are, rather than
10880
+ * under the top with an empty band between it and the box. The scroller is a
10881
+ * column and the items take the room above them; a conversation's rows set
10882
+ * their own spacing, so the items keep no gap.
10883
+ */
10884
+ .crewlet-chat-thread--rest-end .crewlet-chat-thread__scroller {
10885
+ display: flex;
10886
+ flex-direction: column;
10887
+ }
10888
+
10889
+ .crewlet-chat-thread--rest-end .crewlet-chat-thread__items {
10890
+ margin-top: auto;
10891
+ gap: 0;
10892
+ }
10893
+
9945
10894
  /*
9946
10895
  * The pill, centred in a row of its own under the log. IN FLOW, NOT FLOATING:
9947
10896
  * laid over the scroller it covered the last lines of whatever was being read,
@@ -10446,6 +11395,117 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10446
11395
  }
10447
11396
 
10448
11397
 
11398
+ /* ChipField-D4CW6XFA.css */
11399
+ /*
11400
+ * ChipField: chosen items as chips inside the field, before a bare text box.
11401
+ * The chips and the box wrap as one line of words; the box takes whatever
11402
+ * width the last line leaves, and a line of its own when that is too little.
11403
+ */
11404
+ .crewlet-chip-field {
11405
+ display: flex;
11406
+ flex-wrap: wrap;
11407
+ align-items: center;
11408
+ gap: var(--spacing-1);
11409
+ box-sizing: border-box;
11410
+ width: 100%;
11411
+ color: var(--color-text-primary);
11412
+ font-size: var(--font-size-sm);
11413
+ cursor: text;
11414
+ }
11415
+
11416
+ /* A field like any other: the field's fill, boundary and corner. */
11417
+ .crewlet-chip-field--boxed {
11418
+ min-height: var(--size-control-lg);
11419
+ padding: var(--spacing-1) var(--spacing-2);
11420
+ border: 1px solid var(--color-border-field);
11421
+ border-radius: var(--radius-md);
11422
+ background-color: var(--color-surface-subtle);
11423
+ }
11424
+
11425
+ /*
11426
+ * ONE RING, the one every field in this package draws: an outline over the
11427
+ * boundary, on the field rather than on the box inside it, because the
11428
+ * field is what the reader sees as the control. The selector names the box
11429
+ * rather than asking :focus-within, so tabbing to a chip's Remove control
11430
+ * rings that control alone, not the field round it as well.
11431
+ */
11432
+ .crewlet-chip-field--boxed:has(.crewlet-chip-field__input:focus-visible) {
11433
+ outline: 2px solid var(--color-focus);
11434
+ outline-offset: -1px;
11435
+ }
11436
+
11437
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
11438
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-chip-field--boxed:has(.crewlet-chip-field__input:focus-visible) {
11439
+ outline-width: 1px;
11440
+ outline-color: var(--color-border-selected);
11441
+ }
11442
+
11443
+ /*
11444
+ * The address line at the top of a view: full width, a rule under it, and
11445
+ * the view's own side inset (`--crewlet-chip-field-inset`, the chat's row
11446
+ * inset by default). Its focus is a bar along the rule; the transparent
11447
+ * outline is what forced colors, which drops the bar, draws instead.
11448
+ */
11449
+ .crewlet-chip-field--bare {
11450
+ gap: var(--spacing-2);
11451
+ min-height: var(--size-shell-topbar);
11452
+ padding: var(--spacing-2) var(--crewlet-chip-field-inset, var(--spacing-5));
11453
+ border-bottom: 1px solid var(--color-border-default);
11454
+ }
11455
+
11456
+ .crewlet-chip-field--bare:has(.crewlet-chip-field__input:focus-visible) {
11457
+ outline: 2px solid transparent;
11458
+ outline-offset: -2px;
11459
+ box-shadow: inset 0 -2px 0 var(--color-focus);
11460
+ }
11461
+
11462
+ .crewlet-chip-field__prefix {
11463
+ flex: none;
11464
+ color: var(--color-text-secondary);
11465
+ }
11466
+
11467
+ /* The list lends its chips to the field's own line (ChipField.tsx spells its
11468
+ role out, which a contents box can lose). */
11469
+ .crewlet-chip-field__chips {
11470
+ display: contents;
11471
+ list-style: none;
11472
+ }
11473
+
11474
+ .crewlet-chip-field__chip {
11475
+ display: inline-flex;
11476
+ min-width: 0;
11477
+ max-width: 100%;
11478
+ }
11479
+
11480
+ .crewlet-chip-field__input {
11481
+ flex: 1;
11482
+ min-width: 120px;
11483
+ height: var(--size-control-md);
11484
+ box-sizing: border-box;
11485
+ margin: 0;
11486
+ padding: 0 var(--spacing-1);
11487
+ border: 0;
11488
+ background: transparent;
11489
+ color: inherit;
11490
+ font: inherit;
11491
+ outline: none;
11492
+ }
11493
+
11494
+ .crewlet-chip-field--bare .crewlet-chip-field__input {
11495
+ padding-inline: 0;
11496
+ }
11497
+
11498
+ .crewlet-chip-field__input::placeholder {
11499
+ color: var(--color-text-tertiary);
11500
+ opacity: 1;
11501
+ }
11502
+
11503
+ .crewlet-chip-field.is-disabled {
11504
+ opacity: 0.6;
11505
+ cursor: not-allowed;
11506
+ }
11507
+
11508
+
10449
11509
  /* ChoiceButtons-T3GG6VLG.css */
10450
11510
  /*
10451
11511
  * One answer, sent with one press: a column of buttons as tall as a touch
@@ -12367,7 +13427,332 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
12367
13427
  }
12368
13428
 
12369
13429
 
12370
- /* Composer-HQIMTMRC.css */
13430
+ /* CompactNav-CU2AQXBC.css */
13431
+ /*
13432
+ * The compact rail: each place its glyph's tile over its name, in one column.
13433
+ *
13434
+ * A PLACE IS 48PX TALL: a 26px tile, its name under it and a breath. Fourteen
13435
+ * places, two rules, and the rail's head and foot stand in a 900px window, so
13436
+ * the column a reader folded the rail to see more of the page never scrolls
13437
+ * on a laptop.
13438
+ *
13439
+ * Tokens only. The tile's sizes are component variables, so a surface that
13440
+ * draws the compact rail at another width changes them in one place.
13441
+ */
13442
+
13443
+ .crewlet-compact-nav {
13444
+ --crewlet-compact-nav-tile-width: 36px;
13445
+ --crewlet-compact-nav-tile-height: var(--size-control-sm);
13446
+ --crewlet-compact-nav-glyph: 17px;
13447
+ width: 100%;
13448
+ min-width: 0;
13449
+ }
13450
+
13451
+ .crewlet-compact-nav__list {
13452
+ display: flex;
13453
+ flex-direction: column;
13454
+ align-items: stretch;
13455
+ margin: 0;
13456
+ padding: 0 var(--spacing-1);
13457
+ list-style: none;
13458
+ }
13459
+
13460
+ .crewlet-compact-nav__entry {
13461
+ display: flex;
13462
+ min-width: 0;
13463
+ }
13464
+
13465
+ /* A place is a link or a button, and a folded group is a button: one look for
13466
+ all three. The entry itself draws nothing; the tile is what lifts. */
13467
+ .crewlet-compact-nav__item {
13468
+ display: flex;
13469
+ flex-direction: column;
13470
+ align-items: center;
13471
+ gap: calc(var(--spacing-1) / 2);
13472
+ width: 100%;
13473
+ min-width: 0;
13474
+ margin: 0;
13475
+ padding: calc(var(--spacing-1) - 1px) 0 var(--spacing-1);
13476
+ border: 0;
13477
+ border-radius: var(--radius-md);
13478
+ background: transparent;
13479
+ color: var(--color-text-secondary);
13480
+ font: inherit;
13481
+ text-decoration: none;
13482
+ cursor: pointer;
13483
+ }
13484
+
13485
+ /* The ring is drawn on the tile (below), not round the whole entry. The
13486
+ entry's own outline is transparent rather than none, so forced colours,
13487
+ which paint a transparent outline in the system's ink, still draw one. */
13488
+ .crewlet-compact-nav__item:focus {
13489
+ outline: 2px solid transparent;
13490
+ }
13491
+
13492
+ .crewlet-compact-nav__tile {
13493
+ position: relative;
13494
+ display: inline-flex;
13495
+ align-items: center;
13496
+ justify-content: center;
13497
+ flex: none;
13498
+ width: var(--crewlet-compact-nav-tile-width);
13499
+ height: var(--crewlet-compact-nav-tile-height);
13500
+ border-radius: var(--radius-md);
13501
+ transition:
13502
+ background var(--motion-duration-fast) var(--motion-easing-default),
13503
+ color var(--motion-duration-fast) var(--motion-easing-default);
13504
+ }
13505
+
13506
+ /* A step larger than the full rail's 14px glyph: in the compact rail the
13507
+ glyph is the place's name at a glance, and the word under it is the
13508
+ caption. */
13509
+ .crewlet-compact-nav__tile > .crewlet-glyph {
13510
+ width: var(--crewlet-compact-nav-glyph);
13511
+ height: var(--crewlet-compact-nav-glyph);
13512
+ }
13513
+
13514
+ .crewlet-compact-nav__item:hover .crewlet-compact-nav__tile,
13515
+ .crewlet-compact-nav__item[data-open] .crewlet-compact-nav__tile {
13516
+ background: var(--color-surface-hover);
13517
+ color: var(--color-text-primary);
13518
+ }
13519
+
13520
+ .crewlet-compact-nav__item:hover .crewlet-compact-nav__label,
13521
+ .crewlet-compact-nav__item[data-open] .crewlet-compact-nav__label {
13522
+ color: var(--color-text-primary);
13523
+ }
13524
+
13525
+ /*
13526
+ * WHERE THE READER IS: the full rail's own current row, drawn on the tile.
13527
+ * Raised, the plain hairline as an OUTLINE (forced colours keep outlines and
13528
+ * drop backgrounds), and the primary ink. After :hover, so the current tile
13529
+ * shows its lift rather than the overlay. A folded group's tile is current
13530
+ * (`aria-current="true"`) while one of its places is.
13531
+ */
13532
+ .crewlet-compact-nav__item[aria-current] .crewlet-compact-nav__tile {
13533
+ background: var(--color-surface-elevated);
13534
+ outline: 1px solid var(--color-border-default);
13535
+ outline-offset: -1px;
13536
+ color: var(--color-text-primary);
13537
+ }
13538
+
13539
+ .crewlet-compact-nav__item[aria-current] .crewlet-compact-nav__label {
13540
+ color: var(--color-text-primary);
13541
+ font-weight: var(--font-weight-semibold);
13542
+ }
13543
+
13544
+ /* The ring is the tile's, after the current rule that draws its hairline on
13545
+ the same property, so a focused current tile draws the ring. */
13546
+ .crewlet-compact-nav__item:focus-visible .crewlet-compact-nav__tile {
13547
+ outline: 2px solid var(--color-focus);
13548
+ outline-offset: 0;
13549
+ }
13550
+
13551
+ .crewlet-compact-nav__label {
13552
+ max-width: 100%;
13553
+ box-sizing: border-box;
13554
+ padding: 0 calc(var(--spacing-1) / 2);
13555
+ overflow: hidden;
13556
+ color: var(--color-text-secondary);
13557
+ font-family: var(--font-family-sans);
13558
+ font-size: var(--font-size-2xs);
13559
+ font-weight: var(--font-weight-medium);
13560
+ line-height: var(--font-line-height-tight);
13561
+ text-align: center;
13562
+ text-overflow: ellipsis;
13563
+ white-space: nowrap;
13564
+ }
13565
+
13566
+ /* A place the reader holds no access to keeps its name and its key, in the
13567
+ quiet ink, as a locked group's rows do in the full rail. */
13568
+ .crewlet-compact-nav__item--locked:not([aria-current]):not(:hover) .crewlet-compact-nav__label,
13569
+ .crewlet-compact-nav__item--locked:not([aria-current]):not(:hover) .crewlet-compact-nav__tile {
13570
+ color: var(--color-text-tertiary);
13571
+ }
13572
+
13573
+ /*
13574
+ * THE FIGURE RIDES THE TILE'S TOP END CORNER, cut out of the rail by a ring of
13575
+ * the rail's own ground, so it reads apart from the glyph under it. It is the
13576
+ * one count badge size the whole chrome draws (`--size-badge`), the accent
13577
+ * fill where it is waiting on the reader and the raised ground where it is
13578
+ * only a tally.
13579
+ */
13580
+ .crewlet-compact-nav__figure {
13581
+ position: absolute;
13582
+ top: calc(var(--spacing-1) * -1 - 1px);
13583
+ right: calc(var(--spacing-2) * -1 + 1px);
13584
+ display: inline-flex;
13585
+ align-items: center;
13586
+ justify-content: center;
13587
+ min-width: var(--size-badge);
13588
+ height: var(--size-badge);
13589
+ box-sizing: border-box;
13590
+ padding: 0 var(--size-badge-pad);
13591
+ border: 2px solid var(--color-surface-frame);
13592
+ border-radius: var(--radius-pill);
13593
+ background: var(--color-surface-elevated);
13594
+ color: var(--color-text-secondary);
13595
+ font-family: var(--font-family-sans);
13596
+ font-size: var(--font-size-badge);
13597
+ font-weight: var(--font-weight-semibold);
13598
+ font-variant-numeric: tabular-nums;
13599
+ line-height: 1;
13600
+ }
13601
+
13602
+ .crewlet-compact-nav__figure--badge {
13603
+ background: var(--color-brand-accent);
13604
+ color: var(--color-text-on-accent);
13605
+ }
13606
+
13607
+ /* A short rule between two runs of tiles, centred in the column. */
13608
+ .crewlet-compact-nav__separator {
13609
+ display: flex;
13610
+ justify-content: center;
13611
+ padding: calc(var(--spacing-1) + var(--spacing-1) / 2) 0;
13612
+ }
13613
+
13614
+ .crewlet-compact-nav__rule {
13615
+ width: var(--spacing-6);
13616
+ height: 1px;
13617
+ background: var(--color-border-default);
13618
+ }
13619
+
13620
+ /*
13621
+ * THE FLYOUT: a folded group's places beside the rail, on the popover's rung.
13622
+ * Its rows are the full rail's rows at the menu's step: the glyph, the name,
13623
+ * and the figure at the end, so the places read as they do unfolded.
13624
+ */
13625
+ .crewlet-compact-nav__flyout {
13626
+ position: fixed;
13627
+ display: flex;
13628
+ flex-direction: column;
13629
+ gap: 1px;
13630
+ min-width: 208px;
13631
+ max-width: min(320px, calc(100vw - var(--spacing-4)));
13632
+ box-sizing: border-box;
13633
+ padding: var(--spacing-1);
13634
+ border: 1px solid var(--color-border-default);
13635
+ border-radius: var(--radius-lg);
13636
+ background: var(--color-surface-elevated);
13637
+ box-shadow: var(--shadow-lg);
13638
+ font-family: var(--font-family-sans);
13639
+ animation: crewlet-compact-nav-flyout-in var(--motion-duration-fast) var(--motion-easing-out);
13640
+ }
13641
+
13642
+ /* Inside a LayerHost the coordinates are the host's own, so the flyout is
13643
+ absolute within it rather than fixed against the window. */
13644
+ .crewlet-compact-nav__flyout--in-host {
13645
+ position: absolute;
13646
+ }
13647
+
13648
+ @keyframes crewlet-compact-nav-flyout-in {
13649
+ from {
13650
+ opacity: 0;
13651
+ transform: translateX(calc(var(--spacing-1) * -1));
13652
+ }
13653
+ }
13654
+
13655
+ .crewlet-compact-nav__flyout-head {
13656
+ padding: var(--spacing-1) var(--spacing-2);
13657
+ color: var(--color-text-secondary);
13658
+ font-size: var(--font-size-xs);
13659
+ font-weight: var(--font-weight-semibold);
13660
+ line-height: var(--font-line-height-tight);
13661
+ }
13662
+
13663
+ /* A router's link is drawn by the caller; its wrapper stays out of the box tree. */
13664
+ .crewlet-compact-nav__link-slot {
13665
+ display: contents;
13666
+ }
13667
+
13668
+ .crewlet-compact-nav__link {
13669
+ display: flex;
13670
+ align-items: center;
13671
+ gap: var(--spacing-2);
13672
+ min-width: 0;
13673
+ height: var(--size-control-md);
13674
+ padding: 0 var(--spacing-2);
13675
+ border-radius: var(--radius-md);
13676
+ color: var(--color-text-secondary);
13677
+ font-size: var(--font-size-sm);
13678
+ text-decoration: none;
13679
+ outline: none;
13680
+ transition:
13681
+ background var(--motion-duration-fast) var(--motion-easing-default),
13682
+ color var(--motion-duration-fast) var(--motion-easing-default);
13683
+ }
13684
+
13685
+ .crewlet-compact-nav__link:hover,
13686
+ .crewlet-compact-nav__link:focus-visible {
13687
+ background: var(--color-surface-hover);
13688
+ color: var(--color-text-primary);
13689
+ }
13690
+
13691
+ /* The place the reader is on: the selected fill, the primary ink, a step
13692
+ heavier. Declared after the hover so the selected fill holds under it. */
13693
+ .crewlet-compact-nav__link[aria-current='page'] {
13694
+ background: var(--color-surface-selected);
13695
+ color: var(--color-text-primary);
13696
+ font-weight: var(--font-weight-semibold);
13697
+ }
13698
+
13699
+ .crewlet-compact-nav__link:focus-visible {
13700
+ outline: 2px solid var(--color-focus);
13701
+ outline-offset: var(--size-focus-ring-inset-offset);
13702
+ }
13703
+
13704
+ .crewlet-compact-nav__link--locked:not([aria-current]):not(:hover):not(:focus-visible) {
13705
+ color: var(--color-text-tertiary);
13706
+ }
13707
+
13708
+ .crewlet-compact-nav__link-icon {
13709
+ display: inline-flex;
13710
+ flex: none;
13711
+ }
13712
+
13713
+ .crewlet-compact-nav__link-label {
13714
+ flex: 1 1 auto;
13715
+ min-width: 0;
13716
+ overflow: hidden;
13717
+ text-overflow: ellipsis;
13718
+ white-space: nowrap;
13719
+ }
13720
+
13721
+ .crewlet-compact-nav__link-figure {
13722
+ display: inline-flex;
13723
+ align-items: center;
13724
+ justify-content: center;
13725
+ flex: none;
13726
+ min-width: var(--size-badge);
13727
+ height: var(--size-badge);
13728
+ box-sizing: border-box;
13729
+ padding: 0 var(--size-badge-pad);
13730
+ border-radius: var(--radius-pill);
13731
+ color: var(--color-text-tertiary);
13732
+ font-size: var(--font-size-badge);
13733
+ font-weight: var(--font-weight-semibold);
13734
+ font-variant-numeric: tabular-nums;
13735
+ line-height: 1;
13736
+ }
13737
+
13738
+ .crewlet-compact-nav__link-figure--badge {
13739
+ background: var(--color-brand-accent);
13740
+ color: var(--color-text-on-accent);
13741
+ }
13742
+
13743
+ @media (prefers-reduced-motion: reduce) {
13744
+ .crewlet-compact-nav__tile,
13745
+ .crewlet-compact-nav__link {
13746
+ transition: none;
13747
+ }
13748
+
13749
+ .crewlet-compact-nav__flyout {
13750
+ animation: none;
13751
+ }
13752
+ }
13753
+
13754
+
13755
+ /* Composer-ZEGHEAFE.css */
12371
13756
  /*
12372
13757
  * A message written in place: the field and its footer strip in one box. The
12373
13758
  * BOX takes the focus ring every field in the package draws (see Input.css):
@@ -12506,6 +13891,32 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
12506
13891
  padding: var(--spacing-2) var(--spacing-3) 0;
12507
13892
  }
12508
13893
 
13894
+ /*
13895
+ * THE FORMATTING ROW, along the box's top on the field's own inset less the
13896
+ * small tool's own room round its glyph, so the first glyph starts on the
13897
+ * words' line. It belongs to the field rather than to a strip of its own: no
13898
+ * rule under it.
13899
+ */
13900
+ .crewlet-composer__toolbar {
13901
+ display: flex;
13902
+ align-items: center;
13903
+ min-width: 0;
13904
+ padding: var(--spacing-1) var(--spacing-1) 0 calc(var(--spacing-3) - (var(--size-control-sm) - var(--font-size-xs)) / 2);
13905
+ }
13906
+
13907
+ /*
13908
+ * THE TOOLS AT THE FOOTER'S START, a tight row whose first glyph starts on
13909
+ * the words' line, as the formatting row's does. The spacer after them puts
13910
+ * the actions at the end.
13911
+ */
13912
+ .crewlet-composer__tools {
13913
+ display: flex;
13914
+ align-items: center;
13915
+ gap: 2px;
13916
+ min-width: 0;
13917
+ margin-inline-start: calc(-1 * (var(--size-control-sm) - var(--font-size-xs)) / 2);
13918
+ }
13919
+
12509
13920
  /*
12510
13921
  * DISABLED, AS A FIELD IS: the whole box at the disabled field's 0.6 and the
12511
13922
  * not-allowed cursor, so it no longer reads as somewhere to type. Faded once:
@@ -12583,6 +13994,51 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
12583
13994
  }
12584
13995
  }
12585
13996
 
13997
+ /*
13998
+ * A CONVERSATION'S MESSAGE BOX (`appearance="chat"`), on the transcript's own
13999
+ * scale (ChatMessage/ChatScale.css): the large corner on the transcript's
14000
+ * ground with the row wash laid over it, a step lighter than the list, and a
14001
+ * small shadow, so the box sits just above the messages, inside the edge
14002
+ * scale's strong step, the edge a field draws. The words are set at the
14003
+ * transcript's size on one line to start. The footer belongs to the field
14004
+ * rather than standing as a strip under it: no rule and no ground of its own.
14005
+ */
14006
+ .crewlet-composer--chat {
14007
+ border-color: var(--color-edge-strong);
14008
+ background:
14009
+ linear-gradient(var(--color-fill-row), var(--color-fill-row)),
14010
+ var(--crewlet-chat-ground);
14011
+ box-shadow: var(--shadow-xs);
14012
+ }
14013
+
14014
+ .crewlet-composer--chat .crewlet-composer__field {
14015
+ min-height: 0;
14016
+ padding: var(--spacing-2) var(--spacing-3);
14017
+ font-size: var(--crewlet-chat-text);
14018
+ line-height: var(--crewlet-chat-line);
14019
+ }
14020
+
14021
+ .crewlet-composer--chat .crewlet-composer__footer {
14022
+ gap: 2px;
14023
+ padding: var(--spacing-1);
14024
+ padding-inline-start: var(--spacing-3);
14025
+ border-top: 0;
14026
+ background: transparent;
14027
+ }
14028
+
14029
+ /* A tool whose menu or picker is open reads as held down. */
14030
+ .crewlet-composer--chat .crewlet-composer__tools [aria-expanded='true'] {
14031
+ background: var(--color-surface-pressed);
14032
+ color: var(--color-text-primary);
14033
+ }
14034
+
14035
+ /* The formatting row's glyphs rest in the tertiary ink while the box is not
14036
+ in use, so the row reads as part of the field rather than as a toolbar
14037
+ competing with the conversation, and take their own ink once it is. */
14038
+ .crewlet-composer--chat:not(:focus-within) .crewlet-composer__toolbar :is(button, [role='button']):not(:hover) {
14039
+ color: var(--color-text-tertiary);
14040
+ }
14041
+
12586
14042
 
12587
14043
  /* ConflictNote-OP64JJ6T.css */
12588
14044
  /* ConflictNote: a refused write's sentence in the danger ink, with its glyph
@@ -12933,7 +14389,7 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
12933
14389
  }
12934
14390
 
12935
14391
 
12936
- /* Count-ZJ6ID4ZU.css */
14392
+ /* Count-2HXBBYPO.css */
12937
14393
  /*
12938
14394
  * The count pill. One neutral look, deliberately: see the component doc for
12939
14395
  * why a count is never tinted.
@@ -12960,6 +14416,25 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
12960
14416
  line-height: round(nearest, calc(var(--font-line-height-body) * 1em), 1px);
12961
14417
  }
12962
14418
 
14419
+ /*
14420
+ * WHAT WAITS ON THE READER (`tone="attention"`): the accent pill every count
14421
+ * of that kind is drawn as, wherever it stands, at the badge's own size: 16px
14422
+ * tall and at least as wide, its figure at the badge step in the semibold
14423
+ * weight. At 18px with an 11px figure such a badge read louder than the name
14424
+ * beside it.
14425
+ */
14426
+ .crewlet-count--attention {
14427
+ box-sizing: border-box;
14428
+ min-width: var(--size-badge);
14429
+ height: var(--size-badge);
14430
+ padding: 0 var(--size-badge-pad);
14431
+ background: var(--color-brand-accent);
14432
+ color: var(--color-text-on-accent);
14433
+ font-size: var(--font-size-badge);
14434
+ font-weight: var(--font-weight-semibold);
14435
+ line-height: 1;
14436
+ }
14437
+
12963
14438
 
12964
14439
  /* CursorFlag-AJQJBUGY.css */
12965
14440
  /*
@@ -18663,6 +20138,72 @@ svg.crewlet-datetime__chevron {
18663
20138
  }
18664
20139
 
18665
20140
 
20141
+ /* EmojiPicker-FMWYN2WX.css */
20142
+ /*
20143
+ * A searchable grid of emoji in a popover: the field, then each group under
20144
+ * its quiet heading, eight to a row, in a scroller of its own.
20145
+ */
20146
+
20147
+ .crewlet-emoji-picker__body {
20148
+ display: flex;
20149
+ flex-direction: column;
20150
+ gap: var(--spacing-2);
20151
+ width: 296px;
20152
+ max-width: 100%;
20153
+ box-sizing: border-box;
20154
+ padding: var(--spacing-2);
20155
+ }
20156
+
20157
+ .crewlet-emoji-picker__scroll {
20158
+ max-height: 240px;
20159
+ overflow-y: auto;
20160
+ overscroll-behavior: contain;
20161
+ }
20162
+
20163
+ /* A group's heading, in the meta register at the regular weight. */
20164
+ .crewlet-emoji-picker__group {
20165
+ padding: var(--spacing-2) var(--spacing-1) var(--spacing-1);
20166
+ color: var(--color-text-tertiary);
20167
+ font-size: var(--font-size-2xs);
20168
+ font-weight: var(--font-weight-regular);
20169
+ letter-spacing: var(--font-letter-spacing-wide);
20170
+ text-transform: uppercase;
20171
+ }
20172
+
20173
+ .crewlet-emoji-picker__grid {
20174
+ display: grid;
20175
+ grid-template-columns: repeat(var(--crewlet-emoji-picker-columns), minmax(0, 1fr));
20176
+ gap: 2px;
20177
+ }
20178
+
20179
+ .crewlet-emoji-picker__cell {
20180
+ aspect-ratio: 1;
20181
+ padding: 0;
20182
+ border: 0;
20183
+ border-radius: var(--radius-sm);
20184
+ background: transparent;
20185
+ font-size: var(--font-size-lg);
20186
+ line-height: 1;
20187
+ cursor: pointer;
20188
+ }
20189
+
20190
+ .crewlet-emoji-picker__cell:hover {
20191
+ background: var(--color-surface-hover);
20192
+ }
20193
+
20194
+ .crewlet-emoji-picker__cell:focus-visible {
20195
+ background: var(--color-surface-hover);
20196
+ outline: 2px solid var(--color-focus);
20197
+ outline-offset: var(--size-focus-ring-inset-offset);
20198
+ }
20199
+
20200
+ .crewlet-emoji-picker__none {
20201
+ margin: var(--spacing-3) var(--spacing-1);
20202
+ color: var(--color-text-tertiary);
20203
+ font-size: var(--font-size-sm);
20204
+ }
20205
+
20206
+
18666
20207
  /* EmptyState-7L4UAQBX.css */
18667
20208
  /*
18668
20209
  * The empty state.
@@ -20379,7 +21920,7 @@ a.crewlet-icon-btn {
20379
21920
  .crewlet-icon-tile--blue { --crewlet-icon-tile-fill: var(--color-node-blue-fill); --crewlet-icon-tile-ink: var(--color-node-blue-ink); }
20380
21921
 
20381
21922
 
20382
- /* ImageUpload-OWI7CCG7.css */
21923
+ /* ImageUpload-IFXZROFZ.css */
20383
21924
  /*
20384
21925
  * ImageUpload, the click-to-upload affordance built on Avatar.
20385
21926
  *
@@ -20426,34 +21967,16 @@ a.crewlet-icon-btn {
20426
21967
  cursor: pointer;
20427
21968
  }
20428
21969
 
20429
- /* The kind modifiers keep the trigger, the overlay and the Avatar outlines in
20430
- step. A person's picture is a circle. */
20431
- .crewlet-image-upload--human .crewlet-image-upload__trigger,
20432
- .crewlet-image-upload--human .crewlet-image-upload__overlay {
20433
- border-radius: var(--radius-circle);
20434
- }
20435
-
20436
21970
  /* THE SAME CORNER THE PICTURE INSIDE TAKES, which is why it is a variable
20437
- rather than a step: Avatar moves an agent badge's corner with its box, so a
20438
- trigger pinned to one step is rounder or squarer than the badge under it at
20439
- every size but one, and the badge's corners show through the overlay. */
20440
- .crewlet-image-upload--agent .crewlet-image-upload__trigger,
20441
- .crewlet-image-upload--agent .crewlet-image-upload__overlay {
21971
+ rather than a step: Avatar moves a face's corner with its box, so a trigger
21972
+ pinned to one step is rounder or squarer than the face under it at every
21973
+ size but one, and the face's corners show through the overlay. Every face
21974
+ is one shape, a person's and an agent's alike, so one rule serves both. */
21975
+ .crewlet-image-upload__trigger,
21976
+ .crewlet-image-upload__overlay {
20442
21977
  border-radius: var(--crewlet-image-upload-corner);
20443
21978
  }
20444
21979
 
20445
- /* AND THE SAME SQUIRCLE, where the browser draws one, for the same reason:
20446
- Avatar.css states why its squircle is a whole one at the circle token, and
20447
- this is that rule for the two frames over the picture. The suite holds the
20448
- two blocks to one declaration list. */
20449
- @supports (corner-shape: squircle) {
20450
- .crewlet-image-upload--agent .crewlet-image-upload__trigger,
20451
- .crewlet-image-upload--agent .crewlet-image-upload__overlay {
20452
- corner-shape: squircle;
20453
- border-radius: var(--radius-circle);
20454
- }
20455
- }
20456
-
20457
21980
  .crewlet-image-upload__trigger:disabled {
20458
21981
  cursor: default;
20459
21982
  }
@@ -20552,19 +22075,6 @@ a.crewlet-icon-btn {
20552
22075
  transition: opacity var(--motion-duration-fast) var(--motion-easing-default);
20553
22076
  }
20554
22077
 
20555
- /*
20556
- * ON A PERSON'S CIRCLE THE BADGE SITS ON THE EDGE, where the circle crosses
20557
- * its own diagonal: (1 - 1/sqrt(2)) / 2 of the size, 0.1464, in from each
20558
- * side, less half the 24px badge. The six pixels out above are the agent
20559
- * tile's, whose squircle corner reaches that far; a circle turns away sooner,
20560
- * and at the default 80px the badge's middle stood 8px off the picture, so
20561
- * the badge floated beside it rather than being pinned to it.
20562
- */
20563
- .crewlet-image-upload--human .crewlet-image-upload__remove {
20564
- top: calc(var(--crewlet-image-upload-size) * 0.1464 - 12px);
20565
- right: calc(var(--crewlet-image-upload-size) * 0.1464 - 12px);
20566
- }
20567
-
20568
22078
  .crewlet-image-upload:hover .crewlet-image-upload__remove,
20569
22079
  .crewlet-image-upload__remove:focus-visible {
20570
22080
  opacity: 1;
@@ -22731,6 +24241,164 @@ a.crewlet-icon-btn {
22731
24241
  }
22732
24242
 
22733
24243
 
24244
+ /* LinkCard-5I4MYU6I.css */
24245
+ /*
24246
+ * LinkCard: what a link points at, unfurled under its message.
24247
+ *
24248
+ * AN UNFURL, NOT A CARD. No box and no fill: a slim bar on the left in the
24249
+ * status's line colour (the medium edge with none), and the lines beside it
24250
+ * in the dashboard's own type (the title in the primary ink, the small meta
24251
+ * under it), so a preview reads as part of its message. One width for every
24252
+ * preview (ChatScale.css), so a stack of them shares both edges.
24253
+ */
24254
+ .crewlet-link-card {
24255
+ --crewlet-link-card-bar: 3px;
24256
+ --crewlet-link-card-tone: var(--color-edge-medium);
24257
+ --crewlet-link-card-dot: var(--color-text-tertiary);
24258
+ position: relative;
24259
+ display: flex;
24260
+ flex-direction: column;
24261
+ align-items: flex-start;
24262
+ gap: 2px;
24263
+ width: min(100%, var(--crewlet-chat-card));
24264
+ box-sizing: border-box;
24265
+ padding: 2px 0 2px calc(var(--crewlet-link-card-bar) + var(--spacing-3));
24266
+ border-radius: var(--radius-xs);
24267
+ color: var(--color-text-secondary);
24268
+ font-size: var(--font-size-xs);
24269
+ line-height: var(--font-line-height-snug);
24270
+ text-decoration: none;
24271
+ }
24272
+
24273
+ .crewlet-link-card::before {
24274
+ content: '';
24275
+ position: absolute;
24276
+ inset-block: 0;
24277
+ left: 0;
24278
+ width: var(--crewlet-link-card-bar);
24279
+ border-radius: var(--radius-pill);
24280
+ background: var(--crewlet-link-card-tone);
24281
+ }
24282
+
24283
+ /* The bar takes the tone's line colour; the status dot, small enough to
24284
+ carry it, the tone's full colour, so the status reads in both modes. */
24285
+ .crewlet-link-card--info {
24286
+ --crewlet-link-card-tone: var(--color-feedback-info-line);
24287
+ --crewlet-link-card-dot: var(--color-feedback-info);
24288
+ }
24289
+
24290
+ .crewlet-link-card--success {
24291
+ --crewlet-link-card-tone: var(--color-feedback-success-line);
24292
+ --crewlet-link-card-dot: var(--color-feedback-success);
24293
+ }
24294
+
24295
+ .crewlet-link-card--warning {
24296
+ --crewlet-link-card-tone: var(--color-feedback-warning-line);
24297
+ --crewlet-link-card-dot: var(--color-feedback-warning);
24298
+ }
24299
+
24300
+ .crewlet-link-card--danger {
24301
+ --crewlet-link-card-tone: var(--color-feedback-danger-line);
24302
+ --crewlet-link-card-dot: var(--color-feedback-danger);
24303
+ }
24304
+
24305
+ /* No box to ring over: the ring stands off the preview's words. */
24306
+ .crewlet-link-card:focus-visible {
24307
+ outline: 2px solid var(--color-focus);
24308
+ outline-offset: 2px;
24309
+ }
24310
+
24311
+ /* The app it comes from: its mark and its name, small and quiet. */
24312
+ .crewlet-link-card__source {
24313
+ display: inline-flex;
24314
+ align-items: center;
24315
+ gap: var(--spacing-1);
24316
+ }
24317
+
24318
+ .crewlet-link-card__mark,
24319
+ .crewlet-link-card__face {
24320
+ display: inline-flex;
24321
+ flex: none;
24322
+ }
24323
+
24324
+ /* The title in the primary ink at the regular weight, two lines at most;
24325
+ under the pointer it takes the accent ink and an underline. */
24326
+ .crewlet-link-card__title {
24327
+ display: -webkit-box;
24328
+ max-width: 100%;
24329
+ overflow: hidden;
24330
+ -webkit-box-orient: vertical;
24331
+ -webkit-line-clamp: 2;
24332
+ color: var(--color-text-primary);
24333
+ font-size: var(--font-size-compact);
24334
+ font-weight: var(--font-weight-regular);
24335
+ overflow-wrap: anywhere;
24336
+ }
24337
+
24338
+ /* THE TITLE ALONE IS UNDERLINED. The document's base underlines every link
24339
+ under the pointer, and an underline on the link runs through all of its
24340
+ lines (the source, the details, the owner), which no line inside can
24341
+ take off again. */
24342
+ a.crewlet-link-card:hover {
24343
+ text-decoration: none;
24344
+ }
24345
+
24346
+ a.crewlet-link-card:hover .crewlet-link-card__title {
24347
+ color: var(--color-brand-accent-ink);
24348
+ text-decoration: underline;
24349
+ text-underline-offset: 2px;
24350
+ }
24351
+
24352
+ .crewlet-link-card__code {
24353
+ color: var(--color-text-secondary);
24354
+ }
24355
+
24356
+ .crewlet-link-card__meta {
24357
+ max-width: 100%;
24358
+ overflow: hidden;
24359
+ text-overflow: ellipsis;
24360
+ white-space: nowrap;
24361
+ }
24362
+
24363
+ /* Status and owner as words on one line: a dot in the status's colour, and
24364
+ a small face with the owner's name. */
24365
+ .crewlet-link-card__fields {
24366
+ display: flex;
24367
+ flex-wrap: wrap;
24368
+ align-items: center;
24369
+ gap: var(--spacing-1) var(--spacing-3);
24370
+ margin-top: 2px;
24371
+ }
24372
+
24373
+ .crewlet-link-card__status,
24374
+ .crewlet-link-card__owner {
24375
+ display: inline-flex;
24376
+ align-items: center;
24377
+ gap: var(--spacing-1);
24378
+ white-space: nowrap;
24379
+ }
24380
+
24381
+ .crewlet-link-card__dot {
24382
+ width: 6px;
24383
+ height: 6px;
24384
+ flex: none;
24385
+ border-radius: var(--radius-circle);
24386
+ background: var(--crewlet-link-card-dot);
24387
+ }
24388
+
24389
+ /* FORCED COLORS drops the bar's and the dot's backgrounds; a border is the
24390
+ one edge the mode keeps. */
24391
+ @media (forced-colors: active) {
24392
+ .crewlet-link-card::before {
24393
+ border-left: var(--crewlet-link-card-bar) solid CanvasText;
24394
+ }
24395
+
24396
+ .crewlet-link-card__dot {
24397
+ border: 1px solid CanvasText;
24398
+ }
24399
+ }
24400
+
24401
+
22734
24402
  /* LinkInterstitial-ET4MSVSV.css */
22735
24403
  /*
22736
24404
  * The destination, said twice: the host as the claim a reader decides on, in
@@ -24349,6 +26017,119 @@ a.crewlet-icon-btn {
24349
26017
  }
24350
26018
 
24351
26019
 
26020
+ /* MentionChip-W7MZZVRZ.css */
26021
+ /*
26022
+ * A mention in a message's words: a chip in the line, in the info tone's
26023
+ * light blue, or the warning tone where it names the reader.
26024
+ */
26025
+
26026
+ .crewlet-mention-chip {
26027
+ display: inline;
26028
+ padding: 0 2px;
26029
+ border: 0;
26030
+ border-radius: var(--radius-xs);
26031
+ background: var(--color-feedback-info-soft);
26032
+ color: var(--color-feedback-info-ink);
26033
+ font: inherit;
26034
+ font-weight: var(--font-weight-regular);
26035
+ -webkit-box-decoration-break: clone;
26036
+ box-decoration-break: clone;
26037
+ }
26038
+
26039
+ .crewlet-mention-chip--self,
26040
+ .crewlet-mention-chip--everyone {
26041
+ background: var(--color-feedback-warning-soft);
26042
+ color: var(--color-feedback-warning-ink);
26043
+ }
26044
+
26045
+ button.crewlet-mention-chip {
26046
+ cursor: pointer;
26047
+ }
26048
+
26049
+ /* Under the pointer the fill takes the tone's next strength, its line step. */
26050
+ button.crewlet-mention-chip:hover {
26051
+ background: var(--color-feedback-info-line);
26052
+ }
26053
+
26054
+ button.crewlet-mention-chip--self:hover,
26055
+ button.crewlet-mention-chip--everyone:hover {
26056
+ background: var(--color-feedback-warning-line);
26057
+ }
26058
+
26059
+ button.crewlet-mention-chip:focus-visible {
26060
+ outline: 2px solid var(--color-focus);
26061
+ outline-offset: 1px;
26062
+ }
26063
+
26064
+
26065
+ /* MentionMenu-4NAQ45S4.css */
26066
+ /*
26067
+ * MentionMenu: the suggestions a composer opens on "@" or "#".
26068
+ *
26069
+ * The popover surface (the fill, hairline, corner and shadow of the emoji
26070
+ * picker that opens from the same composer), as wide as the field but no
26071
+ * wider than a list a reader scans: on a wide room the trailing word
26072
+ * ("Working") stood a screen's width from the name it belongs to; a host
26073
+ * moves that cap with `--crewlet-mention-menu-width` on any box round it.
26074
+ * It is placed against the nearest positioned box round the field, above
26075
+ * it, so it never covers what is being typed.
26076
+ */
26077
+ .crewlet-mention-menu {
26078
+ position: absolute;
26079
+ bottom: calc(100% + var(--spacing-1));
26080
+ left: 0;
26081
+ z-index: var(--z-index-dropdown);
26082
+ box-sizing: border-box;
26083
+ width: min(100%, var(--crewlet-mention-menu-width, 560px));
26084
+ overflow: hidden;
26085
+ border: 1px solid var(--color-border-default);
26086
+ border-radius: var(--radius-lg);
26087
+ background: var(--color-surface-subtle);
26088
+ box-shadow: var(--shadow-xl);
26089
+ }
26090
+
26091
+ .crewlet-mention-menu__label {
26092
+ padding: var(--spacing-2) var(--spacing-3) var(--spacing-1);
26093
+ color: var(--color-text-tertiary);
26094
+ font-size: var(--font-size-2xs);
26095
+ font-weight: var(--font-weight-regular);
26096
+ letter-spacing: var(--font-letter-spacing-wide);
26097
+ text-transform: uppercase;
26098
+ }
26099
+
26100
+ .crewlet-mention-menu__list {
26101
+ max-height: 264px;
26102
+ margin: 0;
26103
+ padding: 0 var(--spacing-1) var(--spacing-1);
26104
+ overflow-y: auto;
26105
+ overscroll-behavior: contain;
26106
+ list-style: none;
26107
+ }
26108
+
26109
+ /* The panel's corner less its inset, so each row's curve runs parallel. */
26110
+ .crewlet-mention-menu__list > .crewlet-person-row {
26111
+ --crewlet-person-row-radius: calc(var(--radius-lg) - var(--spacing-1));
26112
+ }
26113
+
26114
+ .crewlet-mention-menu__footer {
26115
+ display: flex;
26116
+ flex-wrap: wrap;
26117
+ align-items: center;
26118
+ gap: var(--spacing-1) var(--spacing-3);
26119
+ padding: var(--spacing-2) var(--spacing-3);
26120
+ border-top: 1px solid var(--color-border-default);
26121
+ color: var(--color-text-tertiary);
26122
+ font-size: var(--font-size-xs);
26123
+ }
26124
+
26125
+ /* The foot names keys, and a touch screen has none to press. */
26126
+ @media (hover: none) {
26127
+ .crewlet-mention-menu__footer {
26128
+ display: none;
26129
+ }
26130
+ }
26131
+
26132
+
24352
26133
  /* Menu-I4SNXHOT.css */
24353
26134
  /*
24354
26135
  * The menu button's panel.
@@ -24743,6 +26524,82 @@ a.crewlet-icon-btn {
24743
26524
  }
24744
26525
 
24745
26526
 
26527
+ /* MessageActions-Q4F5UH3S.css */
26528
+ /*
26529
+ * The tray a message shows on hover: the transcript's own ground ringed with
26530
+ * the hairline and a small shadow, the large corner, and 30px tools inside
26531
+ * the inset, so it reads as a soft tray of tools rather than a framed bar.
26532
+ * Two classes, so the tray's own rules hold over Toolbar's in any bundle
26533
+ * order.
26534
+ */
26535
+ .crewlet-toolbar.crewlet-message-actions {
26536
+ flex-wrap: nowrap;
26537
+ gap: var(--crewlet-chat-toolbar-inset);
26538
+ height: var(--crewlet-chat-toolbar);
26539
+ box-sizing: border-box;
26540
+ padding: var(--crewlet-chat-toolbar-inset);
26541
+ border: 1px solid var(--color-edge-hairline);
26542
+ border-radius: var(--radius-lg);
26543
+ background: var(--crewlet-chat-ground);
26544
+ box-shadow: var(--shadow-xs);
26545
+ }
26546
+
26547
+ /* A tool whose menu or picker is open reads as held down, which is not the
26548
+ accent fill a toggle that is on (Saved) draws. */
26549
+ .crewlet-message-actions .crewlet-icon-btn[aria-expanded='true'] {
26550
+ background: var(--color-surface-pressed);
26551
+ color: var(--color-text-primary);
26552
+ }
26553
+
26554
+ .crewlet-message-actions__emoji {
26555
+ display: inline-flex;
26556
+ flex: none;
26557
+ align-items: center;
26558
+ justify-content: center;
26559
+ width: var(--size-control-md);
26560
+ height: var(--size-control-md);
26561
+ padding: 0;
26562
+ border: 0;
26563
+ border-radius: var(--radius-md);
26564
+ background: transparent;
26565
+ font-size: var(--font-size-md);
26566
+ line-height: 1;
26567
+ cursor: pointer;
26568
+ }
26569
+
26570
+ .crewlet-message-actions__emoji:hover {
26571
+ background: var(--color-fill-soft);
26572
+ }
26573
+
26574
+ .crewlet-message-actions__emoji:active {
26575
+ background: var(--color-surface-pressed);
26576
+ }
26577
+
26578
+ /* Held, as the tray's icon tools are: faded, no fill under the pointer, and
26579
+ the reason in its hint. */
26580
+ .crewlet-message-actions__emoji[aria-disabled='true'] {
26581
+ opacity: 0.5;
26582
+ cursor: not-allowed;
26583
+ }
26584
+
26585
+ .crewlet-message-actions__emoji[aria-disabled='true']:is(:hover, :active) {
26586
+ background: transparent;
26587
+ }
26588
+
26589
+ .crewlet-message-actions__emoji:focus-visible {
26590
+ outline: 2px solid var(--color-focus);
26591
+ outline-offset: var(--size-focus-ring-inset-offset);
26592
+ }
26593
+
26594
+ .crewlet-message-actions__divider {
26595
+ flex: none;
26596
+ width: 1px;
26597
+ height: var(--spacing-4);
26598
+ margin: 0 var(--spacing-1);
26599
+ background: var(--color-border-default);
26600
+ }
26601
+
26602
+
24746
26603
  /* MessageBubble-AHTXBO3X.css */
24747
26604
  /*
24748
26605
  * One message: the bubble on its writer's side, and what it carried and its
@@ -24972,7 +26829,7 @@ a.crewlet-icon-btn {
24972
26829
  }
24973
26830
 
24974
26831
 
24975
- /* Modal-FYQYEI3N.css */
26832
+ /* Modal-GKUOO7PZ.css */
24976
26833
  /*
24977
26834
  * The modal surface: the veil, the frame, and the three bands inside it.
24978
26835
  *
@@ -25260,13 +27117,32 @@ a.crewlet-icon-btn {
25260
27117
  animation: crewlet-modal-sheet-in var(--motion-duration-slow) var(--motion-easing-emphasized);
25261
27118
  }
25262
27119
 
27120
+ /*
27121
+ * A SHEET FROM THE START EDGE (`side="start"`): a navigation panel, pinned to
27122
+ * the inline start and arriving from past it, with its edge and its shadow on
27123
+ * its inline end, into the page it covers. The shadow is the sheet's own,
27124
+ * mirrored by the token build, so a palette's sheet shadow reads the same way
27125
+ * round on either side.
27126
+ */
27127
+ .crewlet-modal-overlay--sheet.crewlet-modal-overlay--start {
27128
+ justify-content: flex-start;
27129
+ }
27130
+
27131
+ .crewlet-modal--sheet.crewlet-modal--start {
27132
+ --crewlet-modal-sheet-from: -100%;
27133
+ border-inline-start: none;
27134
+ border-inline-end: 1px solid var(--color-border-default);
27135
+ box-shadow: var(--shadow-sheet-start);
27136
+ }
27137
+
25263
27138
  /*
25264
27139
  * The shell's one breakpoint, strictly under it as the shell switches. Below
25265
27140
  * it there is no content beside a sheet to keep in view, so the sheet takes
25266
27141
  * the whole width and its edge goes with it.
25267
27142
  */
25268
27143
  @media (width < 1024px) {
25269
- .crewlet-modal--sheet {
27144
+ .crewlet-modal--sheet,
27145
+ .crewlet-modal--sheet.crewlet-modal--start {
25270
27146
  width: 100%;
25271
27147
  border-inline: none;
25272
27148
  }
@@ -25289,6 +27165,11 @@ a.crewlet-icon-btn {
25289
27165
  --crewlet-modal-glyph-inset: calc((var(--size-control-md) - var(--font-size-sm)) / 2);
25290
27166
 
25291
27167
  display: flex;
27168
+ /* The head and the foot keep their height and the body gives way: in the
27169
+ frame's column a head that could shrink was squeezed under a long body
27170
+ to the bar's height, and a wrapped title and subtitle ran over its
27171
+ edges. */
27172
+ flex-shrink: 0;
25292
27173
  align-items: center;
25293
27174
  gap: var(--spacing-3);
25294
27175
  padding: var(--spacing-4);
@@ -25509,6 +27390,7 @@ a.crewlet-icon-btn {
25509
27390
  */
25510
27391
  .crewlet-modal__footer {
25511
27392
  display: flex;
27393
+ flex-shrink: 0;
25512
27394
  align-items: center;
25513
27395
  flex-wrap: wrap;
25514
27396
  gap: var(--spacing-2);
@@ -27418,6 +29300,170 @@ a.crewlet-icon-btn {
27418
29300
  }
27419
29301
 
27420
29302
 
29303
+ /* PersonRow-V5GTPNVP.css */
29304
+ /*
29305
+ * PersonRow: a person or an agent as one row of a list, as a button or as a
29306
+ * listbox option. One design for every list of people.
29307
+ */
29308
+ .crewlet-person-row {
29309
+ /* The row's corner. A list inside a rounded panel sets it to the panel's
29310
+ corner less the panel's inset, so the two curves run parallel. */
29311
+ --crewlet-person-row-radius: var(--radius-md);
29312
+ display: flex;
29313
+ align-items: center;
29314
+ gap: var(--spacing-3);
29315
+ width: 100%;
29316
+ box-sizing: border-box;
29317
+ margin: 0;
29318
+ padding: var(--spacing-2);
29319
+ border: 0;
29320
+ border-radius: var(--crewlet-person-row-radius);
29321
+ background: transparent;
29322
+ color: var(--color-text-primary);
29323
+ font: inherit;
29324
+ font-size: var(--font-size-sm);
29325
+ line-height: var(--font-line-height-normal);
29326
+ text-align: left;
29327
+ list-style: none;
29328
+ cursor: pointer;
29329
+ }
29330
+
29331
+ /* One line, for a list that opens under a caret: the name, its detail after
29332
+ it, and the trailing words at the end. */
29333
+ .crewlet-person-row--compact {
29334
+ gap: var(--spacing-2);
29335
+ min-height: var(--size-row-md);
29336
+ padding-block: 0;
29337
+ }
29338
+
29339
+ /*
29340
+ * A ROW SHOWS THE HOVER OVERLAY OR THE CHOSEN TINT, NEVER BOTH: they are the
29341
+ * same property on the same element, and the chosen row keeps its tint under
29342
+ * the pointer.
29343
+ */
29344
+ .crewlet-person-row:hover,
29345
+ .crewlet-person-row.is-highlighted {
29346
+ background: var(--color-surface-hover);
29347
+ }
29348
+
29349
+ .crewlet-person-row.is-selected,
29350
+ .crewlet-person-row.is-selected:hover {
29351
+ background: var(--color-brand-accent-soft);
29352
+ }
29353
+
29354
+ /* The row the arrows are on, in a list a field owns: a bar on its start
29355
+ edge, so it is found in a list whose chosen rows are tinted too. */
29356
+ .crewlet-person-row.is-highlighted {
29357
+ box-shadow: inset 2px 0 0 var(--color-brand-accent);
29358
+ }
29359
+
29360
+ .crewlet-person-row:focus-visible {
29361
+ outline: 2px solid var(--color-focus);
29362
+ outline-offset: var(--size-focus-ring-inset-offset);
29363
+ }
29364
+
29365
+ .crewlet-person-row:disabled,
29366
+ .crewlet-person-row.is-disabled {
29367
+ color: var(--color-text-tertiary);
29368
+ cursor: not-allowed;
29369
+ }
29370
+
29371
+ /*
29372
+ * One column for every face or glyph, so every name starts on one edge: a
29373
+ * room's 16px glyph started its name a step left of the faces beside it.
29374
+ */
29375
+ .crewlet-person-row__face {
29376
+ display: inline-flex;
29377
+ flex: none;
29378
+ align-items: center;
29379
+ justify-content: center;
29380
+ min-width: var(--size-control-md);
29381
+ color: var(--color-text-secondary);
29382
+ }
29383
+
29384
+ .crewlet-person-row--compact .crewlet-person-row__face {
29385
+ min-width: var(--size-control-sm);
29386
+ }
29387
+
29388
+ .crewlet-person-row__text {
29389
+ display: flex;
29390
+ flex: 1;
29391
+ flex-direction: column;
29392
+ min-width: 0;
29393
+ }
29394
+
29395
+ .crewlet-person-row__name {
29396
+ display: inline-flex;
29397
+ align-items: center;
29398
+ gap: var(--spacing-2);
29399
+ min-width: 0;
29400
+ font-weight: var(--font-weight-regular);
29401
+ white-space: nowrap;
29402
+ }
29403
+
29404
+ .crewlet-person-row__detail {
29405
+ min-width: 0;
29406
+ overflow: hidden;
29407
+ color: var(--color-text-secondary);
29408
+ font-size: var(--font-size-xs);
29409
+ text-overflow: ellipsis;
29410
+ white-space: nowrap;
29411
+ }
29412
+
29413
+ .crewlet-person-row--compact .crewlet-person-row__detail {
29414
+ color: var(--color-text-tertiary);
29415
+ }
29416
+
29417
+ .crewlet-person-row__meta {
29418
+ flex: none;
29419
+ margin-left: auto;
29420
+ color: var(--color-text-tertiary);
29421
+ font-size: var(--font-size-xs);
29422
+ white-space: nowrap;
29423
+ }
29424
+
29425
+ /* The toggle's mark: a plus that is quiet until the row is pointed at, and a
29426
+ check on the accent once the row is chosen. */
29427
+ .crewlet-person-row__mark {
29428
+ display: inline-flex;
29429
+ flex: none;
29430
+ align-items: center;
29431
+ justify-content: center;
29432
+ width: var(--size-control-sm);
29433
+ height: var(--size-control-sm);
29434
+ margin-left: auto;
29435
+ border-radius: var(--radius-md);
29436
+ color: var(--color-text-secondary);
29437
+ }
29438
+
29439
+ .crewlet-person-row__meta + .crewlet-person-row__mark {
29440
+ margin-left: 0;
29441
+ }
29442
+
29443
+ .crewlet-person-row:hover .crewlet-person-row__mark {
29444
+ background: var(--color-surface-elevated);
29445
+ color: var(--color-text-primary);
29446
+ }
29447
+
29448
+ .crewlet-person-row.is-selected .crewlet-person-row__mark {
29449
+ background: var(--color-brand-accent);
29450
+ color: var(--color-text-on-accent);
29451
+ }
29452
+
29453
+ /*
29454
+ * FORCED COLORS repaints every background to Canvas, which took the chosen
29455
+ * tint and the arrows' row with it. An outline is the one mark the mode
29456
+ * keeps, in the system's own colour for exactly this.
29457
+ */
29458
+ @media (forced-colors: active) {
29459
+ .crewlet-person-row.is-selected,
29460
+ .crewlet-person-row.is-highlighted {
29461
+ outline: 2px solid Highlight;
29462
+ outline-offset: -2px;
29463
+ }
29464
+ }
29465
+
29466
+
27421
29467
  /* PinTile-OWS7JTHD.css */
27422
29468
  /*
27423
29469
  * PinTile: one pinned thing, a link with its facts.
@@ -27845,7 +29891,7 @@ a.crewlet-icon-btn {
27845
29891
  }
27846
29892
 
27847
29893
 
27848
- /* PresenceStack-ZV67BH4V.css */
29894
+ /* PresenceStack-2DTYRADY.css */
27849
29895
  /*
27850
29896
  * Who is here (PresenceStack.tsx), on the avatar stack's own geometry: the
27851
29897
  * overlap and the counted chip are the stack's, the overlap stepped out by
@@ -27875,12 +29921,10 @@ a.crewlet-icon-btn {
27875
29921
  font: inherit;
27876
29922
  }
27877
29923
 
27878
- .crewlet-presence-stack > .crewlet-presence-stack__member--human {
27879
- border-radius: var(--radius-circle);
27880
- }
27881
-
27882
- .crewlet-presence-stack > .crewlet-presence-stack__member--agent {
27883
- border-radius: var(--radius-sm);
29924
+ /* The face's own corner, which the component sets from Avatar's ladder: one
29925
+ shape for people and agents. */
29926
+ .crewlet-presence-stack > .crewlet-presence-stack__member {
29927
+ border-radius: var(--crewlet-presence-stack-corner);
27884
29928
  }
27885
29929
 
27886
29930
  button.crewlet-presence-stack__member {
@@ -28785,6 +30829,102 @@ button.crewlet-presence-stack__member:focus-visible {
28785
30829
  }
28786
30830
 
28787
30831
 
30832
+ /* ReactionBar-XXI4V7XG.css */
30833
+ /*
30834
+ * A message's reactions: one pill to an emoji, then the add pill. A pill at
30835
+ * rest is a fill and no frame; the edge arrives under the pointer.
30836
+ */
30837
+
30838
+ .crewlet-reaction-bar {
30839
+ display: flex;
30840
+ flex-wrap: wrap;
30841
+ align-items: center;
30842
+ gap: var(--spacing-1);
30843
+ }
30844
+
30845
+ .crewlet-reaction {
30846
+ display: inline-flex;
30847
+ align-items: center;
30848
+ justify-content: center;
30849
+ gap: var(--spacing-1);
30850
+ min-width: 44px;
30851
+ height: 24px;
30852
+ box-sizing: border-box;
30853
+ padding: 0 var(--spacing-2);
30854
+ border: 1px solid transparent;
30855
+ border-radius: var(--radius-pill);
30856
+ background: var(--color-fill-soft);
30857
+ color: var(--color-text-primary);
30858
+ font: inherit;
30859
+ font-size: var(--crewlet-chat-meta);
30860
+ line-height: 1;
30861
+ cursor: pointer;
30862
+ transition:
30863
+ border-color var(--motion-duration-fast) var(--motion-easing-default),
30864
+ background var(--motion-duration-fast) var(--motion-easing-default);
30865
+ }
30866
+
30867
+ /* The emoji is the pill's picture and the count its caption: at the count's
30868
+ size the emoji read smaller than the number beside it. */
30869
+ .crewlet-reaction__emoji {
30870
+ font-size: var(--font-size-md);
30871
+ }
30872
+
30873
+ .crewlet-reaction__count {
30874
+ font-variant-numeric: tabular-nums;
30875
+ font-weight: var(--font-weight-regular);
30876
+ }
30877
+
30878
+ /* The pointed pill drops its fill and takes the strong edge. */
30879
+ .crewlet-reaction:hover {
30880
+ border-color: var(--color-edge-strong);
30881
+ background: transparent;
30882
+ }
30883
+
30884
+ /* Yours: the accent's soft fill, its ink and a heavier count, ringed in the
30885
+ accent, so it differs from the others by more than its hue. */
30886
+ .crewlet-reaction.is-mine {
30887
+ border-color: var(--color-brand-accent);
30888
+ background: var(--color-brand-accent-soft);
30889
+ color: var(--color-brand-accent-ink);
30890
+ }
30891
+
30892
+ .crewlet-reaction.is-mine:hover {
30893
+ background: var(--color-brand-accent-soft-strong);
30894
+ }
30895
+
30896
+ .crewlet-reaction.is-mine .crewlet-reaction__count {
30897
+ font-weight: var(--font-weight-medium);
30898
+ }
30899
+
30900
+ .crewlet-reaction[aria-disabled='true'] {
30901
+ cursor: not-allowed;
30902
+ }
30903
+
30904
+ .crewlet-reaction:focus-visible {
30905
+ outline: 2px solid var(--color-focus);
30906
+ outline-offset: var(--size-focus-ring-inset-offset);
30907
+ }
30908
+
30909
+ /* The add pill: the glyph alone, in the quiet ink. */
30910
+ .crewlet-reaction.crewlet-reaction--add {
30911
+ min-width: 32px;
30912
+ padding: 0;
30913
+ color: var(--color-text-tertiary);
30914
+ }
30915
+
30916
+ .crewlet-reaction.crewlet-reaction--add[aria-expanded='true'] {
30917
+ background: var(--color-surface-pressed);
30918
+ color: var(--color-text-primary);
30919
+ }
30920
+
30921
+ @media (prefers-reduced-motion: reduce) {
30922
+ .crewlet-reaction {
30923
+ transition: none;
30924
+ }
30925
+ }
30926
+
30927
+
28788
30928
  /* ReadingPane-VLYOWMCM.css */
28789
30929
  /*
28790
30930
  * One item read in full, in one column.
@@ -33567,7 +35707,7 @@ svg.crewlet-select__chevron {
33567
35707
  }
33568
35708
 
33569
35709
 
33570
- /* SidePanel-VXKUKLOJ.css */
35710
+ /* SidePanel-BKWT6Q6Z.css */
33571
35711
  /*
33572
35712
  * A side panel and the frame that lays it beside the content or over it
33573
35713
  * (`SidePanel`, `SidePanelFrame`, and their artifact presets).
@@ -33658,6 +35798,42 @@ svg.crewlet-select__chevron {
33658
35798
  border-bottom: 1px solid var(--color-border-default);
33659
35799
  }
33660
35800
 
35801
+ /* With a subtitle the head holds one or two lines, so its height is a floor
35802
+ rather than a height, and its controls stay on the first line. */
35803
+ .crewlet-side-panel__head--subtitled {
35804
+ align-items: flex-start;
35805
+ height: auto;
35806
+ min-height: var(--crewlet-side-panel-head-height);
35807
+ padding-block: calc((var(--crewlet-side-panel-head-height) - var(--size-control-sm)) / 2);
35808
+ box-sizing: border-box;
35809
+ }
35810
+
35811
+ /* The title and the subtitle on one baseline, the subtitle dropping under
35812
+ the title when the two do not fit; the title shrinks to its own line and
35813
+ is ellipsised there. Centred on the controls' line while it is one line. */
35814
+ .crewlet-side-panel__heading {
35815
+ display: flex;
35816
+ flex: 1 1 auto;
35817
+ flex-wrap: wrap;
35818
+ align-items: baseline;
35819
+ column-gap: var(--spacing-2);
35820
+ min-width: 0;
35821
+ min-height: var(--size-control-sm);
35822
+ align-content: center;
35823
+ }
35824
+
35825
+ .crewlet-side-panel__heading > .crewlet-side-panel__title {
35826
+ flex: 0 1 auto;
35827
+ }
35828
+
35829
+ .crewlet-side-panel__subtitle {
35830
+ min-width: 0;
35831
+ overflow-wrap: anywhere;
35832
+ color: var(--color-text-tertiary);
35833
+ font-size: var(--font-size-sm);
35834
+ line-height: var(--font-line-height-snug);
35835
+ }
35836
+
33661
35837
  .crewlet-side-panel__icon {
33662
35838
  display: inline-flex;
33663
35839
  flex: none;
@@ -33813,7 +35989,7 @@ svg.crewlet-select__chevron {
33813
35989
  }
33814
35990
 
33815
35991
 
33816
- /* SidebarNav-VTQ3G4AE.css */
35992
+ /* SidebarNav-E7PZGGA6.css */
33817
35993
  /*
33818
35994
  * The rail's navigation.
33819
35995
  *
@@ -33903,6 +36079,61 @@ svg.crewlet-select__chevron {
33903
36079
  color: var(--color-text-tertiary);
33904
36080
  }
33905
36081
 
36082
+ /*
36083
+ * A HEADING THAT FOLDS ITS GROUP (`collapsible`): the button is the heading's
36084
+ * words and a chevron, the chevron centred in the glyph column (a nav glyph's
36085
+ * 14px; the xs chevron is 12px) and the words on the label line, so the
36086
+ * headings and the rows of a folded list stay one grid. It is the target
36087
+ * floor tall, the head's own height, and as wide as its words, so the head's
36088
+ * control keeps its own target at the end.
36089
+ *
36090
+ * THE RING IS DRAWN INSIDE ITS EDGE, because the words ellipsize and the box
36091
+ * that cuts them would cut an outset ring on every side.
36092
+ */
36093
+ .crewlet-nav-group__toggle {
36094
+ display: inline-flex;
36095
+ flex: 0 1 auto;
36096
+ align-items: center;
36097
+ gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
36098
+ min-width: 0;
36099
+ min-height: var(--size-target-min);
36100
+ margin: 0;
36101
+ padding: 0 var(--spacing-1) 0 0;
36102
+ border: 0;
36103
+ border-radius: var(--radius-sm);
36104
+ background: transparent;
36105
+ color: var(--color-text-tertiary);
36106
+ font: inherit;
36107
+ cursor: pointer;
36108
+ transition: color var(--motion-duration-fast) var(--motion-easing-default);
36109
+ }
36110
+
36111
+ .crewlet-nav-group__toggle:hover {
36112
+ color: var(--color-text-primary);
36113
+ }
36114
+
36115
+ .crewlet-nav-group__toggle:focus-visible {
36116
+ outline: 2px solid var(--color-focus);
36117
+ outline-offset: var(--size-focus-ring-inset-offset);
36118
+ }
36119
+
36120
+ /* The words take the button's ink, so the heading lifts as one. */
36121
+ .crewlet-nav-group__toggle > .crewlet-nav-group__label {
36122
+ color: inherit;
36123
+ }
36124
+
36125
+ .crewlet-nav-group__chevron {
36126
+ display: inline-flex;
36127
+ flex: none;
36128
+ margin: 0 calc((14px - 12px) / 2);
36129
+ transition: transform var(--motion-duration-fast) var(--motion-easing-default);
36130
+ }
36131
+
36132
+ /* Folded, the chevron points at the words it would open. */
36133
+ .crewlet-nav-group--collapsed .crewlet-nav-group__chevron {
36134
+ transform: rotate(-90deg);
36135
+ }
36136
+
33906
36137
  /* The heading's control. Pushed to the end whether or not the heading has
33907
36138
  words, and at the floor the heading stands at. */
33908
36139
  .crewlet-nav-group__action {
@@ -34148,13 +36379,16 @@ svg.crewlet-select__chevron {
34148
36379
  * somebody who cannot separate the hue at all: the filled pill is the signal,
34149
36380
  * the figure is the count.
34150
36381
  *
34151
- * The design's 18px pill, at least as wide as it is tall so a single digit is
34152
- * a round mark and not a lozenge, and following the density like the xs Tag
34153
- * it matches. The label is the on-accent step, the primary action's own pair,
34154
- * on every row alike, because the fill is opaque.
36382
+ * The chrome's one count badge (`--size-badge`, 16px with a 10px figure), at
36383
+ * least as wide as it is tall so a single digit is a round mark and not a
36384
+ * lozenge, and following the density. The same pill is drawn on the compact
36385
+ * rail's tiles and in its flyouts, so a count waiting for the reader is one
36386
+ * mark wherever it is; at 18px with an 11px figure it read louder than the
36387
+ * names beside it. The label is the on-accent step, the primary action's own
36388
+ * pair, on every row alike, because the fill is opaque.
34155
36389
  */
34156
36390
  .crewlet-nav-item__badge {
34157
- --crewlet-nav-item-badge-size: calc(18px * var(--density, 1));
36391
+ --crewlet-nav-item-badge-size: var(--size-badge);
34158
36392
  display: inline-flex;
34159
36393
  align-items: center;
34160
36394
  justify-content: center;
@@ -34163,11 +36397,11 @@ svg.crewlet-select__chevron {
34163
36397
  min-width: var(--crewlet-nav-item-badge-size);
34164
36398
  height: var(--crewlet-nav-item-badge-size);
34165
36399
  margin-left: auto;
34166
- padding: 0 calc(var(--spacing-1) + 1px);
36400
+ padding: 0 var(--size-badge-pad);
34167
36401
  border-radius: var(--radius-pill);
34168
36402
  background: var(--color-brand-accent);
34169
36403
  color: var(--color-text-on-accent);
34170
- font-size: var(--font-size-2xs);
36404
+ font-size: var(--font-size-badge);
34171
36405
  font-weight: var(--font-weight-semibold);
34172
36406
  font-variant-numeric: tabular-nums;
34173
36407
  line-height: 1;
@@ -34245,8 +36479,75 @@ svg.crewlet-select__chevron {
34245
36479
  border-left-color: var(--color-border-strong);
34246
36480
  }
34247
36481
 
36482
+ /*
36483
+ * THE DENSE LIST (`dense`): a list read in passing that runs long, a step
36484
+ * denser than the application's navigation.
36485
+ *
36486
+ * Its rows stand at the 24px target floor, the gutter is halved so a row's
36487
+ * highlight runs nearly from edge to edge (a long bar rather than a pill), and
36488
+ * the row's pad grows by exactly what the gutter gave up, so every glyph and
36489
+ * name stays on the line it was on, whatever the surface set the two tokens
36490
+ * to. The glyph column is as wide as a small face (an `Avatar` at `xs`), so a
36491
+ * face, a glyph and a group's count stand in one column and every name starts
36492
+ * on one line. Names are set in the regular weight, a step lighter than the
36493
+ * navigation's, which is what lets an unread row stand out by weight.
36494
+ */
36495
+ .crewlet-sidebar-nav--dense {
36496
+ --crewlet-nav-dense-pad: calc(var(--size-nav-row-pad) + var(--size-nav-gutter) - var(--spacing-1));
36497
+ --crewlet-nav-dense-slot: 20px;
36498
+ padding-right: var(--spacing-1);
36499
+ padding-left: var(--spacing-1);
36500
+ }
36501
+
36502
+ .crewlet-sidebar-nav--dense .crewlet-nav-item__row {
36503
+ min-height: var(--size-target-min);
36504
+ padding-right: var(--crewlet-nav-dense-pad);
36505
+ padding-left: var(--crewlet-nav-dense-pad);
36506
+ font-weight: var(--font-weight-regular);
36507
+ }
36508
+
36509
+ .crewlet-sidebar-nav--dense .crewlet-nav-group__head {
36510
+ padding-right: calc(var(--crewlet-nav-dense-pad) - (var(--size-target-min) - 14px) / 2);
36511
+ padding-left: var(--crewlet-nav-dense-pad);
36512
+ }
36513
+
36514
+ .crewlet-sidebar-nav--dense .crewlet-nav-item__icon {
36515
+ min-width: var(--crewlet-nav-dense-slot);
36516
+ }
36517
+
36518
+ .crewlet-sidebar-nav--dense .crewlet-nav-group__chevron {
36519
+ margin-right: calc((var(--crewlet-nav-dense-slot) - 12px) / 2);
36520
+ margin-left: calc((var(--crewlet-nav-dense-slot) - 12px) / 2);
36521
+ }
36522
+
36523
+ .crewlet-sidebar-nav--dense .crewlet-nav-item__children {
36524
+ margin-left: var(--crewlet-nav-dense-pad);
36525
+ padding-left: calc(var(--crewlet-nav-dense-slot) + var(--spacing-2) + var(--spacing-1) / 2 - var(--crewlet-nav-dense-pad) - 1px);
36526
+ }
36527
+
36528
+ /*
36529
+ * A ROW WITH NEWS (`unread`): its name a step heavier than its neighbours' and
36530
+ * in the primary ink, which is the whole of the signal in a dense list whose
36531
+ * names are regular. A muted row is never drawn unread (the component drops
36532
+ * the class), so the two rules never meet.
36533
+ */
36534
+ .crewlet-nav-item--unread > .crewlet-nav-item__head > .crewlet-nav-item__row {
36535
+ color: var(--color-text-primary);
36536
+ font-weight: var(--font-weight-medium);
36537
+ }
36538
+
36539
+ /*
36540
+ * A MUTED ROW rests in the quiet ink, glyph and name together, and lifts as
36541
+ * every row does: under the pointer, and while it is the row the reader is on.
36542
+ */
36543
+ .crewlet-nav-item--muted > .crewlet-nav-item__head > .crewlet-nav-item__row:not([aria-current]):not(:hover) {
36544
+ color: var(--color-text-tertiary);
36545
+ }
36546
+
34248
36547
  @media (prefers-reduced-motion: reduce) {
34249
36548
  .crewlet-nav-group__action,
36549
+ .crewlet-nav-group__toggle,
36550
+ .crewlet-nav-group__chevron,
34250
36551
  .crewlet-nav-item__row,
34251
36552
  .crewlet-nav-item__chevron {
34252
36553
  transition: none;
@@ -34264,7 +36565,7 @@ svg.crewlet-select__chevron {
34264
36565
  }
34265
36566
 
34266
36567
 
34267
- /* Skeleton-7ZA5ETJM.css */
36568
+ /* Skeleton-GIXV3KK5.css */
34268
36569
  /*
34269
36570
  * Skeleton, the loading placeholder, in eight shapes:
34270
36571
  * box One large rectangle with a sweeping glow, for a hero area.
@@ -34347,10 +36648,12 @@ svg.crewlet-select__chevron {
34347
36648
  .crewlet-skeleton__line--label { height: 13px; width: 40%; margin-bottom: var(--spacing-2); }
34348
36649
  .crewlet-skeleton__line--value { height: 14px; width: 80%; }
34349
36650
 
36651
+ /* A face's placeholder takes a face's shape, the rounded square every Avatar
36652
+ is drawn as: at 40px its corner is 8.9px, which the md step rounds to. */
34350
36653
  .crewlet-skeleton__avatar {
34351
36654
  width: 40px;
34352
36655
  height: 40px;
34353
- border-radius: var(--radius-circle);
36656
+ border-radius: var(--radius-md);
34354
36657
  flex-shrink: 0;
34355
36658
  }
34356
36659
 
@@ -38687,7 +40990,7 @@ b.crewlet-switcher__match {
38687
40990
  }
38688
40991
 
38689
40992
 
38690
- /* Tag-JTJVZM2D.css */
40993
+ /* Tag-WLDOROB5.css */
38691
40994
  /*
38692
40995
  * The tag: a small pill naming a state, a category or a value.
38693
40996
  *
@@ -38992,6 +41295,30 @@ b.crewlet-switcher__match {
38992
41295
  --crewlet-tag-ink: var(--color-text-tertiary);
38993
41296
  }
38994
41297
 
41298
+ /*
41299
+ * THE QUIET LABEL (`appearance="quiet"`): a seat's kind beside its name
41300
+ * ("Agent"), a small filled mark with no boundary, so it reads as part of the
41301
+ * name line rather than as a control. 16px tall with a step of room each side,
41302
+ * the xs corner rather than a pill's round ends, and the label register at the
41303
+ * regular weight. The neutral label sits on the soft fill under the secondary
41304
+ * ink; a tone keeps its own tint and ink. It takes no size step: these rules
41305
+ * come after the steps, at their specificity, so a step cannot reshape it.
41306
+ */
41307
+ .crewlet-tag--quiet {
41308
+ --crewlet-tag-height: calc(16px * var(--density, 1));
41309
+ --crewlet-tag-pad: var(--spacing-1);
41310
+ --crewlet-tag-edge: transparent;
41311
+ gap: var(--spacing-1);
41312
+ border-radius: var(--radius-xs);
41313
+ font-size: var(--font-size-2xs);
41314
+ font-weight: var(--font-weight-regular);
41315
+ }
41316
+
41317
+ .crewlet-tag--neutral.crewlet-tag--quiet {
41318
+ --crewlet-tag-fill: var(--color-fill-soft);
41319
+ --crewlet-tag-ink: var(--color-text-secondary);
41320
+ }
41321
+
38995
41322
  /* ── the interactive form ──────────────────────────────────────────────── */
38996
41323
 
38997
41324
  .crewlet-tag--actionable {
@@ -40117,9 +42444,9 @@ b.crewlet-switcher__match {
40117
42444
  }
40118
42445
 
40119
42446
 
40120
- /* ThinkingIndicator-JVF52N7L.css */
42447
+ /* ThinkingIndicator-S7ZL2C77.css */
40121
42448
  /*
40122
- * The assistant at work: the Assistant's mark, its spark turning, and a line
42449
+ * Ask Crewlet at work: the Ask Crewlet mark, its spark turning, and a line
40123
42450
  * of status under a shimmer. See ThinkingIndicator.tsx for why it replaces a
40124
42451
  * caret and how it is announced.
40125
42452
  */
@@ -40128,12 +42455,20 @@ b.crewlet-switcher__match {
40128
42455
  * ONE LINE OF PROSE TALL, at every state: the mark alone, the mark with a
40129
42456
  * status line, and the line changing from one step to the next all keep the
40130
42457
  * same height, so the thread never moves while the assistant works.
42458
+ *
42459
+ * NEVER WIDER THAN ITS COLUMN. The status never wraps, so where the
42460
+ * indicator is sized by its content (a flex column that starts its items on
42461
+ * the start edge, as a message's footer does) a long status made it as wide
42462
+ * as its words and widened the column with it, and a phone's transcript
42463
+ * scrolled sideways. Held to its container, the status truncates as it was
42464
+ * written to.
40131
42465
  */
40132
42466
  .crewlet-thinking {
40133
42467
  display: flex;
40134
42468
  align-items: center;
40135
42469
  gap: var(--spacing-2);
40136
42470
  min-width: 0;
42471
+ max-width: 100%;
40137
42472
  min-height: calc(var(--font-size-compact) * var(--font-line-height-relaxed));
40138
42473
  font-family: var(--font-family-sans);
40139
42474
  font-size: var(--font-size-compact);
@@ -40141,7 +42476,7 @@ b.crewlet-switcher__match {
40141
42476
  }
40142
42477
 
40143
42478
  /*
40144
- * THE SPARK TURNS A QUARTER, THEN RESTS. The Assistant's main spark
42479
+ * THE SPARK TURNS A QUARTER, THEN RESTS. The Ask Crewlet mark's main spark
40145
42480
  * (data-motion="turn") makes a quarter turn about its own centre while its
40146
42481
  * companion (data-motion="twinkle") dims and shrinks, both on one timeline of
40147
42482
  * --motion-duration-spark (1.6s). The gesture runs from 20% to 70% of the
@@ -40313,6 +42648,99 @@ b.crewlet-switcher__match {
40313
42648
  }
40314
42649
 
40315
42650
 
42651
+ /* ThreadSummary-AGR4NDMD.css */
42652
+ /*
42653
+ * The line under a message that has replies, and the working line under it.
42654
+ */
42655
+
42656
+ .crewlet-thread-summary-wrap {
42657
+ display: flex;
42658
+ flex-direction: column;
42659
+ align-items: flex-start;
42660
+ gap: var(--spacing-1);
42661
+ max-width: 100%;
42662
+ }
42663
+
42664
+ /* No piece is wider than the column: a long working line truncates. */
42665
+ .crewlet-thread-summary-wrap > * {
42666
+ max-width: 100%;
42667
+ }
42668
+
42669
+ /* The faces sit on the content edge: the line's 1px edge and its inset are
42670
+ taken back by the same amount outside it. */
42671
+ .crewlet-thread-summary {
42672
+ --crewlet-thread-summary-inset: var(--spacing-1);
42673
+ display: inline-flex;
42674
+ align-items: center;
42675
+ gap: var(--spacing-2);
42676
+ max-width: 100%;
42677
+ height: var(--size-control-md);
42678
+ box-sizing: border-box;
42679
+ margin-inline-start: calc((var(--crewlet-thread-summary-inset) + 1px) * -1);
42680
+ padding: 0 var(--crewlet-thread-summary-inset);
42681
+ border: 1px solid transparent;
42682
+ border-radius: var(--radius-sm);
42683
+ background: transparent;
42684
+ color: var(--color-text-secondary);
42685
+ font: inherit;
42686
+ font-size: var(--font-size-compact);
42687
+ line-height: 1;
42688
+ text-align: start;
42689
+ cursor: pointer;
42690
+ }
42691
+
42692
+ /* Lifted onto the transcript's own ground inside a hairline, under the
42693
+ pointer or the keyboard, and while the thread is open. */
42694
+ .crewlet-thread-summary:is(:hover, :focus-visible, .is-open) {
42695
+ border-color: var(--color-edge-hairline);
42696
+ background: var(--crewlet-chat-ground);
42697
+ }
42698
+
42699
+ .crewlet-thread-summary:focus-visible {
42700
+ outline: 2px solid var(--color-focus);
42701
+ outline-offset: var(--size-focus-ring-inset-offset);
42702
+ }
42703
+
42704
+ .crewlet-thread-summary__count {
42705
+ color: var(--color-brand-accent-ink);
42706
+ font-weight: var(--font-weight-medium);
42707
+ white-space: nowrap;
42708
+ }
42709
+
42710
+ /* "Last reply 1h ago" and "View thread" share one cell, so the line keeps
42711
+ its width when one gives way to the other under the pointer. */
42712
+ .crewlet-thread-summary__tail {
42713
+ display: inline-grid;
42714
+ min-width: 0;
42715
+ padding-inline-end: var(--spacing-1);
42716
+ white-space: nowrap;
42717
+ }
42718
+
42719
+ .crewlet-thread-summary__last,
42720
+ .crewlet-thread-summary__view {
42721
+ grid-area: 1 / 1;
42722
+ }
42723
+
42724
+ .crewlet-thread-summary__last {
42725
+ color: var(--color-text-tertiary);
42726
+ }
42727
+
42728
+ .crewlet-thread-summary__view {
42729
+ justify-self: end;
42730
+ visibility: hidden;
42731
+ color: var(--color-text-secondary);
42732
+ font-weight: var(--font-weight-regular);
42733
+ }
42734
+
42735
+ .crewlet-thread-summary:is(:hover, :focus-visible, .is-open) .crewlet-thread-summary__last {
42736
+ visibility: hidden;
42737
+ }
42738
+
42739
+ .crewlet-thread-summary:is(:hover, :focus-visible, .is-open) .crewlet-thread-summary__view {
42740
+ visibility: visible;
42741
+ }
42742
+
42743
+
40316
42744
  /* TileGrid-XOEJ4P52.css */
40317
42745
  /*
40318
42746
  * TileGrid: tiles on a fixed track count that folds by the grid's own width.