@crewlethq/ui 0.81.2 → 0.83.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 (410) hide show
  1. package/README.md +89 -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 +19 -1
  13. package/dist/AppShell/AppShell.d.ts +62 -4
  14. package/dist/AppShell/index.d.ts +1 -1
  15. package/dist/AppShell/index.js +12 -6
  16. package/dist/AppShell/railMotion.d.ts +60 -0
  17. package/dist/AppShell/railShape.d.ts +22 -0
  18. package/dist/{AppShell-2IBUS4TH.css → AppShell-U7D2MUUF.css} +291 -20
  19. package/dist/ArrangeFrame/index.js +2 -2
  20. package/dist/ArrangeGroup/index.js +2 -2
  21. package/dist/ArrangeList/index.js +8 -7
  22. package/dist/ArtifactBar/index.js +13 -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 +13 -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 +8 -6
  46. package/dist/CanvasBoard/index.js +11 -9
  47. package/dist/CanvasToolbar/index.js +10 -8
  48. package/dist/Card/index.js +2 -2
  49. package/dist/ChangeList/index.js +5 -5
  50. package/dist/ChangeMark/index.js +6 -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 +2 -2
  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 +12 -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 +9 -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 +7 -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 +11 -10
  96. package/dist/DataView/index.js +18 -17
  97. package/dist/DatasetSource/index.js +3 -3
  98. package/dist/DateTimePicker/index.js +6 -5
  99. package/dist/DeepWorkCard/index.js +9 -9
  100. package/dist/Disclosure/index.js +3 -3
  101. package/dist/DocTabsEditor/index.js +11 -9
  102. package/dist/DockColumn/DockColumn.d.ts +68 -0
  103. package/dist/DockColumn/index.d.ts +3 -0
  104. package/dist/DockColumn/index.js +6 -0
  105. package/dist/DockColumn-SMJCXHS4.css +61 -0
  106. package/dist/Document/index.js +2 -2
  107. package/dist/EditingStatus/index.js +2 -2
  108. package/dist/{Editor-IMYESOW7.js → Editor-5D5Z3LBQ.js} +9 -8
  109. package/dist/EmojiPicker/EmojiPicker.d.ts +51 -0
  110. package/dist/EmojiPicker/emoji.d.ts +24 -0
  111. package/dist/EmojiPicker/index.d.ts +5 -0
  112. package/dist/EmojiPicker/index.js +15 -0
  113. package/dist/EmojiPicker-FMWYN2WX.css +63 -0
  114. package/dist/EntityChip/index.js +3 -3
  115. package/dist/EntityList/index.js +6 -6
  116. package/dist/FactList/index.js +6 -4
  117. package/dist/FolderTile/index.js +3 -3
  118. package/dist/FollowBanner/index.js +4 -4
  119. package/dist/HuePicker/index.js +9 -8
  120. package/dist/ImageUpload/ImageUpload.d.ts +6 -7
  121. package/dist/ImageUpload/index.js +3 -3
  122. package/dist/{ImageUpload-OWI7CCG7.css → ImageUpload-IFXZROFZ.css} +6 -37
  123. package/dist/InlineEditor/index.js +7 -7
  124. package/dist/Input/index.js +4 -4
  125. package/dist/Kbd/Kbd.d.ts +9 -0
  126. package/dist/Kbd/index.d.ts +1 -1
  127. package/dist/Kbd/index.js +1 -1
  128. package/dist/Layer/index.js +2 -2
  129. package/dist/LinkCard/LinkCard.d.ts +64 -0
  130. package/dist/LinkCard/index.d.ts +5 -0
  131. package/dist/LinkCard/index.js +5 -0
  132. package/dist/LinkCard-5I4MYU6I.css +155 -0
  133. package/dist/LinkInterstitial/index.js +7 -6
  134. package/dist/ListInput/index.js +10 -9
  135. package/dist/Listbox/index.js +3 -3
  136. package/dist/LogoSlot/index.js +3 -3
  137. package/dist/MarkdownEditor/format.d.ts +9 -1
  138. package/dist/MarkdownEditor/index.d.ts +2 -2
  139. package/dist/MarkdownEditor/index.js +10 -9
  140. package/dist/MediaMatch/index.d.ts +1 -1
  141. package/dist/MediaMatch/index.js +1 -1
  142. package/dist/MediaMatch/useMediaMatch.d.ts +14 -0
  143. package/dist/MentionChip/MentionChip.d.ts +25 -0
  144. package/dist/MentionChip/index.d.ts +3 -0
  145. package/dist/MentionChip/index.js +2 -0
  146. package/dist/MentionChip-W7MZZVRZ.css +42 -0
  147. package/dist/MentionMenu/MentionMenu.d.ts +82 -0
  148. package/dist/MentionMenu/index.d.ts +4 -0
  149. package/dist/MentionMenu/index.js +3 -0
  150. package/dist/MentionMenu-4NAQ45S4.css +65 -0
  151. package/dist/Menu/index.js +5 -4
  152. package/dist/MergeConflicts/index.js +9 -8
  153. package/dist/MessageActions/MessageActions.d.ts +58 -0
  154. package/dist/MessageActions/index.d.ts +4 -0
  155. package/dist/MessageActions/index.js +18 -0
  156. package/dist/MessageActions-Q4F5UH3S.css +73 -0
  157. package/dist/Modal/Modal.d.ts +12 -0
  158. package/dist/Modal/index.js +6 -5
  159. package/dist/{Modal-FYQYEI3N.css → Modal-GKUOO7PZ.css} +26 -1
  160. package/dist/OpenInAppCard/index.js +8 -8
  161. package/dist/OrgLabel/index.js +3 -3
  162. package/dist/OrgNode/index.js +4 -4
  163. package/dist/OrgTable/index.js +7 -7
  164. package/dist/Outline/index.js +2 -1
  165. package/dist/PeekRail/index.js +1 -1
  166. package/dist/PeopleRail/index.js +4 -4
  167. package/dist/PersonRow/PersonRow.d.ts +70 -0
  168. package/dist/PersonRow/index.d.ts +3 -0
  169. package/dist/PersonRow/index.js +2 -0
  170. package/dist/PersonRow-V5GTPNVP.css +161 -0
  171. package/dist/Popover/index.js +4 -3
  172. package/dist/Presence/index.d.ts +2 -0
  173. package/dist/Presence/index.js +4 -0
  174. package/dist/Presence/usePresence.d.ts +109 -0
  175. package/dist/PresenceStack/index.js +3 -3
  176. package/dist/{PresenceStack-ZV67BH4V.css → PresenceStack-2DTYRADY.css} +4 -6
  177. package/dist/PresenterView/index.js +5 -5
  178. package/dist/PricingCard/index.js +2 -2
  179. package/dist/Principal/index.js +3 -3
  180. package/dist/PrincipalPicker/index.js +11 -11
  181. package/dist/ProposalCard/index.js +15 -15
  182. package/dist/ReactionBar/ReactionBar.d.ts +84 -0
  183. package/dist/ReactionBar/index.d.ts +4 -0
  184. package/dist/ReactionBar/index.js +17 -0
  185. package/dist/ReactionBar-XXI4V7XG.css +93 -0
  186. package/dist/RecordChip/index.js +5 -4
  187. package/dist/RefusalCard/index.js +6 -6
  188. package/dist/RelatedRow/index.js +3 -3
  189. package/dist/Reorder/index.js +2 -1
  190. package/dist/ResultTableCard/index.js +7 -7
  191. package/dist/ReviewList/index.js +2 -2
  192. package/dist/RichEditor/index.js +2 -2
  193. package/dist/RunChip/index.js +5 -5
  194. package/dist/SandboxedFrame/index.js +2 -2
  195. package/dist/SectionFrame/index.js +2 -2
  196. package/dist/SegmentedControl/index.js +8 -7
  197. package/dist/Select/index.js +4 -4
  198. package/dist/SelectionBar/index.js +6 -6
  199. package/dist/SetupWizard/index.js +6 -6
  200. package/dist/ShareDialog/index.js +13 -12
  201. package/dist/SheetColumnEditor/index.js +17 -16
  202. package/dist/SheetGrid/index.js +14 -12
  203. package/dist/Shortcut/index.js +3 -3
  204. package/dist/SidePanel/SidePanel.d.ts +8 -1
  205. package/dist/SidePanel/SidePanelBase.d.ts +3 -1
  206. package/dist/SidePanel/index.js +5 -5
  207. package/dist/{SidePanel-VXKUKLOJ.css → SidePanel-BKWT6Q6Z.css} +36 -0
  208. package/dist/SidebarNav/SidebarNav.d.ts +52 -3
  209. package/dist/SidebarNav/index.js +1 -1
  210. package/dist/{SidebarNav-VTQ3G4AE.css → SidebarNav-E7PZGGA6.css} +132 -7
  211. package/dist/Skeleton/index.js +1 -1
  212. package/dist/{Skeleton-7ZA5ETJM.css → Skeleton-GIXV3KK5.css} +3 -1
  213. package/dist/SlideCompare/index.js +5 -5
  214. package/dist/SlideFilmstrip/index.js +11 -9
  215. package/dist/SlideGrid/index.js +4 -4
  216. package/dist/SlideStage/index.js +3 -3
  217. package/dist/SourceEditor/index.js +2 -2
  218. package/dist/StatusCard/index.js +5 -5
  219. package/dist/Switcher/index.js +13 -12
  220. package/dist/TableCells/index.js +5 -5
  221. package/dist/Tabs/index.js +7 -6
  222. package/dist/Tag/Tag.d.ts +9 -2
  223. package/dist/Tag/index.js +1 -1
  224. package/dist/{Tag-JTJVZM2D.css → Tag-WLDOROB5.css} +24 -0
  225. package/dist/TagsInput/index.js +6 -6
  226. package/dist/ThemeGallery/index.js +5 -5
  227. package/dist/ThemeSwitcher/index.js +9 -8
  228. package/dist/ThinkingIndicator/index.js +1 -1
  229. package/dist/{ThinkingIndicator-JMK2TNMZ.css → ThinkingIndicator-S7ZL2C77.css} +8 -0
  230. package/dist/ThreadSummary/ThreadSummary.d.ts +43 -0
  231. package/dist/ThreadSummary/index.d.ts +4 -0
  232. package/dist/ThreadSummary/index.js +6 -0
  233. package/dist/ThreadSummary-AGR4NDMD.css +90 -0
  234. package/dist/TimeRangePicker/index.js +13 -12
  235. package/dist/TimeWindowPicker/index.js +11 -10
  236. package/dist/Toaster/index.js +2 -2
  237. package/dist/Toolbar/index.js +3 -3
  238. package/dist/Tooltip/Tooltip.d.ts +30 -3
  239. package/dist/Tooltip/index.js +5 -3
  240. package/dist/TreeCanvas/index.js +10 -7
  241. package/dist/TreeGrid/index.js +3 -3
  242. package/dist/ValueField/index.js +9 -9
  243. package/dist/VersionCompare/index.js +10 -9
  244. package/dist/VersionTimeline/index.js +4 -4
  245. package/dist/WidgetFrame/index.js +2 -2
  246. package/dist/{chunk-LOWQK2PB.js → chunk-22CU7V4J.js} +4 -4
  247. package/dist/{chunk-WCDPFTJZ.js → chunk-25JQNHTC.js} +92 -28
  248. package/dist/{chunk-6LXS3X7A.js → chunk-2L4WHYMT.js} +1 -1
  249. package/dist/{chunk-6G6WHTC7.js → chunk-2O5CMV76.js} +1 -1
  250. package/dist/{chunk-FQI62PIZ.js → chunk-2SVQBQAD.js} +2 -2
  251. package/dist/{chunk-7PJFUQMY.js → chunk-2ZSCHQOA.js} +1 -1
  252. package/dist/chunk-3BRXEMYT.js +46 -0
  253. package/dist/{chunk-H22SR76M.js → chunk-3H6OZUZ3.js} +1 -1
  254. package/dist/{chunk-VK45YJLH.js → chunk-3IWZVEXA.js} +2 -2
  255. package/dist/{chunk-2STOSJT3.js → chunk-46FIBJCV.js} +7 -7
  256. package/dist/chunk-4DEKONVJ.js +87 -0
  257. package/dist/{chunk-NUZHC6MM.js → chunk-4ITETIGZ.js} +12 -1
  258. package/dist/{chunk-73GUXYYE.js → chunk-5AHNW5CP.js} +1 -1
  259. package/dist/{chunk-FFGEJUAP.js → chunk-5ILRWUE7.js} +2 -2
  260. package/dist/chunk-5JPOFAVN.js +58 -0
  261. package/dist/{chunk-S5QJZOPL.js → chunk-5K5SZGBI.js} +1 -1
  262. package/dist/{chunk-YB64PWIN.js → chunk-5V6GW6HK.js} +1 -1
  263. package/dist/{chunk-LM6VYJTV.js → chunk-5YXMKZUA.js} +1 -1
  264. package/dist/{chunk-5XBNJNSO.js → chunk-65RFU7LF.js} +1 -1
  265. package/dist/{chunk-7MGXHCVK.js → chunk-6M2N6ETA.js} +1 -1
  266. package/dist/{chunk-OWHETZIU.js → chunk-6SFDL4QH.js} +1 -1
  267. package/dist/{chunk-WK4FQPYW.js → chunk-77VOASOY.js} +5 -5
  268. package/dist/{chunk-UYF2B2TH.js → chunk-7ELFH3RJ.js} +1 -1
  269. package/dist/{chunk-HPI5J6AR.js → chunk-7K6LVM5I.js} +2 -2
  270. package/dist/{chunk-YQDRJZ5J.js → chunk-7M7WKYOV.js} +8 -8
  271. package/dist/{chunk-A5YKNRG6.js → chunk-7QCSISHM.js} +2 -1
  272. package/dist/{chunk-CYYBE2MM.js → chunk-7U6PK242.js} +1 -1
  273. package/dist/{chunk-I33UIUZD.js → chunk-7ZSEUO5Q.js} +51 -40
  274. package/dist/{chunk-LCZULGMB.js → chunk-ABRWL5FJ.js} +2 -2
  275. package/dist/{chunk-VG3SIJ3M.js → chunk-AFLS26AC.js} +2 -2
  276. package/dist/{chunk-4XF7ENQA.js → chunk-AOJ6ZA77.js} +2 -2
  277. package/dist/{chunk-Q2T4L6ML.js → chunk-AQNP3KQU.js} +5 -5
  278. package/dist/{chunk-6X5PGHEX.js → chunk-AUSFKGKL.js} +2 -2
  279. package/dist/{chunk-6R334YT3.js → chunk-AZYE7NR4.js} +2 -2
  280. package/dist/{chunk-WKKWF277.js → chunk-BN5FEJL5.js} +2 -2
  281. package/dist/{chunk-MPVMB2DV.js → chunk-BVML4UVB.js} +3 -2
  282. package/dist/{chunk-EAIOXW2W.js → chunk-BXGBGYKH.js} +8 -14
  283. package/dist/chunk-C4256UXE.js +21 -0
  284. package/dist/{chunk-2FMBZCFR.js → chunk-C42XW5YP.js} +1 -1
  285. package/dist/{chunk-4MRFLHJC.js → chunk-C46DDVTK.js} +1 -1
  286. package/dist/{chunk-5BOFC5OP.js → chunk-CF4M6N6A.js} +20 -4
  287. package/dist/{chunk-ANTAQAR4.js → chunk-CMAZZY2I.js} +7 -1
  288. package/dist/{chunk-3JXX5S3Z.js → chunk-CV2LU2T2.js} +2 -2
  289. package/dist/{chunk-MLDTLZAO.js → chunk-D2GT3CR4.js} +3 -3
  290. package/dist/{chunk-57AKYFML.js → chunk-DD7RBNT4.js} +3 -3
  291. package/dist/{chunk-KL6A7JGH.js → chunk-DRFOTWJE.js} +2 -2
  292. package/dist/{chunk-MUFBHVCT.js → chunk-DWQYV5AV.js} +2 -2
  293. package/dist/{chunk-CNEHFH2A.js → chunk-EAHEJNVJ.js} +1 -1
  294. package/dist/chunk-EALRMP7N.js +69 -0
  295. package/dist/{chunk-E35HYQMK.js → chunk-EBVZHVPD.js} +12 -5
  296. package/dist/{chunk-KHJIEPZV.js → chunk-EC6EUIAD.js} +9 -6
  297. package/dist/{chunk-XNNY27SC.js → chunk-ED4A6Q24.js} +1 -1
  298. package/dist/{chunk-6LN64KGG.js → chunk-F7HZYTZT.js} +6 -3
  299. package/dist/{chunk-RTMNULTL.js → chunk-FLW5U7YS.js} +2 -2
  300. package/dist/{chunk-JQEXAH7G.js → chunk-FPU7AA3X.js} +5 -16
  301. package/dist/{chunk-GHQG4VZA.js → chunk-G3CACE5L.js} +3 -3
  302. package/dist/{chunk-JMTBK55P.js → chunk-G4EHZHKM.js} +2 -2
  303. package/dist/{chunk-45M73G5A.js → chunk-GLKQHN7G.js} +5 -5
  304. package/dist/{chunk-N2BF272H.js → chunk-HF5L56YQ.js} +1 -1
  305. package/dist/chunk-HTBTAIH6.js +37 -0
  306. package/dist/chunk-HTS5RJ7S.js +6 -0
  307. package/dist/{chunk-BRLZXYPA.js → chunk-I4IUX3JF.js} +1 -1
  308. package/dist/{chunk-BXCL6P5Z.js → chunk-I4PBFJGX.js} +1 -1
  309. package/dist/{chunk-ADGNISEI.js → chunk-IAP7APOX.js} +5 -5
  310. package/dist/chunk-ICE3D63E.js +384 -0
  311. package/dist/{chunk-BT3GB7HC.js → chunk-IRONPJB4.js} +3 -3
  312. package/dist/chunk-IUBOLGHG.js +140 -0
  313. package/dist/chunk-JLOESTT2.js +10 -0
  314. package/dist/{chunk-5EFLA6BW.js → chunk-K6RWEQ6P.js} +2 -2
  315. package/dist/{chunk-ZQEJSEPS.js → chunk-K6Y6CDEZ.js} +2 -2
  316. package/dist/chunk-K774LUN3.js +20 -0
  317. package/dist/{chunk-7KBNFFM3.js → chunk-KXWJJWBD.js} +6 -3
  318. package/dist/{chunk-53J2YNQA.js → chunk-L5VU3LZT.js} +1 -1
  319. package/dist/chunk-L72URIHR.js +36 -0
  320. package/dist/{chunk-VERJCAJ4.js → chunk-LBGKLYBY.js} +1 -1
  321. package/dist/{chunk-PRN5IP2R.js → chunk-LMEMH6DO.js} +1 -1
  322. package/dist/{chunk-I22MUEG7.js → chunk-LNQSNXGJ.js} +1 -1
  323. package/dist/chunk-LT44RL62.js +50 -0
  324. package/dist/{chunk-222VILSP.js → chunk-LVJGN5II.js} +1 -1
  325. package/dist/{chunk-AYHIF6DH.js → chunk-LZNPL266.js} +1 -1
  326. package/dist/{chunk-R45VM5EX.js → chunk-MMV7NEAC.js} +1 -1
  327. package/dist/{chunk-2IIHMJMZ.js → chunk-MVKUE4FI.js} +2 -2
  328. package/dist/{chunk-37U3Z65B.js → chunk-MVMVMHYI.js} +1 -1
  329. package/dist/{chunk-JD7P2GJP.js → chunk-MYAARF4Z.js} +1 -1
  330. package/dist/{chunk-OBPINJNO.js → chunk-NCUSI4ZU.js} +3 -3
  331. package/dist/{chunk-NKBKQEKS.js → chunk-NFXCJGHG.js} +1 -1
  332. package/dist/{chunk-OZAZHM55.js → chunk-NKBKHOMU.js} +1 -1
  333. package/dist/{chunk-MGQKF7GK.js → chunk-NN475NAP.js} +1 -1
  334. package/dist/{chunk-6EWNMSS4.js → chunk-NNZRTR5M.js} +2 -2
  335. package/dist/{chunk-JT7WRPZ6.js → chunk-NTRKC2JV.js} +1 -1
  336. package/dist/{chunk-63GBSOLU.js → chunk-NXBCAXP5.js} +2 -2
  337. package/dist/{chunk-NR4CPM4T.js → chunk-NXFTCPF6.js} +1 -1
  338. package/dist/chunk-O3MYBNRO.js +80 -0
  339. package/dist/{chunk-RMEBFYL7.js → chunk-O6EV6GKI.js} +1 -1
  340. package/dist/{chunk-YL7AR6PR.js → chunk-O7KG4CXB.js} +3 -3
  341. package/dist/{chunk-FB3TCNQP.js → chunk-O7N6W52M.js} +3 -3
  342. package/dist/chunk-ONHYFU7D.js +25 -0
  343. package/dist/{chunk-T24HBEU6.js → chunk-OOOVL77Y.js} +1 -1
  344. package/dist/{chunk-BLGBD2D2.js → chunk-P7HMY3BQ.js} +4 -4
  345. package/dist/chunk-PCAT2EFB.js +104 -0
  346. package/dist/{chunk-TPIMOGOZ.js → chunk-PEBQMX5X.js} +1 -1
  347. package/dist/{chunk-UY3FWQWG.js → chunk-PGBKZSSQ.js} +201 -22
  348. package/dist/{chunk-4TMBAOXK.js → chunk-PW57R4BN.js} +1 -1
  349. package/dist/chunk-PX5BOALQ.js +13 -0
  350. package/dist/{chunk-CFTBESST.js → chunk-Q6TCUSQA.js} +2 -2
  351. package/dist/{chunk-ZWXHTXZO.js → chunk-QGEDXYLB.js} +2 -2
  352. package/dist/{chunk-ZKLEAK7M.js → chunk-QM3432PH.js} +7 -7
  353. package/dist/{chunk-WTXCK46H.js → chunk-R2QBQ6NO.js} +1 -1
  354. package/dist/{chunk-Z6JKZI4E.js → chunk-RBQRTGXX.js} +1 -1
  355. package/dist/{chunk-TJIBTHWJ.js → chunk-RDIQB5ZE.js} +3 -3
  356. package/dist/{chunk-TPCBPGSB.js → chunk-RO5JU6SN.js} +4 -4
  357. package/dist/{chunk-O222F2IX.js → chunk-SGMWLUYQ.js} +6 -6
  358. package/dist/{chunk-HEA6TERQ.js → chunk-SHH7UD5U.js} +1 -1
  359. package/dist/{chunk-CLJGFOTV.js → chunk-SKGOKLJD.js} +31 -18
  360. package/dist/{chunk-CSXJIIO4.js → chunk-SNQ7PH3D.js} +1 -1
  361. package/dist/chunk-SPNTUQBV.js +244 -0
  362. package/dist/{chunk-RIAPCEB5.js → chunk-T3S3D4FC.js} +5 -5
  363. package/dist/chunk-TDFLCUBE.js +6 -0
  364. package/dist/{chunk-OQG4P5KU.js → chunk-TGGYSQRD.js} +5 -6
  365. package/dist/{chunk-7FF6CZW5.js → chunk-TQKQRS2J.js} +36 -8
  366. package/dist/chunk-TRXTO3WC.js +114 -0
  367. package/dist/{chunk-H5XTJ7GJ.js → chunk-TUEM2XIW.js} +1 -1
  368. package/dist/{chunk-4AUTALJA.js → chunk-U2IQNDDR.js} +1 -1
  369. package/dist/{chunk-IVTQWOXV.js → chunk-ULYHDP7U.js} +1 -1
  370. package/dist/{chunk-DGSK4LLS.js → chunk-V6WDJUYK.js} +1 -1
  371. package/dist/{chunk-Z2MZTI3H.js → chunk-VB3FVKNI.js} +1 -1
  372. package/dist/{chunk-R5OATXWU.js → chunk-VONEKR3J.js} +38 -15
  373. package/dist/{chunk-CZQ7UITX.js → chunk-WANKINXG.js} +3 -3
  374. package/dist/{chunk-HQOEAUDJ.js → chunk-WMO722J2.js} +2 -2
  375. package/dist/{chunk-D7G2QGET.js → chunk-X3US25XJ.js} +1 -1
  376. package/dist/{chunk-GPFYITOF.js → chunk-X7VZQKIW.js} +1 -1
  377. package/dist/{chunk-L4HHWG4V.js → chunk-XA2QKGBJ.js} +3 -3
  378. package/dist/{chunk-DV5L2GRY.js → chunk-XJMES7AE.js} +1 -1
  379. package/dist/{chunk-5NJMSYDZ.js → chunk-XNC3M4IN.js} +1 -1
  380. package/dist/{chunk-B2YSFWUG.js → chunk-XRWHDW6F.js} +9 -9
  381. package/dist/{chunk-TKUAGWNR.js → chunk-XTJHMP3W.js} +2 -2
  382. package/dist/{chunk-KTIQSSME.js → chunk-XZY6S3UC.js} +6 -3
  383. package/dist/{chunk-7KHM2FZH.js → chunk-YGRTX67J.js} +1 -1
  384. package/dist/{chunk-RTPQDNW3.js → chunk-YJQXESOJ.js} +5 -1
  385. package/dist/chunk-YP2FS6SH.js +54 -0
  386. package/dist/{chunk-LMQG3VPG.js → chunk-YQ7Q52XU.js} +1 -1
  387. package/dist/{chunk-G4CGDUCP.js → chunk-YRNNUCQP.js} +1 -1
  388. package/dist/{chunk-5CEQ3HLH.js → chunk-YXKSUILG.js} +6 -6
  389. package/dist/{chunk-NHLNHH4J.js → chunk-ZB3E2Z4Y.js} +1 -1
  390. package/dist/{chunk-IL3XLDW7.js → chunk-ZDWAIVWL.js} +1 -1
  391. package/dist/{chunk-SNIPM6K7.js → chunk-ZJVLGYE3.js} +3 -3
  392. package/dist/{chunk-BFM5G2Z6.js → chunk-ZPTKAYJK.js} +1 -1
  393. package/dist/{chunk-2PIH6JHJ.js → chunk-ZXTDWTXS.js} +1 -1
  394. package/dist/{chunk-C667GCU7.js → chunk-ZXXZESCD.js} +9 -7
  395. package/dist/generated/index.d.ts +17 -0
  396. package/dist/generated/index.js +184 -163
  397. package/dist/index.js +184 -163
  398. package/dist/styles.css +2769 -156
  399. package/dist/utils/composedRef.d.ts +39 -0
  400. package/dist/utils/focusModality.d.ts +14 -0
  401. package/dist/utils/heldHint.d.ts +6 -0
  402. package/dist/utils/index.d.ts +3 -1
  403. package/dist/utils/index.js +4 -2
  404. package/dist/utils/tokenMs.d.ts +6 -0
  405. package/package.json +5 -5
  406. package/dist/ArtifactKinds-O3CALPVX.css +0 -16
  407. package/dist/{chunk-PLNJEDGI.js → chunk-I4IO56EY.js} +1 -1
  408. package/dist/{chunk-FEJANUZK.js → chunk-KBSD476L.js} +0 -0
  409. package/dist/{chunk-624X3RVA.js → chunk-O55JQ7BE.js} +1 -1
  410. /package/dist/{chunk-CDFQ7MQK.js → chunk-REEZQCML.js} +0 -0
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-U7D2MUUF.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.
@@ -784,30 +974,40 @@
784
974
  --crewlet-app-shell-rail: var(--size-shell-rail);
