@crewlethq/ui 0.81.1 → 0.82.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. package/README.md +61 -4
  2. package/dist/Accordion/index.js +3 -3
  3. package/dist/ActionCard/ActionCard.d.ts +49 -0
  4. package/dist/ActionCard/index.d.ts +4 -0
  5. package/dist/ActionCard/index.js +2 -0
  6. package/dist/ActionCard-47WSZ2O5.css +110 -0
  7. package/dist/ActivityLine/ActivityLine.d.ts +27 -0
  8. package/dist/ActivityLine/index.d.ts +4 -0
  9. package/dist/ActivityLine/index.js +4 -0
  10. package/dist/ActivityLine-AMSERTOB.css +74 -0
  11. package/dist/AgentHandoffPanel/index.js +15 -15
  12. package/dist/AppShell/AccountRow.d.ts +14 -1
  13. package/dist/AppShell/AppShell.d.ts +53 -4
  14. package/dist/AppShell/ResizeHandle.d.ts +1 -1
  15. package/dist/AppShell/index.d.ts +1 -1
  16. package/dist/AppShell/index.js +8 -5
  17. package/dist/AppShell/railShape.d.ts +17 -0
  18. package/dist/{AppShell-2IBUS4TH.css → AppShell-F7RID4P4.css} +150 -0
  19. package/dist/ArrangeFrame/index.js +2 -2
  20. package/dist/ArrangeGroup/index.js +2 -2
  21. package/dist/ArrangeList/index.js +6 -6
  22. package/dist/ArtifactBar/index.js +11 -11
  23. package/dist/ArtifactCard/index.js +13 -13
  24. package/dist/ArtifactCover/index.js +3 -3
  25. package/dist/ArtifactKindIllustration/index.js +1 -1
  26. package/dist/ArtifactKinds-3EH4KR3F.css +18 -0
  27. package/dist/ArtifactMakeRow/index.js +1 -1
  28. package/dist/ArtifactNameCell/index.js +1 -1
  29. package/dist/ArtifactPanel/index.js +5 -5
  30. package/dist/AttachmentChip/index.js +2 -2
  31. package/dist/AuthLayout/index.js +5 -4
  32. package/dist/Avatar/Avatar.d.ts +30 -28
  33. package/dist/Avatar/AvatarStack.d.ts +2 -2
  34. package/dist/Avatar/index.d.ts +1 -1
  35. package/dist/Avatar/index.js +2 -2
  36. package/dist/{Avatar-VJSJGFRG.css → Avatar-MNE3WBZO.css} +56 -54
  37. package/dist/AvatarPicker/index.js +12 -12
  38. package/dist/{AvatarStack-7I3P7LCK.css → AvatarStack-KEHD3GWY.css} +16 -4
  39. package/dist/BrandLockup/BrandLockup.d.ts +6 -0
  40. package/dist/BrandLockup/index.js +2 -1
  41. package/dist/BriefCard/BriefCard.d.ts +23 -1
  42. package/dist/BriefCard/index.d.ts +2 -2
  43. package/dist/BriefCard/index.js +7 -7
  44. package/dist/{BriefCard-VKTH3BSW.css → BriefCard-QCL7MVUV.css} +26 -0
  45. package/dist/Canvas/index.js +6 -6
  46. package/dist/CanvasBoard/index.js +9 -9
  47. package/dist/CanvasToolbar/index.js +8 -8
  48. package/dist/Card/index.js +2 -2
  49. package/dist/ChangeList/index.js +5 -5
  50. package/dist/ChangeMark/index.js +4 -4
  51. package/dist/CharacterPicker/index.js +2 -2
  52. package/dist/ChatDay/ChatDay.d.ts +53 -0
  53. package/dist/ChatDay/index.d.ts +5 -0
  54. package/dist/ChatDay/index.js +3 -0
  55. package/dist/ChatDay-E3FF5HWF.css +116 -0
  56. package/dist/ChatDivider/ChatDivider.d.ts +31 -0
  57. package/dist/ChatDivider/index.d.ts +4 -0
  58. package/dist/ChatDivider/index.js +2 -0
  59. package/dist/ChatDivider-7ZNDL2PZ.css +76 -0
  60. package/dist/ChatMessage/ChatMessage.d.ts +111 -0
  61. package/dist/ChatMessage/index.d.ts +4 -0
  62. package/dist/ChatMessage/index.js +5 -0
  63. package/dist/ChatMessage-FH7VRVCH.css +304 -0
  64. package/dist/ChatScale-L4SIHSKL.css +42 -0
  65. package/dist/ChatThread/ChatThread.d.ts +33 -4
  66. package/dist/ChatThread/index.d.ts +1 -1
  67. package/dist/ChatThread/index.js +1 -1
  68. package/dist/{ChatThread-2KO3FZKQ.css → ChatThread-HAECJMP6.css} +17 -0
  69. package/dist/CheckGrid/index.js +6 -6
  70. package/dist/Checkbox/index.js +5 -5
  71. package/dist/ChipField/ChipField.d.ts +82 -0
  72. package/dist/ChipField/index.d.ts +4 -0
  73. package/dist/ChipField/index.js +9 -0
  74. package/dist/ChipField-D4CW6XFA.css +108 -0
  75. package/dist/ColorField/index.js +5 -5
  76. package/dist/Combobox/index.js +7 -7
  77. package/dist/CommandPalette/index.js +11 -11
  78. package/dist/CommentThread/index.js +14 -14
  79. package/dist/CompactNav/CompactNav.d.ts +175 -0
  80. package/dist/CompactNav/index.d.ts +4 -0
  81. package/dist/CompactNav/index.js +8 -0
  82. package/dist/CompactNav-CU2AQXBC.css +322 -0
  83. package/dist/Composer/Composer.d.ts +26 -2
  84. package/dist/Composer/index.d.ts +2 -1
  85. package/dist/Composer/index.js +7 -7
  86. package/dist/{Composer-HQIMTMRC.css → Composer-ZEGHEAFE.css} +71 -0
  87. package/dist/ConfirmField/index.js +5 -5
  88. package/dist/ContrastBadge/index.js +2 -2
  89. package/dist/ContrastHelp/index.js +6 -6
  90. package/dist/Count/Count.d.ts +24 -6
  91. package/dist/Count/index.d.ts +1 -1
  92. package/dist/Count/index.js +1 -1
  93. package/dist/{Count-ZJ6ID4ZU.css → Count-2HXBBYPO.css} +19 -0
  94. package/dist/DataGrid/index.js +8 -8
  95. package/dist/DataTable/index.js +10 -10
  96. package/dist/DataView/index.js +17 -17
  97. package/dist/DatasetSource/index.js +3 -3
  98. package/dist/DateTimePicker/index.js +5 -5
  99. package/dist/DeepWorkCard/index.js +10 -10
  100. package/dist/Disclosure/index.js +3 -3
  101. package/dist/DocTabsEditor/index.js +8 -8
  102. package/dist/Document/index.js +2 -2
  103. package/dist/EditingStatus/index.js +2 -2
  104. package/dist/{Editor-BXOWAV46.js → Editor-7EQWP3RN.js} +8 -8
  105. package/dist/EmojiPicker/EmojiPicker.d.ts +51 -0
  106. package/dist/EmojiPicker/emoji.d.ts +24 -0
  107. package/dist/EmojiPicker/index.d.ts +5 -0
  108. package/dist/EmojiPicker/index.js +13 -0
  109. package/dist/EmojiPicker-FMWYN2WX.css +63 -0
  110. package/dist/EntityChip/index.js +3 -3
  111. package/dist/EntityList/index.js +6 -6
  112. package/dist/FactList/index.js +4 -4
  113. package/dist/FolderTile/index.js +3 -3
  114. package/dist/FollowBanner/index.js +4 -4
  115. package/dist/HuePicker/index.js +8 -8
  116. package/dist/ImageUpload/ImageUpload.d.ts +6 -7
  117. package/dist/ImageUpload/index.js +3 -3
  118. package/dist/{ImageUpload-OWI7CCG7.css → ImageUpload-IFXZROFZ.css} +6 -37
  119. package/dist/InlineEditor/index.js +7 -7
  120. package/dist/Input/index.js +4 -4
  121. package/dist/Kbd/Kbd.d.ts +9 -0
  122. package/dist/Kbd/index.d.ts +1 -1
  123. package/dist/Kbd/index.js +1 -1
  124. package/dist/Layer/index.js +2 -2
  125. package/dist/LinkCard/LinkCard.d.ts +64 -0
  126. package/dist/LinkCard/index.d.ts +5 -0
  127. package/dist/LinkCard/index.js +5 -0
  128. package/dist/LinkCard-5I4MYU6I.css +155 -0
  129. package/dist/LinkInterstitial/index.js +6 -6
  130. package/dist/ListInput/index.js +8 -8
  131. package/dist/Listbox/index.js +3 -3
  132. package/dist/LogoSlot/index.js +3 -3
  133. package/dist/MarkdownEditor/format.d.ts +9 -1
  134. package/dist/MarkdownEditor/index.d.ts +2 -2
  135. package/dist/MarkdownEditor/index.js +9 -9
  136. package/dist/MentionChip/MentionChip.d.ts +25 -0
  137. package/dist/MentionChip/index.d.ts +3 -0
  138. package/dist/MentionChip/index.js +2 -0
  139. package/dist/MentionChip-W7MZZVRZ.css +42 -0
  140. package/dist/MentionMenu/MentionMenu.d.ts +82 -0
  141. package/dist/MentionMenu/index.d.ts +4 -0
  142. package/dist/MentionMenu/index.js +3 -0
  143. package/dist/MentionMenu-4NAQ45S4.css +65 -0
  144. package/dist/Menu/index.js +4 -4
  145. package/dist/MergeConflicts/index.js +8 -8
  146. package/dist/MessageActions/MessageActions.d.ts +58 -0
  147. package/dist/MessageActions/index.d.ts +4 -0
  148. package/dist/MessageActions/index.js +16 -0
  149. package/dist/MessageActions-Q4F5UH3S.css +73 -0
  150. package/dist/Modal/Modal.d.ts +12 -0
  151. package/dist/Modal/index.js +5 -5
  152. package/dist/{Modal-FYQYEI3N.css → Modal-GKUOO7PZ.css} +26 -1
  153. package/dist/OpenInAppCard/index.js +7 -7
  154. package/dist/OrgLabel/index.js +3 -3
  155. package/dist/OrgNode/index.js +4 -4
  156. package/dist/OrgTable/index.js +7 -7
  157. package/dist/PeekRail/index.js +1 -1
  158. package/dist/PeopleRail/index.js +4 -4
  159. package/dist/PersonRow/PersonRow.d.ts +70 -0
  160. package/dist/PersonRow/index.d.ts +3 -0
  161. package/dist/PersonRow/index.js +2 -0
  162. package/dist/PersonRow-V5GTPNVP.css +161 -0
  163. package/dist/Popover/index.js +3 -3
  164. package/dist/PresenceStack/index.js +3 -3
  165. package/dist/{PresenceStack-ZV67BH4V.css → PresenceStack-2DTYRADY.css} +4 -6
  166. package/dist/PresenterView/index.js +5 -5
  167. package/dist/PricingCard/index.js +2 -2
  168. package/dist/Principal/index.js +3 -3
  169. package/dist/PrincipalPicker/index.js +11 -11
  170. package/dist/ProposalCard/index.js +15 -15
  171. package/dist/ReactionBar/ReactionBar.d.ts +84 -0
  172. package/dist/ReactionBar/index.d.ts +4 -0
  173. package/dist/ReactionBar/index.js +15 -0
  174. package/dist/ReactionBar-XXI4V7XG.css +93 -0
  175. package/dist/RecordChip/index.js +4 -4
  176. package/dist/RefusalCard/index.js +6 -6
  177. package/dist/RelatedRow/index.js +3 -3
  178. package/dist/ResultTableCard/index.js +7 -7
  179. package/dist/ReviewList/index.js +2 -2
  180. package/dist/RichEditor/index.js +2 -2
  181. package/dist/RunChip/index.js +5 -5
  182. package/dist/SandboxedFrame/index.js +2 -2
  183. package/dist/SectionFrame/index.js +2 -2
  184. package/dist/SegmentedControl/index.js +7 -7
  185. package/dist/Select/index.js +4 -4
  186. package/dist/SelectionBar/index.js +6 -6
  187. package/dist/SetupWizard/index.js +6 -6
  188. package/dist/ShareDialog/index.js +11 -11
  189. package/dist/SheetColumnEditor/index.js +16 -16
  190. package/dist/SheetGrid/index.js +12 -12
  191. package/dist/Shortcut/index.js +3 -3
  192. package/dist/SidePanel/SidePanel.d.ts +10 -3
  193. package/dist/SidePanel/SidePanelBase.d.ts +3 -1
  194. package/dist/SidePanel/index.js +5 -5
  195. package/dist/{SidePanel-VXKUKLOJ.css → SidePanel-BKWT6Q6Z.css} +36 -0
  196. package/dist/SidebarNav/SidebarNav.d.ts +52 -3
  197. package/dist/SidebarNav/index.js +1 -1
  198. package/dist/{SidebarNav-VTQ3G4AE.css → SidebarNav-E7PZGGA6.css} +132 -7
  199. package/dist/Skeleton/index.js +1 -1
  200. package/dist/{Skeleton-7ZA5ETJM.css → Skeleton-GIXV3KK5.css} +3 -1
  201. package/dist/SlideCompare/index.js +5 -5
  202. package/dist/SlideFilmstrip/index.js +8 -8
  203. package/dist/SlideGrid/index.js +4 -4
  204. package/dist/SlideStage/index.js +3 -3
  205. package/dist/SourceEditor/index.js +2 -2
  206. package/dist/StatusCard/index.js +5 -5
  207. package/dist/Switcher/index.js +12 -12
  208. package/dist/TableCells/index.js +5 -5
  209. package/dist/Tabs/index.js +6 -6
  210. package/dist/Tag/Tag.d.ts +9 -2
  211. package/dist/Tag/index.js +1 -1
  212. package/dist/{Tag-JTJVZM2D.css → Tag-WLDOROB5.css} +24 -0
  213. package/dist/TagsInput/index.js +6 -6
  214. package/dist/ThemeGallery/index.js +5 -5
  215. package/dist/ThemeSwitcher/index.js +8 -8
  216. package/dist/ThinkingIndicator/ThinkingIndicator.d.ts +1 -1
  217. package/dist/ThinkingIndicator/index.js +1 -1
  218. package/dist/{ThinkingIndicator-JVF52N7L.css → ThinkingIndicator-S7ZL2C77.css} +10 -2
  219. package/dist/ThreadSummary/ThreadSummary.d.ts +43 -0
  220. package/dist/ThreadSummary/index.d.ts +4 -0
  221. package/dist/ThreadSummary/index.js +6 -0
  222. package/dist/ThreadSummary-AGR4NDMD.css +90 -0
  223. package/dist/TimeRangePicker/index.js +12 -12
  224. package/dist/TimeWindowPicker/index.js +10 -10
  225. package/dist/Toaster/index.js +2 -2
  226. package/dist/Toolbar/index.js +3 -3
  227. package/dist/Tooltip/Tooltip.d.ts +30 -3
  228. package/dist/Tooltip/index.js +3 -3
  229. package/dist/TreeCanvas/index.js +7 -7
  230. package/dist/TreeGrid/index.js +3 -3
  231. package/dist/ValueField/index.js +9 -9
  232. package/dist/VersionCompare/index.js +9 -9
  233. package/dist/VersionTimeline/index.js +4 -4
  234. package/dist/WidgetFrame/index.js +2 -2
  235. package/dist/{chunk-WCDPFTJZ.js → chunk-25JQNHTC.js} +92 -28
  236. package/dist/{chunk-ZKLEAK7M.js → chunk-2H6YDUR5.js} +7 -7
  237. package/dist/{chunk-7FF6CZW5.js → chunk-2KJCUCVE.js} +36 -8
  238. package/dist/{chunk-6LXS3X7A.js → chunk-2L4WHYMT.js} +1 -1
  239. package/dist/{chunk-6G6WHTC7.js → chunk-2O5CMV76.js} +1 -1
  240. package/dist/chunk-2TOGGCDM.js +50 -0
  241. package/dist/{chunk-7PJFUQMY.js → chunk-2ZSCHQOA.js} +1 -1
  242. package/dist/chunk-3BRXEMYT.js +46 -0
  243. package/dist/{chunk-H22SR76M.js → chunk-3H6OZUZ3.js} +1 -1
  244. package/dist/{chunk-VK45YJLH.js → chunk-3IWZVEXA.js} +2 -2
  245. package/dist/{chunk-I33UIUZD.js → chunk-3QQIGMY3.js} +49 -14
  246. package/dist/{chunk-NUZHC6MM.js → chunk-4ITETIGZ.js} +12 -1
  247. package/dist/{chunk-FQI62PIZ.js → chunk-4RYELYWG.js} +2 -2
  248. package/dist/{chunk-LCZULGMB.js → chunk-57BFL323.js} +2 -2
  249. package/dist/{chunk-73GUXYYE.js → chunk-5AHNW5CP.js} +1 -1
  250. package/dist/{chunk-FFGEJUAP.js → chunk-5ILRWUE7.js} +2 -2
  251. package/dist/{chunk-S5QJZOPL.js → chunk-5K5SZGBI.js} +1 -1
  252. package/dist/{chunk-LM6VYJTV.js → chunk-5YXMKZUA.js} +1 -1
  253. package/dist/{chunk-5XBNJNSO.js → chunk-65RFU7LF.js} +1 -1
  254. package/dist/{chunk-WKKWF277.js → chunk-6IOQWMYJ.js} +2 -2
  255. package/dist/{chunk-7MGXHCVK.js → chunk-6M2N6ETA.js} +1 -1
  256. package/dist/{chunk-OWHETZIU.js → chunk-6SFDL4QH.js} +1 -1
  257. package/dist/{chunk-JD7P2GJP.js → chunk-6YBBQAEM.js} +1 -1
  258. package/dist/{chunk-WK4FQPYW.js → chunk-77VOASOY.js} +5 -5
  259. package/dist/{chunk-UYF2B2TH.js → chunk-7ELFH3RJ.js} +1 -1
  260. package/dist/{chunk-CYYBE2MM.js → chunk-7U6PK242.js} +1 -1
  261. package/dist/{chunk-VG3SIJ3M.js → chunk-AFLS26AC.js} +2 -2
  262. package/dist/{chunk-JQEXAH7G.js → chunk-AMUXSJ2A.js} +2 -2
  263. package/dist/{chunk-4XF7ENQA.js → chunk-AOJ6ZA77.js} +2 -2
  264. package/dist/{chunk-TJIBTHWJ.js → chunk-B3X4DHRB.js} +2 -2
  265. package/dist/{chunk-BFM5G2Z6.js → chunk-BSAU7QRW.js} +1 -1
  266. package/dist/chunk-C4256UXE.js +21 -0
  267. package/dist/{chunk-4MRFLHJC.js → chunk-C46DDVTK.js} +1 -1
  268. package/dist/{chunk-5EFLA6BW.js → chunk-C75WZMXG.js} +2 -2
  269. package/dist/{chunk-YB64PWIN.js → chunk-C7UHDM7Y.js} +1 -1
  270. package/dist/{chunk-5BOFC5OP.js → chunk-CF4M6N6A.js} +20 -4
  271. package/dist/{chunk-ANTAQAR4.js → chunk-CMAZZY2I.js} +7 -1
  272. package/dist/{chunk-MLDTLZAO.js → chunk-D2GT3CR4.js} +3 -3
  273. package/dist/{chunk-57AKYFML.js → chunk-DD7RBNT4.js} +3 -3
  274. package/dist/{chunk-MUFBHVCT.js → chunk-DWQYV5AV.js} +2 -2
  275. package/dist/{chunk-CNEHFH2A.js → chunk-EAHEJNVJ.js} +1 -1
  276. package/dist/chunk-EALRMP7N.js +69 -0
  277. package/dist/{chunk-E35HYQMK.js → chunk-EBVZHVPD.js} +12 -5
  278. package/dist/{chunk-M73MMEZY.js → chunk-ED4A6Q24.js} +1 -1
  279. package/dist/{chunk-6LN64KGG.js → chunk-F7HZYTZT.js} +6 -3
  280. package/dist/{chunk-YQDRJZ5J.js → chunk-FKAJBN6G.js} +8 -8
  281. package/dist/{chunk-RTMNULTL.js → chunk-FLW5U7YS.js} +2 -2
  282. package/dist/{chunk-JMTBK55P.js → chunk-FVZPSTL2.js} +1 -1
  283. package/dist/{chunk-GHQG4VZA.js → chunk-G3CACE5L.js} +3 -3
  284. package/dist/{chunk-SNIPM6K7.js → chunk-G6ZFSUIH.js} +3 -3
  285. package/dist/chunk-GP5TNTZH.js +386 -0
  286. package/dist/{chunk-7KBNFFM3.js → chunk-GVPUCEWH.js} +6 -3
  287. package/dist/{chunk-6R334YT3.js → chunk-GZVAZ3LL.js} +2 -2
  288. package/dist/{chunk-KL6A7JGH.js → chunk-HA2PL7PA.js} +2 -2
  289. package/dist/{chunk-2IIHMJMZ.js → chunk-HCUECVZ3.js} +2 -2
  290. package/dist/{chunk-N2BF272H.js → chunk-HF5L56YQ.js} +1 -1
  291. package/dist/{chunk-Q2T4L6ML.js → chunk-HFOTRZFU.js} +4 -4
  292. package/dist/{chunk-2STOSJT3.js → chunk-HQFOZJQ4.js} +7 -7
  293. package/dist/chunk-HTBTAIH6.js +37 -0
  294. package/dist/{chunk-BRLZXYPA.js → chunk-I4IUX3JF.js} +1 -1
  295. package/dist/{chunk-BXCL6P5Z.js → chunk-I4PBFJGX.js} +1 -1
  296. package/dist/{chunk-ADGNISEI.js → chunk-IAP7APOX.js} +5 -5
  297. package/dist/{chunk-BT3GB7HC.js → chunk-IRONPJB4.js} +3 -3
  298. package/dist/chunk-ISQANI6Q.js +9 -0
  299. package/dist/chunk-IUBOLGHG.js +140 -0
  300. package/dist/{chunk-O222F2IX.js → chunk-IUWP2LSE.js} +6 -6
  301. package/dist/{chunk-3JXX5S3Z.js → chunk-IYI6HWKN.js} +3 -3
  302. package/dist/{chunk-R5OATXWU.js → chunk-JHQGNFN3.js} +36 -13
  303. package/dist/{chunk-CSXJIIO4.js → chunk-JV6JM6W6.js} +1 -1
  304. package/dist/{chunk-ZQEJSEPS.js → chunk-K6Y6CDEZ.js} +2 -2
  305. package/dist/chunk-K774LUN3.js +20 -0
  306. package/dist/{chunk-LOWQK2PB.js → chunk-KJR5X4II.js} +4 -4
  307. package/dist/{chunk-45M73G5A.js → chunk-KLAVEJIO.js} +4 -4
  308. package/dist/{chunk-53J2YNQA.js → chunk-L5VU3LZT.js} +1 -1
  309. package/dist/{chunk-VERJCAJ4.js → chunk-LBGKLYBY.js} +1 -1
  310. package/dist/{chunk-PRN5IP2R.js → chunk-LMEMH6DO.js} +1 -1
  311. package/dist/{chunk-I22MUEG7.js → chunk-LNQSNXGJ.js} +1 -1
  312. package/dist/chunk-LQRN2XZK.js +87 -0
  313. package/dist/{chunk-HEA6TERQ.js → chunk-LSOR77RZ.js} +1 -1
  314. package/dist/{chunk-222VILSP.js → chunk-LVJGN5II.js} +1 -1
  315. package/dist/{chunk-AYHIF6DH.js → chunk-LZNPL266.js} +1 -1
  316. package/dist/{chunk-R45VM5EX.js → chunk-MMV7NEAC.js} +1 -1
  317. package/dist/chunk-MPYRC3GO.js +244 -0
  318. package/dist/{chunk-37U3Z65B.js → chunk-MVMVMHYI.js} +1 -1
  319. package/dist/{chunk-MP7DGKB6.js → chunk-N2T7Y5KR.js} +2 -2
  320. package/dist/{chunk-NKBKQEKS.js → chunk-NFXCJGHG.js} +1 -1
  321. package/dist/{chunk-OZAZHM55.js → chunk-NKBKHOMU.js} +1 -1
  322. package/dist/{chunk-MGQKF7GK.js → chunk-NN475NAP.js} +1 -1
  323. package/dist/{chunk-6EWNMSS4.js → chunk-NNZRTR5M.js} +2 -2
  324. package/dist/{chunk-JT7WRPZ6.js → chunk-NTRKC2JV.js} +1 -1
  325. package/dist/{chunk-63GBSOLU.js → chunk-NXBCAXP5.js} +2 -2
  326. package/dist/{chunk-NR4CPM4T.js → chunk-NXFTCPF6.js} +1 -1
  327. package/dist/chunk-O3MYBNRO.js +80 -0
  328. package/dist/{chunk-RMEBFYL7.js → chunk-O6EV6GKI.js} +1 -1
  329. package/dist/{chunk-YL7AR6PR.js → chunk-O7KG4CXB.js} +3 -3
  330. package/dist/{chunk-FB3TCNQP.js → chunk-O7N6W52M.js} +3 -3
  331. package/dist/{chunk-2FMBZCFR.js → chunk-OAHRMR4U.js} +1 -1
  332. package/dist/chunk-ONHYFU7D.js +25 -0
  333. package/dist/{chunk-Z2MZTI3H.js → chunk-ONNXUS5Y.js} +1 -1
  334. package/dist/{chunk-T24HBEU6.js → chunk-OOOVL77Y.js} +1 -1
  335. package/dist/{chunk-CZQ7UITX.js → chunk-P6F3PE4V.js} +3 -3
  336. package/dist/{chunk-BLGBD2D2.js → chunk-P7HMY3BQ.js} +4 -4
  337. package/dist/{chunk-TPIMOGOZ.js → chunk-PEBQMX5X.js} +1 -1
  338. package/dist/{chunk-4TMBAOXK.js → chunk-PW57R4BN.js} +1 -1
  339. package/dist/chunk-PX5BOALQ.js +13 -0
  340. package/dist/{chunk-HQOEAUDJ.js → chunk-PXLS6JKL.js} +2 -2
  341. package/dist/{chunk-CFTBESST.js → chunk-Q6TCUSQA.js} +2 -2
  342. package/dist/{chunk-ZWXHTXZO.js → chunk-QGEDXYLB.js} +2 -2
  343. package/dist/{chunk-WTXCK46H.js → chunk-R2QBQ6NO.js} +1 -1
  344. package/dist/{chunk-OBPINJNO.js → chunk-SEKO6P3Y.js} +3 -3
  345. package/dist/{chunk-CLJGFOTV.js → chunk-SKGOKLJD.js} +31 -18
  346. package/dist/{chunk-KHJIEPZV.js → chunk-SM4P2SHB.js} +2 -2
  347. package/dist/{chunk-B2YSFWUG.js → chunk-SYVQXMLO.js} +9 -9
  348. package/dist/{chunk-UY3FWQWG.js → chunk-T4IEESXN.js} +128 -12
  349. package/dist/{chunk-TPCBPGSB.js → chunk-T7WESRZF.js} +3 -3
  350. package/dist/chunk-TDFLCUBE.js +6 -0
  351. package/dist/{chunk-Z6JKZI4E.js → chunk-TGCGLKD4.js} +1 -1
  352. package/dist/chunk-TRXTO3WC.js +114 -0
  353. package/dist/{chunk-H5XTJ7GJ.js → chunk-TUEM2XIW.js} +1 -1
  354. package/dist/{chunk-4AUTALJA.js → chunk-U2IQNDDR.js} +1 -1
  355. package/dist/{chunk-IVTQWOXV.js → chunk-ULYHDP7U.js} +1 -1
  356. package/dist/{chunk-DGSK4LLS.js → chunk-V6WDJUYK.js} +1 -1
  357. package/dist/{chunk-5CEQ3HLH.js → chunk-VGOWSOUA.js} +6 -6
  358. package/dist/{chunk-TKUAGWNR.js → chunk-WT3B76MG.js} +1 -1
  359. package/dist/{chunk-D7G2QGET.js → chunk-X3US25XJ.js} +1 -1
  360. package/dist/{chunk-GPFYITOF.js → chunk-X7VZQKIW.js} +1 -1
  361. package/dist/{chunk-L4HHWG4V.js → chunk-XA2QKGBJ.js} +3 -3
  362. package/dist/{chunk-HPI5J6AR.js → chunk-XGLMPPDW.js} +2 -2
  363. package/dist/{chunk-DV5L2GRY.js → chunk-XJMES7AE.js} +1 -1
  364. package/dist/{chunk-5NJMSYDZ.js → chunk-XNC3M4IN.js} +1 -1
  365. package/dist/{chunk-C667GCU7.js → chunk-XXDB6KPV.js} +6 -3
  366. package/dist/{chunk-EAIOXW2W.js → chunk-XY4O2XMR.js} +8 -14
  367. package/dist/{chunk-KTIQSSME.js → chunk-XZY6S3UC.js} +6 -3
  368. package/dist/{chunk-7KHM2FZH.js → chunk-YGRTX67J.js} +1 -1
  369. package/dist/{chunk-RIAPCEB5.js → chunk-YM77TZ7Q.js} +5 -5
  370. package/dist/{chunk-OQG4P5KU.js → chunk-YOJAGKTS.js} +2 -2
  371. package/dist/chunk-YP2FS6SH.js +54 -0
  372. package/dist/{chunk-LMQG3VPG.js → chunk-YQ7Q52XU.js} +1 -1
  373. package/dist/{chunk-G4CGDUCP.js → chunk-YRNNUCQP.js} +1 -1
  374. package/dist/{chunk-NHLNHH4J.js → chunk-ZB3E2Z4Y.js} +1 -1
  375. package/dist/{chunk-IL3XLDW7.js → chunk-ZDWAIVWL.js} +1 -1
  376. package/dist/{chunk-2PIH6JHJ.js → chunk-ZXTDWTXS.js} +1 -1
  377. package/dist/generated/index.d.ts +15 -0
  378. package/dist/generated/index.js +181 -164
  379. package/dist/index.js +181 -164
  380. package/dist/styles.css +2566 -138
  381. package/dist/utils/focusModality.d.ts +14 -0
  382. package/dist/utils/heldHint.d.ts +6 -0
  383. package/dist/utils/index.d.ts +1 -1
  384. package/dist/utils/index.js +1 -1
  385. package/package.json +3 -3
  386. package/dist/ArtifactKinds-O3CALPVX.css +0 -16
  387. package/dist/{chunk-PLNJEDGI.js → chunk-I4IO56EY.js} +1 -1
  388. package/dist/{chunk-CDFQ7MQK.js → chunk-KLWWNV25.js} +0 -0
  389. package/dist/{chunk-624X3RVA.js → chunk-O55JQ7BE.js} +1 -1