785
975
  --crewlet-app-shell-topbar: var(--size-shell-topbar);
786
976
  /* What stands on the frame to the sheet's left: the rail's column, or
787
- nothing where there is no rail or the rail is a drawer. The aside's cap
788
- below subtracts it, so it is one name for both. */
977
+ nothing where there is no rail or the rail is a drawer. */
789
978
  --crewlet-app-shell-beside: var(--crewlet-app-shell-rail);
790
- /* THE ASIDE'S TRACK, while it is a column: the panel's width and the inset
791
- it is held off the window's edge by, capped so the sheet keeps the
792
- host's floor (`--crewlet-app-shell-aside-reserve`, the page's sheet with
793
- its own inset and hairlines). The host publishes both widths on this
794
- element; with no reserve the panel takes the width it was given. */
795
- --crewlet-app-shell-aside-track: calc(
796
- min(
797
- var(--crewlet-app-shell-aside),
798
- max(
799
- 0px,
800
- 100% - var(--crewlet-app-shell-beside) - var(--crewlet-app-shell-aside-reserve, 0px) - var(--size-shell-inset)
801
- )
802
- ) +
803
- var(--size-shell-inset)
979
+ /*
980
+ * THE ASIDE'S TRACK, while it is a column: the inset it is held off the
981
+ * window's edge by at least, and the panel's width and that inset at most.
982
+ * THE CAP IS THE GRID'S. The page's sheet takes the host's floor as its
983
+ * own track's minimum (`--crewlet-app-shell-aside-reserve`, the page's sheet
984
+ * with its own inset and hairlines), and the grid hands the aside what is
985
+ * left once the rail and that floor have theirs, up to its width. The rail's
986
+ * track is the rail's live width, so while the rail eases between its
987
+ * shapes the cap eases with it: a cap computed from the rail's VARIABLE
988
+ * named the shape drawn, and jumped at both ends of a fold. With no reserve
989
+ * the panel takes the width it was given, as far as the window holds it.
990
+ */
991
+ --crewlet-app-shell-aside-track: minmax(
992
+ var(--size-shell-inset),
993
+ calc(var(--crewlet-app-shell-aside) + var(--size-shell-inset))
994
+ );
995
+ /* The page's floor beside an aside column, never more than the window
996
+ leaves it: on a window too narrow for the floor, the page gives way rather
997
+ than the shell growing past the window's edge. */
998
+ --crewlet-app-shell-sheet-floor: min(
999
+ var(--crewlet-app-shell-aside-reserve, 0px),
1000
+ max(0px, 100% - var(--crewlet-app-shell-beside) - var(--size-shell-inset))
804
1001
  );
805
1002
  /* Where the drawer's veil sits while it is open. The shell replaces it with
806
1003
  the surface's own place in the layer band; this default only has to clear
807
1004
  the page chrome for the moment before that lands. */
808
1005
  --crewlet-app-shell-drawer-z: var(--z-index-overlay);
809
1006
  display: grid;
810
- grid-template-columns: var(--crewlet-app-shell-rail) minmax(0, 1fr);
1007
+ /* The rail's track is the rail's own width (`auto`), and the rail takes
1008
+ `--crewlet-app-shell-rail` itself, so the track follows it while it eases
1009
+ between its two shapes (see the rail's motion, below). */
1010
+ grid-template-columns: auto minmax(0, 1fr);
811
1011
  /* One row, the viewport's height less nothing: the sheet's own margin is
812
1012
  what holds it off the frame's edges, and a row sized by its content would
813
1013
  let a tall screen push the sheet's bottom edge off the window. */
@@ -846,11 +1046,11 @@
846
1046
  keeps its column and is only narrower, so nothing under the bar moves but
847
1047
  its end edge. */
848
1048
  .crewlet-app-shell[data-aside='column'] {
849
- grid-template-columns: var(--crewlet-app-shell-rail) minmax(0, 1fr) var(--crewlet-app-shell-aside-track);
1049
+ grid-template-columns: auto minmax(var(--crewlet-app-shell-sheet-floor), 1fr) var(--crewlet-app-shell-aside-track);
850
1050
  }
851
1051
 
852
1052
  .crewlet-app-shell--no-rail[data-aside='column'] {
853
- grid-template-columns: minmax(0, 1fr) var(--crewlet-app-shell-aside-track);
1053
+ grid-template-columns: minmax(var(--crewlet-app-shell-sheet-floor), 1fr) var(--crewlet-app-shell-aside-track);
854
1054
  }
855
1055
 
856
1056
  /* The skip link, drawn only while it holds focus, over everything. */
@@ -890,16 +1090,31 @@
890
1090
  * run the height of the window parallel to it, eight pixels off.
891
1091
  */
892
1092
  .crewlet-app-shell__rail {
1093
+ /* The fold control's containing block. Re-declared as `fixed` by the
1094
+ narrow block below, which comes later at the same weight, so the drawer
1095
+ keeps its layer. */
1096
+ position: relative;
893
1097
  display: flex;
894
1098
  flex-direction: column;
1099
+ width: var(--crewlet-app-shell-rail);
895
1100
  min-height: 0;
896
1101
  min-width: 0;
1102
+ /* THE MOVING EDGE CUTS WHAT IT PASSES. While the rail eases between its
1103
+ shapes its content keeps the width of the shape drawn (below), and the
1104
+ edge clips it rather than squeezing it. Across only: a ring or a badge
1105
+ at a row's top or bottom is never cut. */
1106
+ overflow-x: clip;
897
1107
  background: var(--color-surface-frame);
1108
+ transition: width var(--motion-duration-slow) var(--motion-easing-emphasized);
898
1109
  }
899
1110
 
1111
+ /* THE CONTENT IS LAID OUT AT ITS SHAPE'S WIDTH, never at a width between the
1112
+ two, so no word in the rail rewraps while it moves and nothing drifts with
1113
+ the edge: the column stands still and the edge travels over it. */
900
1114
  .crewlet-app-shell__rail-inner {
901
1115
  display: flex;
902
1116
  flex-direction: column;
1117
+ width: var(--crewlet-app-shell-rail);
903
1118
  min-height: 0;
904
1119
  height: 100%;
905
1120
  }
@@ -1475,6 +1690,24 @@
1475
1690
  height: 100%;
1476
1691
  }
1477
1692
 
1693
+ /*
1694
+ * A FLUSH SCREEN draws its own frame to the sheet's edges: the column gives up
1695
+ * its pad, its measure and its gap, and the scroller reserves no gutter, since
1696
+ * nothing in it scrolls and a strip at its end would cut the screen's own
1697
+ * edge. The column is the containing block for a `LayerHost` the screen
1698
+ * keeps, so its layers fill the screen rather than the window.
1699
+ */
1700
+ .crewlet-app-shell--fill-flush .crewlet-app-shell__main {
1701
+ scrollbar-gutter: auto;
1702
+ }
1703
+
1704
+ .crewlet-app-shell--fill-flush .crewlet-app-shell__content {
1705
+ position: relative;
1706
+ gap: 0;
1707
+ max-width: none;
1708
+ padding: 0;
1709
+ }
1710
+
1478
1711
  /* Hidden by default, revealed by the breakpoint below: the wide layout has the
1479
1712
  rail on screen already, so the control that opens it has nothing to do. */
1480
1713
  .crewlet-app-shell__toggle {
@@ -1624,6 +1857,180 @@
1624
1857
  animation: crewlet-app-shell-aside-slide var(--motion-duration-slow) var(--motion-easing-emphasized);
1625
1858
  }
1626
1859
 
1860
+ /*
1861
+ * THE COMPACT RAIL: the same rail, narrowed to the compact column. One
1862
+ * variable is the rail's width for the grid, the aside's cap and the drawer
1863
+ * alike, so folding the rail is this one declaration. The shell writes the
1864
+ * attribute only where the layout is wide: the drawer under the step is
1865
+ * always the full list.
1866
+ */
1867
+ .crewlet-app-shell[data-rail='compact'] {
1868
+ --crewlet-app-shell-rail: var(--size-shell-rail-compact);
1869
+ }
1870
+
1871
+ /*
1872
+ * THE FOLD CONTROL stands in the rail's top left corner, in both shapes, so
1873
+ * it never moves under the pointer that pressed it: a minus while the rail is
1874
+ * full and a plus while it is compact. The corner is the square the head
1875
+ * leaves empty up and to the left of the brand's mark, and the control is the
1876
+ * target floor (`--size-target-min`), so it ends short of the mark on the
1877
+ * compact column's centre at every density.
1878
+ *
1879
+ * Quiet until the rail is pointed at: the tertiary ink, which holds 3:1 on
1880
+ * the frame, then the secondary, and the ghost's own primary under the
1881
+ * pointer. Its ring is drawn inside its own box, because the corner it
1882
+ * stands in is the window's, and a ring outside it would be cut there.
1883
+ */
1884
+ .crewlet-app-shell__fold {
1885
+ position: absolute;
1886
+ top: 0;
1887
+ left: 0;
1888
+ z-index: 1;
1889
+ display: inline-flex;
1890
+ }
1891
+
1892
+ .crewlet-app-shell__fold > .crewlet-icon-btn {
1893
+ width: var(--size-target-min);
1894
+ height: var(--size-target-min);
1895
+ color: var(--color-text-tertiary);
1896
+ }
1897
+
1898
+ .crewlet-app-shell__rail:hover > .crewlet-app-shell__fold > .crewlet-icon-btn:not(:hover) {
1899
+ color: var(--color-text-secondary);
1900
+ }
1901
+
1902
+ .crewlet-app-shell__fold > .crewlet-icon-btn:focus-visible {
1903
+ outline-offset: var(--size-focus-ring-inset-offset);
1904
+ }
1905
+
1906
+ /*
1907
+ * THE MARK STANDS WHERE THE COMPACT RAIL'S DOES, in both shapes: centred over
1908
+ * the compact column, in the head. Full, the name follows it; compact, the
1909
+ * name is not drawn (the link keeps it as its name and title).
1910
+ */
1911
+ .crewlet-app-shell--foldable .crewlet-app-shell__rail-head > .crewlet-brand,
1912
+ .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-head > .crewlet-brand {
1913
+ padding-left: calc((var(--size-shell-rail-compact) - var(--crewlet-brand-mark)) / 2);
1914
+ }
1915
+
1916
+ .crewlet-app-shell[data-rail='compact'] .crewlet-brand__name,
1917
+ .crewlet-app-shell[data-rail='compact'] .crewlet-brand__context {
1918
+ display: none;
1919
+ }
1920
+
1921
+ /*
1922
+ * COMPACT, THE STATUS HAS A ROW OF ITS OWN under the mark, a small control
1923
+ * step tall, its dot and its count centred in the column: the first thing
1924
+ * under the head, before the places, where the fold control stood before it
1925
+ * moved to the corner.
1926
+ */
1927
+ .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-inner > .crewlet-app-shell__rail-status {
1928
+ justify-content: center;
1929
+ min-width: 0;
1930
+ min-height: var(--size-control-sm);
1931
+ margin: 0;
1932
+ }
1933
+
1934
+ .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-body {
1935
+ padding: var(--spacing-1) 0;
1936
+ scrollbar-width: thin;
1937
+ }
1938
+
1939
+ /*
1940
+ * The compact foot: what the full foot holds, centred in the column, a step
1941
+ * apart: a Settings tile, the reader's face.
1942
+ */
1943
+ .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-foot {
1944
+ align-items: center;
1945
+ gap: var(--spacing-2);
1946
+ padding: var(--spacing-1) 0 var(--spacing-3);
1947
+ }
1948
+
1949
+ .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-foot > .crewlet-compact-nav {
1950
+ align-self: stretch;
1951
+ }
1952
+
1953
+ /*
1954
+ * THE COMPACT FACE IS CENTRED ON THE TILES' LINE. It gives up the full row's
1955
+ * badge column and the step after it (above): kept, the step stood the face
1956
+ * 4px left of the column's centre, in a box 8px wider than the face, so the
1957
+ * face sat off the line every tile above it is centred on.
1958
+ */
1959
+ .crewlet-app-shell__rail-foot .crewlet-account-row--compact .crewlet-account-row__avatar {
1960
+ width: auto;
1961
+ margin-inline-end: 0;
1962
+ }
1963
+
1964
+ /*
1965
+ * THE RAIL'S MOTION (railMotion.ts). The rail's width eases between the two
1966
+ * shapes on the slow step with the emphasized curve, the motion a
1967
+ * `DockColumn` opens and closes by, so a column of the frame and a column of
1968
+ * a screen move as one. What the rail holds keeps the width of the shape
1969
+ * drawn, so the moving edge clips the words rather than squeezing them.
1970
+ *
1971
+ * FOLDING, the full rail stays drawn, inert, while the edge narrows to the
1972
+ * compact column, and its words fade out on the base step; the compact column
1973
+ * is drawn when the rail's motion has ended, and fades in on the fast step.
1974
+ * UNFOLDING, the full rail is drawn at once and fades in while the edge
1975
+ * uncovers it. The brand's mark and the fold control are in the same place in
1976
+ * both shapes, so neither fades.
1977
+ *
1978
+ * THE WORDS LEAVE BY A TRANSITION and arrive by keyframes. A fold takes their
1979
+ * opacity to nothing; a fold pressed again mid way (`reverse`) declares
1980
+ * nothing of its own, so the same transition takes the opacity back from
1981
+ * wherever it had reached. Faded out by keyframes instead, a reversal could
1982
+ * only start an entrance from nothing, and the words blinked out and back.
1983
+ * The transition is declared only while the rail moves, so nothing else that
1984
+ * sets these parts' opacity is eased.
1985
+ */
1986
+ .crewlet-app-shell[data-rail-motion='fold'] > .crewlet-app-shell__rail {
1987
+ width: var(--size-shell-rail-compact);
1988
+ }
1989
+
1990
+ /* Two names for one entrance, so an unfold pressed while the compact column
1991
+ is still arriving starts the full rail's entrance afresh. */
1992
+ @keyframes crewlet-app-shell-rail-unfold {
1993
+ from {
1994
+ opacity: 0;
1995
+ }
1996
+ }
1997
+
1998
+ @keyframes crewlet-app-shell-rail-settle {
1999
+ from {
2000
+ opacity: 0;
2001
+ }
2002
+ }
2003
+
2004
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-body,
2005
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-foot,
2006
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-status,
2007
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-head .crewlet-brand__name,
2008
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-head .crewlet-brand__context {
2009
+ transition: opacity var(--motion-duration-base) var(--motion-easing-out);
2010
+ }
2011
+
2012
+ .crewlet-app-shell[data-rail-motion='fold'] .crewlet-app-shell__rail-body,
2013
+ .crewlet-app-shell[data-rail-motion='fold'] .crewlet-app-shell__rail-foot,
2014
+ .crewlet-app-shell[data-rail-motion='fold'] .crewlet-app-shell__rail-status,
2015
+ .crewlet-app-shell[data-rail-motion='fold'] .crewlet-app-shell__rail-head .crewlet-brand__name,
2016
+ .crewlet-app-shell[data-rail-motion='fold'] .crewlet-app-shell__rail-head .crewlet-brand__context {
2017
+ opacity: 0;
2018
+ }
2019
+
2020
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-body,
2021
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-foot,
2022
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-status,
2023
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-head .crewlet-brand__name,
2024
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-head .crewlet-brand__context {
2025
+ animation: crewlet-app-shell-rail-unfold var(--motion-duration-slow) var(--motion-easing-out);
2026
+ }
2027
+
2028
+ .crewlet-app-shell[data-rail-motion='folded'] .crewlet-app-shell__rail-body,
2029
+ .crewlet-app-shell[data-rail-motion='folded'] .crewlet-app-shell__rail-foot,
2030
+ .crewlet-app-shell[data-rail-motion='folded'] .crewlet-app-shell__rail-status {
2031
+ animation: crewlet-app-shell-rail-settle var(--motion-duration-fast) var(--motion-easing-out);
2032
+ }
2033
+
1627
2034
  @media (width < 1024px) {
1628
2035
  .crewlet-app-shell {
1629
2036
  --crewlet-app-shell-beside: 0px;
@@ -1634,7 +2041,7 @@
1634
2041
  step is still a column; the rail is a drawer here and takes no track. */
1635
2042
  .crewlet-app-shell[data-aside='column'],
1636
2043
  .crewlet-app-shell--no-rail[data-aside='column'] {
1637
- grid-template-columns: minmax(0, 1fr) var(--crewlet-app-shell-aside-track);
2044
+ grid-template-columns: minmax(var(--crewlet-app-shell-sheet-floor), 1fr) var(--crewlet-app-shell-aside-track);
1638
2045
  }
1639
2046
 
1640
2047
  .crewlet-app-shell--no-rail {
@@ -1699,6 +2106,12 @@
1699
2106
  transition: transform var(--motion-duration-slow) var(--motion-easing-emphasized);
1700
2107
  }
1701
2108
 
2109
+ /* The drawer never changes shape, and on a window narrower than the rail
2110
+ it is the window's width: its content fills it rather than being cut. */
2111
+ .crewlet-app-shell__rail-inner {
2112
+ width: auto;
2113
+ }
2114
+
1702
2115
  .crewlet-app-shell__toggle {
1703
2116
  display: inline-flex;
1704
2117
  }
@@ -1733,6 +2146,27 @@
1733
2146
  .crewlet-app-shell__aside[data-shape='sheet'] {
1734
2147
  animation: none;
1735
2148
  }
2149
+
2150
+ /* Under reduced motion the shell draws the new shape at once
2151
+ (`usePresence`), so no phase starts; these hold even if one did. */
2152
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-body,
2153
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-foot,
2154
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-status,
2155
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-head .crewlet-brand__name,
2156
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-head .crewlet-brand__context {
2157
+ transition: none;
2158
+ }
2159
+
2160
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-body,
2161
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-foot,
2162
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-status,
2163
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-head .crewlet-brand__name,
2164
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-head .crewlet-brand__context,
2165
+ .crewlet-app-shell[data-rail-motion='folded'] .crewlet-app-shell__rail-body,
2166
+ .crewlet-app-shell[data-rail-motion='folded'] .crewlet-app-shell__rail-foot,
2167
+ .crewlet-app-shell[data-rail-motion='folded'] .crewlet-app-shell__rail-status {
2168
+ animation: none;
2169
+ }
1736
2170
  }
1737
2171
 
1738
2172
  /* ── the account row ───────────────────────────────────────────────────── */
@@ -1933,6 +2367,33 @@ button.crewlet-account-row__who:focus-visible {
1933
2367
  gap: var(--spacing-1);
1934
2368
  }
1935
2369
 
2370
+ /*
2371
+ * THE COMPACT ACCOUNT: the reader's face alone, centred in the compact rail's
2372
+ * foot, the face's own corner carrying the lift, the hover and the ring. It
2373
+ * keeps the row's link and menu rules above (hover, current, ring), with no
2374
+ * pad of its own, so the box is the face.
2375
+ */
2376
+ .crewlet-account-row--compact {
2377
+ justify-content: center;
2378
+ padding: 0;
2379
+ }
2380
+
2381
+ .crewlet-account-row__who--compact,
2382
+ .crewlet-app-shell__rail-foot .crewlet-account-row__who--compact {
2383
+ flex: none;
2384
+ width: auto;
2385
+ min-height: 0;
2386
+ padding: calc(var(--spacing-1) / 2);
2387
+ border-radius: var(--radius-md);
2388
+ }
2389
+
2390
+ /* The ring stands off the face, outside it: drawn inside, it would cover the
2391
+ face's own edge and status. */
2392
+ .crewlet-account-row__who.crewlet-account-row__who--compact:focus-visible {
2393
+ outline: 2px solid var(--color-focus);
2394
+ outline-offset: 2px;
2395
+ }
2396
+
1936
2397
  @media (prefers-reduced-motion: reduce) {
1937
2398
  .crewlet-account-row__who {
1938
2399
  transition: none;
@@ -4004,23 +4465,25 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
4004
4465
  }
4005
4466
 
4006
4467
 
4007
- /* ArtifactKinds-O3CALPVX.css */
4468
+ /* ArtifactKinds-3EH4KR3F.css */
4008
4469
  /*
4009
4470
  * 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
4471
+ * (`crewlet-kind--<kind>`): the hue, its Fill and Line steps, the ink a
4472
+ * glyph is drawn in, and the Ground steps a card drawn ON the kind's colour
4473
+ * reads (its ground, the ground under the pointer, the ground at its foot
4474
+ * and the glow behind its drawing; ActionCard). Every surface that tints by
4475
+ * kind reads these, so a kind glyph in a bar, a card's badge and a Make row's tile repaint together with
4013
4476
  * the theme, and no surface spells a kind's colour of its own. A sheet of
4014
4477
  * its own, imported by each surface that tints, because the glyph's module
4015
4478
  * carries no stylesheet (a frame that draws one glyph takes nothing else).
4016
4479
  */
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); }
4480
+ .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); }
4481
+ .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); }
4482
+ .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); }
4483
+ .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); }
4484
+ .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); }
4485
+ .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); }
4486
+ .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
4487
 
4025
4488
 
4026
4489
  /* ArtifactMakeRow-6UX2LTF7.css */
@@ -4560,7 +5023,7 @@ a.crewlet-make-row__item:active {
4560
5023
  }
4561
5024
 
4562
5025
 
4563
- /* Avatar-VJSJGFRG.css */
5026
+ /* Avatar-MNE3WBZO.css */
4564
5027
  /*
4565
5028
  * The identity badge.
4566
5029
  *
@@ -4569,9 +5032,10 @@ a.crewlet-make-row__item:active {
4569
5032
  * same eight families it also spent on phases and event categories, so one
4570
5033
  * amber meant "the execute phase", "the decision category" and "the Analyst"
4571
5034
  * 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.
5035
+ * colour changes, which is the proof it never meant anything. Identity is
5036
+ * what the face holds (a monogram set in the kind's face, a picture, or for an
5037
+ * agent an operator gave one, its character and its hue) and the name beside
5038
+ * it. Every face is ONE SHAPE, people and agents alike (see "the shape").
4575
5039
  *
4576
5040
  * A STATE IS A CORNER BADGE, NEVER A LINE ROUND THE PLATE. A ring in a state's
4577
5041
  * hue round a plate in the agent's own hue put two colours on a 32px mark and
@@ -4711,46 +5175,40 @@ a.crewlet-make-row__item:active {
4711
5175
  font-size: var(--font-size-sm);
4712
5176
  }
4713
5177
 
4714
- /* ── kinds ─────────────────────────────────────────────────────────────── */
5178
+ /* ── the shape ────────────────────────────────────────────────────────── */
4715
5179
 
4716
5180
  /*
4717
- * AN AGENT IS A SQUIRCLE, set in the mono face: what the engine runs, named
4718
- * the way a handle is written.
5181
+ * ONE FACE SHAPE FOR PEOPLE AND AGENTS: a square with rounded corners, the
5182
+ * corner two ninths of the side (8px on a 36px face), never under the xs
5183
+ * radius on the smallest faces and never over the lg radius on the largest.
5184
+ * A person was a circle and an agent a squircle, so a row of people and
5185
+ * agents changed shape from face to face, and a list of members read as two
5186
+ * lists. One shape lines every face up on the same square and lets what the
5187
+ * face holds say who it is: a character on its hue, a picture, or initials
5188
+ * set in the kind's own face (below).
4719
5189
  *
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.
4727
- *
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.
5190
+ * THE CORNER MOVES WITH THE BOX, computed here from the size property every
5191
+ * step and every numeric size sets, so there is ONE ladder: `AVATAR_CORNER`
5192
+ * in the component states the same ratio and clamp for a caller that has to
5193
+ * round something else to match a face (ImageUpload, PresenceStack), and the
5194
+ * suite holds the two equal. No step rule sets a corner.
4737
5195
  */