@@ -0,0 +1,116 @@
1
+ /*
2
+ * ChatDay: a day of a conversation under its date, set on the conversation's
3
+ * own scale (ChatScale.css).
4
+ */
5
+
6
+ /* The day is the pill's range: pinned, the pill stays inside it, so the next
7
+ day pushes it out from below. */
8
+ .crewlet-chat-day {
9
+ position: relative;
10
+ display: flex;
11
+ flex-direction: column;
12
+ }
13
+
14
+ /*
15
+ * THE PILL'S PLACE. A box as tall as the pill, first in the day, set so the
16
+ * pill's middle is on the rule. Sticky in the day, it holds the pill a little
17
+ * under the list's top edge for as long as the day is in view, and the day's
18
+ * end pushes it out, a small gap above the next day's pill.
19
+ *
20
+ * ITS OWN MARGINS STAY POSITIVE. A sticky box may travel as far as its margin
21
+ * box allows, so a negative margin here let the pill run past the end of its
22
+ * day and sit on the next day's pill. The rule under it takes the overlap
23
+ * instead, with a negative margin of its own, which moves nothing sticky.
24
+ *
25
+ * The box lets the pointer through to the rows beside the pill; the pill
26
+ * takes it. It stands under a message's hover toolbar (which stands over the
27
+ * rows and the pill alike) and over the rows and the New line.
28
+ */
29
+ .crewlet-chat-day__label {
30
+ position: sticky;
31
+ top: var(--crewlet-chat-day-pin);
32
+ z-index: var(--z-index-sticky);
33
+ display: flex;
34
+ flex: none;
35
+ justify-content: center;
36
+ height: var(--crewlet-chat-day-pill);
37
+ margin-top: calc(var(--crewlet-chat-day-gap) - var(--crewlet-chat-day-pill) / 2);
38
+ pointer-events: none;
39
+ /* A host that raises the pin (a banner arriving) moves the pinned pill
40
+ down with it rather than jumping it. */
41
+ transition: top var(--motion-duration-fast) var(--motion-easing-default);
42
+ }
43
+
44
+ /*
45
+ * THE DAY'S RULE: a hairline across the whole list with the day's gap under
46
+ * it, in the flow like any row. It rises half a pill, so it runs through the
47
+ * pill's middle.
48
+ */
49
+ .crewlet-chat-day__rule {
50
+ position: relative;
51
+ flex: none;
52
+ height: 1px;
53
+ margin: calc(var(--crewlet-chat-day-pill) / -2) 0 var(--crewlet-chat-day-gap);
54
+ background: var(--color-edge-hairline);
55
+ }
56
+
57
+ /* The New line on the day's rule covers the rule, as one line. */
58
+ .crewlet-chat-day__rule > .crewlet-chat-divider--unread {
59
+ position: absolute;
60
+ inset: 0;
61
+ }
62
+
63
+ /*
64
+ * THE PILL floats over the rows: the transcript's own ground, ringed with the
65
+ * hairline and a small shadow, so it reads as lifted off the messages it
66
+ * passes over. The ring is a shadow, which forced colors drops, so a
67
+ * transparent outline stands in for it there.
68
+ */
69
+ .crewlet-chat-day__pill {
70
+ display: inline-flex;
71
+ align-items: center;
72
+ gap: var(--spacing-1);
73
+ height: var(--crewlet-chat-day-pill);
74
+ box-sizing: border-box;
75
+ padding: 0 var(--spacing-3);
76
+ border: 0;
77
+ border-radius: var(--radius-pill);
78
+ outline: 1px solid transparent;
79
+ outline-offset: -1px;
80
+ background-color: var(--crewlet-chat-ground);
81
+ box-shadow:
82
+ 0 0 0 1px var(--color-edge-hairline),
83
+ var(--shadow-xs);
84
+ color: var(--color-text-secondary);
85
+ font: inherit;
86
+ font-size: var(--font-size-xs);
87
+ font-weight: var(--font-weight-medium);
88
+ line-height: 1;
89
+ white-space: nowrap;
90
+ pointer-events: auto;
91
+ }
92
+
93
+ /* A pill that opens a menu: its chevron sits a step closer to its edge. */
94
+ .crewlet-chat-day__pill--button {
95
+ padding-inline-end: var(--spacing-2);
96
+ cursor: pointer;
97
+ }
98
+
99
+ /* Under the pointer, and while its menu is open, the hover overlay laid on
100
+ the pill's own ground. */
101
+ .crewlet-chat-day__pill--button:hover,
102
+ .crewlet-chat-day__pill--button[aria-expanded='true'] {
103
+ background-image: linear-gradient(var(--color-surface-hover), var(--color-surface-hover));
104
+ }
105
+
106
+ /* The pill draws its own ring, so focus is drawn over it, as one edge. */
107
+ .crewlet-chat-day__pill--button:focus-visible {
108
+ outline: 2px solid var(--color-focus);
109
+ outline-offset: var(--size-focus-ring-inset-offset);
110
+ }
111
+
112
+ @media (prefers-reduced-motion: reduce) {
113
+ .crewlet-chat-day__label {
114
+ transition: none;
115
+ }
116
+ }
@@ -0,0 +1,31 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export type ChatDividerVariant =
3
+ /**
4
+ * The New line: a hairline in the danger hue across the whole list, laid
5
+ * on the boundary between the last message the reader has read and the
6
+ * first one they have not, with its word at the line's end.
7
+ */
8
+ 'unread'
9
+ /** A quiet labelled rule, as a thread pane sets its reply count over the replies. */
10
+ | 'date';
11
+ export interface ChatDividerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'children'> {
12
+ variant: ChatDividerVariant;
13
+ /** The words on the line, and its name for a screen reader: "New", "3 replies". */
14
+ label: string;
15
+ }
16
+ /**
17
+ * A line between the rows of a conversation.
18
+ *
19
+ * THE NEW LINE TAKES NO HEIGHT. Marking where the reader left off moves no
20
+ * message: the line is drawn on the boundary between two rows, over the gap
21
+ * they already keep, so a list that gains or loses it never shifts under the
22
+ * reader's eye. Inside a `ChatDay` whose first message is the first unread
23
+ * one, the day draws it on its own rule (`unread`), as one line rather than
24
+ * a second line under the first.
25
+ *
26
+ * A SEPARATOR TO A SCREEN READER, named by its words, so a reader moving
27
+ * through the log hears "New" where the unread messages start. The host can
28
+ * find it again by `data-divider` (to bring it into view, or to tell whether
29
+ * it is on screen for an unread banner).
30
+ */
31
+ export declare function ChatDivider({ variant, label, className, ...rest }: ChatDividerProps): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import '../ChatMessage/ChatScale.css';
2
+ import './ChatDivider.css';
3
+ export { ChatDivider } from './ChatDivider.js';
4
+ export type { ChatDividerProps, ChatDividerVariant } from './ChatDivider.js';
@@ -0,0 +1,2 @@
1
+ export { ChatDivider } from '../chunk-K774LUN3.js';
2
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,76 @@
1
+ /*
2
+ * ChatDivider: a line between the rows of a conversation, set on the
3
+ * conversation's own scale (ChatScale.css).
4
+ */
5
+
6
+ /* A quiet labelled rule: the words in the middle, a hairline either side. */
7
+ .crewlet-chat-divider--date {
8
+ display: flex;
9
+ align-items: center;
10
+ gap: var(--spacing-3);
11
+ padding: var(--spacing-2) var(--crewlet-chat-pad-x);
12
+ color: var(--color-text-tertiary);
13
+ font-size: var(--crewlet-chat-meta);
14
+ font-weight: var(--font-weight-regular);
15
+ }
16
+
17
+ .crewlet-chat-divider--date::before,
18
+ .crewlet-chat-divider--date::after {
19
+ content: '';
20
+ flex: 1;
21
+ height: 1px;
22
+ background: var(--color-border-default);
23
+ }
24
+
25
+ .crewlet-chat-divider--date .crewlet-chat-divider__label {
26
+ white-space: nowrap;
27
+ }
28
+
29
+ /*
30
+ * THE NEW LINE TAKES NO HEIGHT. A hairline across the whole list in the
31
+ * danger hue, laid on the boundary between the last read message and the
32
+ * first unread one, with "New" at its end on the transcript's ground, so it
33
+ * reads over the rows it passes. Brought to the top of the view (scrolled to
34
+ * as a target), it stops under the day's pinned pill rather than behind it.
35
+ */
36
+ .crewlet-chat-divider--unread {
37
+ position: relative;
38
+ z-index: var(--z-index-raised);
39
+ height: 0;
40
+ pointer-events: none;
41
+ scroll-margin-top: calc(var(--crewlet-chat-day-pin) + var(--crewlet-chat-day-pill) + var(--spacing-3));
42
+ }
43
+
44
+ .crewlet-chat-divider--unread::before {
45
+ content: '';
46
+ position: absolute;
47
+ inset-inline: 0;
48
+ top: 0;
49
+ height: 1px;
50
+ background: var(--color-feedback-danger);
51
+ }
52
+
53
+ .crewlet-chat-divider--unread .crewlet-chat-divider__label {
54
+ position: absolute;
55
+ top: 0;
56
+ right: var(--crewlet-chat-pad-x);
57
+ padding: 0 var(--spacing-1);
58
+ transform: translateY(-50%);
59
+ background: var(--crewlet-chat-ground);
60
+ color: var(--color-feedback-danger-ink);
61
+ font-size: var(--font-size-xs);
62
+ font-weight: var(--font-weight-medium);
63
+ line-height: var(--font-line-height-normal);
64
+ }
65
+
66
+ /*
67
+ * FORCED COLORS drops the line's background, which is the whole line. A
68
+ * border is the one edge the mode keeps, painted in its own text colour.
69
+ */
70
+ @media (forced-colors: active) {
71
+ .crewlet-chat-divider--unread::before,
72
+ .crewlet-chat-divider--date::before,
73
+ .crewlet-chat-divider--date::after {
74
+ border-top: 1px solid CanvasText;
75
+ }
76
+ }
@@ -0,0 +1,111 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ /** Why a row is drawn apart from the rest: it names the reader, or the whole room. */
3
+ export type ChatMessageHighlight = 'mention';
4
+ /** An outbox row: `sending` is drawn faint in place, `failed` carries its own line. */
5
+ export type ChatMessagePending = 'sending' | 'failed';
6
+ /**
7
+ * Where the toolbar stands. `auto` rests it on the row's first line, over the
8
+ * row above, and inside the row's own head where the scroller's edge would cut
9
+ * it. `inside` always draws it inside the row, for a row with something of the
10
+ * host's own above it that the toolbar must not cover (the head of a card).
11
+ */
12
+ export type ChatMessageActionsPlacement = 'auto' | 'inside';
13
+ /** The class every message row carries, which the row's keys walk between. */
14
+ export declare const CHAT_MESSAGE_CLASS = "crewlet-chat-message";
15
+ export interface ChatMessageProps extends Omit<HTMLAttributes<HTMLElement>, 'id' | 'children'> {
16
+ /** The message's own id, drawn as `data-message-id` so a host can find the row it opens at. */
17
+ id: string;
18
+ /** Names the row for a screen reader: "Product Manager, 11:02 AM". */
19
+ label: string;
20
+ /** The author's face, drawn in the gutter of a message that starts a run. A button that opens their profile is styled to fit. */
21
+ avatar: ReactNode;
22
+ /** The author's name, usually a button that opens their profile. */
23
+ author: ReactNode;
24
+ /** After the name: a quiet `Tag` naming the seat's kind ("Agent"), a saved flag, the room a mention came from. */
25
+ badges?: ReactNode;
26
+ /** The short time beside the name ("11:40 AM"). */
27
+ time: string;
28
+ /** The full time, shown on hover of either time. */
29
+ timeTitle: string;
30
+ /** The machine-readable time, for the `<time>` elements' `dateTime`. */
31
+ dateTime?: string | undefined;
32
+ /**
33
+ * The time a continuation shows in its gutter, which is a face wide:
34
+ * "11:40" rather than "11:40 AM". `time` by default.
35
+ */
36
+ gutterTime?: string | undefined;
37
+ /** A later message from the same author, close in time to the one before: no face and no head. */
38
+ continuation?: boolean | undefined;
39
+ /** `mention` for a message that names the reader or the whole room: a light warning wash and a bar on its edge. */
40
+ highlight?: ChatMessageHighlight | null | undefined;
41
+ /** An outbox row. See `ChatMessageFailure` for the line a failed one carries. */
42
+ pending?: ChatMessagePending | undefined;
43
+ /** Holds the row's fill and its toolbar in view while one of the toolbar's menus or pickers is open. */
44
+ active?: boolean | undefined;
45
+ /** The row a link, a mention or a search opened at: a wash of the accent that fades out. */
46
+ flash?: boolean | undefined;
47
+ /** The words are being edited in place: the toolbar steps aside. */
48
+ editing?: boolean | undefined;
49
+ /** The hover toolbar, a `MessageActions`. */
50
+ actions?: ReactNode;
51
+ /** Where the toolbar stands, `auto` by default. */
52
+ actionsPlacement?: ChatMessageActionsPlacement | undefined;
53
+ /** Under the words, one stack a step apart: previews, a `ReactionBar`, a `ThreadSummary`, a `ChatMessageFailure`. */
54
+ footer?: ReactNode;
55
+ /** The message's words. */
56
+ children: ReactNode;
57
+ }
58
+ /**
59
+ * One message in a transcript: the author's face in a gutter, the name, a
60
+ * quiet label and the time on one head line, the words, and a footer stack
61
+ * under them.
62
+ *
63
+ * A RUN OF MESSAGES IS ONE BLOCK. A `continuation` (the same author again,
64
+ * close in time) draws no face and no head: its gutter holds the time, a
65
+ * face wide, shown while the row is pointed at or focused, on the baseline
66
+ * of the words' first line.
67
+ *
68
+ * THE TOOLBAR RESTS ON THE ROW'S FIRST LINE, over the row above. Laid across
69
+ * the row's top edge, it covered the end of the row's own head, which on a
70
+ * narrow column is the time of the very message it acts on. A row with less
71
+ * room above it than the toolbar needs, at the top of its scroller, would
72
+ * have it cut by the scroller's edge, so that row draws it inside its own
73
+ * head. The room is MEASURED, when the pointer arrives or focus enters: the
74
+ * toolbar's height less the row's own top inset, against the distance to the
75
+ * scroller's top.
76
+ *
77
+ * A TOUCH SCREEN HAS NO HOVER. A tap on the row focuses it (it is focusable,
78
+ * out of the tab order), and a focused row shows its toolbar there, so
79
+ * replying, saving and the More menu are reached by touch as well.
80
+ *
81
+ * THE KEYS. ArrowUp and ArrowDown on a focused row move to the row before and
82
+ * after it in the same log. A host's own `onKeyDown` runs first, and a key it
83
+ * handles (`preventDefault`) is left alone.
84
+ *
85
+ * NO BOLD. The name is the medium weight and everything else on the head the
86
+ * regular one, in the meta step and the tertiary ink.
87
+ */
88
+ export declare const ChatMessage: import("react").ForwardRefExoticComponent<ChatMessageProps & import("react").RefAttributes<HTMLElement>>;
89
+ /** The words a failed row's line says. */
90
+ export interface ChatMessageFailureLabels {
91
+ /** Leads the line, before the reason. */
92
+ notSent: string;
93
+ retry: string;
94
+ discard: string;
95
+ }
96
+ export declare const CHAT_MESSAGE_FAILURE_LABELS: ChatMessageFailureLabels;
97
+ export interface ChatMessageFailureProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
98
+ /** Why it was not sent, in a sentence: "The engine did not answer." */
99
+ reason?: ReactNode;
100
+ /** Sends it again. */
101
+ onRetry: () => void;
102
+ /** Drops it from the outbox. */
103
+ onDiscard: () => void;
104
+ labels?: Partial<ChatMessageFailureLabels> | undefined;
105
+ }
106
+ /**
107
+ * The line under a message that was not sent (`pending="failed"`): what
108
+ * happened in the danger ink, then Retry and Discard. It is a status, so a
109
+ * screen reader hears it once when it appears.
110
+ */
111
+ export declare function ChatMessageFailure({ reason, onRetry, onDiscard, labels: overrides, className, ...rest }: ChatMessageFailureProps): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import './ChatScale.css';
2
+ import './ChatMessage.css';
3
+ export { CHAT_MESSAGE_CLASS, CHAT_MESSAGE_FAILURE_LABELS, ChatMessage, ChatMessageFailure } from './ChatMessage.js';
4
+ export type { ChatMessageActionsPlacement, ChatMessageFailureLabels, ChatMessageFailureProps, ChatMessageHighlight, ChatMessagePending, ChatMessageProps, } from './ChatMessage.js';
@@ -0,0 +1,5 @@
1
+ export { CHAT_MESSAGE_CLASS, CHAT_MESSAGE_FAILURE_LABELS, ChatMessage, ChatMessageFailure } from '../chunk-IUBOLGHG.js';
2
+ import '../chunk-DGXZ635L.js';
3
+ import '../chunk-XSPCITPN.js';
4
+ import '../chunk-UT6CW3C7.js';
5
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,304 @@
1
+ /*
2
+ * One message in a transcript: a face in a gutter, the head line, the words
3
+ * and a footer stack. Every size reads the conversation scale
4
+ * (ChatScale.css); every edge and fill the quiet scale in @crewlethq/tokens.
5
+ */
6
+
7
+ .crewlet-chat-message {
8
+ /* Where the row's first line starts: the toolbar rests on it. */
9
+ --crewlet-chat-row-top: var(--spacing-2);
10
+ position: relative;
11
+ display: grid;
12
+ grid-template-columns: var(--crewlet-chat-avatar) minmax(0, 1fr);
13
+ column-gap: var(--crewlet-chat-gap);
14
+ padding: var(--crewlet-chat-row-top) var(--crewlet-chat-pad-x) var(--spacing-1);
15
+ font-size: var(--crewlet-chat-text);
16
+ line-height: var(--crewlet-chat-line);
17
+ transition: background var(--motion-duration-fast) var(--motion-easing-default);
18
+ /* A message the reader is taken to stops under the day's pinned pill. */
19
+ scroll-margin-top: calc(var(--crewlet-chat-day-pin) + var(--crewlet-chat-day-pill) + var(--spacing-2));
20
+ }
21
+
22
+ .crewlet-chat-message.is-continuation {
23
+ --crewlet-chat-row-top: 1px;
24
+ padding-bottom: 1px;
25
+ }
26
+
27
+ .crewlet-chat-message:hover,
28
+ .crewlet-chat-message:focus-visible,
29
+ .crewlet-chat-message:has(:focus-visible),
30
+ .crewlet-chat-message.is-active {
31
+ background: var(--color-fill-row);
32
+ }
33
+
34
+ .crewlet-chat-message:focus-visible {
35
+ outline: 2px solid var(--color-focus);
36
+ outline-offset: var(--size-focus-ring-inset-offset);
37
+ }
38
+
39
+ /* A row that names the reader: its wash and the warning bar on its edge. It
40
+ keeps its wash, and only its wash, under the pointer: the toolbar and the
41
+ gutter's time say which row is pointed at, and a hover step laid over the
42
+ wash took the row's quiet text under 4.5:1 on the darker palettes. */
43
+ .crewlet-chat-message.is-mention,
44
+ .crewlet-chat-message.is-mention:hover,
45
+ .crewlet-chat-message.is-mention:focus-visible,
46
+ .crewlet-chat-message.is-mention:has(:focus-visible),
47
+ .crewlet-chat-message.is-mention.is-active {
48
+ background: var(--crewlet-chat-mention);
49
+ box-shadow: inset 2px 0 0 var(--color-feedback-warning);
50
+ }
51
+
52
+ /* The row a link or a search opened at: a wash of the accent that fades back
53
+ to whatever the row draws of its own (the mention wash included), so there
54
+ is no last keyframe to name it. */
55
+ .crewlet-chat-message.is-flash {
56
+ animation: crewlet-chat-message-flash calc(var(--motion-duration-moderate) * 8) var(--motion-easing-out);
57
+ }
58
+
59
+ @keyframes crewlet-chat-message-flash {
60
+ 0%,
61
+ 40% {
62
+ background: var(--color-brand-accent-soft-strong);
63
+ }
64
+ }
65
+
66
+ .crewlet-chat-message.is-sending .crewlet-chat-message__body {
67
+ color: var(--color-text-tertiary);
68
+ }
69
+
70
+ /* The face starts a hairline under the top of the name's line box, so across
71
+ the name and the first line of words it sits centred on the pair. It keeps
72
+ its own height: stretched to the row, the face's button (and its focus
73
+ ring) ran the full height of a long message. */
74
+ .crewlet-chat-message__gutter {
75
+ display: flex;
76
+ align-items: flex-start;
77
+ justify-content: center;
78
+ padding-top: 2px;
79
+ }
80
+
81
+ /* A face that opens the author's profile: the face is the whole control. */
82
+ .crewlet-chat-message__gutter > button {
83
+ display: inline-flex;
84
+ padding: 0;
85
+ border: 0;
86
+ border-radius: var(--radius-md);
87
+ background: transparent;
88
+ cursor: pointer;
89
+ }
90
+
91
+ .crewlet-chat-message__gutter > button:focus-visible {
92
+ outline: 2px solid var(--color-focus);
93
+ outline-offset: 2px;
94
+ }
95
+
96
+ /* A continuation's time sits on the baseline of the first line of its words.
97
+ The two are in different columns and set at different sizes, so the grid
98
+ aligns them by baseline rather than by sharing a line height. It ends on
99
+ the column's edge: a time is wider than a face, and centred it ran into the
100
+ gap before the words. */
101
+ .crewlet-chat-message.is-continuation > .crewlet-chat-message__gutter {
102
+ justify-content: flex-end;
103
+ padding-top: 0;
104
+ }
105
+
106
+ .crewlet-chat-message.is-continuation > .crewlet-chat-message__gutter,
107
+ .crewlet-chat-message.is-continuation > .crewlet-chat-message__main {
108
+ align-self: baseline;
109
+ }
110
+
111
+ .crewlet-chat-message__gutter-time {
112
+ visibility: hidden;
113
+ color: var(--color-text-tertiary);
114
+ font-size: var(--font-size-2xs);
115
+ font-variant-numeric: tabular-nums;
116
+ line-height: 1;
117
+ white-space: nowrap;
118
+ }
119
+
120
+ .crewlet-chat-message:hover .crewlet-chat-message__gutter-time,
121
+ .crewlet-chat-message:focus-visible .crewlet-chat-message__gutter-time,
122
+ .crewlet-chat-message:has(:focus-visible) .crewlet-chat-message__gutter-time,
123
+ .crewlet-chat-message.is-active .crewlet-chat-message__gutter-time {
124
+ visibility: visible;
125
+ }
126
+
127
+ .crewlet-chat-message__main {
128
+ display: flex;
129
+ flex-direction: column;
130
+ min-width: 0;
131
+ }
132
+
133
+ /* THE HEAD IS SET AS TEXT, not as a flex row. Every line of it, the first or
134
+ one a narrow pane wraps the time onto, is held to one body line by the
135
+ block's strut, and the smaller meta stands on the name's baseline inside
136
+ it. As a wrapping flex row the line grew a pixel to fit the time's own
137
+ line box, and a time wrapped alone got a short line of its own. */
138
+ .crewlet-chat-message__head {
139
+ min-width: 0;
140
+ line-height: calc(var(--crewlet-chat-text) * var(--crewlet-chat-line));
141
+ }
142
+
143
+ /* The gap follows each part, so a part a narrow pane wraps starts flush. */
144
+ .crewlet-chat-message__head > * {
145
+ white-space: nowrap;
146
+ }
147
+
148
+ .crewlet-chat-message__head > :not(:last-child) {
149
+ margin-inline-end: var(--spacing-2);
150
+ }
151
+
152
+ /* A label beside the name ("Agent") is centred on the lower-case letters, as
153
+ text sets an inline mark. */
154
+ .crewlet-chat-message__head > .crewlet-tag {
155
+ vertical-align: middle;
156
+ }
157
+
158
+ .crewlet-chat-message__author {
159
+ color: var(--color-text-primary);
160
+ font-weight: var(--font-weight-medium);
161
+ }
162
+
163
+ /* A name that opens the author's profile reads as the name, not a button. */
164
+ .crewlet-chat-message__author > button {
165
+ padding: 0;
166
+ border: 0;
167
+ border-radius: var(--radius-xs);
168
+ background: transparent;
169
+ color: inherit;
170
+ font: inherit;
171
+ cursor: pointer;
172
+ }
173
+
174
+ .crewlet-chat-message__author > button:hover {
175
+ text-decoration: underline;
176
+ text-underline-offset: 2px;
177
+ }
178
+
179
+ .crewlet-chat-message__author > button:focus-visible {
180
+ outline: 2px solid var(--color-focus);
181
+ outline-offset: 2px;
182
+ }
183
+
184
+ /* Meta on the head shares the name's baseline. A line height of its own
185
+ would sit its smaller text lower in a box as tall as the name's and grow
186
+ the line by a pixel, so it takes none. */
187
+ .crewlet-chat-message__time {
188
+ color: var(--color-text-tertiary);
189
+ font-size: var(--crewlet-chat-meta);
190
+ font-variant-numeric: tabular-nums;
191
+ line-height: 1;
192
+ }
193
+
194
+ .crewlet-chat-message__body {
195
+ min-width: 0;
196
+ color: var(--color-text-primary);
197
+ overflow-wrap: anywhere;
198
+ }
199
+
200
+ /* Emphasis in a message is the semibold step, as it is everywhere else in
201
+ the product: the browser's own bold read heavier than the names. */
202
+ .crewlet-chat-message__body :is(b, strong) {
203
+ font-weight: var(--font-weight-semibold);
204
+ }
205
+
206
+ /* Previews, reactions and the thread line: one stack, one gap. */
207
+ .crewlet-chat-message__footer {
208
+ display: flex;
209
+ flex-direction: column;
210
+ align-items: flex-start;
211
+ gap: var(--crewlet-chat-stack);
212
+ margin-top: var(--crewlet-chat-stack);
213
+ }
214
+
215
+ /* NO PIECE UNDER A MESSAGE IS WIDER THAN ITS COLUMN. Stacked on the start
216
+ edge, each piece takes its one-line width, and an agent's working line set
217
+ it wider than a phone's column: the transcript scrolled sideways. */
218
+ .crewlet-chat-message__footer > * {
219
+ max-width: 100%;
220
+ }
221
+
222
+ /* THE TOOLBAR STANDS ON THE ROW'S FIRST LINE, over the row above, and over
223
+ the day's pinned pill as well as the rows: a toolbar that slid under the
224
+ pill lost its middle buttons wherever the two crossed. */
225
+ .crewlet-chat-message__actions {
226
+ position: absolute;
227
+ top: calc(var(--crewlet-chat-row-top) - var(--crewlet-chat-toolbar));
228
+ right: var(--crewlet-chat-pad-x);
229
+ z-index: calc(var(--z-index-sticky) + var(--z-index-raised));
230
+ opacity: 0;
231
+ pointer-events: none;
232
+ transition: opacity var(--motion-duration-fast) var(--motion-easing-default);
233
+ }
234
+
235
+ .crewlet-chat-message:hover > .crewlet-chat-message__actions,
236
+ .crewlet-chat-message:focus-visible > .crewlet-chat-message__actions,
237
+ .crewlet-chat-message:has(:focus-visible) > .crewlet-chat-message__actions,
238
+ .crewlet-chat-message.is-active > .crewlet-chat-message__actions {
239
+ opacity: 1;
240
+ pointer-events: auto;
241
+ }
242
+
243
+ /* With no row above to stand over (see ChatMessage.tsx), or when the host
244
+ asks, it is drawn inside the row's own head. */
245
+ .crewlet-chat-message.has-actions-inside > .crewlet-chat-message__actions {
246
+ top: var(--spacing-1);
247
+ }
248
+
249
+ /* A row's quiet controls, the add-reaction pill among them, show while the
250
+ row is pointed at or holds keyboard focus, and while their picker is open. */
251
+ .crewlet-chat-message .crewlet-reaction--add {
252
+ opacity: 0;
253
+ }
254
+
255
+ .crewlet-chat-message:hover .crewlet-reaction--add,
256
+ .crewlet-chat-message:has(:focus-visible) .crewlet-reaction--add,
257
+ .crewlet-chat-message.is-active .crewlet-reaction--add,
258
+ .crewlet-chat-message .crewlet-reaction--add[aria-expanded='true'] {
259
+ opacity: 1;
260
+ }
261
+
262
+ /* A TOUCH SCREEN HAS NO HOVER: a tap on the row (which focuses it) shows the
263
+ toolbar, so replying in a thread, saving and the More menu are reached by
264
+ touch as well as by pointer and keyboard. The add pill is always shown
265
+ there, so a reaction is one tap away without finding the toolbar first. */
266
+ @media (hover: none) {
267
+ .crewlet-chat-message:focus-within > .crewlet-chat-message__actions {
268
+ opacity: 1;
269
+ pointer-events: auto;
270
+ }
271
+
272
+ .crewlet-chat-message .crewlet-reaction--add {
273
+ opacity: 1;
274
+ }
275
+ }
276
+
277
+ /* The line under a message that was not sent. */
278
+ .crewlet-chat-message-failure {
279
+ display: flex;
280
+ flex-wrap: wrap;
281
+ align-items: center;
282
+ gap: var(--spacing-1);
283
+ color: var(--color-feedback-danger-ink);
284
+ font-size: var(--crewlet-chat-meta);
285
+ line-height: var(--crewlet-chat-line);
286
+ }
287
+
288
+ .crewlet-chat-message-failure__words {
289
+ margin-inline-end: var(--spacing-1);
290
+ }
291
+
292
+ @media (prefers-reduced-motion: reduce) {
293
+ .crewlet-chat-message {
294
+ transition: none;
295
+ }
296
+
297
+ .crewlet-chat-message.is-flash {
298
+ animation: none;
299
+ }
300
+
301
+ .crewlet-chat-message__actions {
302
+ transition: none;
303
+ }
304
+ }