4738
- .crewlet-avatar--agent {
4739
- border-radius: calc(var(--crewlet-avatar-size) * 0.29);
4740
- font-family: var(--font-family-mono);
5196
+ .crewlet-avatar {
5197
+ border-radius: clamp(var(--radius-xs), calc(var(--crewlet-avatar-size) * 2 / 9), var(--radius-lg));
4741
5198
  }
4742
5199
 
4743
- @supports (corner-shape: squircle) {
4744
- .crewlet-avatar--agent {
4745
- corner-shape: squircle;
4746
- border-radius: var(--radius-circle);
4747
- }
5200
+ /* ── kinds ─────────────────────────────────────────────────────────────── */
5201
+
5202
+ /*
5203
+ * The kind is said by the monogram's face: an agent's initials are set in the
5204
+ * mono face, the way a handle is written, and a person's in the sans face. A
5205
+ * character or a picture says it on its own.
5206
+ */
5207
+ .crewlet-avatar--agent {
5208
+ font-family: var(--font-family-mono);
4748
5209
  }
4749
5210
 
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
5211
  .crewlet-avatar--human {
4753
- border-radius: var(--radius-circle);
4754
5212
  font-family: var(--font-family-sans);
4755
5213
  }
4756
5214
 
@@ -4780,16 +5238,22 @@ a.crewlet-make-row__item:active {
4780
5238
 
4781
5239
  /* ── tones ─────────────────────────────────────────────────────────────── */
4782
5240
 
5241
+ /*
5242
+ * A FACE'S OWN OUTLINE IS THE HAIRLINE (`--color-edge-hairline`), whatever it
5243
+ * holds: the neutral badge, a seeded tint, a character's plate. A row of faces
5244
+ * then reads as faces rather than as a row of framed boxes, where the strong
5245
+ * hairline and a hue's line drew each face as a tile. A reader who asked for
5246
+ * more contrast gets the control edge here, as the edge scale promises.
5247
+ */
4783
5248
  .crewlet-avatar--fallback {
4784
- border: 1px solid transparent;
5249
+ border: 1px solid var(--color-edge-hairline);
4785
5250
  }
4786
5251
 
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. */
5252
+ /* The design's badge: the raised rung inside the face's hairline and the
5253
+ secondary ink, so a badge on a card reads as a mark standing on it rather
5254
+ than as a hole in it. */
4790
5255
  .crewlet-avatar--neutral {
4791
5256
  background: var(--color-surface-elevated);
4792
- border-color: var(--color-border-strong);
4793
5257
  color: var(--color-text-secondary);
4794
5258
  }
4795
5259
 
@@ -4817,7 +5281,7 @@ a.crewlet-make-row__item:active {
4817
5281
  * plate's sides, a tall one its top and its foot, and none touches the curve.
4818
5282
  */
4819
5283
  .crewlet-avatar--character {
4820
- border: 1px solid transparent;
5284
+ border: 1px solid var(--color-edge-hairline);
4821
5285
  }
4822
5286
 
4823
5287
  .crewlet-avatar__character {
@@ -4827,50 +5291,44 @@ a.crewlet-make-row__item:active {
4827
5291
  height: 74%;
4828
5292
  }
4829
5293
 
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
5294
+ /* The plate an agent's hue is drawn on: the hue's fill inside the face's
5295
+ hairline, and the hue itself as the character's ink. The fill is published as
4832
5296
  `--crewlet-avatar-plate` and painted from it, because it is a TINT (12% of
4833
5297
  the hue over whatever the badge stands on), and a stack has to lay it over
4834
5298
  its own ground rather than over the badge behind it (AvatarStack.css). */
4835
5299
  .crewlet-avatar--hue-purple {
4836
5300
  --crewlet-avatar-plate: var(--color-node-purple-fill);
4837
5301
  background: var(--crewlet-avatar-plate);
4838
- border-color: var(--color-node-purple-line);
4839
5302
  color: var(--color-node-purple);
4840
5303
  }
4841
5304
 
4842
5305
  .crewlet-avatar--hue-cyan {
4843
5306
  --crewlet-avatar-plate: var(--color-node-cyan-fill);
4844
5307
  background: var(--crewlet-avatar-plate);
4845
- border-color: var(--color-node-cyan-line);
4846
5308
  color: var(--color-node-cyan);
4847
5309
  }
4848
5310
 
4849
5311
  .crewlet-avatar--hue-green {
4850
5312
  --crewlet-avatar-plate: var(--color-node-green-fill);
4851
5313
  background: var(--crewlet-avatar-plate);
4852
- border-color: var(--color-node-green-line);
4853
5314
  color: var(--color-node-green);
4854
5315
  }
4855
5316
 
4856
5317
  .crewlet-avatar--hue-amber {
4857
5318
  --crewlet-avatar-plate: var(--color-node-amber-fill);
4858
5319
  background: var(--crewlet-avatar-plate);
4859
- border-color: var(--color-node-amber-line);
4860
5320
  color: var(--color-node-amber);
4861
5321
  }
4862
5322
 
4863
5323
  .crewlet-avatar--hue-rose {
4864
5324
  --crewlet-avatar-plate: var(--color-node-rose-fill);
4865
5325
  background: var(--crewlet-avatar-plate);
4866
- border-color: var(--color-node-rose-line);
4867
5326
  color: var(--color-node-rose);
4868
5327
  }
4869
5328
 
4870
5329
  .crewlet-avatar--hue-blue {
4871
5330
  --crewlet-avatar-plate: var(--color-node-blue-fill);
4872
5331
  background: var(--crewlet-avatar-plate);
4873
- border-color: var(--color-node-blue-line);
4874
5332
  color: var(--color-node-blue);
4875
5333
  }
4876
5334
 
@@ -4884,7 +5342,7 @@ a.crewlet-make-row__item:active {
4884
5342
  * AN OUTLINE RATHER THAN THAT SHADOW PAIR, for three reasons. The gap is
4885
5343
  * TRANSPARENT, so the ring reads on whatever the badge stands on, where the
4886
5344
  * 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
5345
+ * other ground. An outline follows the corner, the face's clamp included, in
4888
5346
  * every engine this package supports. And forced-colors mode keeps an outline
4889
5347
  * and drops every shadow, so the ring is still drawn for the readers who most
4890
5348
  * need a boundary.
@@ -4905,13 +5363,20 @@ a.crewlet-make-row__item:active {
4905
5363
  /*
4906
5364
  * THE FRAME is the face's own box, so a badge with a status takes exactly the
4907
5365
  * 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.
5366
+ * it, and a row lays out the same either way.
5367
+ *
5368
+ * THE BADGE WHERE A READER LOOKS FOR PRESENCE: under a third of the face (0.3
5369
+ * of the box), hanging a twentieth of the box past its bottom-right corner,
5370
+ * with the notch (a gap of the ground round it) kept. At 36px that is an 11px
5371
+ * badge set 2px past the corner, the size and place of a presence dot, where
5372
+ * a badge at 0.42 of the box read as a second face. It never drops under
5373
+ * 10px, where its glyph stops being a shape, and always hangs at least a
5374
+ * pixel past the corner.
4910
5375
  */
4911
5376
  .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;
5377
+ --crewlet-avatar-status-size: max(10px, calc(var(--crewlet-avatar-size) * 0.3));
5378
+ --crewlet-avatar-status-overhang: max(1px, calc(var(--crewlet-avatar-size) * 0.05));
5379
+ --crewlet-avatar-status-gap: 2px;
4915
5380
  position: relative;
4916
5381
  display: inline-flex;
4917
5382
  flex: none;
@@ -5069,7 +5534,7 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
5069
5534
  }
5070
5535
 
5071
5536
 
5072
- /* AvatarStack-7I3P7LCK.css */
5537
+ /* AvatarStack-KEHD3GWY.css */
5073
5538
  /*
5074
5539
  * Several badges as one mark (AvatarStack.tsx).
5075
5540
  *
@@ -5078,7 +5543,8 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
5078
5543
  * badges standing in front of each other rather than as one blot. The ring is
5079
5544
  * a SHADOW rather than a border, because it has to fall outside the badge
5080
5545
  * without moving it, and it is decoration: forced-colors mode drops it and the
5081
- * badges' own hairlines still separate them.
5546
+ * badges' own borders, which that mode paints in the system ink, still
5547
+ * separate them.
5082
5548
  *
5083
5549
  * THE GROUND IS A VARIABLE because a stack stands on whatever it is put on,
5084
5550
  * and a cut-out in the sheet's colour on a card is a band of the wrong grey
@@ -5108,6 +5574,17 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
5108
5574
  box-shadow: 0 0 0 2px var(--crewlet-avatar-stack-ground);
5109
5575
  }
5110
5576
 
5577
+ /*
5578
+ * THE RING IS THE ONLY EDGE A STACKED FACE NEEDS. A face's own hairline inside
5579
+ * the ring drew each face as a framed tile, two edges a pixel apart, so a
5580
+ * stacked face (a member, or the face a member wraps) draws its border in no
5581
+ * colour. The border keeps its width, so the face keeps its box.
5582
+ */
5583
+ .crewlet-avatar-stack > .crewlet-avatar-stack__member.crewlet-avatar,
5584
+ .crewlet-avatar-stack > .crewlet-avatar-stack__member > .crewlet-avatar {
5585
+ border-color: transparent;
5586
+ }
5587
+
5111
5588
  /*
5112
5589
  * A BADGE IN FRONT HIDES THE ONE BEHIND IT. A hue's plate is a tint, 12% of
5113
5590
  * the hue over whatever the badge stands on, and in a stack that is partly
@@ -5135,9 +5612,9 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
5135
5612
  }
5136
5613
 
5137
5614
  /*
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
5615
+ * THE COUNT OF THE REST. A PILL, where every face is a rounded square: it is
5616
+ * a number rather than somebody, and drawn in a face's outline it would read
5617
+ * as one more agent or one more person. Otherwise it is the neutral
5141
5618
  * badge exactly (the raised rung, the strong hairline, the secondary ink), in
5142
5619
  * the sans face with tabular figures so "+9" and "+12" sit alike.
5143
5620
  */
@@ -5805,7 +6282,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5805
6282
  }
5806
6283
 
5807
6284
 
5808
- /* BriefCard-VKTH3BSW.css */
6285
+ /* BriefCard-QCL7MVUV.css */
5809
6286
  /*
5810
6287
  * A brief inside the product's status card: the verdict in the head, then one
5811
6288
  * line on what the page is about, the ranked rows that wait on the reader, a
@@ -5922,6 +6399,32 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5922
6399
  margin-inline: calc(-1 * var(--spacing-3));
5923
6400
  }
5924
6401
 
6402
+ /*
6403
+ * WHAT WAS SAID (a room's catch up): one point to a row, the sentence and its
6404
+ * citation, the press that opens the message it came from, at the row's end.
6405
+ * A quiet list with no markers, between the needs and the context.
6406
+ */
6407
+ .crewlet-brief-card__points {
6408
+ display: flex;
6409
+ flex-direction: column;
6410
+ gap: var(--spacing-1);
6411
+ margin: 0;
6412
+ padding: 0;
6413
+ list-style: none;
6414
+ }
6415
+
6416
+ .crewlet-brief-card__point {
6417
+ display: grid;
6418
+ grid-template-columns: minmax(0, 1fr) auto;
6419
+ align-items: baseline;
6420
+ gap: var(--spacing-3);
6421
+ padding-block: var(--spacing-1);
6422
+ }
6423
+
6424
+ .crewlet-brief-card__point-text {
6425
+ color: var(--color-text-primary);
6426
+ }
6427
+
5925
6428
 
5926
6429
  /* Button-GDEBGBX6.css */
5927
6430
  /*
@@ -9886,7 +10389,557 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
9886
10389
  }
9887
10390
 
9888
10391
 
9889
- /* ChatThread-2KO3FZKQ.css */
10392
+ /* ChatDay-E3FF5HWF.css */
10393
+ /*
10394
+ * ChatDay: a day of a conversation under its date, set on the conversation's
10395
+ * own scale (ChatScale.css).
10396
+ */
10397
+
10398
+ /* The day is the pill's range: pinned, the pill stays inside it, so the next
10399
+ day pushes it out from below. */
10400
+ .crewlet-chat-day {
10401
+ position: relative;
10402
+ display: flex;
10403
+ flex-direction: column;
10404
+ }
10405
+
10406
+ /*
10407
+ * THE PILL'S PLACE. A box as tall as the pill, first in the day, set so the
10408
+ * pill's middle is on the rule. Sticky in the day, it holds the pill a little
10409
+ * under the list's top edge for as long as the day is in view, and the day's
10410
+ * end pushes it out, a small gap above the next day's pill.
10411
+ *
10412
+ * ITS OWN MARGINS STAY POSITIVE. A sticky box may travel as far as its margin
10413
+ * box allows, so a negative margin here let the pill run past the end of its
10414
+ * day and sit on the next day's pill. The rule under it takes the overlap
10415
+ * instead, with a negative margin of its own, which moves nothing sticky.
10416
+ *
10417
+ * The box lets the pointer through to the rows beside the pill; the pill
10418
+ * takes it. It stands under a message's hover toolbar (which stands over the
10419
+ * rows and the pill alike) and over the rows and the New line.
10420
+ */
10421
+ .crewlet-chat-day__label {
10422
+ position: sticky;
10423
+ top: var(--crewlet-chat-day-pin);
10424
+ z-index: var(--z-index-sticky);
10425
+ display: flex;
10426
+ flex: none;
10427
+ justify-content: center;
10428
+ height: var(--crewlet-chat-day-pill);
10429
+ margin-top: calc(var(--crewlet-chat-day-gap) - var(--crewlet-chat-day-pill) / 2);
10430
+ pointer-events: none;
10431
+ /* A host that raises the pin (a banner arriving) moves the pinned pill
10432
+ down with it rather than jumping it. */
10433
+ transition: top var(--motion-duration-fast) var(--motion-easing-default);
10434
+ }
10435
+
10436
+ /*
10437
+ * THE DAY'S RULE: a hairline across the whole list with the day's gap under
10438
+ * it, in the flow like any row. It rises half a pill, so it runs through the
10439
+ * pill's middle.
10440
+ */
10441
+ .crewlet-chat-day__rule {
10442
+ position: relative;
10443
+ flex: none;
10444
+ height: 1px;
10445
+ margin: calc(var(--crewlet-chat-day-pill) / -2) 0 var(--crewlet-chat-day-gap);
10446
+ background: var(--color-edge-hairline);
10447
+ }
10448
+
10449
+ /* The New line on the day's rule covers the rule, as one line. */
10450
+ .crewlet-chat-day__rule > .crewlet-chat-divider--unread {
10451
+ position: absolute;
10452
+ inset: 0;
10453
+ }
10454
+
10455
+ /*
10456
+ * THE PILL floats over the rows: the transcript's own ground, ringed with the
10457
+ * hairline and a small shadow, so it reads as lifted off the messages it
10458
+ * passes over. The ring is a shadow, which forced colors drops, so a
10459
+ * transparent outline stands in for it there.
10460
+ */
10461
+ .crewlet-chat-day__pill {
10462
+ display: inline-flex;
10463
+ align-items: center;
10464
+ gap: var(--spacing-1);
10465
+ height: var(--crewlet-chat-day-pill);
10466
+ box-sizing: border-box;
10467
+ padding: 0 var(--spacing-3);
10468
+ border: 0;
10469
+ border-radius: var(--radius-pill);
10470
+ outline: 1px solid transparent;
10471
+ outline-offset: -1px;
10472
+ background-color: var(--crewlet-chat-ground);
10473
+ box-shadow:
10474
+ 0 0 0 1px var(--color-edge-hairline),
10475
+ var(--shadow-xs);
10476
+ color: var(--color-text-secondary);
10477
+ font: inherit;
10478
+ font-size: var(--font-size-xs);
10479
+ font-weight: var(--font-weight-medium);
10480
+ line-height: 1;
10481
+ white-space: nowrap;
10482
+ pointer-events: auto;
10483
+ }
10484
+
10485
+ /* A pill that opens a menu: its chevron sits a step closer to its edge. */
10486
+ .crewlet-chat-day__pill--button {
10487
+ padding-inline-end: var(--spacing-2);
10488
+ cursor: pointer;
10489
+ }
10490
+
10491
+ /* Under the pointer, and while its menu is open, the hover overlay laid on
10492
+ the pill's own ground. */
10493
+ .crewlet-chat-day__pill--button:hover,
10494
+ .crewlet-chat-day__pill--button[aria-expanded='true'] {
10495
+ background-image: linear-gradient(var(--color-surface-hover), var(--color-surface-hover));
10496
+ }
10497
+
10498
+ /* The pill draws its own ring, so focus is drawn over it, as one edge. */
10499
+ .crewlet-chat-day__pill--button:focus-visible {
10500
+ outline: 2px solid var(--color-focus);
10501
+ outline-offset: var(--size-focus-ring-inset-offset);
10502
+ }
10503
+
10504
+ @media (prefers-reduced-motion: reduce) {
10505
+ .crewlet-chat-day__label {
10506
+ transition: none;
10507
+ }
10508
+ }
10509
+
10510
+
10511
+ /* ChatDivider-7ZNDL2PZ.css */
10512
+ /*
10513
+ * ChatDivider: a line between the rows of a conversation, set on the
10514
+ * conversation's own scale (ChatScale.css).
10515
+ */
10516
+
10517
+ /* A quiet labelled rule: the words in the middle, a hairline either side. */
10518
+ .crewlet-chat-divider--date {
10519
+ display: flex;
10520
+ align-items: center;
10521
+ gap: var(--spacing-3);
10522
+ padding: var(--spacing-2) var(--crewlet-chat-pad-x);
10523
+ color: var(--color-text-tertiary);
10524
+ font-size: var(--crewlet-chat-meta);
10525
+ font-weight: var(--font-weight-regular);
10526
+ }
10527
+
10528
+ .crewlet-chat-divider--date::before,
10529
+ .crewlet-chat-divider--date::after {
10530
+ content: '';
10531
+ flex: 1;
10532
+ height: 1px;
10533
+ background: var(--color-border-default);
10534
+ }
10535
+
10536
+ .crewlet-chat-divider--date .crewlet-chat-divider__label {
10537
+ white-space: nowrap;
10538
+ }
10539
+
10540
+ /*
10541
+ * THE NEW LINE TAKES NO HEIGHT. A hairline across the whole list in the
10542
+ * danger hue, laid on the boundary between the last read message and the
10543
+ * first unread one, with "New" at its end on the transcript's ground, so it
10544
+ * reads over the rows it passes. Brought to the top of the view (scrolled to
10545
+ * as a target), it stops under the day's pinned pill rather than behind it.
10546
+ */
10547
+ .crewlet-chat-divider--unread {
10548
+ position: relative;
10549
+ z-index: var(--z-index-raised);
10550
+ height: 0;
10551
+ pointer-events: none;
10552
+ scroll-margin-top: calc(var(--crewlet-chat-day-pin) + var(--crewlet-chat-day-pill) + var(--spacing-3));
10553
+ }
10554
+
10555
+ .crewlet-chat-divider--unread::before {
10556
+ content: '';
10557
+ position: absolute;
10558
+ inset-inline: 0;
10559
+ top: 0;
10560
+ height: 1px;
10561
+ background: var(--color-feedback-danger);
10562
+ }
10563
+
10564
+ .crewlet-chat-divider--unread .crewlet-chat-divider__label {
10565
+ position: absolute;
10566
+ top: 0;
10567
+ right: var(--crewlet-chat-pad-x);
10568
+ padding: 0 var(--spacing-1);
10569
+ transform: translateY(-50%);
10570
+ background: var(--crewlet-chat-ground);
10571
+ color: var(--color-feedback-danger-ink);
10572
+ font-size: var(--font-size-xs);
10573
+ font-weight: var(--font-weight-medium);
10574
+ line-height: var(--font-line-height-normal);
10575
+ }
10576
+
10577
+ /*
10578
+ * FORCED COLORS drops the line's background, which is the whole line. A
10579
+ * border is the one edge the mode keeps, painted in its own text colour.
10580
+ */
10581
+ @media (forced-colors: active) {
10582
+ .crewlet-chat-divider--unread::before,
10583
+ .crewlet-chat-divider--date::before,
10584
+ .crewlet-chat-divider--date::after {
10585
+ border-top: 1px solid CanvasText;
10586
+ }
10587
+ }
10588
+
10589
+
10590
+ /* ChatMessage-FH7VRVCH.css */
10591
+ /*
10592
+ * One message in a transcript: a face in a gutter, the head line, the words
10593
+ * and a footer stack. Every size reads the conversation scale
10594
+ * (ChatScale.css); every edge and fill the quiet scale in @crewlethq/tokens.
10595
+ */
10596
+
10597
+ .crewlet-chat-message {
10598
+ /* Where the row's first line starts: the toolbar rests on it. */
10599
+ --crewlet-chat-row-top: var(--spacing-2);
10600
+ position: relative;
10601
+ display: grid;
10602
+ grid-template-columns: var(--crewlet-chat-avatar) minmax(0, 1fr);
10603
+ column-gap: var(--crewlet-chat-gap);
10604
+ padding: var(--crewlet-chat-row-top) var(--crewlet-chat-pad-x) var(--spacing-1);
10605
+ font-size: var(--crewlet-chat-text);
10606
+ line-height: var(--crewlet-chat-line);
10607
+ transition: background var(--motion-duration-fast) var(--motion-easing-default);
10608
+ /* A message the reader is taken to stops under the day's pinned pill. */
10609
+ scroll-margin-top: calc(var(--crewlet-chat-day-pin) + var(--crewlet-chat-day-pill) + var(--spacing-2));
10610
+ }
10611
+
10612
+ .crewlet-chat-message.is-continuation {
10613
+ --crewlet-chat-row-top: 1px;
10614
+ padding-bottom: 1px;
10615
+ }
10616
+
10617
+ .crewlet-chat-message:hover,
10618
+ .crewlet-chat-message:focus-visible,
10619
+ .crewlet-chat-message:has(:focus-visible),
10620
+ .crewlet-chat-message.is-active {
10621
+ background: var(--color-fill-row);
10622
+ }
10623
+
10624
+ .crewlet-chat-message:focus-visible {
10625
+ outline: 2px solid var(--color-focus);
10626
+ outline-offset: var(--size-focus-ring-inset-offset);
10627
+ }
10628
+
10629
+ /* A row that names the reader: its wash and the warning bar on its edge. It
10630
+ keeps its wash, and only its wash, under the pointer: the toolbar and the
10631
+ gutter's time say which row is pointed at, and a hover step laid over the
10632
+ wash took the row's quiet text under 4.5:1 on the darker palettes. */
10633
+ .crewlet-chat-message.is-mention,
10634
+ .crewlet-chat-message.is-mention:hover,
10635
+ .crewlet-chat-message.is-mention:focus-visible,
10636
+ .crewlet-chat-message.is-mention:has(:focus-visible),
10637
+ .crewlet-chat-message.is-mention.is-active {
10638
+ background: var(--crewlet-chat-mention);
10639
+ box-shadow: inset 2px 0 0 var(--color-feedback-warning);
10640
+ }
10641
+
10642
+ /* The row a link or a search opened at: a wash of the accent that fades back
10643
+ to whatever the row draws of its own (the mention wash included), so there
10644
+ is no last keyframe to name it. */
10645
+ .crewlet-chat-message.is-flash {
10646
+ animation: crewlet-chat-message-flash calc(var(--motion-duration-moderate) * 8) var(--motion-easing-out);
10647
+ }
10648
+
10649
+ @keyframes crewlet-chat-message-flash {
10650
+ 0%,
10651
+ 40% {
10652
+ background: var(--color-brand-accent-soft-strong);
10653
+ }
10654
+ }
10655
+
10656
+ .crewlet-chat-message.is-sending .crewlet-chat-message__body {
10657
+ color: var(--color-text-tertiary);
10658
+ }
10659
+
10660
+ /* The face starts a hairline under the top of the name's line box, so across
10661
+ the name and the first line of words it sits centred on the pair. It keeps
10662
+ its own height: stretched to the row, the face's button (and its focus
10663
+ ring) ran the full height of a long message. */
10664
+ .crewlet-chat-message__gutter {
10665
+ display: flex;
10666
+ align-items: flex-start;
10667
+ justify-content: center;
10668
+ padding-top: 2px;
10669
+ }
10670
+
10671
+ /* A face that opens the author's profile: the face is the whole control. */
10672
+ .crewlet-chat-message__gutter > button {
10673
+ display: inline-flex;
10674
+ padding: 0;
10675
+ border: 0;
10676
+ border-radius: var(--radius-md);
10677
+ background: transparent;
10678
+ cursor: pointer;
10679
+ }
10680
+
10681
+ .crewlet-chat-message__gutter > button:focus-visible {
10682
+ outline: 2px solid var(--color-focus);
10683
+ outline-offset: 2px;
10684
+ }
10685
+
10686
+ /* A continuation's time sits on the baseline of the first line of its words.
10687
+ The two are in different columns and set at different sizes, so the grid
10688
+ aligns them by baseline rather than by sharing a line height. It ends on
10689
+ the column's edge: a time is wider than a face, and centred it ran into the
10690
+ gap before the words. */
10691
+ .crewlet-chat-message.is-continuation > .crewlet-chat-message__gutter {
10692
+ justify-content: flex-end;
10693
+ padding-top: 0;
10694
+ }
10695
+
10696
+ .crewlet-chat-message.is-continuation > .crewlet-chat-message__gutter,
10697
+ .crewlet-chat-message.is-continuation > .crewlet-chat-message__main {
10698
+ align-self: baseline;
10699
+ }
10700
+
10701
+ .crewlet-chat-message__gutter-time {
10702
+ visibility: hidden;
10703
+ color: var(--color-text-tertiary);
10704
+ font-size: var(--font-size-2xs);
10705
+ font-variant-numeric: tabular-nums;
10706
+ line-height: 1;
10707
+ white-space: nowrap;
10708
+ }
10709
+
10710
+ .crewlet-chat-message:hover .crewlet-chat-message__gutter-time,
10711
+ .crewlet-chat-message:focus-visible .crewlet-chat-message__gutter-time,
10712
+ .crewlet-chat-message:has(:focus-visible) .crewlet-chat-message__gutter-time,
10713
+ .crewlet-chat-message.is-active .crewlet-chat-message__gutter-time {
10714
+ visibility: visible;
10715
+ }
10716
+
10717
+ .crewlet-chat-message__main {
10718
+ display: flex;
10719
+ flex-direction: column;
10720
+ min-width: 0;
10721
+ }
10722
+
10723
+ /* THE HEAD IS SET AS TEXT, not as a flex row. Every line of it, the first or
10724
+ one a narrow pane wraps the time onto, is held to one body line by the
10725
+ block's strut, and the smaller meta stands on the name's baseline inside
10726
+ it. As a wrapping flex row the line grew a pixel to fit the time's own
10727
+ line box, and a time wrapped alone got a short line of its own. */
10728
+ .crewlet-chat-message__head {
10729
+ min-width: 0;
10730
+ line-height: calc(var(--crewlet-chat-text) * var(--crewlet-chat-line));
10731
+ }
10732
+
10733
+ /* The gap follows each part, so a part a narrow pane wraps starts flush. */
10734
+ .crewlet-chat-message__head > * {
10735
+ white-space: nowrap;
10736
+ }
10737
+
10738
+ .crewlet-chat-message__head > :not(:last-child) {
10739
+ margin-inline-end: var(--spacing-2);
10740
+ }
10741
+
10742
+ /* A label beside the name ("Agent") is centred on the lower-case letters, as
10743
+ text sets an inline mark. */
10744
+ .crewlet-chat-message__head > .crewlet-tag {
10745
+ vertical-align: middle;
10746
+ }
10747
+
10748
+ .crewlet-chat-message__author {
10749
+ color: var(--color-text-primary);
10750
+ font-weight: var(--font-weight-medium);
10751
+ }
10752
+
10753
+ /* A name that opens the author's profile reads as the name, not a button. */
10754
+ .crewlet-chat-message__author > button {
10755
+ padding: 0;
10756
+ border: 0;
10757
+ border-radius: var(--radius-xs);
10758
+ background: transparent;
10759
+ color: inherit;
10760
+ font: inherit;
10761
+ cursor: pointer;
10762
+ }
10763
+
10764
+ .crewlet-chat-message__author > button:hover {
10765
+ text-decoration: underline;
10766
+ text-underline-offset: 2px;
10767
+ }
10768
+
10769
+ .crewlet-chat-message__author > button:focus-visible {
10770
+ outline: 2px solid var(--color-focus);
10771
+ outline-offset: 2px;
10772
+ }
10773
+
10774
+ /* Meta on the head shares the name's baseline. A line height of its own
10775
+ would sit its smaller text lower in a box as tall as the name's and grow
10776
+ the line by a pixel, so it takes none. */
10777
+ .crewlet-chat-message__time {
10778
+ color: var(--color-text-tertiary);
10779
+ font-size: var(--crewlet-chat-meta);
10780
+ font-variant-numeric: tabular-nums;
10781
+ line-height: 1;
10782
+ }
10783
+
10784
+ .crewlet-chat-message__body {
10785
+ min-width: 0;
10786
+ color: var(--color-text-primary);
10787
+ overflow-wrap: anywhere;
10788
+ }
10789
+
10790
+ /* Emphasis in a message is the semibold step, as it is everywhere else in
10791
+ the product: the browser's own bold read heavier than the names. */
10792
+ .crewlet-chat-message__body :is(b, strong) {
10793
+ font-weight: var(--font-weight-semibold);
10794
+ }
10795
+
10796
+ /* Previews, reactions and the thread line: one stack, one gap. */
10797
+ .crewlet-chat-message__footer {
10798
+ display: flex;
10799
+ flex-direction: column;
10800
+ align-items: flex-start;
10801
+ gap: var(--crewlet-chat-stack);
10802
+ margin-top: var(--crewlet-chat-stack);
10803
+ }
10804
+
10805
+ /* NO PIECE UNDER A MESSAGE IS WIDER THAN ITS COLUMN. Stacked on the start
10806
+ edge, each piece takes its one-line width, and an agent's working line set
10807
+ it wider than a phone's column: the transcript scrolled sideways. */
10808
+ .crewlet-chat-message__footer > * {
10809
+ max-width: 100%;
10810
+ }
10811
+
10812
+ /* THE TOOLBAR STANDS ON THE ROW'S FIRST LINE, over the row above, and over
10813
+ the day's pinned pill as well as the rows: a toolbar that slid under the
10814
+ pill lost its middle buttons wherever the two crossed. */
10815
+ .crewlet-chat-message__actions {
10816
+ position: absolute;
10817
+ top: calc(var(--crewlet-chat-row-top) - var(--crewlet-chat-toolbar));
10818
+ right: var(--crewlet-chat-pad-x);
10819
+ z-index: calc(var(--z-index-sticky) + var(--z-index-raised));
10820
+ opacity: 0;
10821
+ pointer-events: none;
10822
+ transition: opacity var(--motion-duration-fast) var(--motion-easing-default);
10823
+ }
10824
+
10825
+ .crewlet-chat-message:hover > .crewlet-chat-message__actions,
10826
+ .crewlet-chat-message:focus-visible > .crewlet-chat-message__actions,
10827
+ .crewlet-chat-message:has(:focus-visible) > .crewlet-chat-message__actions,
10828
+ .crewlet-chat-message.is-active > .crewlet-chat-message__actions {
10829
+ opacity: 1;
10830
+ pointer-events: auto;
10831
+ }
10832
+
10833
+ /* With no row above to stand over (see ChatMessage.tsx), or when the host
10834
+ asks, it is drawn inside the row's own head. */
10835
+ .crewlet-chat-message.has-actions-inside > .crewlet-chat-message__actions {
10836
+ top: var(--spacing-1);
10837
+ }
10838
+
10839
+ /* A row's quiet controls, the add-reaction pill among them, show while the
10840
+ row is pointed at or holds keyboard focus, and while their picker is open. */
10841
+ .crewlet-chat-message .crewlet-reaction--add {
10842
+ opacity: 0;
10843
+ }
10844
+
10845
+ .crewlet-chat-message:hover .crewlet-reaction--add,
10846
+ .crewlet-chat-message:has(:focus-visible) .crewlet-reaction--add,
10847
+ .crewlet-chat-message.is-active .crewlet-reaction--add,
10848
+ .crewlet-chat-message .crewlet-reaction--add[aria-expanded='true'] {
10849
+ opacity: 1;
10850
+ }
10851
+
10852
+ /* A TOUCH SCREEN HAS NO HOVER: a tap on the row (which focuses it) shows the
10853
+ toolbar, so replying in a thread, saving and the More menu are reached by
10854
+ touch as well as by pointer and keyboard. The add pill is always shown
10855
+ there, so a reaction is one tap away without finding the toolbar first. */
10856
+ @media (hover: none) {
10857
+ .crewlet-chat-message:focus-within > .crewlet-chat-message__actions {
10858
+ opacity: 1;
10859
+ pointer-events: auto;
10860
+ }
10861
+
10862
+ .crewlet-chat-message .crewlet-reaction--add {
10863
+ opacity: 1;
10864
+ }
10865
+ }
10866
+
10867
+ /* The line under a message that was not sent. */
10868
+ .crewlet-chat-message-failure {
10869
+ display: flex;
10870
+ flex-wrap: wrap;
10871
+ align-items: center;
10872
+ gap: var(--spacing-1);
10873
+ color: var(--color-feedback-danger-ink);
10874
+ font-size: var(--crewlet-chat-meta);
10875
+ line-height: var(--crewlet-chat-line);
10876
+ }
10877
+
10878
+ .crewlet-chat-message-failure__words {
10879
+ margin-inline-end: var(--spacing-1);
10880
+ }
10881
+
10882
+ @media (prefers-reduced-motion: reduce) {
10883
+ .crewlet-chat-message {
10884
+ transition: none;
10885
+ }
10886
+
10887
+ .crewlet-chat-message.is-flash {
10888
+ animation: none;
10889
+ }
10890
+
10891
+ .crewlet-chat-message__actions {
10892
+ transition: none;
10893
+ }
10894
+ }
10895
+
10896
+
10897
+ /* ChatScale-L4SIHSKL.css */
10898
+ /*
10899
+ * ONE SCALE FOR A CONVERSATION. Every part of a transcript reads from these:
10900
+ * the message rows, their toolbar, reactions and thread line, the day's rule
10901
+ * and pill, the New line and the link previews. A name, the words under it
10902
+ * and the box they were typed in are one size, and everything around them
10903
+ * (times, counts, the second lines of previews) is one step down. A surface
10904
+ * that wants a denser or roomier transcript sets them once, on itself.
10905
+ *
10906
+ * A sheet of its own, imported by every part that reads it, so a consumer
10907
+ * that imports one part (`@crewlethq/ui/ChatDay`) still gets the scale.
10908
+ */
10909
+ :root {
10910
+ /* The words: names, bodies and the message box, on one line height. */
10911
+ --crewlet-chat-text: var(--font-size-sm);
10912
+ --crewlet-chat-line: var(--font-line-height-normal);
10913
+ /* Times, counts, reactions and second lines: one step down. */
10914
+ --crewlet-chat-meta: var(--font-size-xs);
10915
+ /* The row's side inset, the face column, the gap after it, and the space
10916
+ between the pieces stacked under a message's words. */
10917
+ --crewlet-chat-pad-x: var(--spacing-5);
10918
+ --crewlet-chat-avatar: 36px;
10919
+ --crewlet-chat-gap: var(--spacing-3);
10920
+ --crewlet-chat-stack: 6px;
10921
+ /* One width for every link preview, so a stack of them shares both edges. */
10922
+ --crewlet-chat-card: 440px;
10923
+ /* A day: the pill's height, the room above and below its rule, and how far
10924
+ under the list's top edge the pill pins. A host with a bar floating over
10925
+ the list's top (an unread banner) moves the pin down past it. */
10926
+ --crewlet-chat-day-pill: 24px;
10927
+ --crewlet-chat-day-gap: var(--spacing-5);
10928
+ --crewlet-chat-day-pin: var(--spacing-3);
10929
+ /* The hover toolbar: a medium control, big enough to aim at while the
10930
+ pointer is passing, inside its inset and its hairline, twice. */
10931
+ --crewlet-chat-toolbar-inset: var(--spacing-1);
10932
+ --crewlet-chat-toolbar: calc(var(--size-control-md) + (var(--crewlet-chat-toolbar-inset) + 1px) * 2);
10933
+ /* The ground the transcript is set on. A host that sets it on another fill
10934
+ names that fill here, and everything lifted off the rows (the toolbar,
10935
+ the day's pill, the open thread line) is filled with it. */
10936
+ --crewlet-chat-ground: var(--color-surface-background);
10937
+ /* A row that names the reader: a light wash of the warning hue. */
10938
+ --crewlet-chat-mention: var(--color-feedback-warning-soft);
10939
+ }
10940
+
10941
+
10942
+ /* ChatThread-HAECJMP6.css */
9890
10943
  /*
9891
10944
  * A conversation as it grows: the scroller, the items a spacing step and a
9892
10945
  * half apart on the panel's 16px inset, and the Jump to latest pill in a row
@@ -9942,6 +10995,23 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
9942
10995
  flex: none;
9943
10996
  }
9944
10997
 
10998
+ /*
10999
+ * A SHORT TRANSCRIPT RESTS ON ITS FOOT (`rest="end"`), against the composer
11000
+ * under it, as a conversation's newest messages always are, rather than
11001
+ * under the top with an empty band between it and the box. The scroller is a
11002
+ * column and the items take the room above them; a conversation's rows set
11003
+ * their own spacing, so the items keep no gap.
11004
+ */
11005
+ .crewlet-chat-thread--rest-end .crewlet-chat-thread__scroller {
11006
+ display: flex;
11007
+ flex-direction: column;
11008
+ }
11009
+
11010
+ .crewlet-chat-thread--rest-end .crewlet-chat-thread__items {
11011
+ margin-top: auto;
11012
+ gap: 0;
11013
+ }
11014
+
9945
11015
  /*
9946
11016
  * The pill, centred in a row of its own under the log. IN FLOW, NOT FLOATING:
9947
11017
  * laid over the scroller it covered the last lines of whatever was being read,
@@ -10446,6 +11516,117 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10446
11516
  }
10447
11517
 
10448
11518
 
11519
+ /* ChipField-D4CW6XFA.css */
11520
+ /*
11521
+ * ChipField: chosen items as chips inside the field, before a bare text box.
11522
+ * The chips and the box wrap as one line of words; the box takes whatever
11523
+ * width the last line leaves, and a line of its own when that is too little.
11524
+ */
11525
+ .crewlet-chip-field {
11526
+ display: flex;
11527
+ flex-wrap: wrap;
11528
+ align-items: center;
11529
+ gap: var(--spacing-1);
11530
+ box-sizing: border-box;
11531
+ width: 100%;
11532
+ color: var(--color-text-primary);
11533
+ font-size: var(--font-size-sm);
11534
+ cursor: text;
11535
+ }
11536
+
11537
+ /* A field like any other: the field's fill, boundary and corner. */
11538
+ .crewlet-chip-field--boxed {
11539
+ min-height: var(--size-control-lg);
11540
+ padding: var(--spacing-1) var(--spacing-2);
11541
+ border: 1px solid var(--color-border-field);
11542
+ border-radius: var(--radius-md);
11543
+ background-color: var(--color-surface-subtle);
11544
+ }
11545
+
11546
+ /*
11547
+ * ONE RING, the one every field in this package draws: an outline over the
11548
+ * boundary, on the field rather than on the box inside it, because the
11549
+ * field is what the reader sees as the control. The selector names the box
11550
+ * rather than asking :focus-within, so tabbing to a chip's Remove control
11551
+ * rings that control alone, not the field round it as well.
11552
+ */
11553
+ .crewlet-chip-field--boxed:has(.crewlet-chip-field__input:focus-visible) {
11554
+ outline: 2px solid var(--color-focus);
11555
+ outline-offset: -1px;
11556
+ }
11557
+
11558
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
11559
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-chip-field--boxed:has(.crewlet-chip-field__input:focus-visible) {
11560
+ outline-width: 1px;
11561
+ outline-color: var(--color-border-selected);
11562
+ }
11563
+
11564
+ /*
11565
+ * The address line at the top of a view: full width, a rule under it, and
11566
+ * the view's own side inset (`--crewlet-chip-field-inset`, the chat's row
11567
+ * inset by default). Its focus is a bar along the rule; the transparent
11568
+ * outline is what forced colors, which drops the bar, draws instead.
11569
+ */
11570
+ .crewlet-chip-field--bare {
11571
+ gap: var(--spacing-2);
11572
+ min-height: var(--size-shell-topbar);
11573
+ padding: var(--spacing-2) var(--crewlet-chip-field-inset, var(--spacing-5));
11574
+ border-bottom: 1px solid var(--color-border-default);
11575
+ }
11576
+
11577
+ .crewlet-chip-field--bare:has(.crewlet-chip-field__input:focus-visible) {
11578
+ outline: 2px solid transparent;
11579
+ outline-offset: -2px;
11580
+ box-shadow: inset 0 -2px 0 var(--color-focus);
11581
+ }
11582
+
11583
+ .crewlet-chip-field__prefix {
11584
+ flex: none;
11585
+ color: var(--color-text-secondary);
11586
+ }
11587
+
11588
+ /* The list lends its chips to the field's own line (ChipField.tsx spells its
11589
+ role out, which a contents box can lose). */
11590
+ .crewlet-chip-field__chips {
11591
+ display: contents;
11592
+ list-style: none;
11593
+ }
11594
+
11595
+ .crewlet-chip-field__chip {
11596
+ display: inline-flex;
11597
+ min-width: 0;
11598
+ max-width: 100%;
11599
+ }
11600
+
11601
+ .crewlet-chip-field__input {
11602
+ flex: 1;
11603
+ min-width: 120px;
11604
+ height: var(--size-control-md);
11605
+ box-sizing: border-box;
11606
+ margin: 0;
11607
+ padding: 0 var(--spacing-1);
11608
+ border: 0;
11609
+ background: transparent;
11610
+ color: inherit;
11611
+ font: inherit;
11612
+ outline: none;
11613
+ }
11614
+
11615
+ .crewlet-chip-field--bare .crewlet-chip-field__input {
11616
+ padding-inline: 0;
11617
+ }
11618
+
11619
+ .crewlet-chip-field__input::placeholder {
11620
+ color: var(--color-text-tertiary);
11621
+ opacity: 1;
11622
+ }
11623
+
11624
+ .crewlet-chip-field.is-disabled {
11625
+ opacity: 0.6;
11626
+ cursor: not-allowed;
11627
+ }
11628
+
11629
+
10449
11630
  /* ChoiceButtons-T3GG6VLG.css */
10450
11631
  /*
10451
11632
  * One answer, sent with one press: a column of buttons as tall as a touch
@@ -12367,7 +13548,332 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
12367
13548
  }
12368
13549
 
12369
13550
 
12370
- /* Composer-HQIMTMRC.css */
13551
+ /* CompactNav-CU2AQXBC.css */
13552
+ /*
13553
+ * The compact rail: each place its glyph's tile over its name, in one column.
13554
+ *
13555
+ * A PLACE IS 48PX TALL: a 26px tile, its name under it and a breath. Fourteen
13556
+ * places, two rules, and the rail's head and foot stand in a 900px window, so
13557
+ * the column a reader folded the rail to see more of the page never scrolls
13558
+ * on a laptop.
13559
+ *
13560
+ * Tokens only. The tile's sizes are component variables, so a surface that
13561
+ * draws the compact rail at another width changes them in one place.
13562
+ */
13563
+
13564
+ .crewlet-compact-nav {
13565
+ --crewlet-compact-nav-tile-width: 36px;
13566
+ --crewlet-compact-nav-tile-height: var(--size-control-sm);
13567
+ --crewlet-compact-nav-glyph: 17px;
13568
+ width: 100%;
13569
+ min-width: 0;
13570
+ }
13571
+
13572
+ .crewlet-compact-nav__list {
13573
+ display: flex;
13574
+ flex-direction: column;
13575
+ align-items: stretch;
13576
+ margin: 0;
13577
+ padding: 0 var(--spacing-1);
13578
+ list-style: none;
13579
+ }
13580
+
13581
+ .crewlet-compact-nav__entry {
13582
+ display: flex;
13583
+ min-width: 0;
13584
+ }
13585
+
13586
+ /* A place is a link or a button, and a folded group is a button: one look for
13587
+ all three. The entry itself draws nothing; the tile is what lifts. */
13588
+ .crewlet-compact-nav__item {
13589
+ display: flex;
13590
+ flex-direction: column;
13591
+ align-items: center;
13592
+ gap: calc(var(--spacing-1) / 2);
13593
+ width: 100%;
13594
+ min-width: 0;
13595
+ margin: 0;
13596
+ padding: calc(var(--spacing-1) - 1px) 0 var(--spacing-1);
13597
+ border: 0;
13598
+ border-radius: var(--radius-md);
13599
+ background: transparent;
13600
+ color: var(--color-text-secondary);
13601
+ font: inherit;
13602
+ text-decoration: none;
13603
+ cursor: pointer;
13604
+ }
13605
+
13606
+ /* The ring is drawn on the tile (below), not round the whole entry. The
13607
+ entry's own outline is transparent rather than none, so forced colours,
13608
+ which paint a transparent outline in the system's ink, still draw one. */
13609
+ .crewlet-compact-nav__item:focus {
13610
+ outline: 2px solid transparent;
13611
+ }
13612
+
13613
+ .crewlet-compact-nav__tile {
13614
+ position: relative;
13615
+ display: inline-flex;
13616
+ align-items: center;
13617
+ justify-content: center;
13618
+ flex: none;
13619
+ width: var(--crewlet-compact-nav-tile-width);
13620
+ height: var(--crewlet-compact-nav-tile-height);
13621
+ border-radius: var(--radius-md);
13622
+ transition:
13623
+ background var(--motion-duration-fast) var(--motion-easing-default),
13624
+ color var(--motion-duration-fast) var(--motion-easing-default);
13625
+ }
13626
+
13627
+ /* A step larger than the full rail's 14px glyph: in the compact rail the
13628
+ glyph is the place's name at a glance, and the word under it is the
13629
+ caption. */
13630
+ .crewlet-compact-nav__tile > .crewlet-glyph {
13631
+ width: var(--crewlet-compact-nav-glyph);
13632
+ height: var(--crewlet-compact-nav-glyph);
13633
+ }
13634
+
13635
+ .crewlet-compact-nav__item:hover .crewlet-compact-nav__tile,
13636
+ .crewlet-compact-nav__item[data-open] .crewlet-compact-nav__tile {
13637
+ background: var(--color-surface-hover);
13638
+ color: var(--color-text-primary);
13639
+ }
13640
+
13641
+ .crewlet-compact-nav__item:hover .crewlet-compact-nav__label,
13642
+ .crewlet-compact-nav__item[data-open] .crewlet-compact-nav__label {
13643
+ color: var(--color-text-primary);
13644
+ }
13645
+
13646
+ /*
13647
+ * WHERE THE READER IS: the full rail's own current row, drawn on the tile.
13648
+ * Raised, the plain hairline as an OUTLINE (forced colours keep outlines and
13649
+ * drop backgrounds), and the primary ink. After :hover, so the current tile
13650
+ * shows its lift rather than the overlay. A folded group's tile is current
13651
+ * (`aria-current="true"`) while one of its places is.
13652
+ */
13653
+ .crewlet-compact-nav__item[aria-current] .crewlet-compact-nav__tile {
13654
+ background: var(--color-surface-elevated);
13655
+ outline: 1px solid var(--color-border-default);
13656
+ outline-offset: -1px;
13657
+ color: var(--color-text-primary);
13658
+ }
13659
+
13660
+ .crewlet-compact-nav__item[aria-current] .crewlet-compact-nav__label {
13661
+ color: var(--color-text-primary);
13662
+ font-weight: var(--font-weight-semibold);
13663
+ }
13664
+
13665
+ /* The ring is the tile's, after the current rule that draws its hairline on
13666
+ the same property, so a focused current tile draws the ring. */
13667
+ .crewlet-compact-nav__item:focus-visible .crewlet-compact-nav__tile {
13668
+ outline: 2px solid var(--color-focus);
13669
+ outline-offset: 0;
13670
+ }
13671
+
13672
+ .crewlet-compact-nav__label {
13673
+ max-width: 100%;
13674
+ box-sizing: border-box;
13675
+ padding: 0 calc(var(--spacing-1) / 2);
13676
+ overflow: hidden;
13677
+ color: var(--color-text-secondary);
13678
+ font-family: var(--font-family-sans);
13679
+ font-size: var(--font-size-2xs);
13680
+ font-weight: var(--font-weight-medium);
13681
+ line-height: var(--font-line-height-tight);
13682
+ text-align: center;
13683
+ text-overflow: ellipsis;
13684
+ white-space: nowrap;
13685
+ }
13686
+
13687
+ /* A place the reader holds no access to keeps its name and its key, in the
13688
+ quiet ink, as a locked group's rows do in the full rail. */
13689
+ .crewlet-compact-nav__item--locked:not([aria-current]):not(:hover) .crewlet-compact-nav__label,
13690
+ .crewlet-compact-nav__item--locked:not([aria-current]):not(:hover) .crewlet-compact-nav__tile {
13691
+ color: var(--color-text-tertiary);
13692
+ }
13693
+
13694
+ /*
13695
+ * THE FIGURE RIDES THE TILE'S TOP END CORNER, cut out of the rail by a ring of
13696
+ * the rail's own ground, so it reads apart from the glyph under it. It is the
13697
+ * one count badge size the whole chrome draws (`--size-badge`), the accent
13698
+ * fill where it is waiting on the reader and the raised ground where it is
13699
+ * only a tally.
13700
+ */
13701
+ .crewlet-compact-nav__figure {
13702
+ position: absolute;
13703
+ top: calc(var(--spacing-1) * -1 - 1px);
13704
+ right: calc(var(--spacing-2) * -1 + 1px);
13705
+ display: inline-flex;
13706
+ align-items: center;
13707
+ justify-content: center;
13708
+ min-width: var(--size-badge);
13709
+ height: var(--size-badge);
13710
+ box-sizing: border-box;
13711
+ padding: 0 var(--size-badge-pad);
13712
+ border: 2px solid var(--color-surface-frame);
13713
+ border-radius: var(--radius-pill);
13714
+ background: var(--color-surface-elevated);
13715
+ color: var(--color-text-secondary);
13716
+ font-family: var(--font-family-sans);
13717
+ font-size: var(--font-size-badge);
13718
+ font-weight: var(--font-weight-semibold);
13719
+ font-variant-numeric: tabular-nums;
13720
+ line-height: 1;
13721
+ }
13722
+
13723
+ .crewlet-compact-nav__figure--badge {
13724
+ background: var(--color-brand-accent);
13725
+ color: var(--color-text-on-accent);
13726
+ }
13727
+
13728
+ /* A short rule between two runs of tiles, centred in the column. */
13729
+ .crewlet-compact-nav__separator {
13730
+ display: flex;
13731
+ justify-content: center;
13732
+ padding: calc(var(--spacing-1) + var(--spacing-1) / 2) 0;
13733
+ }
13734
+
13735
+ .crewlet-compact-nav__rule {
13736
+ width: var(--spacing-6);
13737
+ height: 1px;
13738
+ background: var(--color-border-default);
13739
+ }
13740
+
13741
+ /*
13742
+ * THE FLYOUT: a folded group's places beside the rail, on the popover's rung.
13743
+ * Its rows are the full rail's rows at the menu's step: the glyph, the name,
13744
+ * and the figure at the end, so the places read as they do unfolded.
13745
+ */
13746
+ .crewlet-compact-nav__flyout {
13747
+ position: fixed;
13748
+ display: flex;
13749
+ flex-direction: column;
13750
+ gap: 1px;
13751
+ min-width: 208px;
13752
+ max-width: min(320px, calc(100vw - var(--spacing-4)));
13753
+ box-sizing: border-box;
13754
+ padding: var(--spacing-1);
13755
+ border: 1px solid var(--color-border-default);
13756
+ border-radius: var(--radius-lg);
13757
+ background: var(--color-surface-elevated);
13758
+ box-shadow: var(--shadow-lg);
13759
+ font-family: var(--font-family-sans);
13760
+ animation: crewlet-compact-nav-flyout-in var(--motion-duration-fast) var(--motion-easing-out);
13761
+ }
13762
+
13763
+ /* Inside a LayerHost the coordinates are the host's own, so the flyout is
13764
+ absolute within it rather than fixed against the window. */
13765
+ .crewlet-compact-nav__flyout--in-host {
13766
+ position: absolute;
13767
+ }
13768
+
13769
+ @keyframes crewlet-compact-nav-flyout-in {
13770
+ from {
13771
+ opacity: 0;
13772
+ transform: translateX(calc(var(--spacing-1) * -1));
13773
+ }
13774
+ }
13775
+
13776
+ .crewlet-compact-nav__flyout-head {
13777
+ padding: var(--spacing-1) var(--spacing-2);
13778
+ color: var(--color-text-secondary);
13779
+ font-size: var(--font-size-xs);
13780
+ font-weight: var(--font-weight-semibold);
13781
+ line-height: var(--font-line-height-tight);
13782
+ }
13783
+
13784
+ /* A router's link is drawn by the caller; its wrapper stays out of the box tree. */
13785
+ .crewlet-compact-nav__link-slot {
13786
+ display: contents;
13787
+ }
13788
+
13789
+ .crewlet-compact-nav__link {
13790
+ display: flex;
13791
+ align-items: center;
13792
+ gap: var(--spacing-2);
13793
+ min-width: 0;
13794
+ height: var(--size-control-md);
13795
+ padding: 0 var(--spacing-2);
13796
+ border-radius: var(--radius-md);
13797
+ color: var(--color-text-secondary);
13798
+ font-size: var(--font-size-sm);
13799
+ text-decoration: none;
13800
+ outline: none;
13801
+ transition:
13802
+ background var(--motion-duration-fast) var(--motion-easing-default),
13803
+ color var(--motion-duration-fast) var(--motion-easing-default);
13804
+ }
13805
+
13806
+ .crewlet-compact-nav__link:hover,
13807
+ .crewlet-compact-nav__link:focus-visible {
13808
+ background: var(--color-surface-hover);
13809
+ color: var(--color-text-primary);
13810
+ }
13811
+
13812
+ /* The place the reader is on: the selected fill, the primary ink, a step
13813
+ heavier. Declared after the hover so the selected fill holds under it. */
13814
+ .crewlet-compact-nav__link[aria-current='page'] {
13815
+ background: var(--color-surface-selected);
13816
+ color: var(--color-text-primary);
13817
+ font-weight: var(--font-weight-semibold);
13818
+ }
13819
+
13820
+ .crewlet-compact-nav__link:focus-visible {
13821
+ outline: 2px solid var(--color-focus);
13822
+ outline-offset: var(--size-focus-ring-inset-offset);
13823
+ }
13824
+
13825
+ .crewlet-compact-nav__link--locked:not([aria-current]):not(:hover):not(:focus-visible) {
13826
+ color: var(--color-text-tertiary);
13827
+ }
13828
+
13829
+ .crewlet-compact-nav__link-icon {
13830
+ display: inline-flex;
13831
+ flex: none;
13832
+ }
13833
+
13834
+ .crewlet-compact-nav__link-label {
13835
+ flex: 1 1 auto;
13836
+ min-width: 0;
13837
+ overflow: hidden;
13838
+ text-overflow: ellipsis;
13839
+ white-space: nowrap;
13840
+ }
13841
+
13842
+ .crewlet-compact-nav__link-figure {
13843
+ display: inline-flex;
13844
+ align-items: center;
13845
+ justify-content: center;
13846
+ flex: none;
13847
+ min-width: var(--size-badge);
13848
+ height: var(--size-badge);
13849
+ box-sizing: border-box;
13850
+ padding: 0 var(--size-badge-pad);
13851
+ border-radius: var(--radius-pill);
13852
+ color: var(--color-text-tertiary);
13853
+ font-size: var(--font-size-badge);
13854
+ font-weight: var(--font-weight-semibold);
13855
+ font-variant-numeric: tabular-nums;
13856
+ line-height: 1;
13857
+ }
13858
+
13859
+ .crewlet-compact-nav__link-figure--badge {
13860
+ background: var(--color-brand-accent);
13861
+ color: var(--color-text-on-accent);
13862
+ }
13863
+
13864
+ @media (prefers-reduced-motion: reduce) {
13865
+ .crewlet-compact-nav__tile,
13866
+ .crewlet-compact-nav__link {
13867
+ transition: none;
13868
+ }
13869
+
13870
+ .crewlet-compact-nav__flyout {
13871
+ animation: none;
13872
+ }
13873
+ }
13874
+
13875
+
13876
+ /* Composer-ZEGHEAFE.css */
12371
13877
  /*
12372
13878
  * A message written in place: the field and its footer strip in one box. The
12373
13879
  * BOX takes the focus ring every field in the package draws (see Input.css):
@@ -12506,6 +14012,32 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
12506
14012
  padding: var(--spacing-2) var(--spacing-3) 0;
12507
14013
  }
12508
14014
 
14015
+ /*
14016
+ * THE FORMATTING ROW, along the box's top on the field's own inset less the
14017
+ * small tool's own room round its glyph, so the first glyph starts on the
14018
+ * words' line. It belongs to the field rather than to a strip of its own: no
14019
+ * rule under it.
14020
+ */
14021
+ .crewlet-composer__toolbar {
14022
+ display: flex;
14023
+ align-items: center;
14024
+ min-width: 0;
14025
+ padding: var(--spacing-1) var(--spacing-1) 0 calc(var(--spacing-3) - (var(--size-control-sm) - var(--font-size-xs)) / 2);
14026
+ }
14027
+
14028
+ /*
14029
+ * THE TOOLS AT THE FOOTER'S START, a tight row whose first glyph starts on
14030
+ * the words' line, as the formatting row's does. The spacer after them puts
14031
+ * the actions at the end.
14032
+ */
14033
+ .crewlet-composer__tools {
14034
+ display: flex;
14035
+ align-items: center;
14036
+ gap: 2px;
14037
+ min-width: 0;
14038
+ margin-inline-start: calc(-1 * (var(--size-control-sm) - var(--font-size-xs)) / 2);
14039
+ }
14040
+
12509
14041
  /*
12510
14042
  * DISABLED, AS A FIELD IS: the whole box at the disabled field's 0.6 and the
12511
14043
  * not-allowed cursor, so it no longer reads as somewhere to type. Faded once:
@@ -12583,6 +14115,51 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
12583
14115
  }
12584
14116
  }
12585
14117
 
14118
+ /*
14119
+ * A CONVERSATION'S MESSAGE BOX (`appearance="chat"`), on the transcript's own
14120
+ * scale (ChatMessage/ChatScale.css): the large corner on the transcript's
14121
+ * ground with the row wash laid over it, a step lighter than the list, and a
14122
+ * small shadow, so the box sits just above the messages, inside the edge
14123
+ * scale's strong step, the edge a field draws. The words are set at the
14124
+ * transcript's size on one line to start. The footer belongs to the field
14125
+ * rather than standing as a strip under it: no rule and no ground of its own.
14126
+ */
14127
+ .crewlet-composer--chat {
14128
+ border-color: var(--color-edge-strong);
14129
+ background:
14130
+ linear-gradient(var(--color-fill-row), var(--color-fill-row)),
14131
+ var(--crewlet-chat-ground);
14132
+ box-shadow: var(--shadow-xs);
14133
+ }
14134
+
14135
+ .crewlet-composer--chat .crewlet-composer__field {
14136
+ min-height: 0;
14137
+ padding: var(--spacing-2) var(--spacing-3);
14138
+ font-size: var(--crewlet-chat-text);
14139
+ line-height: var(--crewlet-chat-line);
14140
+ }
14141
+
14142
+ .crewlet-composer--chat .crewlet-composer__footer {
14143
+ gap: 2px;
14144
+ padding: var(--spacing-1);
14145
+ padding-inline-start: var(--spacing-3);
14146
+ border-top: 0;
14147
+ background: transparent;
14148
+ }
14149
+
14150
+ /* A tool whose menu or picker is open reads as held down. */
14151
+ .crewlet-composer--chat .crewlet-composer__tools [aria-expanded='true'] {
14152
+ background: var(--color-surface-pressed);
14153
+ color: var(--color-text-primary);
14154
+ }
14155
+
14156
+ /* The formatting row's glyphs rest in the tertiary ink while the box is not
14157
+ in use, so the row reads as part of the field rather than as a toolbar
14158
+ competing with the conversation, and take their own ink once it is. */
14159
+ .crewlet-composer--chat:not(:focus-within) .crewlet-composer__toolbar :is(button, [role='button']):not(:hover) {
14160
+ color: var(--color-text-tertiary);
14161
+ }
14162
+
12586
14163
 
12587
14164
  /* ConflictNote-OP64JJ6T.css */
12588
14165
  /* ConflictNote: a refused write's sentence in the danger ink, with its glyph
@@ -12933,7 +14510,7 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
12933
14510
  }
12934
14511
 
12935
14512
 
12936
- /* Count-ZJ6ID4ZU.css */
14513
+ /* Count-2HXBBYPO.css */
12937
14514
  /*
12938
14515
  * The count pill. One neutral look, deliberately: see the component doc for
12939
14516
  * why a count is never tinted.
@@ -12960,6 +14537,25 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
12960
14537
  line-height: round(nearest, calc(var(--font-line-height-body) * 1em), 1px);
12961
14538
  }
12962
14539
 
14540
+ /*
14541
+ * WHAT WAITS ON THE READER (`tone="attention"`): the accent pill every count
14542
+ * of that kind is drawn as, wherever it stands, at the badge's own size: 16px
14543
+ * tall and at least as wide, its figure at the badge step in the semibold
14544
+ * weight. At 18px with an 11px figure such a badge read louder than the name
14545
+ * beside it.
14546
+ */
14547
+ .crewlet-count--attention {
14548
+ box-sizing: border-box;
14549
+ min-width: var(--size-badge);
14550
+ height: var(--size-badge);
14551
+ padding: 0 var(--size-badge-pad);
14552
+ background: var(--color-brand-accent);
14553
+ color: var(--color-text-on-accent);
14554
+ font-size: var(--font-size-badge);
14555
+ font-weight: var(--font-weight-semibold);
14556
+ line-height: 1;
14557
+ }
14558
+
12963
14559
 
12964
14560
  /* CursorFlag-AJQJBUGY.css */
12965
14561
  /*
@@ -18088,6 +19684,70 @@ svg.crewlet-datetime__chevron {
18088
19684
  }
18089
19685
 
18090
19686
 
19687
+ /* DockColumn-SMJCXHS4.css */
19688
+ /*
19689
+ * A column docked beside the content (DockColumn.tsx).
19690
+ *
19691
+ * THE COLUMN EASES ITS WIDTH between none and its panel's, on the slow step
19692
+ * with the emphasized curve: the motion the application rail folds by,
19693
+ * so a column of the frame and a column of a screen open and close as one
19694
+ * movement. The host gives it an `auto` track, so its width is the track.
19695
+ * Clipped rather than hidden, so it is never a scroll container a focus or a
19696
+ * scrollIntoView could scroll.
19697
+ *
19698
+ * THE PANEL KEEPS ITS WIDTH and is held to the column's edge that faces the
19699
+ * content: before the content (`start`) it is held to the column's end, so
19700
+ * the moving edge uncovers it from the start edge, and after the content
19701
+ * (`end`) the other way round.
19702
+ *
19703
+ * Tokens only. The width is the component's own variable, set from the
19704
+ * `width` prop, so the column and the panel read one value.
19705
+ */
19706
+
19707
+ .crewlet-dock-column {
19708
+ display: flex;
19709
+ justify-content: flex-end;
19710
+ width: 0;
19711
+ min-width: 0;
19712
+ min-height: 0;
19713
+ overflow: clip;
19714
+ transition: width var(--motion-duration-slow) var(--motion-easing-emphasized);
19715
+ }
19716
+
19717
+ .crewlet-dock-column[data-side='end'] {
19718
+ justify-content: flex-start;
19719
+ }
19720
+
19721
+ .crewlet-dock-column[data-open] {
19722
+ width: var(--crewlet-dock-column-width);
19723
+ }
19724
+
19725
+ .crewlet-dock-column__panel {
19726
+ display: flex;
19727
+ flex: none;
19728
+ flex-direction: column;
19729
+ box-sizing: border-box;
19730
+ width: var(--crewlet-dock-column-width);
19731
+ min-height: 0;
19732
+ background: var(--crewlet-dock-column-ground, transparent);
19733
+ }
19734
+
19735
+ /* The hairline on the panel's edge that faces the content. */
19736
+ .crewlet-dock-column--divider[data-side='start'] > .crewlet-dock-column__panel {
19737
+ border-inline-end: 1px solid var(--color-border-default);
19738
+ }
19739
+
19740
+ .crewlet-dock-column--divider[data-side='end'] > .crewlet-dock-column__panel {
19741
+ border-inline-start: 1px solid var(--color-border-default);
19742
+ }
19743
+
19744
+ @media (prefers-reduced-motion: reduce) {
19745
+ .crewlet-dock-column {
19746
+ transition: none;
19747
+ }
19748
+ }
19749
+
19750
+
18091
19751
  /* Document-M6JYGLWV.css */
18092
19752
  /*
18093
19753
  * Rendered markdown, set as a document (Document.tsx).
@@ -18663,6 +20323,72 @@ svg.crewlet-datetime__chevron {
18663
20323
  }
18664
20324
 
18665
20325
 
20326
+ /* EmojiPicker-FMWYN2WX.css */
20327
+ /*
20328
+ * A searchable grid of emoji in a popover: the field, then each group under
20329
+ * its quiet heading, eight to a row, in a scroller of its own.
20330
+ */
20331
+
20332
+ .crewlet-emoji-picker__body {
20333
+ display: flex;
20334
+ flex-direction: column;
20335
+ gap: var(--spacing-2);
20336
+ width: 296px;
20337
+ max-width: 100%;
20338
+ box-sizing: border-box;
20339
+ padding: var(--spacing-2);
20340
+ }
20341
+
20342
+ .crewlet-emoji-picker__scroll {
20343
+ max-height: 240px;
20344
+ overflow-y: auto;
20345
+ overscroll-behavior: contain;
20346
+ }
20347
+
20348
+ /* A group's heading, in the meta register at the regular weight. */
20349
+ .crewlet-emoji-picker__group {
20350
+ padding: var(--spacing-2) var(--spacing-1) var(--spacing-1);
20351
+ color: var(--color-text-tertiary);
20352
+ font-size: var(--font-size-2xs);
20353
+ font-weight: var(--font-weight-regular);
20354
+ letter-spacing: var(--font-letter-spacing-wide);
20355
+ text-transform: uppercase;
20356
+ }
20357
+
20358
+ .crewlet-emoji-picker__grid {
20359
+ display: grid;
20360
+ grid-template-columns: repeat(var(--crewlet-emoji-picker-columns), minmax(0, 1fr));
20361
+ gap: 2px;
20362
+ }
20363
+
20364
+ .crewlet-emoji-picker__cell {
20365
+ aspect-ratio: 1;
20366
+ padding: 0;
20367
+ border: 0;
20368
+ border-radius: var(--radius-sm);
20369
+ background: transparent;
20370
+ font-size: var(--font-size-lg);
20371
+ line-height: 1;
20372
+ cursor: pointer;
20373
+ }
20374
+
20375
+ .crewlet-emoji-picker__cell:hover {
20376
+ background: var(--color-surface-hover);
20377
+ }
20378
+
20379
+ .crewlet-emoji-picker__cell:focus-visible {
20380
+ background: var(--color-surface-hover);
20381
+ outline: 2px solid var(--color-focus);
20382
+ outline-offset: var(--size-focus-ring-inset-offset);
20383
+ }
20384
+
20385
+ .crewlet-emoji-picker__none {
20386
+ margin: var(--spacing-3) var(--spacing-1);
20387
+ color: var(--color-text-tertiary);
20388
+ font-size: var(--font-size-sm);
20389
+ }
20390
+
20391
+
18666
20392
  /* EmptyState-7L4UAQBX.css */
18667
20393
  /*
18668
20394
  * The empty state.
@@ -20379,7 +22105,7 @@ a.crewlet-icon-btn {
20379
22105
  .crewlet-icon-tile--blue { --crewlet-icon-tile-fill: var(--color-node-blue-fill); --crewlet-icon-tile-ink: var(--color-node-blue-ink); }
20380
22106
 
20381
22107
 
20382
- /* ImageUpload-OWI7CCG7.css */
22108
+ /* ImageUpload-IFXZROFZ.css */
20383
22109
  /*
20384
22110
  * ImageUpload, the click-to-upload affordance built on Avatar.
20385
22111
  *
@@ -20426,34 +22152,16 @@ a.crewlet-icon-btn {
20426
22152
  cursor: pointer;
20427
22153
  }
20428
22154
 
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
22155
  /* 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 {
22156
+ rather than a step: Avatar moves a face's corner with its box, so a trigger
22157
+ pinned to one step is rounder or squarer than the face under it at every
22158
+ size but one, and the face's corners show through the overlay. Every face
22159
+ is one shape, a person's and an agent's alike, so one rule serves both. */
22160
+ .crewlet-image-upload__trigger,
22161
+ .crewlet-image-upload__overlay {
20442
22162
  border-radius: var(--crewlet-image-upload-corner);
20443
22163
  }
20444
22164
 
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
22165
  .crewlet-image-upload__trigger:disabled {
20458
22166
  cursor: default;
20459
22167
  }
@@ -20552,19 +22260,6 @@ a.crewlet-icon-btn {
20552
22260
  transition: opacity var(--motion-duration-fast) var(--motion-easing-default);
20553
22261
  }
20554
22262
 
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
22263
  .crewlet-image-upload:hover .crewlet-image-upload__remove,
20569
22264
  .crewlet-image-upload__remove:focus-visible {
20570
22265
  opacity: 1;
@@ -22731,6 +24426,164 @@ a.crewlet-icon-btn {
22731
24426
  }
22732
24427
 
22733
24428
 
24429
+ /* LinkCard-5I4MYU6I.css */
24430
+ /*
24431
+ * LinkCard: what a link points at, unfurled under its message.
24432
+ *
24433
+ * AN UNFURL, NOT A CARD. No box and no fill: a slim bar on the left in the
24434
+ * status's line colour (the medium edge with none), and the lines beside it
24435
+ * in the dashboard's own type (the title in the primary ink, the small meta
24436
+ * under it), so a preview reads as part of its message. One width for every
24437
+ * preview (ChatScale.css), so a stack of them shares both edges.
24438
+ */
24439
+ .crewlet-link-card {
24440
+ --crewlet-link-card-bar: 3px;
24441
+ --crewlet-link-card-tone: var(--color-edge-medium);
24442
+ --crewlet-link-card-dot: var(--color-text-tertiary);
24443
+ position: relative;
24444
+ display: flex;
24445
+ flex-direction: column;
24446
+ align-items: flex-start;
24447
+ gap: 2px;
24448
+ width: min(100%, var(--crewlet-chat-card));
24449
+ box-sizing: border-box;
24450
+ padding: 2px 0 2px calc(var(--crewlet-link-card-bar) + var(--spacing-3));
24451
+ border-radius: var(--radius-xs);
24452
+ color: var(--color-text-secondary);
24453
+ font-size: var(--font-size-xs);
24454
+ line-height: var(--font-line-height-snug);
24455
+ text-decoration: none;
24456
+ }
24457
+
24458
+ .crewlet-link-card::before {
24459
+ content: '';
24460
+ position: absolute;
24461
+ inset-block: 0;
24462
+ left: 0;
24463
+ width: var(--crewlet-link-card-bar);
24464
+ border-radius: var(--radius-pill);
24465
+ background: var(--crewlet-link-card-tone);
24466
+ }
24467
+
24468
+ /* The bar takes the tone's line colour; the status dot, small enough to
24469
+ carry it, the tone's full colour, so the status reads in both modes. */
24470
+ .crewlet-link-card--info {
24471
+ --crewlet-link-card-tone: var(--color-feedback-info-line);
24472
+ --crewlet-link-card-dot: var(--color-feedback-info);
24473
+ }
24474
+
24475
+ .crewlet-link-card--success {
24476
+ --crewlet-link-card-tone: var(--color-feedback-success-line);
24477
+ --crewlet-link-card-dot: var(--color-feedback-success);
24478
+ }
24479
+
24480
+ .crewlet-link-card--warning {
24481
+ --crewlet-link-card-tone: var(--color-feedback-warning-line);
24482
+ --crewlet-link-card-dot: var(--color-feedback-warning);
24483
+ }
24484
+
24485
+ .crewlet-link-card--danger {
24486
+ --crewlet-link-card-tone: var(--color-feedback-danger-line);
24487
+ --crewlet-link-card-dot: var(--color-feedback-danger);
24488
+ }
24489
+
24490
+ /* No box to ring over: the ring stands off the preview's words. */
24491
+ .crewlet-link-card:focus-visible {
24492
+ outline: 2px solid var(--color-focus);
24493
+ outline-offset: 2px;
24494
+ }
24495
+
24496
+ /* The app it comes from: its mark and its name, small and quiet. */
24497
+ .crewlet-link-card__source {
24498
+ display: inline-flex;
24499
+ align-items: center;
24500
+ gap: var(--spacing-1);
24501
+ }
24502
+
24503
+ .crewlet-link-card__mark,
24504
+ .crewlet-link-card__face {
24505
+ display: inline-flex;
24506
+ flex: none;
24507
+ }
24508
+
24509
+ /* The title in the primary ink at the regular weight, two lines at most;
24510
+ under the pointer it takes the accent ink and an underline. */
24511
+ .crewlet-link-card__title {
24512
+ display: -webkit-box;
24513
+ max-width: 100%;
24514
+ overflow: hidden;
24515
+ -webkit-box-orient: vertical;
24516
+ -webkit-line-clamp: 2;
24517
+ color: var(--color-text-primary);
24518
+ font-size: var(--font-size-compact);
24519
+ font-weight: var(--font-weight-regular);
24520
+ overflow-wrap: anywhere;
24521
+ }
24522
+
24523
+ /* THE TITLE ALONE IS UNDERLINED. The document's base underlines every link
24524
+ under the pointer, and an underline on the link runs through all of its
24525
+ lines (the source, the details, the owner), which no line inside can
24526
+ take off again. */
24527
+ a.crewlet-link-card:hover {
24528
+ text-decoration: none;
24529
+ }
24530
+
24531
+ a.crewlet-link-card:hover .crewlet-link-card__title {
24532
+ color: var(--color-brand-accent-ink);
24533
+ text-decoration: underline;
24534
+ text-underline-offset: 2px;
24535
+ }
24536
+
24537
+ .crewlet-link-card__code {
24538
+ color: var(--color-text-secondary);
24539
+ }
24540
+
24541
+ .crewlet-link-card__meta {
24542
+ max-width: 100%;
24543
+ overflow: hidden;
24544
+ text-overflow: ellipsis;
24545
+ white-space: nowrap;
24546
+ }
24547
+
24548
+ /* Status and owner as words on one line: a dot in the status's colour, and
24549
+ a small face with the owner's name. */
24550
+ .crewlet-link-card__fields {
24551
+ display: flex;
24552
+ flex-wrap: wrap;
24553
+ align-items: center;
24554
+ gap: var(--spacing-1) var(--spacing-3);
24555
+ margin-top: 2px;
24556
+ }
24557
+
24558
+ .crewlet-link-card__status,
24559
+ .crewlet-link-card__owner {
24560
+ display: inline-flex;
24561
+ align-items: center;
24562
+ gap: var(--spacing-1);
24563
+ white-space: nowrap;
24564
+ }
24565
+
24566
+ .crewlet-link-card__dot {
24567
+ width: 6px;
24568
+ height: 6px;
24569
+ flex: none;
24570
+ border-radius: var(--radius-circle);
24571
+ background: var(--crewlet-link-card-dot);
24572
+ }
24573
+
24574
+ /* FORCED COLORS drops the bar's and the dot's backgrounds; a border is the
24575
+ one edge the mode keeps. */
24576
+ @media (forced-colors: active) {
24577
+ .crewlet-link-card::before {
24578
+ border-left: var(--crewlet-link-card-bar) solid CanvasText;
24579
+ }
24580
+
24581
+ .crewlet-link-card__dot {
24582
+ border: 1px solid CanvasText;
24583
+ }
24584
+ }
24585
+
24586
+
22734
24587
  /* LinkInterstitial-ET4MSVSV.css */
22735
24588
  /*
22736
24589
  * The destination, said twice: the host as the claim a reader decides on, in
@@ -24349,6 +26202,119 @@ a.crewlet-icon-btn {
24349
26202
  }
24350
26203
 
24351
26204
 
26205
+ /* MentionChip-W7MZZVRZ.css */
26206
+ /*
26207
+ * A mention in a message's words: a chip in the line, in the info tone's
26208
+ * light blue, or the warning tone where it names the reader.
26209
+ */
26210
+
26211
+ .crewlet-mention-chip {
26212
+ display: inline;
26213
+ padding: 0 2px;
26214
+ border: 0;
26215
+ border-radius: var(--radius-xs);
26216
+ background: var(--color-feedback-info-soft);
26217
+ color: var(--color-feedback-info-ink);
26218
+ font: inherit;
26219
+ font-weight: var(--font-weight-regular);
26220
+ -webkit-box-decoration-break: clone;
26221
+ box-decoration-break: clone;
26222
+ }
26223
+
26224
+ .crewlet-mention-chip--self,
26225
+ .crewlet-mention-chip--everyone {
26226
+ background: var(--color-feedback-warning-soft);
26227
+ color: var(--color-feedback-warning-ink);
26228
+ }
26229
+
26230
+ button.crewlet-mention-chip {
26231
+ cursor: pointer;
26232
+ }
26233
+
26234
+ /* Under the pointer the fill takes the tone's next strength, its line step. */
26235
+ button.crewlet-mention-chip:hover {
26236
+ background: var(--color-feedback-info-line);
26237
+ }
26238
+
26239
+ button.crewlet-mention-chip--self:hover,
26240
+ button.crewlet-mention-chip--everyone:hover {
26241
+ background: var(--color-feedback-warning-line);
26242
+ }
26243
+
26244
+ button.crewlet-mention-chip:focus-visible {
26245
+ outline: 2px solid var(--color-focus);
26246
+ outline-offset: 1px;
26247
+ }
26248
+
26249
+
26250
+ /* MentionMenu-4NAQ45S4.css */
26251
+ /*
26252
+ * MentionMenu: the suggestions a composer opens on "@" or "#".
26253
+ *
26254
+ * The popover surface (the fill, hairline, corner and shadow of the emoji
26255
+ * picker that opens from the same composer), as wide as the field but no
26256
+ * wider than a list a reader scans: on a wide room the trailing word
26257
+ * ("Working") stood a screen's width from the name it belongs to; a host
26258
+ * moves that cap with `--crewlet-mention-menu-width` on any box round it.
26259
+ * It is placed against the nearest positioned box round the field, above
26260
+ * it, so it never covers what is being typed.
26261
+ */
26262
+ .crewlet-mention-menu {
26263
+ position: absolute;
26264
+ bottom: calc(100% + var(--spacing-1));
26265
+ left: 0;
26266
+ z-index: var(--z-index-dropdown);
26267
+ box-sizing: border-box;
26268
+ width: min(100%, var(--crewlet-mention-menu-width, 560px));
26269
+ overflow: hidden;
26270
+ border: 1px solid var(--color-border-default);
26271
+ border-radius: var(--radius-lg);
26272
+ background: var(--color-surface-subtle);
26273
+ box-shadow: var(--shadow-xl);
26274
+ }
26275
+
26276
+ .crewlet-mention-menu__label {
26277
+ padding: var(--spacing-2) var(--spacing-3) var(--spacing-1);
26278
+ color: var(--color-text-tertiary);
26279
+ font-size: var(--font-size-2xs);
26280
+ font-weight: var(--font-weight-regular);
26281
+ letter-spacing: var(--font-letter-spacing-wide);
26282
+ text-transform: uppercase;
26283
+ }
26284
+
26285
+ .crewlet-mention-menu__list {
26286
+ max-height: 264px;
26287
+ margin: 0;
26288
+ padding: 0 var(--spacing-1) var(--spacing-1);
26289
+ overflow-y: auto;
26290
+ overscroll-behavior: contain;
26291
+ list-style: none;
26292
+ }
26293
+
26294
+ /* The panel's corner less its inset, so each row's curve runs parallel. */
26295
+ .crewlet-mention-menu__list > .crewlet-person-row {
26296
+ --crewlet-person-row-radius: calc(var(--radius-lg) - var(--spacing-1));
26297
+ }
26298
+
26299
+ .crewlet-mention-menu__footer {
26300
+ display: flex;
26301
+ flex-wrap: wrap;
26302
+ align-items: center;
26303
+ gap: var(--spacing-1) var(--spacing-3);
26304
+ padding: var(--spacing-2) var(--spacing-3);
26305
+ border-top: 1px solid var(--color-border-default);
26306
+ color: var(--color-text-tertiary);
26307
+ font-size: var(--font-size-xs);
26308
+ }
26309
+
26310
+ /* The foot names keys, and a touch screen has none to press. */
26311
+ @media (hover: none) {
26312
+ .crewlet-mention-menu__footer {
26313
+ display: none;
26314
+ }
26315
+ }
26316
+
26317
+
24352
26318
  /* Menu-I4SNXHOT.css */
24353
26319
  /*
24354
26320
  * The menu button's panel.
@@ -24743,6 +26709,82 @@ a.crewlet-icon-btn {
24743
26709
  }
24744
26710
 
24745
26711
 
26712
+ /* MessageActions-Q4F5UH3S.css */
26713
+ /*
26714
+ * The tray a message shows on hover: the transcript's own ground ringed with
26715
+ * the hairline and a small shadow, the large corner, and 30px tools inside
26716
+ * the inset, so it reads as a soft tray of tools rather than a framed bar.
26717
+ * Two classes, so the tray's own rules hold over Toolbar's in any bundle
26718
+ * order.
26719
+ */
26720
+ .crewlet-toolbar.crewlet-message-actions {
26721
+ flex-wrap: nowrap;
26722
+ gap: var(--crewlet-chat-toolbar-inset);
26723
+ height: var(--crewlet-chat-toolbar);
26724
+ box-sizing: border-box;
26725
+ padding: var(--crewlet-chat-toolbar-inset);
26726
+ border: 1px solid var(--color-edge-hairline);
26727
+ border-radius: var(--radius-lg);
26728
+ background: var(--crewlet-chat-ground);
26729
+ box-shadow: var(--shadow-xs);
26730
+ }
26731
+
26732
+ /* A tool whose menu or picker is open reads as held down, which is not the
26733
+ accent fill a toggle that is on (Saved) draws. */
26734
+ .crewlet-message-actions .crewlet-icon-btn[aria-expanded='true'] {
26735
+ background: var(--color-surface-pressed);
26736
+ color: var(--color-text-primary);
26737
+ }
26738
+
26739
+ .crewlet-message-actions__emoji {
26740
+ display: inline-flex;
26741
+ flex: none;
26742
+ align-items: center;
26743
+ justify-content: center;
26744
+ width: var(--size-control-md);
26745
+ height: var(--size-control-md);
26746
+ padding: 0;
26747
+ border: 0;
26748
+ border-radius: var(--radius-md);
26749
+ background: transparent;
26750
+ font-size: var(--font-size-md);
26751
+ line-height: 1;
26752
+ cursor: pointer;
26753
+ }
26754
+
26755
+ .crewlet-message-actions__emoji:hover {
26756
+ background: var(--color-fill-soft);
26757
+ }
26758
+
26759
+ .crewlet-message-actions__emoji:active {
26760
+ background: var(--color-surface-pressed);
26761
+ }
26762
+
26763
+ /* Held, as the tray's icon tools are: faded, no fill under the pointer, and
26764
+ the reason in its hint. */
26765
+ .crewlet-message-actions__emoji[aria-disabled='true'] {
26766
+ opacity: 0.5;
26767
+ cursor: not-allowed;
26768
+ }
26769
+
26770
+ .crewlet-message-actions__emoji[aria-disabled='true']:is(:hover, :active) {
26771
+ background: transparent;
26772
+ }
26773
+
26774
+ .crewlet-message-actions__emoji:focus-visible {
26775
+ outline: 2px solid var(--color-focus);
26776
+ outline-offset: var(--size-focus-ring-inset-offset);
26777
+ }
26778
+
26779
+ .crewlet-message-actions__divider {
26780
+ flex: none;
26781
+ width: 1px;
26782
+ height: var(--spacing-4);
26783
+ margin: 0 var(--spacing-1);
26784
+ background: var(--color-border-default);
26785
+ }
26786
+
26787
+
24746
26788
  /* MessageBubble-AHTXBO3X.css */
24747
26789
  /*
24748
26790
  * One message: the bubble on its writer's side, and what it carried and its
@@ -24972,7 +27014,7 @@ a.crewlet-icon-btn {
24972
27014
  }
24973
27015
 
24974
27016
 
24975
- /* Modal-FYQYEI3N.css */
27017
+ /* Modal-GKUOO7PZ.css */
24976
27018
  /*
24977
27019
  * The modal surface: the veil, the frame, and the three bands inside it.
24978
27020
  *
@@ -25260,13 +27302,32 @@ a.crewlet-icon-btn {
25260
27302
  animation: crewlet-modal-sheet-in var(--motion-duration-slow) var(--motion-easing-emphasized);
25261
27303
  }
25262
27304
 
27305
+ /*
27306
+ * A SHEET FROM THE START EDGE (`side="start"`): a navigation panel, pinned to
27307
+ * the inline start and arriving from past it, with its edge and its shadow on
27308
+ * its inline end, into the page it covers. The shadow is the sheet's own,
27309
+ * mirrored by the token build, so a palette's sheet shadow reads the same way
27310
+ * round on either side.
27311
+ */
27312
+ .crewlet-modal-overlay--sheet.crewlet-modal-overlay--start {
27313
+ justify-content: flex-start;
27314
+ }
27315
+
27316
+ .crewlet-modal--sheet.crewlet-modal--start {
27317
+ --crewlet-modal-sheet-from: -100%;
27318
+ border-inline-start: none;
27319
+ border-inline-end: 1px solid var(--color-border-default);
27320
+ box-shadow: var(--shadow-sheet-start);
27321
+ }
27322
+
25263
27323
  /*
25264
27324
  * The shell's one breakpoint, strictly under it as the shell switches. Below
25265
27325
  * it there is no content beside a sheet to keep in view, so the sheet takes
25266
27326
  * the whole width and its edge goes with it.
25267
27327
  */
25268
27328
  @media (width < 1024px) {
25269
- .crewlet-modal--sheet {
27329
+ .crewlet-modal--sheet,
27330
+ .crewlet-modal--sheet.crewlet-modal--start {
25270
27331
  width: 100%;
25271
27332
  border-inline: none;
25272
27333
  }
@@ -25289,6 +27350,11 @@ a.crewlet-icon-btn {
25289
27350
  --crewlet-modal-glyph-inset: calc((var(--size-control-md) - var(--font-size-sm)) / 2);
25290
27351
 
25291
27352
  display: flex;
27353
+ /* The head and the foot keep their height and the body gives way: in the
27354
+ frame's column a head that could shrink was squeezed under a long body
27355
+ to the bar's height, and a wrapped title and subtitle ran over its
27356
+ edges. */
27357
+ flex-shrink: 0;
25292
27358
  align-items: center;
25293
27359
  gap: var(--spacing-3);
25294
27360
  padding: var(--spacing-4);
@@ -25509,6 +27575,7 @@ a.crewlet-icon-btn {
25509
27575
  */
25510
27576
  .crewlet-modal__footer {
25511
27577
  display: flex;
27578
+ flex-shrink: 0;
25512
27579
  align-items: center;
25513
27580
  flex-wrap: wrap;
25514
27581
  gap: var(--spacing-2);
@@ -27418,6 +29485,170 @@ a.crewlet-icon-btn {
27418
29485
  }
27419
29486
 
27420
29487
 
29488
+ /* PersonRow-V5GTPNVP.css */
29489
+ /*
29490
+ * PersonRow: a person or an agent as one row of a list, as a button or as a
29491
+ * listbox option. One design for every list of people.
29492
+ */
29493
+ .crewlet-person-row {
29494
+ /* The row's corner. A list inside a rounded panel sets it to the panel's
29495
+ corner less the panel's inset, so the two curves run parallel. */
29496
+ --crewlet-person-row-radius: var(--radius-md);
29497
+ display: flex;
29498
+ align-items: center;
29499
+ gap: var(--spacing-3);
29500
+ width: 100%;
29501
+ box-sizing: border-box;
29502
+ margin: 0;
29503
+ padding: var(--spacing-2);
29504
+ border: 0;
29505
+ border-radius: var(--crewlet-person-row-radius);
29506
+ background: transparent;
29507
+ color: var(--color-text-primary);
29508
+ font: inherit;
29509
+ font-size: var(--font-size-sm);
29510
+ line-height: var(--font-line-height-normal);
29511
+ text-align: left;
29512
+ list-style: none;
29513
+ cursor: pointer;
29514
+ }
29515
+
29516
+ /* One line, for a list that opens under a caret: the name, its detail after
29517
+ it, and the trailing words at the end. */
29518
+ .crewlet-person-row--compact {
29519
+ gap: var(--spacing-2);
29520
+ min-height: var(--size-row-md);
29521
+ padding-block: 0;
29522
+ }
29523
+
29524
+ /*
29525
+ * A ROW SHOWS THE HOVER OVERLAY OR THE CHOSEN TINT, NEVER BOTH: they are the
29526
+ * same property on the same element, and the chosen row keeps its tint under
29527
+ * the pointer.
29528
+ */
29529
+ .crewlet-person-row:hover,
29530
+ .crewlet-person-row.is-highlighted {
29531
+ background: var(--color-surface-hover);
29532
+ }
29533
+
29534
+ .crewlet-person-row.is-selected,
29535
+ .crewlet-person-row.is-selected:hover {
29536
+ background: var(--color-brand-accent-soft);
29537
+ }
29538
+
29539
+ /* The row the arrows are on, in a list a field owns: a bar on its start
29540
+ edge, so it is found in a list whose chosen rows are tinted too. */
29541
+ .crewlet-person-row.is-highlighted {
29542
+ box-shadow: inset 2px 0 0 var(--color-brand-accent);
29543
+ }
29544
+
29545
+ .crewlet-person-row:focus-visible {
29546
+ outline: 2px solid var(--color-focus);
29547
+ outline-offset: var(--size-focus-ring-inset-offset);
29548
+ }
29549
+
29550
+ .crewlet-person-row:disabled,
29551
+ .crewlet-person-row.is-disabled {
29552
+ color: var(--color-text-tertiary);
29553
+ cursor: not-allowed;
29554
+ }
29555
+
29556
+ /*
29557
+ * One column for every face or glyph, so every name starts on one edge: a
29558
+ * room's 16px glyph started its name a step left of the faces beside it.
29559
+ */
29560
+ .crewlet-person-row__face {
29561
+ display: inline-flex;
29562
+ flex: none;
29563
+ align-items: center;
29564
+ justify-content: center;
29565
+ min-width: var(--size-control-md);
29566
+ color: var(--color-text-secondary);
29567
+ }
29568
+
29569
+ .crewlet-person-row--compact .crewlet-person-row__face {
29570
+ min-width: var(--size-control-sm);
29571
+ }
29572
+
29573
+ .crewlet-person-row__text {
29574
+ display: flex;
29575
+ flex: 1;
29576
+ flex-direction: column;
29577
+ min-width: 0;
29578
+ }
29579
+
29580
+ .crewlet-person-row__name {
29581
+ display: inline-flex;
29582
+ align-items: center;
29583
+ gap: var(--spacing-2);
29584
+ min-width: 0;
29585
+ font-weight: var(--font-weight-regular);
29586
+ white-space: nowrap;
29587
+ }
29588
+
29589
+ .crewlet-person-row__detail {
29590
+ min-width: 0;
29591
+ overflow: hidden;
29592
+ color: var(--color-text-secondary);
29593
+ font-size: var(--font-size-xs);
29594
+ text-overflow: ellipsis;
29595
+ white-space: nowrap;
29596
+ }
29597
+
29598
+ .crewlet-person-row--compact .crewlet-person-row__detail {
29599
+ color: var(--color-text-tertiary);
29600
+ }
29601
+
29602
+ .crewlet-person-row__meta {
29603
+ flex: none;
29604
+ margin-left: auto;
29605
+ color: var(--color-text-tertiary);
29606
+ font-size: var(--font-size-xs);
29607
+ white-space: nowrap;
29608
+ }
29609
+
29610
+ /* The toggle's mark: a plus that is quiet until the row is pointed at, and a
29611
+ check on the accent once the row is chosen. */
29612
+ .crewlet-person-row__mark {
29613
+ display: inline-flex;
29614
+ flex: none;
29615
+ align-items: center;
29616
+ justify-content: center;
29617
+ width: var(--size-control-sm);
29618
+ height: var(--size-control-sm);
29619
+ margin-left: auto;
29620
+ border-radius: var(--radius-md);
29621
+ color: var(--color-text-secondary);
29622
+ }
29623
+
29624
+ .crewlet-person-row__meta + .crewlet-person-row__mark {
29625
+ margin-left: 0;
29626
+ }
29627
+
29628
+ .crewlet-person-row:hover .crewlet-person-row__mark {
29629
+ background: var(--color-surface-elevated);
29630
+ color: var(--color-text-primary);
29631
+ }
29632
+
29633
+ .crewlet-person-row.is-selected .crewlet-person-row__mark {
29634
+ background: var(--color-brand-accent);
29635
+ color: var(--color-text-on-accent);
29636
+ }
29637
+
29638
+ /*
29639
+ * FORCED COLORS repaints every background to Canvas, which took the chosen
29640
+ * tint and the arrows' row with it. An outline is the one mark the mode
29641
+ * keeps, in the system's own colour for exactly this.
29642
+ */
29643
+ @media (forced-colors: active) {
29644
+ .crewlet-person-row.is-selected,
29645
+ .crewlet-person-row.is-highlighted {
29646
+ outline: 2px solid Highlight;
29647
+ outline-offset: -2px;
29648
+ }
29649
+ }
29650
+
29651
+
27421
29652
  /* PinTile-OWS7JTHD.css */
27422
29653
  /*
27423
29654
  * PinTile: one pinned thing, a link with its facts.
@@ -27845,7 +30076,7 @@ a.crewlet-icon-btn {
27845
30076
  }
27846
30077
 
27847
30078
 
27848
- /* PresenceStack-ZV67BH4V.css */
30079
+ /* PresenceStack-2DTYRADY.css */
27849
30080
  /*
27850
30081
  * Who is here (PresenceStack.tsx), on the avatar stack's own geometry: the
27851
30082
  * overlap and the counted chip are the stack's, the overlap stepped out by
@@ -27875,12 +30106,10 @@ a.crewlet-icon-btn {
27875
30106
  font: inherit;
27876
30107
  }
27877
30108
 
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);
30109
+ /* The face's own corner, which the component sets from Avatar's ladder: one
30110
+ shape for people and agents. */
30111
+ .crewlet-presence-stack > .crewlet-presence-stack__member {
30112
+ border-radius: var(--crewlet-presence-stack-corner);
27884
30113
  }
27885
30114
 
27886
30115
  button.crewlet-presence-stack__member {
@@ -28785,6 +31014,102 @@ button.crewlet-presence-stack__member:focus-visible {
28785
31014
  }
28786
31015
 
28787
31016
 
31017
+ /* ReactionBar-XXI4V7XG.css */
31018
+ /*
31019
+ * A message's reactions: one pill to an emoji, then the add pill. A pill at
31020
+ * rest is a fill and no frame; the edge arrives under the pointer.
31021
+ */
31022
+
31023
+ .crewlet-reaction-bar {
31024
+ display: flex;
31025
+ flex-wrap: wrap;
31026
+ align-items: center;
31027
+ gap: var(--spacing-1);
31028
+ }
31029
+
31030
+ .crewlet-reaction {
31031
+ display: inline-flex;
31032
+ align-items: center;
31033
+ justify-content: center;
31034
+ gap: var(--spacing-1);
31035
+ min-width: 44px;
31036
+ height: 24px;
31037
+ box-sizing: border-box;
31038
+ padding: 0 var(--spacing-2);
31039
+ border: 1px solid transparent;
31040
+ border-radius: var(--radius-pill);
31041
+ background: var(--color-fill-soft);
31042
+ color: var(--color-text-primary);
31043
+ font: inherit;
31044
+ font-size: var(--crewlet-chat-meta);
31045
+ line-height: 1;
31046
+ cursor: pointer;
31047
+ transition:
31048
+ border-color var(--motion-duration-fast) var(--motion-easing-default),
31049
+ background var(--motion-duration-fast) var(--motion-easing-default);
31050
+ }
31051
+
31052
+ /* The emoji is the pill's picture and the count its caption: at the count's
31053
+ size the emoji read smaller than the number beside it. */
31054
+ .crewlet-reaction__emoji {
31055
+ font-size: var(--font-size-md);
31056
+ }
31057
+
31058
+ .crewlet-reaction__count {
31059
+ font-variant-numeric: tabular-nums;
31060
+ font-weight: var(--font-weight-regular);
31061
+ }
31062
+
31063
+ /* The pointed pill drops its fill and takes the strong edge. */
31064
+ .crewlet-reaction:hover {
31065
+ border-color: var(--color-edge-strong);
31066
+ background: transparent;
31067
+ }
31068
+
31069
+ /* Yours: the accent's soft fill, its ink and a heavier count, ringed in the
31070
+ accent, so it differs from the others by more than its hue. */
31071
+ .crewlet-reaction.is-mine {
31072
+ border-color: var(--color-brand-accent);
31073
+ background: var(--color-brand-accent-soft);
31074
+ color: var(--color-brand-accent-ink);
31075
+ }
31076
+
31077
+ .crewlet-reaction.is-mine:hover {
31078
+ background: var(--color-brand-accent-soft-strong);
31079
+ }
31080
+
31081
+ .crewlet-reaction.is-mine .crewlet-reaction__count {
31082
+ font-weight: var(--font-weight-medium);
31083
+ }
31084
+
31085
+ .crewlet-reaction[aria-disabled='true'] {
31086
+ cursor: not-allowed;
31087
+ }
31088
+
31089
+ .crewlet-reaction:focus-visible {
31090
+ outline: 2px solid var(--color-focus);
31091
+ outline-offset: var(--size-focus-ring-inset-offset);
31092
+ }
31093
+
31094
+ /* The add pill: the glyph alone, in the quiet ink. */
31095
+ .crewlet-reaction.crewlet-reaction--add {
31096
+ min-width: 32px;
31097
+ padding: 0;
31098
+ color: var(--color-text-tertiary);
31099
+ }
31100
+
31101
+ .crewlet-reaction.crewlet-reaction--add[aria-expanded='true'] {
31102
+ background: var(--color-surface-pressed);
31103
+ color: var(--color-text-primary);
31104
+ }
31105
+
31106
+ @media (prefers-reduced-motion: reduce) {
31107
+ .crewlet-reaction {
31108
+ transition: none;
31109
+ }
31110
+ }
31111
+
31112
+
28788
31113
  /* ReadingPane-VLYOWMCM.css */
28789
31114
  /*
28790
31115
  * One item read in full, in one column.
@@ -33567,7 +35892,7 @@ svg.crewlet-select__chevron {
33567
35892
  }
33568
35893
 
33569
35894
 
33570
- /* SidePanel-VXKUKLOJ.css */
35895
+ /* SidePanel-BKWT6Q6Z.css */
33571
35896
  /*
33572
35897
  * A side panel and the frame that lays it beside the content or over it
33573
35898
  * (`SidePanel`, `SidePanelFrame`, and their artifact presets).
@@ -33658,6 +35983,42 @@ svg.crewlet-select__chevron {
33658
35983
  border-bottom: 1px solid var(--color-border-default);
33659
35984
  }
33660
35985
 
35986
+ /* With a subtitle the head holds one or two lines, so its height is a floor
35987
+ rather than a height, and its controls stay on the first line. */
35988
+ .crewlet-side-panel__head--subtitled {
35989
+ align-items: flex-start;
35990
+ height: auto;
35991
+ min-height: var(--crewlet-side-panel-head-height);
35992
+ padding-block: calc((var(--crewlet-side-panel-head-height) - var(--size-control-sm)) / 2);
35993
+ box-sizing: border-box;
35994
+ }
35995
+
35996
+ /* The title and the subtitle on one baseline, the subtitle dropping under
35997
+ the title when the two do not fit; the title shrinks to its own line and
35998
+ is ellipsised there. Centred on the controls' line while it is one line. */
35999
+ .crewlet-side-panel__heading {
36000
+ display: flex;
36001
+ flex: 1 1 auto;
36002
+ flex-wrap: wrap;
36003
+ align-items: baseline;
36004
+ column-gap: var(--spacing-2);
36005
+ min-width: 0;
36006
+ min-height: var(--size-control-sm);
36007
+ align-content: center;
36008
+ }
36009
+
36010
+ .crewlet-side-panel__heading > .crewlet-side-panel__title {
36011
+ flex: 0 1 auto;
36012
+ }
36013
+
36014
+ .crewlet-side-panel__subtitle {
36015
+ min-width: 0;
36016
+ overflow-wrap: anywhere;
36017
+ color: var(--color-text-tertiary);
36018
+ font-size: var(--font-size-sm);
36019
+ line-height: var(--font-line-height-snug);
36020
+ }
36021
+
33661
36022
  .crewlet-side-panel__icon {
33662
36023
  display: inline-flex;
33663
36024
  flex: none;
@@ -33813,7 +36174,7 @@ svg.crewlet-select__chevron {
33813
36174
  }
33814
36175
 
33815
36176
 
33816
- /* SidebarNav-VTQ3G4AE.css */
36177
+ /* SidebarNav-E7PZGGA6.css */
33817
36178
  /*
33818
36179
  * The rail's navigation.
33819
36180
  *
@@ -33903,6 +36264,61 @@ svg.crewlet-select__chevron {
33903
36264
  color: var(--color-text-tertiary);
33904
36265
  }
33905
36266
 
36267
+ /*
36268
+ * A HEADING THAT FOLDS ITS GROUP (`collapsible`): the button is the heading's
36269
+ * words and a chevron, the chevron centred in the glyph column (a nav glyph's
36270
+ * 14px; the xs chevron is 12px) and the words on the label line, so the
36271
+ * headings and the rows of a folded list stay one grid. It is the target
36272
+ * floor tall, the head's own height, and as wide as its words, so the head's
36273
+ * control keeps its own target at the end.
36274
+ *
36275
+ * THE RING IS DRAWN INSIDE ITS EDGE, because the words ellipsize and the box
36276
+ * that cuts them would cut an outset ring on every side.
36277
+ */
36278
+ .crewlet-nav-group__toggle {
36279
+ display: inline-flex;
36280
+ flex: 0 1 auto;
36281
+ align-items: center;
36282
+ gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
36283
+ min-width: 0;
36284
+ min-height: var(--size-target-min);
36285
+ margin: 0;
36286
+ padding: 0 var(--spacing-1) 0 0;
36287
+ border: 0;
36288
+ border-radius: var(--radius-sm);
36289
+ background: transparent;
36290
+ color: var(--color-text-tertiary);
36291
+ font: inherit;
36292
+ cursor: pointer;
36293
+ transition: color var(--motion-duration-fast) var(--motion-easing-default);
36294
+ }
36295
+
36296
+ .crewlet-nav-group__toggle:hover {
36297
+ color: var(--color-text-primary);
36298
+ }
36299
+
36300
+ .crewlet-nav-group__toggle:focus-visible {
36301
+ outline: 2px solid var(--color-focus);
36302
+ outline-offset: var(--size-focus-ring-inset-offset);
36303
+ }
36304
+
36305
+ /* The words take the button's ink, so the heading lifts as one. */
36306
+ .crewlet-nav-group__toggle > .crewlet-nav-group__label {
36307
+ color: inherit;
36308
+ }
36309
+
36310
+ .crewlet-nav-group__chevron {
36311
+ display: inline-flex;
36312
+ flex: none;
36313
+ margin: 0 calc((14px - 12px) / 2);
36314
+ transition: transform var(--motion-duration-fast) var(--motion-easing-default);
36315
+ }
36316
+
36317
+ /* Folded, the chevron points at the words it would open. */
36318
+ .crewlet-nav-group--collapsed .crewlet-nav-group__chevron {
36319
+ transform: rotate(-90deg);
36320
+ }
36321
+
33906
36322
  /* The heading's control. Pushed to the end whether or not the heading has
33907
36323
  words, and at the floor the heading stands at. */
33908
36324
  .crewlet-nav-group__action {
@@ -34148,13 +36564,16 @@ svg.crewlet-select__chevron {
34148
36564
  * somebody who cannot separate the hue at all: the filled pill is the signal,
34149
36565
  * the figure is the count.
34150
36566
  *
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.
36567
+ * The chrome's one count badge (`--size-badge`, 16px with a 10px figure), at
36568
+ * least as wide as it is tall so a single digit is a round mark and not a
36569
+ * lozenge, and following the density. The same pill is drawn on the compact
36570
+ * rail's tiles and in its flyouts, so a count waiting for the reader is one
36571
+ * mark wherever it is; at 18px with an 11px figure it read louder than the
36572
+ * names beside it. The label is the on-accent step, the primary action's own
36573
+ * pair, on every row alike, because the fill is opaque.
34155
36574
  */
34156
36575
  .crewlet-nav-item__badge {
34157
- --crewlet-nav-item-badge-size: calc(18px * var(--density, 1));
36576
+ --crewlet-nav-item-badge-size: var(--size-badge);
34158
36577
  display: inline-flex;
34159
36578
  align-items: center;
34160
36579
  justify-content: center;
@@ -34163,11 +36582,11 @@ svg.crewlet-select__chevron {
34163
36582
  min-width: var(--crewlet-nav-item-badge-size);
34164
36583
  height: var(--crewlet-nav-item-badge-size);
34165
36584
  margin-left: auto;
34166
- padding: 0 calc(var(--spacing-1) + 1px);
36585
+ padding: 0 var(--size-badge-pad);
34167
36586
  border-radius: var(--radius-pill);
34168
36587
  background: var(--color-brand-accent);
34169
36588
  color: var(--color-text-on-accent);
34170
- font-size: var(--font-size-2xs);
36589
+ font-size: var(--font-size-badge);
34171
36590
  font-weight: var(--font-weight-semibold);
34172
36591
  font-variant-numeric: tabular-nums;
34173
36592
  line-height: 1;
@@ -34245,8 +36664,75 @@ svg.crewlet-select__chevron {
34245
36664
  border-left-color: var(--color-border-strong);
34246
36665
  }
34247
36666
 
36667
+ /*
36668
+ * THE DENSE LIST (`dense`): a list read in passing that runs long, a step
36669
+ * denser than the application's navigation.
36670
+ *
36671
+ * Its rows stand at the 24px target floor, the gutter is halved so a row's
36672
+ * highlight runs nearly from edge to edge (a long bar rather than a pill), and
36673
+ * the row's pad grows by exactly what the gutter gave up, so every glyph and
36674
+ * name stays on the line it was on, whatever the surface set the two tokens
36675
+ * to. The glyph column is as wide as a small face (an `Avatar` at `xs`), so a
36676
+ * face, a glyph and a group's count stand in one column and every name starts
36677
+ * on one line. Names are set in the regular weight, a step lighter than the
36678
+ * navigation's, which is what lets an unread row stand out by weight.
36679
+ */
36680
+ .crewlet-sidebar-nav--dense {
36681
+ --crewlet-nav-dense-pad: calc(var(--size-nav-row-pad) + var(--size-nav-gutter) - var(--spacing-1));
36682
+ --crewlet-nav-dense-slot: 20px;
36683
+ padding-right: var(--spacing-1);
36684
+ padding-left: var(--spacing-1);
36685
+ }
36686
+
36687
+ .crewlet-sidebar-nav--dense .crewlet-nav-item__row {
36688
+ min-height: var(--size-target-min);
36689
+ padding-right: var(--crewlet-nav-dense-pad);
36690
+ padding-left: var(--crewlet-nav-dense-pad);
36691
+ font-weight: var(--font-weight-regular);
36692
+ }
36693
+
36694
+ .crewlet-sidebar-nav--dense .crewlet-nav-group__head {
36695
+ padding-right: calc(var(--crewlet-nav-dense-pad) - (var(--size-target-min) - 14px) / 2);
36696
+ padding-left: var(--crewlet-nav-dense-pad);
36697
+ }
36698
+
36699
+ .crewlet-sidebar-nav--dense .crewlet-nav-item__icon {
36700
+ min-width: var(--crewlet-nav-dense-slot);
36701
+ }
36702
+
36703
+ .crewlet-sidebar-nav--dense .crewlet-nav-group__chevron {
36704
+ margin-right: calc((var(--crewlet-nav-dense-slot) - 12px) / 2);
36705
+ margin-left: calc((var(--crewlet-nav-dense-slot) - 12px) / 2);
36706
+ }
36707
+
36708
+ .crewlet-sidebar-nav--dense .crewlet-nav-item__children {
36709
+ margin-left: var(--crewlet-nav-dense-pad);
36710
+ padding-left: calc(var(--crewlet-nav-dense-slot) + var(--spacing-2) + var(--spacing-1) / 2 - var(--crewlet-nav-dense-pad) - 1px);
36711
+ }
36712
+
36713
+ /*
36714
+ * A ROW WITH NEWS (`unread`): its name a step heavier than its neighbours' and
36715
+ * in the primary ink, which is the whole of the signal in a dense list whose
36716
+ * names are regular. A muted row is never drawn unread (the component drops
36717
+ * the class), so the two rules never meet.
36718
+ */
36719
+ .crewlet-nav-item--unread > .crewlet-nav-item__head > .crewlet-nav-item__row {
36720
+ color: var(--color-text-primary);
36721
+ font-weight: var(--font-weight-medium);
36722
+ }
36723
+
36724
+ /*
36725
+ * A MUTED ROW rests in the quiet ink, glyph and name together, and lifts as
36726
+ * every row does: under the pointer, and while it is the row the reader is on.
36727
+ */
36728
+ .crewlet-nav-item--muted > .crewlet-nav-item__head > .crewlet-nav-item__row:not([aria-current]):not(:hover) {
36729
+ color: var(--color-text-tertiary);
36730
+ }
36731
+
34248
36732
  @media (prefers-reduced-motion: reduce) {
34249
36733
  .crewlet-nav-group__action,
36734
+ .crewlet-nav-group__toggle,
36735
+ .crewlet-nav-group__chevron,
34250
36736
  .crewlet-nav-item__row,
34251
36737
  .crewlet-nav-item__chevron {
34252
36738
  transition: none;
@@ -34264,7 +36750,7 @@ svg.crewlet-select__chevron {
34264
36750
  }
34265
36751
 
34266
36752
 
34267
- /* Skeleton-7ZA5ETJM.css */
36753
+ /* Skeleton-GIXV3KK5.css */
34268
36754
  /*
34269
36755
  * Skeleton, the loading placeholder, in eight shapes:
34270
36756
  * box One large rectangle with a sweeping glow, for a hero area.
@@ -34347,10 +36833,12 @@ svg.crewlet-select__chevron {
34347
36833
  .crewlet-skeleton__line--label { height: 13px; width: 40%; margin-bottom: var(--spacing-2); }
34348
36834
  .crewlet-skeleton__line--value { height: 14px; width: 80%; }
34349
36835
 
36836
+ /* A face's placeholder takes a face's shape, the rounded square every Avatar
36837
+ is drawn as: at 40px its corner is 8.9px, which the md step rounds to. */
34350
36838
  .crewlet-skeleton__avatar {
34351
36839
  width: 40px;
34352
36840
  height: 40px;
34353
- border-radius: var(--radius-circle);
36841
+ border-radius: var(--radius-md);
34354
36842
  flex-shrink: 0;
34355
36843
  }
34356
36844
 
@@ -38687,7 +41175,7 @@ b.crewlet-switcher__match {
38687
41175
  }
38688
41176
 
38689
41177
 
38690
- /* Tag-JTJVZM2D.css */
41178
+ /* Tag-WLDOROB5.css */
38691
41179
  /*
38692
41180
  * The tag: a small pill naming a state, a category or a value.
38693
41181
  *
@@ -38992,6 +41480,30 @@ b.crewlet-switcher__match {
38992
41480
  --crewlet-tag-ink: var(--color-text-tertiary);
38993
41481
  }
38994
41482
 
41483
+ /*
41484
+ * THE QUIET LABEL (`appearance="quiet"`): a seat's kind beside its name
41485
+ * ("Agent"), a small filled mark with no boundary, so it reads as part of the
41486
+ * name line rather than as a control. 16px tall with a step of room each side,
41487
+ * the xs corner rather than a pill's round ends, and the label register at the
41488
+ * regular weight. The neutral label sits on the soft fill under the secondary
41489
+ * ink; a tone keeps its own tint and ink. It takes no size step: these rules
41490
+ * come after the steps, at their specificity, so a step cannot reshape it.
41491
+ */
41492
+ .crewlet-tag--quiet {
41493
+ --crewlet-tag-height: calc(16px * var(--density, 1));
41494
+ --crewlet-tag-pad: var(--spacing-1);
41495
+ --crewlet-tag-edge: transparent;
41496
+ gap: var(--spacing-1);
41497
+ border-radius: var(--radius-xs);
41498
+ font-size: var(--font-size-2xs);
41499
+ font-weight: var(--font-weight-regular);
41500
+ }
41501
+
41502
+ .crewlet-tag--neutral.crewlet-tag--quiet {
41503
+ --crewlet-tag-fill: var(--color-fill-soft);
41504
+ --crewlet-tag-ink: var(--color-text-secondary);
41505
+ }
41506
+
38995
41507
  /* ── the interactive form ──────────────────────────────────────────────── */
38996
41508
 
38997
41509
  .crewlet-tag--actionable {
@@ -40117,7 +42629,7 @@ b.crewlet-switcher__match {
40117
42629
  }
40118
42630
 
40119
42631
 
40120
- /* ThinkingIndicator-JMK2TNMZ.css */
42632
+ /* ThinkingIndicator-S7ZL2C77.css */
40121
42633
  /*
40122
42634
  * Ask Crewlet at work: the Ask Crewlet mark, its spark turning, and a line
40123
42635
  * of status under a shimmer. See ThinkingIndicator.tsx for why it replaces a
@@ -40128,12 +42640,20 @@ b.crewlet-switcher__match {
40128
42640
  * ONE LINE OF PROSE TALL, at every state: the mark alone, the mark with a
40129
42641
  * status line, and the line changing from one step to the next all keep the
40130
42642
  * same height, so the thread never moves while the assistant works.
42643
+ *
42644
+ * NEVER WIDER THAN ITS COLUMN. The status never wraps, so where the
42645
+ * indicator is sized by its content (a flex column that starts its items on
42646
+ * the start edge, as a message's footer does) a long status made it as wide
42647
+ * as its words and widened the column with it, and a phone's transcript
42648
+ * scrolled sideways. Held to its container, the status truncates as it was
42649
+ * written to.
40131
42650
  */
40132
42651
  .crewlet-thinking {
40133
42652
  display: flex;
40134
42653
  align-items: center;
40135
42654
  gap: var(--spacing-2);
40136
42655
  min-width: 0;
42656
+ max-width: 100%;
40137
42657
  min-height: calc(var(--font-size-compact) * var(--font-line-height-relaxed));
40138
42658
  font-family: var(--font-family-sans);
40139
42659
  font-size: var(--font-size-compact);
@@ -40313,6 +42833,99 @@ b.crewlet-switcher__match {
40313
42833
  }
40314
42834
 
40315
42835
 
42836
+ /* ThreadSummary-AGR4NDMD.css */
42837
+ /*
42838
+ * The line under a message that has replies, and the working line under it.
42839
+ */
42840
+
42841
+ .crewlet-thread-summary-wrap {
42842
+ display: flex;
42843
+ flex-direction: column;
42844
+ align-items: flex-start;
42845
+ gap: var(--spacing-1);
42846
+ max-width: 100%;
42847
+ }
42848
+
42849
+ /* No piece is wider than the column: a long working line truncates. */
42850
+ .crewlet-thread-summary-wrap > * {
42851
+ max-width: 100%;
42852
+ }
42853
+
42854
+ /* The faces sit on the content edge: the line's 1px edge and its inset are
42855
+ taken back by the same amount outside it. */
42856
+ .crewlet-thread-summary {
42857
+ --crewlet-thread-summary-inset: var(--spacing-1);
42858
+ display: inline-flex;
42859
+ align-items: center;
42860
+ gap: var(--spacing-2);
42861
+ max-width: 100%;
42862
+ height: var(--size-control-md);
42863
+ box-sizing: border-box;
42864
+ margin-inline-start: calc((var(--crewlet-thread-summary-inset) + 1px) * -1);
42865
+ padding: 0 var(--crewlet-thread-summary-inset);
42866
+ border: 1px solid transparent;
42867
+ border-radius: var(--radius-sm);
42868
+ background: transparent;
42869
+ color: var(--color-text-secondary);
42870
+ font: inherit;
42871
+ font-size: var(--font-size-compact);
42872
+ line-height: 1;
42873
+ text-align: start;
42874
+ cursor: pointer;
42875
+ }
42876
+
42877
+ /* Lifted onto the transcript's own ground inside a hairline, under the
42878
+ pointer or the keyboard, and while the thread is open. */
42879
+ .crewlet-thread-summary:is(:hover, :focus-visible, .is-open) {
42880
+ border-color: var(--color-edge-hairline);
42881
+ background: var(--crewlet-chat-ground);
42882
+ }
42883
+
42884
+ .crewlet-thread-summary:focus-visible {
42885
+ outline: 2px solid var(--color-focus);
42886
+ outline-offset: var(--size-focus-ring-inset-offset);
42887
+ }
42888
+
42889
+ .crewlet-thread-summary__count {
42890
+ color: var(--color-brand-accent-ink);
42891
+ font-weight: var(--font-weight-medium);
42892
+ white-space: nowrap;
42893
+ }
42894
+
42895
+ /* "Last reply 1h ago" and "View thread" share one cell, so the line keeps
42896
+ its width when one gives way to the other under the pointer. */
42897
+ .crewlet-thread-summary__tail {
42898
+ display: inline-grid;
42899
+ min-width: 0;
42900
+ padding-inline-end: var(--spacing-1);
42901
+ white-space: nowrap;
42902
+ }
42903
+
42904
+ .crewlet-thread-summary__last,
42905
+ .crewlet-thread-summary__view {
42906
+ grid-area: 1 / 1;
42907
+ }
42908
+
42909
+ .crewlet-thread-summary__last {
42910
+ color: var(--color-text-tertiary);
42911
+ }
42912
+
42913
+ .crewlet-thread-summary__view {
42914
+ justify-self: end;
42915
+ visibility: hidden;
42916
+ color: var(--color-text-secondary);
42917
+ font-weight: var(--font-weight-regular);
42918
+ }
42919
+
42920
+ .crewlet-thread-summary:is(:hover, :focus-visible, .is-open) .crewlet-thread-summary__last {
42921
+ visibility: hidden;
42922
+ }
42923
+
42924
+ .crewlet-thread-summary:is(:hover, :focus-visible, .is-open) .crewlet-thread-summary__view {
42925
+ visibility: visible;
42926
+ }
42927
+
42928
+
40316
42929
  /* TileGrid-XOEJ4P52.css */
40317
42930
  /*
40318
42931
  * TileGrid: tiles on a fixed track count that folds by the grid's own width.