@mattermost/compass-ui 0.1.0-alpha.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 (365) hide show
  1. package/README.md +86 -0
  2. package/dist/compass-ui-standalone.css +62 -0
  3. package/dist/compass-ui.css +508 -0
  4. package/dist/components/ActionButton/ActionButton.d.ts +9 -0
  5. package/dist/components/ActionButton/ActionButton.d.ts.map +1 -0
  6. package/dist/components/ActionButton/index.d.ts +3 -0
  7. package/dist/components/ActionButton/index.d.ts.map +1 -0
  8. package/dist/components/AdminConsoleHeader/AdminConsoleHeader.d.ts +20 -0
  9. package/dist/components/AdminConsoleHeader/AdminConsoleHeader.d.ts.map +1 -0
  10. package/dist/components/AdminConsoleHeader/index.d.ts +3 -0
  11. package/dist/components/AdminConsoleHeader/index.d.ts.map +1 -0
  12. package/dist/components/AdminConsoleSidebar/AdminConsoleSidebar.d.ts +12 -0
  13. package/dist/components/AdminConsoleSidebar/AdminConsoleSidebar.d.ts.map +1 -0
  14. package/dist/components/AdminConsoleSidebar/adminConsoleSidebarModel.d.ts +14 -0
  15. package/dist/components/AdminConsoleSidebar/adminConsoleSidebarModel.d.ts.map +1 -0
  16. package/dist/components/AdminConsoleSidebar/index.d.ts +4 -0
  17. package/dist/components/AdminConsoleSidebar/index.d.ts.map +1 -0
  18. package/dist/components/AdminPanel/AdminPanel.d.ts +35 -0
  19. package/dist/components/AdminPanel/AdminPanel.d.ts.map +1 -0
  20. package/dist/components/AdminPanel/index.d.ts +3 -0
  21. package/dist/components/AdminPanel/index.d.ts.map +1 -0
  22. package/dist/components/AdminPanelFooter/AdminPanelFooter.d.ts +18 -0
  23. package/dist/components/AdminPanelFooter/AdminPanelFooter.d.ts.map +1 -0
  24. package/dist/components/AdminPanelFooter/index.d.ts +3 -0
  25. package/dist/components/AdminPanelFooter/index.d.ts.map +1 -0
  26. package/dist/components/AdminPanelHeader/AdminPanelHeader.d.ts +38 -0
  27. package/dist/components/AdminPanelHeader/AdminPanelHeader.d.ts.map +1 -0
  28. package/dist/components/AdminPanelHeader/index.d.ts +3 -0
  29. package/dist/components/AdminPanelHeader/index.d.ts.map +1 -0
  30. package/dist/components/AppBarItem/AppBarItem.d.ts +24 -0
  31. package/dist/components/AppBarItem/AppBarItem.d.ts.map +1 -0
  32. package/dist/components/AppBarItem/index.d.ts +3 -0
  33. package/dist/components/AppBarItem/index.d.ts.map +1 -0
  34. package/dist/components/AttachmentCard/AttachmentCard.d.ts +29 -0
  35. package/dist/components/AttachmentCard/AttachmentCard.d.ts.map +1 -0
  36. package/dist/components/AttachmentCard/index.d.ts +3 -0
  37. package/dist/components/AttachmentCard/index.d.ts.map +1 -0
  38. package/dist/components/Button/Button.d.ts +30 -0
  39. package/dist/components/Button/Button.d.ts.map +1 -0
  40. package/dist/components/Button/index.d.ts +3 -0
  41. package/dist/components/Button/index.d.ts.map +1 -0
  42. package/dist/components/ChannelCategoryMenu/ChannelCategoryMenu.d.ts +10 -0
  43. package/dist/components/ChannelCategoryMenu/ChannelCategoryMenu.d.ts.map +1 -0
  44. package/dist/components/ChannelCategoryMenu/index.d.ts +3 -0
  45. package/dist/components/ChannelCategoryMenu/index.d.ts.map +1 -0
  46. package/dist/components/ChannelHeader/ChannelHeader.d.ts +37 -0
  47. package/dist/components/ChannelHeader/ChannelHeader.d.ts.map +1 -0
  48. package/dist/components/ChannelHeader/index.d.ts +3 -0
  49. package/dist/components/ChannelHeader/index.d.ts.map +1 -0
  50. package/dist/components/ChannelHeaderMenu/ChannelHeaderMenu.d.ts +8 -0
  51. package/dist/components/ChannelHeaderMenu/ChannelHeaderMenu.d.ts.map +1 -0
  52. package/dist/components/ChannelHeaderMenu/index.d.ts +3 -0
  53. package/dist/components/ChannelHeaderMenu/index.d.ts.map +1 -0
  54. package/dist/components/ChannelInfoMsgHeader/ChannelInfoMsgHeader.d.ts +38 -0
  55. package/dist/components/ChannelInfoMsgHeader/ChannelInfoMsgHeader.d.ts.map +1 -0
  56. package/dist/components/ChannelInfoMsgHeader/index.d.ts +3 -0
  57. package/dist/components/ChannelInfoMsgHeader/index.d.ts.map +1 -0
  58. package/dist/components/ChannelMenu/ChannelMenu.d.ts +8 -0
  59. package/dist/components/ChannelMenu/ChannelMenu.d.ts.map +1 -0
  60. package/dist/components/ChannelMenu/index.d.ts +3 -0
  61. package/dist/components/ChannelMenu/index.d.ts.map +1 -0
  62. package/dist/components/ChannelSidebarItem/ChannelSidebarItem.d.ts +39 -0
  63. package/dist/components/ChannelSidebarItem/ChannelSidebarItem.d.ts.map +1 -0
  64. package/dist/components/ChannelSidebarItem/index.d.ts +3 -0
  65. package/dist/components/ChannelSidebarItem/index.d.ts.map +1 -0
  66. package/dist/components/ChannelsSidebar/ChannelsSidebar.d.ts +57 -0
  67. package/dist/components/ChannelsSidebar/ChannelsSidebar.d.ts.map +1 -0
  68. package/dist/components/ChannelsSidebar/channelsSidebarModel.d.ts +22 -0
  69. package/dist/components/ChannelsSidebar/channelsSidebarModel.d.ts.map +1 -0
  70. package/dist/components/ChannelsSidebar/index.d.ts +5 -0
  71. package/dist/components/ChannelsSidebar/index.d.ts.map +1 -0
  72. package/dist/components/Checkbox/Checkbox.d.ts +26 -0
  73. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
  74. package/dist/components/Checkbox/index.d.ts +3 -0
  75. package/dist/components/Checkbox/index.d.ts.map +1 -0
  76. package/dist/components/Chip/Chip.d.ts +26 -0
  77. package/dist/components/Chip/Chip.d.ts.map +1 -0
  78. package/dist/components/Chip/index.d.ts +3 -0
  79. package/dist/components/Chip/index.d.ts.map +1 -0
  80. package/dist/components/Combobox/Combobox.d.ts +52 -0
  81. package/dist/components/Combobox/Combobox.d.ts.map +1 -0
  82. package/dist/components/Combobox/index.d.ts +3 -0
  83. package/dist/components/Combobox/index.d.ts.map +1 -0
  84. package/dist/components/DateRangePicker/DateRangePicker.d.ts +29 -0
  85. package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -0
  86. package/dist/components/DateRangePicker/index.d.ts +3 -0
  87. package/dist/components/DateRangePicker/index.d.ts.map +1 -0
  88. package/dist/components/Divider/Divider.d.ts +2 -0
  89. package/dist/components/Divider/Divider.d.ts.map +1 -0
  90. package/dist/components/Divider/index.d.ts +3 -0
  91. package/dist/components/Divider/index.d.ts.map +1 -0
  92. package/dist/components/Dropdown/Dropdown.d.ts +29 -0
  93. package/dist/components/Dropdown/Dropdown.d.ts.map +1 -0
  94. package/dist/components/Dropdown/index.d.ts +3 -0
  95. package/dist/components/Dropdown/index.d.ts.map +1 -0
  96. package/dist/components/Emoji/Emoji.d.ts +14 -0
  97. package/dist/components/Emoji/Emoji.d.ts.map +1 -0
  98. package/dist/components/Emoji/index.d.ts +3 -0
  99. package/dist/components/Emoji/index.d.ts.map +1 -0
  100. package/dist/components/EmptyState/EmptyState.d.ts +23 -0
  101. package/dist/components/EmptyState/EmptyState.d.ts.map +1 -0
  102. package/dist/components/EmptyState/index.d.ts +3 -0
  103. package/dist/components/EmptyState/index.d.ts.map +1 -0
  104. package/dist/components/ErrorMessage/ErrorMessage.d.ts +12 -0
  105. package/dist/components/ErrorMessage/ErrorMessage.d.ts.map +1 -0
  106. package/dist/components/ErrorMessage/index.d.ts +3 -0
  107. package/dist/components/ErrorMessage/index.d.ts.map +1 -0
  108. package/dist/components/FeatureDiscoveryPanel/FeatureDiscoveryPanel.d.ts +26 -0
  109. package/dist/components/FeatureDiscoveryPanel/FeatureDiscoveryPanel.d.ts.map +1 -0
  110. package/dist/components/FeatureDiscoveryPanel/index.d.ts +3 -0
  111. package/dist/components/FeatureDiscoveryPanel/index.d.ts.map +1 -0
  112. package/dist/components/GlobalBanner/GlobalBanner.d.ts +25 -0
  113. package/dist/components/GlobalBanner/GlobalBanner.d.ts.map +1 -0
  114. package/dist/components/GlobalBanner/index.d.ts +3 -0
  115. package/dist/components/GlobalBanner/index.d.ts.map +1 -0
  116. package/dist/components/GlobalHeader/GlobalHeader.d.ts +28 -0
  117. package/dist/components/GlobalHeader/GlobalHeader.d.ts.map +1 -0
  118. package/dist/components/GlobalHeader/index.d.ts +3 -0
  119. package/dist/components/GlobalHeader/index.d.ts.map +1 -0
  120. package/dist/components/HelpMenu/HelpMenu.d.ts +8 -0
  121. package/dist/components/HelpMenu/HelpMenu.d.ts.map +1 -0
  122. package/dist/components/HelpMenu/index.d.ts +3 -0
  123. package/dist/components/HelpMenu/index.d.ts.map +1 -0
  124. package/dist/components/Icon/Icon.d.ts +30 -0
  125. package/dist/components/Icon/Icon.d.ts.map +1 -0
  126. package/dist/components/Icon/index.d.ts +3 -0
  127. package/dist/components/Icon/index.d.ts.map +1 -0
  128. package/dist/components/IconButton/IconButton.d.ts +40 -0
  129. package/dist/components/IconButton/IconButton.d.ts.map +1 -0
  130. package/dist/components/IconButton/index.d.ts +3 -0
  131. package/dist/components/IconButton/index.d.ts.map +1 -0
  132. package/dist/components/Illustration/Illustration.d.ts +23 -0
  133. package/dist/components/Illustration/Illustration.d.ts.map +1 -0
  134. package/dist/components/Illustration/index.d.ts +3 -0
  135. package/dist/components/Illustration/index.d.ts.map +1 -0
  136. package/dist/components/ImagePreview/ImagePreview.d.ts +26 -0
  137. package/dist/components/ImagePreview/ImagePreview.d.ts.map +1 -0
  138. package/dist/components/ImagePreview/index.d.ts +3 -0
  139. package/dist/components/ImagePreview/index.d.ts.map +1 -0
  140. package/dist/components/LinkPreview/LinkPreview.d.ts +33 -0
  141. package/dist/components/LinkPreview/LinkPreview.d.ts.map +1 -0
  142. package/dist/components/LinkPreview/index.d.ts +3 -0
  143. package/dist/components/LinkPreview/index.d.ts.map +1 -0
  144. package/dist/components/MentionBadge/MentionBadge.d.ts +22 -0
  145. package/dist/components/MentionBadge/MentionBadge.d.ts.map +1 -0
  146. package/dist/components/MentionBadge/index.d.ts +3 -0
  147. package/dist/components/MentionBadge/index.d.ts.map +1 -0
  148. package/dist/components/MenuItem/MenuItem.d.ts +34 -0
  149. package/dist/components/MenuItem/MenuItem.d.ts.map +1 -0
  150. package/dist/components/MenuItem/index.d.ts +3 -0
  151. package/dist/components/MenuItem/index.d.ts.map +1 -0
  152. package/dist/components/Message/Message.d.ts +34 -0
  153. package/dist/components/Message/Message.d.ts.map +1 -0
  154. package/dist/components/Message/index.d.ts +3 -0
  155. package/dist/components/Message/index.d.ts.map +1 -0
  156. package/dist/components/MessageActions/MessageActions.d.ts +20 -0
  157. package/dist/components/MessageActions/MessageActions.d.ts.map +1 -0
  158. package/dist/components/MessageActions/index.d.ts +3 -0
  159. package/dist/components/MessageActions/index.d.ts.map +1 -0
  160. package/dist/components/MessageHeader/MessageHeader.d.ts +9 -0
  161. package/dist/components/MessageHeader/MessageHeader.d.ts.map +1 -0
  162. package/dist/components/MessageHeader/index.d.ts +3 -0
  163. package/dist/components/MessageHeader/index.d.ts.map +1 -0
  164. package/dist/components/MessageInput/MessageInput.d.ts +15 -0
  165. package/dist/components/MessageInput/MessageInput.d.ts.map +1 -0
  166. package/dist/components/MessageInput/index.d.ts +3 -0
  167. package/dist/components/MessageInput/index.d.ts.map +1 -0
  168. package/dist/components/MessageMoreOptionsMenu/MessageMoreOptionsMenu.d.ts +12 -0
  169. package/dist/components/MessageMoreOptionsMenu/MessageMoreOptionsMenu.d.ts.map +1 -0
  170. package/dist/components/MessageMoreOptionsMenu/index.d.ts +3 -0
  171. package/dist/components/MessageMoreOptionsMenu/index.d.ts.map +1 -0
  172. package/dist/components/MessageReactions/MessageReactions.d.ts +34 -0
  173. package/dist/components/MessageReactions/MessageReactions.d.ts.map +1 -0
  174. package/dist/components/MessageReactions/index.d.ts +3 -0
  175. package/dist/components/MessageReactions/index.d.ts.map +1 -0
  176. package/dist/components/MessageSeparator/MessageSeparator.d.ts +20 -0
  177. package/dist/components/MessageSeparator/MessageSeparator.d.ts.map +1 -0
  178. package/dist/components/MessageSeparator/index.d.ts +3 -0
  179. package/dist/components/MessageSeparator/index.d.ts.map +1 -0
  180. package/dist/components/Modal/Modal.d.ts +26 -0
  181. package/dist/components/Modal/Modal.d.ts.map +1 -0
  182. package/dist/components/Modal/index.d.ts +3 -0
  183. package/dist/components/Modal/index.d.ts.map +1 -0
  184. package/dist/components/MoreUnreadsBanner/MoreUnreadsBanner.d.ts +18 -0
  185. package/dist/components/MoreUnreadsBanner/MoreUnreadsBanner.d.ts.map +1 -0
  186. package/dist/components/MoreUnreadsBanner/index.d.ts +3 -0
  187. package/dist/components/MoreUnreadsBanner/index.d.ts.map +1 -0
  188. package/dist/components/NewMessageBanner/NewMessageBanner.d.ts +20 -0
  189. package/dist/components/NewMessageBanner/NewMessageBanner.d.ts.map +1 -0
  190. package/dist/components/NewMessageBanner/index.d.ts +3 -0
  191. package/dist/components/NewMessageBanner/index.d.ts.map +1 -0
  192. package/dist/components/PaginationDots/PaginationDots.d.ts +24 -0
  193. package/dist/components/PaginationDots/PaginationDots.d.ts.map +1 -0
  194. package/dist/components/PaginationDots/index.d.ts +3 -0
  195. package/dist/components/PaginationDots/index.d.ts.map +1 -0
  196. package/dist/components/PermalinkPreview/PermalinkPreview.d.ts +23 -0
  197. package/dist/components/PermalinkPreview/PermalinkPreview.d.ts.map +1 -0
  198. package/dist/components/PermalinkPreview/index.d.ts +3 -0
  199. package/dist/components/PermalinkPreview/index.d.ts.map +1 -0
  200. package/dist/components/PinnedSavedIndicators/PinnedSavedIndicators.d.ts +9 -0
  201. package/dist/components/PinnedSavedIndicators/PinnedSavedIndicators.d.ts.map +1 -0
  202. package/dist/components/PinnedSavedIndicators/index.d.ts +3 -0
  203. package/dist/components/PinnedSavedIndicators/index.d.ts.map +1 -0
  204. package/dist/components/PlusMenu/PlusMenu.d.ts +8 -0
  205. package/dist/components/PlusMenu/PlusMenu.d.ts.map +1 -0
  206. package/dist/components/PlusMenu/index.d.ts +3 -0
  207. package/dist/components/PlusMenu/index.d.ts.map +1 -0
  208. package/dist/components/PopoverMenu/PopoverMenu.d.ts +43 -0
  209. package/dist/components/PopoverMenu/PopoverMenu.d.ts.map +1 -0
  210. package/dist/components/PopoverMenu/index.d.ts +5 -0
  211. package/dist/components/PopoverMenu/index.d.ts.map +1 -0
  212. package/dist/components/PopoverNotice/PopoverNotice.d.ts +32 -0
  213. package/dist/components/PopoverNotice/PopoverNotice.d.ts.map +1 -0
  214. package/dist/components/PopoverNotice/index.d.ts +3 -0
  215. package/dist/components/PopoverNotice/index.d.ts.map +1 -0
  216. package/dist/components/ProductSwitcherMenu/ProductSwitcherMenu.d.ts +47 -0
  217. package/dist/components/ProductSwitcherMenu/ProductSwitcherMenu.d.ts.map +1 -0
  218. package/dist/components/ProductSwitcherMenu/index.d.ts +4 -0
  219. package/dist/components/ProductSwitcherMenu/index.d.ts.map +1 -0
  220. package/dist/components/ProfilePopover/ProfilePopover.d.ts +82 -0
  221. package/dist/components/ProfilePopover/ProfilePopover.d.ts.map +1 -0
  222. package/dist/components/ProfilePopover/index.d.ts +3 -0
  223. package/dist/components/ProfilePopover/index.d.ts.map +1 -0
  224. package/dist/components/ProgressBar/ProgressBar.d.ts +23 -0
  225. package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -0
  226. package/dist/components/ProgressBar/index.d.ts +3 -0
  227. package/dist/components/ProgressBar/index.d.ts.map +1 -0
  228. package/dist/components/Radio/Radio.d.ts +23 -0
  229. package/dist/components/Radio/Radio.d.ts.map +1 -0
  230. package/dist/components/Radio/index.d.ts +3 -0
  231. package/dist/components/Radio/index.d.ts.map +1 -0
  232. package/dist/components/ReactionPill/ReactionPill.d.ts +23 -0
  233. package/dist/components/ReactionPill/ReactionPill.d.ts.map +1 -0
  234. package/dist/components/ReactionPill/index.d.ts +3 -0
  235. package/dist/components/ReactionPill/index.d.ts.map +1 -0
  236. package/dist/components/RightSidebar/RightSidebar.d.ts +23 -0
  237. package/dist/components/RightSidebar/RightSidebar.d.ts.map +1 -0
  238. package/dist/components/RightSidebar/RightSidebarHeader/RightSidebarHeader.d.ts +29 -0
  239. package/dist/components/RightSidebar/RightSidebarHeader/RightSidebarHeader.d.ts.map +1 -0
  240. package/dist/components/RightSidebar/RightSidebarHeader/index.d.ts +3 -0
  241. package/dist/components/RightSidebar/RightSidebarHeader/index.d.ts.map +1 -0
  242. package/dist/components/RightSidebar/index.d.ts +5 -0
  243. package/dist/components/RightSidebar/index.d.ts.map +1 -0
  244. package/dist/components/Scrollbar/Scrollbar.d.ts +34 -0
  245. package/dist/components/Scrollbar/Scrollbar.d.ts.map +1 -0
  246. package/dist/components/Scrollbar/index.d.ts +3 -0
  247. package/dist/components/Scrollbar/index.d.ts.map +1 -0
  248. package/dist/components/SearchInput/SearchInput.d.ts +20 -0
  249. package/dist/components/SearchInput/SearchInput.d.ts.map +1 -0
  250. package/dist/components/SearchInput/index.d.ts +3 -0
  251. package/dist/components/SearchInput/index.d.ts.map +1 -0
  252. package/dist/components/SearchTipBanner/SearchTipBanner.d.ts +24 -0
  253. package/dist/components/SearchTipBanner/SearchTipBanner.d.ts.map +1 -0
  254. package/dist/components/SearchTipBanner/index.d.ts +3 -0
  255. package/dist/components/SearchTipBanner/index.d.ts.map +1 -0
  256. package/dist/components/SectionNotice/SectionNotice.d.ts +31 -0
  257. package/dist/components/SectionNotice/SectionNotice.d.ts.map +1 -0
  258. package/dist/components/SectionNotice/index.d.ts +3 -0
  259. package/dist/components/SectionNotice/index.d.ts.map +1 -0
  260. package/dist/components/Select/Select.d.ts +39 -0
  261. package/dist/components/Select/Select.d.ts.map +1 -0
  262. package/dist/components/Select/index.d.ts +3 -0
  263. package/dist/components/Select/index.d.ts.map +1 -0
  264. package/dist/components/ShortcutTag/ShortcutTag.d.ts +26 -0
  265. package/dist/components/ShortcutTag/ShortcutTag.d.ts.map +1 -0
  266. package/dist/components/ShortcutTag/index.d.ts +3 -0
  267. package/dist/components/ShortcutTag/index.d.ts.map +1 -0
  268. package/dist/components/Spinner/Spinner.d.ts +9 -0
  269. package/dist/components/Spinner/Spinner.d.ts.map +1 -0
  270. package/dist/components/Spinner/index.d.ts +3 -0
  271. package/dist/components/Spinner/index.d.ts.map +1 -0
  272. package/dist/components/StatusBadge/StatusBadge.d.ts +20 -0
  273. package/dist/components/StatusBadge/StatusBadge.d.ts.map +1 -0
  274. package/dist/components/StatusBadge/index.d.ts +3 -0
  275. package/dist/components/StatusBadge/index.d.ts.map +1 -0
  276. package/dist/components/Switch/Switch.d.ts +28 -0
  277. package/dist/components/Switch/Switch.d.ts.map +1 -0
  278. package/dist/components/Switch/index.d.ts +3 -0
  279. package/dist/components/Switch/index.d.ts.map +1 -0
  280. package/dist/components/Tabs/Tabs.d.ts +29 -0
  281. package/dist/components/Tabs/Tabs.d.ts.map +1 -0
  282. package/dist/components/Tabs/index.d.ts +3 -0
  283. package/dist/components/Tabs/index.d.ts.map +1 -0
  284. package/dist/components/Tag/Tag.d.ts +24 -0
  285. package/dist/components/Tag/Tag.d.ts.map +1 -0
  286. package/dist/components/Tag/index.d.ts +3 -0
  287. package/dist/components/Tag/index.d.ts.map +1 -0
  288. package/dist/components/TeamAvatar/TeamAvatar.d.ts +13 -0
  289. package/dist/components/TeamAvatar/TeamAvatar.d.ts.map +1 -0
  290. package/dist/components/TeamAvatar/index.d.ts +3 -0
  291. package/dist/components/TeamAvatar/index.d.ts.map +1 -0
  292. package/dist/components/TeamMenu/TeamMenu.d.ts +15 -0
  293. package/dist/components/TeamMenu/TeamMenu.d.ts.map +1 -0
  294. package/dist/components/TeamMenu/index.d.ts +3 -0
  295. package/dist/components/TeamMenu/index.d.ts.map +1 -0
  296. package/dist/components/TeamSidebar/TeamSidebar.d.ts +21 -0
  297. package/dist/components/TeamSidebar/TeamSidebar.d.ts.map +1 -0
  298. package/dist/components/TeamSidebar/index.d.ts +3 -0
  299. package/dist/components/TeamSidebar/index.d.ts.map +1 -0
  300. package/dist/components/TextArea/TextArea.d.ts +26 -0
  301. package/dist/components/TextArea/TextArea.d.ts.map +1 -0
  302. package/dist/components/TextArea/index.d.ts +3 -0
  303. package/dist/components/TextArea/index.d.ts.map +1 -0
  304. package/dist/components/TextInput/TextInput.d.ts +30 -0
  305. package/dist/components/TextInput/TextInput.d.ts.map +1 -0
  306. package/dist/components/TextInput/index.d.ts +3 -0
  307. package/dist/components/TextInput/index.d.ts.map +1 -0
  308. package/dist/components/ThreadActionsMenu/ThreadActionsMenu.d.ts +8 -0
  309. package/dist/components/ThreadActionsMenu/ThreadActionsMenu.d.ts.map +1 -0
  310. package/dist/components/ThreadActionsMenu/index.d.ts +3 -0
  311. package/dist/components/ThreadActionsMenu/index.d.ts.map +1 -0
  312. package/dist/components/ThreadFooter/ThreadFooter.d.ts +33 -0
  313. package/dist/components/ThreadFooter/ThreadFooter.d.ts.map +1 -0
  314. package/dist/components/ThreadFooter/index.d.ts +3 -0
  315. package/dist/components/ThreadFooter/index.d.ts.map +1 -0
  316. package/dist/components/ThreadListItem/ThreadListItem.d.ts +37 -0
  317. package/dist/components/ThreadListItem/ThreadListItem.d.ts.map +1 -0
  318. package/dist/components/ThreadListItem/index.d.ts +4 -0
  319. package/dist/components/ThreadListItem/index.d.ts.map +1 -0
  320. package/dist/components/Toast/Toast.d.ts +11 -0
  321. package/dist/components/Toast/Toast.d.ts.map +1 -0
  322. package/dist/components/Toast/index.d.ts +3 -0
  323. package/dist/components/Toast/index.d.ts.map +1 -0
  324. package/dist/components/Tooltip/Tooltip.d.ts +25 -0
  325. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -0
  326. package/dist/components/Tooltip/index.d.ts +3 -0
  327. package/dist/components/Tooltip/index.d.ts.map +1 -0
  328. package/dist/components/TourPoint/TourPoint.d.ts +31 -0
  329. package/dist/components/TourPoint/TourPoint.d.ts.map +1 -0
  330. package/dist/components/TourPoint/index.d.ts +3 -0
  331. package/dist/components/TourPoint/index.d.ts.map +1 -0
  332. package/dist/components/UnreadBadge/UnreadBadge.d.ts +21 -0
  333. package/dist/components/UnreadBadge/UnreadBadge.d.ts.map +1 -0
  334. package/dist/components/UnreadBadge/index.d.ts +3 -0
  335. package/dist/components/UnreadBadge/index.d.ts.map +1 -0
  336. package/dist/components/UserAvatar/UserAvatar.d.ts +39 -0
  337. package/dist/components/UserAvatar/UserAvatar.d.ts.map +1 -0
  338. package/dist/components/UserAvatar/index.d.ts +3 -0
  339. package/dist/components/UserAvatar/index.d.ts.map +1 -0
  340. package/dist/components/UserAvatarGroup/UserAvatarGroup.d.ts +29 -0
  341. package/dist/components/UserAvatarGroup/UserAvatarGroup.d.ts.map +1 -0
  342. package/dist/components/UserAvatarGroup/index.d.ts +3 -0
  343. package/dist/components/UserAvatarGroup/index.d.ts.map +1 -0
  344. package/dist/hooks/useAnchoredPopupPortal.d.ts +38 -0
  345. package/dist/hooks/useAnchoredPopupPortal.d.ts.map +1 -0
  346. package/dist/hooks/useControllable.d.ts +13 -0
  347. package/dist/hooks/useControllable.d.ts.map +1 -0
  348. package/dist/hooks/useExitAnimation.d.ts +11 -0
  349. package/dist/hooks/useExitAnimation.d.ts.map +1 -0
  350. package/dist/hooks/useOutsideClose.d.ts +17 -0
  351. package/dist/hooks/useOutsideClose.d.ts.map +1 -0
  352. package/dist/hooks/usePopoverTransition.d.ts +11 -0
  353. package/dist/hooks/usePopoverTransition.d.ts.map +1 -0
  354. package/dist/index.cjs +2 -0
  355. package/dist/index.cjs.map +1 -0
  356. package/dist/index.css +1 -0
  357. package/dist/index.d.ts +98 -0
  358. package/dist/index.d.ts.map +1 -0
  359. package/dist/index.js +7840 -0
  360. package/dist/index.js.map +1 -0
  361. package/dist/utils/anchoredPopupPlacement.d.ts +76 -0
  362. package/dist/utils/anchoredPopupPlacement.d.ts.map +1 -0
  363. package/dist/utils/string.d.ts +7 -0
  364. package/dist/utils/string.d.ts.map +1 -0
  365. package/package.json +80 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/components/ActionButton/ActionButton.tsx","../src/components/Icon/Icon.tsx","../src/utils/string.ts","../src/components/IconButton/IconButton.tsx","../src/components/Tag/Tag.tsx","../src/components/AdminConsoleHeader/AdminConsoleHeader.tsx","../src/components/StatusBadge/StatusBadge.tsx","../src/components/UserAvatar/UserAvatar.tsx","../src/components/MentionBadge/MentionBadge.tsx","../src/components/ChannelSidebarItem/ChannelSidebarItem.tsx","../src/components/MoreUnreadsBanner/MoreUnreadsBanner.tsx","../src/components/Scrollbar/Scrollbar.tsx","../src/components/ChannelsSidebar/channelsSidebarModel.ts","../src/components/ChannelsSidebar/ChannelsSidebar.tsx","../src/components/AdminConsoleSidebar/AdminConsoleSidebar.tsx","../src/components/Button/Button.tsx","../src/hooks/useControllable.ts","../src/components/Switch/Switch.tsx","../src/components/AdminPanelHeader/AdminPanelHeader.tsx","../src/components/AdminPanel/AdminPanel.tsx","../src/components/AdminPanelFooter/AdminPanelFooter.tsx","../src/components/AppBarItem/AppBarItem.tsx","../src/components/AttachmentCard/AttachmentCard.tsx","../src/components/ChannelHeader/ChannelHeader.tsx","../src/components/MenuItem/MenuItem.tsx","../src/components/PopoverMenu/PopoverMenu.tsx","../src/components/ChannelHeaderMenu/ChannelHeaderMenu.tsx","../src/components/ChannelInfoMsgHeader/ChannelInfoMsgHeader.tsx","../src/components/ChannelMenu/ChannelMenu.tsx","../src/components/ChannelCategoryMenu/ChannelCategoryMenu.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Chip/Chip.tsx","../src/utils/anchoredPopupPlacement.ts","../src/hooks/useAnchoredPopupPortal.ts","../src/hooks/useOutsideClose.ts","../src/hooks/usePopoverTransition.ts","../src/components/Combobox/Combobox.tsx","../src/components/DateRangePicker/DateRangePicker.tsx","../src/components/Divider/Divider.tsx","../src/components/Dropdown/Dropdown.tsx","../src/components/Emoji/Emoji.tsx","../src/components/Illustration/Illustration.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/ErrorMessage/ErrorMessage.tsx","../src/components/FeatureDiscoveryPanel/FeatureDiscoveryPanel.tsx","../src/components/GlobalBanner/GlobalBanner.tsx","../src/components/GlobalHeader/GlobalHeader.tsx","../src/components/HelpMenu/HelpMenu.tsx","../src/components/ImagePreview/ImagePreview.tsx","../src/components/LinkPreview/LinkPreview.tsx","../src/components/MessageHeader/MessageHeader.tsx","../src/components/MessageActions/MessageActions.tsx","../src/components/PinnedSavedIndicators/PinnedSavedIndicators.tsx","../src/components/Message/Message.tsx","../src/components/MessageInput/MessageInput.tsx","../src/components/ShortcutTag/ShortcutTag.tsx","../src/components/MessageMoreOptionsMenu/MessageMoreOptionsMenu.tsx","../src/components/MessageReactions/MessageReactions.tsx","../src/components/MessageSeparator/MessageSeparator.tsx","../src/components/Modal/Modal.tsx","../src/components/NewMessageBanner/NewMessageBanner.tsx","../src/components/PaginationDots/PaginationDots.tsx","../src/components/PermalinkPreview/PermalinkPreview.tsx","../src/components/PlusMenu/PlusMenu.tsx","../src/components/PopoverNotice/PopoverNotice.tsx","../src/components/ProductSwitcherMenu/ProductSwitcherMenu.tsx","../src/components/ProfilePopover/ProfilePopover.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/Radio/Radio.tsx","../src/components/ReactionPill/ReactionPill.tsx","../src/components/RightSidebar/RightSidebar.tsx","../src/components/RightSidebar/RightSidebarHeader/RightSidebarHeader.tsx","../src/components/SearchInput/SearchInput.tsx","../src/components/SearchTipBanner/SearchTipBanner.tsx","../src/components/SectionNotice/SectionNotice.tsx","../src/components/Select/Select.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Tabs/Tabs.tsx","../src/components/TeamAvatar/TeamAvatar.tsx","../src/components/TeamMenu/TeamMenu.tsx","../src/components/UnreadBadge/UnreadBadge.tsx","../src/components/TeamSidebar/TeamSidebar.tsx","../src/components/TextArea/TextArea.tsx","../src/components/TextInput/TextInput.tsx","../src/components/ThreadActionsMenu/ThreadActionsMenu.tsx","../src/components/ThreadFooter/ThreadFooter.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/UserAvatarGroup/UserAvatarGroup.tsx","../src/components/ThreadListItem/ThreadListItem.tsx","../src/components/Toast/Toast.tsx","../src/components/TourPoint/TourPoint.tsx","../src/hooks/useExitAnimation.ts"],"sourcesContent":["import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport styles from './ActionButton.module.scss';\n\nexport interface ActionButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n icon: ReactNode;\n label: string;\n active?: boolean;\n destructive?: boolean;\n}\n\nexport default function ActionButton({\n icon,\n label,\n active = false,\n destructive = false,\n className,\n ...htmlProps\n}: ActionButtonProps) {\n const rootClass = [\n styles['action-button'],\n active ? styles['action-button--active'] : '',\n destructive ? styles['action-button--destructive'] : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button className={rootClass} aria-pressed={active} {...htmlProps}>\n <span className={styles['action-button__icon']}>{icon}</span>\n <span className={styles['action-button__label']}>{label}</span>\n </button>\n );\n}\n","import React, { type ReactNode } from 'react';\nimport EmoticonHappyOutlineIcon from '@mattermost/compass-icons/components/emoticon-happy-outline';\nimport styles from './Icon.module.scss';\n\nexport type IconSize =\n | '10'\n | '12'\n | '16'\n | '20'\n | '24'\n | '28'\n | '32'\n | '40'\n | '52'\n | '64'\n | '104';\n\n/**\n * Maps container size → SVG render size. Icons bleed slightly past the container\n * to strip the built-in clear-space padding from compass-icons SVGs.\n * Pass SVG_SIZE_MAP[size] as the `size` prop on any compass-icons component\n * used as a glyph (e.g. <GlobeIcon size={SVG_SIZE_MAP['24']} />).\n */\nexport const SVG_SIZE_MAP: Record<IconSize, number> = {\n '10': 12,\n '12': 14,\n '16': 18,\n '20': 24,\n '24': 28,\n '28': 32,\n '32': 36,\n '40': 48,\n '52': 60,\n '64': 72,\n '104': 120,\n};\n\nexport interface IconProps {\n /** Optional CSS class name applied to the container. */\n className?: string;\n /**\n * Icon SVG from @mattermost/compass-icons (e.g. `<GlobeIcon />`).\n * Icon automatically injects the correct SVG size — no need to pass a size\n * prop on the glyph element. When omitted, shows emoticon-happy-outline.\n */\n glyph?: ReactNode | null;\n /** Container size from the Mattermost icon scale. Default 24. */\n size?: IconSize;\n}\n\nconst SIZE_CLASS_MAP: Record<IconSize, string> = {\n '10': styles['icon--size-10'],\n '12': styles['icon--size-12'],\n '16': styles['icon--size-16'],\n '20': styles['icon--size-20'],\n '24': styles['icon--size-24'],\n '28': styles['icon--size-28'],\n '32': styles['icon--size-32'],\n '40': styles['icon--size-40'],\n '52': styles['icon--size-52'],\n '64': styles['icon--size-64'],\n '104': styles['icon--size-104'],\n};\n\n/**\n * Icon container using @mattermost/compass-icons. The `size` prop sets the\n * clipping container; the SVG itself renders at SVG_SIZE_MAP[size] to bleed\n * past the container edges and eliminate compass-icons clear-space padding.\n *\n * @see https://compass.mattermost.com/29be2c109/p/19c648-iconography\n */\nexport default function Icon({\n className = '',\n glyph = null,\n size = '24',\n}: IconProps) {\n const sizeClass = SIZE_CLASS_MAP[size];\n const rootClass = [styles.icon, sizeClass, className]\n .filter(Boolean)\n .join(' ');\n\n const svgSize = SVG_SIZE_MAP[size];\n const glyphContent = (() => {\n if (glyph === undefined || glyph === null) {\n return <EmoticonHappyOutlineIcon size={svgSize} aria-hidden />;\n }\n // Inject the correct SVG size into the glyph so callers don't need to\n // know about SVG_SIZE_MAP — the container size is all that's needed.\n if (React.isValidElement(glyph)) {\n return React.cloneElement(\n glyph as React.ReactElement<{ size?: number }>,\n {\n size: svgSize,\n },\n );\n }\n return glyph;\n })();\n\n return (\n <div className={rootClass} aria-hidden>\n <div className={styles['icon__glyph-area']}>{glyphContent}</div>\n </div>\n );\n}\n","/**\n * Converts a string to kebab-case.\n * Used to map Figma-named prop values (e.g. \"Do Not Disturb\", \"X-Small\")\n * to CSS modifier class name suffixes (e.g. \"do-not-disturb\", \"x-small\").\n */\nexport const toKebab = (s: string) => s.replace(/\\s+/g, '-').toLowerCase();\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { toKebab } from '@/utils/string';\nimport styles from './IconButton.module.scss';\n\nexport type IconButtonSize = 'X-Small' | 'Small' | 'Medium' | 'Large';\n\n/** Figma \"Style\": Default (light context) | Inverted (dark context). */\nexport type IconButtonStyle = 'Default' | 'Inverted';\n\nexport type IconButtonPadding = 'Default' | 'Compact';\n\nexport interface IconButtonProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'style'\n> {\n /** When true, forces the subtler pressed/active visual (lighter than toggled). */\n active?: boolean;\n /** Optional CSS class name. */\n className?: string;\n /** Numeric count shown inline after the icon. Figma: Count. */\n count?: number;\n /** When true, uses destructive (danger) styling. Figma: Destructive. */\n destructive?: boolean;\n /** Icon to show. Size the glyph via SVG_SIZE_MAP: e.g. `<Icon glyph={<GlobeIcon size={SVG_SIZE_MAP['16']} />} size=\"16\" />`. */\n icon: ReactNode;\n /** Padding variant. Figma: Padding = Default | Compact. */\n padding?: IconButtonPadding;\n /** When true, uses full border radius (pill). Figma: Rounded = On. */\n rounded?: boolean;\n /** Size variant. Figma: Size. Default: Medium. */\n size?: IconButtonSize;\n /** Default | Inverted. Figma: Style (for light vs dark backgrounds). */\n style?: IconButtonStyle;\n /** When true, shows toggled/selected state. Figma: Toggled = On. */\n toggled?: boolean;\n /** When true, shows a small unread dot over the icon. Figma: Unread Badge. */\n unreadBadge?: boolean;\n}\n\n/** Icon size (px) per IconButton size. Use with Icon: size=\"12\" | \"16\" | \"20\" | \"24\". */\nexport const ICON_BUTTON_ICON_SIZES: Record<\n IconButtonSize,\n '12' | '16' | '20' | '24'\n> = {\n 'X-Small': '12',\n Small: '16',\n Medium: '20',\n Large: '24',\n};\n\n/**\n * Icon-only button matching Figma Icon Button variants.\n * Pass icon e.g. <Icon glyph={<GlobeIcon size={SVG_SIZE_MAP['20']} />} size=\"20\" /> — use ICON_BUTTON_ICON_SIZES[size] for the Icon container size.\n * Accessible via aria-label.\n *\n * @see https://compass.mattermost.com (Icon Button)\n */\nexport default function IconButton({\n active = false,\n className = '',\n count,\n destructive = false,\n icon,\n padding = 'Default',\n rounded = false,\n size = 'Medium',\n style = 'Default',\n toggled = false,\n unreadBadge = false,\n disabled,\n type = 'button',\n 'aria-label': ariaLabel,\n ...rest\n}: IconButtonProps) {\n const sizeClass = styles[`icon-button--size-${toKebab(size)}`];\n const paddingClass =\n padding === 'Compact' ? styles['icon-button--padding-compact'] : '';\n const styleClass =\n style === 'Inverted' ? styles['icon-button--style-inverted'] : '';\n const destructiveClass = destructive\n ? styles['icon-button--destructive']\n : '';\n const roundedClass = rounded ? styles['icon-button--rounded'] : '';\n const toggledClass = toggled ? styles['icon-button--toggled'] : '';\n const activeClass = active ? styles['icon-button--active'] : '';\n const hasCount = count !== undefined;\n const hasCountClass = hasCount ? styles['icon-button--has-count'] : '';\n\n const rootClass = [\n styles['icon-button'],\n sizeClass,\n paddingClass,\n styleClass,\n destructiveClass,\n roundedClass,\n toggledClass,\n activeClass,\n hasCountClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n className={rootClass}\n type={type}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-pressed={toggled ? true : undefined}\n data-active={active ? 'true' : undefined}\n {...rest}\n >\n <span className={styles['icon-button__icon-slot']} aria-hidden>\n {icon}\n {unreadBadge && (\n <span className={styles['icon-button__unread-badge']} />\n )}\n </span>\n {hasCount && (\n <span className={styles['icon-button__count']}>{count}</span>\n )}\n </button>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './Tag.module.scss';\n\nexport type TagType =\n | 'Default'\n | 'Info'\n | 'Info Dim'\n | 'Danger'\n | 'Success'\n | 'Warning';\n\nexport type TagSize = 'Small' | 'X-Small';\nexport type TagCasing = 'Title Case' | 'All Caps';\n\nexport type TagProps = {\n /** Tag label text. */\n label: string;\n /** Semantic colour type. Default: Default. */\n type?: TagType;\n /** Size variant. Default: X-Small. */\n size?: TagSize;\n /** Text casing. Default: Title Case. */\n casing?: TagCasing;\n /** Optional leading icon node. */\n leadingIcon?: ReactNode;\n /** Merged onto the root after variant classes (e.g. layout overrides in a parent row). */\n className?: string;\n};\n\nconst TYPE_CLASS: Record<TagType, string> = {\n Default: styles['tag--type-default'],\n Info: styles['tag--type-info'],\n 'Info Dim': styles['tag--type-info-dim'],\n Danger: styles['tag--type-danger'],\n Success: styles['tag--type-success'],\n Warning: styles['tag--type-warning'],\n};\n\n/**\n * Compact pill for roles, status, tiers, and other metadata labels.\n * Maps to Figma Label Tag (v1.0.1).\n */\nexport default function Tag({\n label,\n type = 'Default',\n size = 'X-Small',\n casing = 'Title Case',\n leadingIcon,\n className = '',\n}: TagProps) {\n const classes = [\n styles.tag,\n TYPE_CLASS[type],\n size === 'Small'\n ? styles['tag--size-small']\n : styles['tag--size-x-small'],\n casing === 'All Caps' ? styles['tag--casing-all-caps'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span className={classes}>\n {leadingIcon && (\n <span className={styles['tag__icon']} aria-hidden>\n {leadingIcon}\n </span>\n )}\n <span className={styles['tag__label']}>{label}</span>\n </span>\n );\n}\n","import type { ReactNode } from 'react';\nimport ArrowBackIosIcon from '@mattermost/compass-icons/components/arrow-back-ios';\nimport MattermostIcon from '@mattermost/compass-icons/components/mattermost';\nimport Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Tag from '@/components/Tag/Tag';\nimport styles from './AdminConsoleHeader.module.scss';\n\nexport interface AdminConsoleHeaderProps {\n /** Page heading (Heading 500). */\n title: ReactNode;\n /** When true, shows a back control with a divider from the title block. */\n showBack?: boolean;\n ariaLabelBack?: string;\n onBackClick?: () => void;\n /** Optional plan or edition tag beside the title. */\n enterpriseBadge?: boolean;\n enterpriseBadgeLabel?: string;\n /** Optional actions on the trailing edge of the title row. */\n trailing?: ReactNode;\n className?: string;\n}\n\n/**\n * Strip header for System Console content: title, optional enterprise tag, optional back affordance.\n */\nexport default function AdminConsoleHeader({\n title,\n showBack = false,\n ariaLabelBack = 'Go back',\n onBackClick,\n enterpriseBadge = false,\n enterpriseBadgeLabel = 'Enterprise',\n trailing,\n className = '',\n}: AdminConsoleHeaderProps) {\n const enterpriseChip =\n enterpriseBadge ? (\n <Tag\n label={enterpriseBadgeLabel}\n size=\"X-Small\"\n leadingIcon={<Icon size=\"12\" glyph={<MattermostIcon />} />}\n />\n ) : null;\n\n return (\n <header\n className={[styles['admin-console-header'], className].join(' ').trim()}\n >\n <div className={styles['admin-console-header__row']}>\n {showBack && (\n <div className={styles['admin-console-header__back']}>\n <IconButton\n type=\"button\"\n style=\"Default\"\n size=\"Medium\"\n className={styles['admin-console-header__back-button']}\n aria-label={ariaLabelBack}\n onClick={onBackClick}\n icon={<Icon size=\"20\" glyph={<ArrowBackIosIcon />} />}\n />\n </div>\n )}\n <div className={styles['admin-console-header__title-row']}>\n <div className={styles['admin-console-header__intro']}>\n <h1 className={styles['admin-console-header__title']}>{title}</h1>\n {enterpriseChip}\n </div>\n {trailing != null ? (\n <div className={styles['admin-console-header__trailing']}>\n {trailing}\n </div>\n ) : null}\n </div>\n </div>\n </header>\n );\n}\n","import type { ElementType } from 'react';\nimport CheckCircleIcon from '@mattermost/compass-icons/components/check-circle';\nimport CircleOutlineIcon from '@mattermost/compass-icons/components/circle-outline';\nimport ClockIcon from '@mattermost/compass-icons/components/clock';\nimport MinusCircleIcon from '@mattermost/compass-icons/components/minus-circle';\nimport { toKebab } from '@/utils/string';\nimport styles from './StatusBadge.module.scss';\n\n/** Figma Status Badge size. */\nexport type StatusBadgeSize =\n | 'XX-Small'\n | 'X-Small'\n | 'Small'\n | 'Medium'\n | 'Large';\n\n/** Figma Status Badge status variant. */\nexport type StatusBadgeStatus =\n | 'Online'\n | 'Away'\n | 'Do Not Disturb'\n | 'Offline';\n\nexport interface StatusBadgeProps {\n /** Optional CSS class name. */\n className?: string;\n /** Size variant. Figma: Size. Default: X-Small. */\n size?: StatusBadgeSize;\n /** Status variant. Figma: Status. Default: Online. */\n status?: StatusBadgeStatus;\n}\n\n/** Compass icon size in px per StatusBadge size — Figma. */\nconst BADGE_ICON_SIZE_PX: Record<StatusBadgeSize, number> = {\n 'XX-Small': 10,\n 'X-Small': 12,\n Small: 16,\n Medium: 20,\n Large: 32,\n};\n\n/** Compass icon component per status variant. */\nconst GLYPH_COMPONENT: Record<StatusBadgeStatus, ElementType> = {\n Online: CheckCircleIcon,\n Away: ClockIcon,\n 'Do Not Disturb': MinusCircleIcon,\n Offline: CircleOutlineIcon,\n};\n\n/**\n * Status badge (Online, Away, Do Not Disturb, Offline).\n * Matches Figma Status Badge v2.0.1. Uses Icon + @mattermost/compass-icons.\n *\n * @see Figma Status Badge (Node ID: 702:1875)\n */\nexport default function StatusBadge({\n className = '',\n size = 'X-Small',\n status = 'Online',\n}: StatusBadgeProps) {\n const sizeClass = styles[`status-badge--size-${toKebab(size)}`];\n const statusClass = styles[`status-badge--status-${toKebab(status)}`];\n const rootClass = [styles['status-badge'], sizeClass, statusClass, className]\n .filter(Boolean)\n .join(' ');\n\n const iconSizePx = BADGE_ICON_SIZE_PX[size];\n const GlyphIcon = GLYPH_COMPONENT[status];\n\n return (\n <span className={rootClass} role=\"img\" aria-label={status}>\n <span className={styles['status-badge__glyph']}>\n <GlyphIcon size={iconSizePx} />\n </span>\n </span>\n );\n}\n","import type { ImgHTMLAttributes } from 'react';\nimport StatusBadge from '@/components/StatusBadge/StatusBadge';\nimport type { StatusBadgeSize } from '@/components/StatusBadge/StatusBadge';\nimport { toKebab } from '@/utils/string';\nimport styles from './UserAvatar.module.scss';\n\n/** Figma User Avatar sizes. */\nexport type UserAvatarSize =\n | '12'\n | '16'\n | '20'\n | '24'\n | '28'\n | '32'\n | '40'\n | '48'\n | '56'\n | '64'\n | '72'\n | '80'\n | '96'\n | '120';\n\n/** Figma User Avatar Fallback colour variants. */\nexport type UserAvatarFallbackColor =\n | 'Red'\n | 'Purple'\n | 'Neutral'\n | 'Blue'\n | 'Cyan'\n | 'Yellow'\n | 'Green'\n | 'Orange';\n\nexport interface UserAvatarProps extends Omit<\n ImgHTMLAttributes<HTMLImageElement>,\n 'src' | 'alt' | 'width' | 'height'\n> {\n /** Alt text for the avatar image. */\n alt: string;\n /** Optional CSS class name. */\n className?: string;\n /**\n * Image URL for the avatar. When omitted, the avatar renders as Fallback\n * (initials on a deterministic colour background).\n */\n src?: string;\n /**\n * Display name used to derive initials and the fallback colour. Defaults\n * to `alt` when not provided.\n */\n name?: string;\n /** Force a specific fallback colour. Hashed from `name`/`alt` if omitted. */\n fallbackColor?: UserAvatarFallbackColor;\n /** Size variant. Figma: Size. Default: 48. */\n size?: UserAvatarSize;\n /** When true, shows online status badge (green dot with check). Figma: Status = On. */\n status?: boolean;\n}\n\nconst FALLBACK_COLORS: readonly UserAvatarFallbackColor[] = [\n 'Red',\n 'Purple',\n 'Neutral',\n 'Blue',\n 'Cyan',\n 'Yellow',\n 'Green',\n 'Orange',\n];\n\n/** Map UserAvatar size to StatusBadge size (Figma scale). */\nconst USER_AVATAR_TO_BADGE_SIZE: Record<UserAvatarSize, StatusBadgeSize> = {\n '12': 'XX-Small',\n '16': 'XX-Small',\n '20': 'X-Small',\n '24': 'X-Small',\n '28': 'X-Small',\n '32': 'Small',\n '40': 'Small',\n '48': 'Small',\n '56': 'Medium',\n '64': 'Medium',\n '72': 'Medium',\n '80': 'Medium',\n '96': 'Large',\n '120': 'Large',\n};\n\nfunction hashFallbackColor(s: string): UserAvatarFallbackColor {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = (h * 31 + s.charCodeAt(i)) | 0;\n }\n return FALLBACK_COLORS[Math.abs(h) % FALLBACK_COLORS.length];\n}\n\nfunction getInitials(name: string): string {\n const trimmed = name.trim();\n if (!trimmed) return '';\n const firstName = trimmed.split(/\\s+/)[0]!;\n return firstName[0]!.toUpperCase() + (firstName[1]?.toLowerCase() ?? '');\n}\n\n/**\n * User avatar. Matches Figma User Avatar — Image and Fallback variants.\n * When `src` is provided, renders an `<img>`; otherwise renders initials on\n * one of eight deterministic colour backgrounds (hashed from `name`/`alt`,\n * or overridden via `fallbackColor`). System variant is not implemented.\n *\n * Uses StatusBadge for online indicator when status=true.\n *\n * @see Figma User Avatar (Type=Image, Type=Fallback)\n */\nexport default function UserAvatar({\n alt,\n className = '',\n src,\n name,\n fallbackColor,\n size = '48',\n status = false,\n ...imgProps\n}: UserAvatarProps) {\n const sizeClass = styles[`user-avatar--size-${toKebab(size)}`];\n const rootClass = [styles['user-avatar'], sizeClass, className]\n .filter(Boolean)\n .join(' ');\n\n const isFallback = !src;\n const displayName = name ?? alt;\n const initials = isFallback ? getInitials(displayName) : '';\n const color = fallbackColor ?? hashFallbackColor(displayName);\n const fallbackColorClass = isFallback\n ? styles[`user-avatar__fallback--${toKebab(color)}`]\n : '';\n\n return (\n <div className={rootClass} data-size={size}>\n {isFallback ? (\n <span\n className={[styles['user-avatar__fallback'], fallbackColorClass]\n .filter(Boolean)\n .join(' ')}\n role=\"img\"\n aria-label={alt}\n >\n {initials}\n </span>\n ) : (\n <img\n {...imgProps}\n alt={alt}\n className={styles['user-avatar__image']}\n src={src}\n width={Number(size)}\n height={Number(size)}\n />\n )}\n {status && (\n <span className={styles['user-avatar__status']}>\n <StatusBadge status=\"Online\" size={USER_AVATAR_TO_BADGE_SIZE[size]} />\n </span>\n )}\n </div>\n );\n}\n","import { toKebab } from '@/utils/string';\nimport styles from './MentionBadge.module.scss';\n\n/** Figma Mention Badge location context — controls color scheme. */\nexport type MentionBadgeLocation =\n | 'Sidebar'\n | 'Menu Item'\n | 'Icon Button'\n | 'Channel';\n\n/** Figma Mention Badge size. */\nexport type MentionBadgeSize = 'Small' | 'Medium' | 'Large';\n\nexport interface MentionBadgeProps {\n /** Optional CSS class name. */\n className?: string;\n /** Mention count. Displays as-is up to 99; shows \"99+\" above that. */\n count: number;\n /** Color context. Figma: Location. Default: Sidebar. */\n location?: MentionBadgeLocation;\n /** Size variant. Figma: Size. Default: Small. */\n size?: MentionBadgeSize;\n}\n\n/**\n * Mention badge — displays a numeric count in a pill.\n * Matches Figma Mention Badge v2.0.1.\n *\n * @see Figma Mention Badge (Node ID: 322:4608)\n */\nexport default function MentionBadge({\n className = '',\n count,\n location = 'Sidebar',\n size = 'Small',\n}: MentionBadgeProps) {\n const displayText = count > 99 ? '99+' : String(count);\n const digitCount = displayText.length; // 1, 2, or 3 (for \"99+\")\n\n const rootClass = [\n styles['mention-badge'],\n styles[`mention-badge--size-${toKebab(size)}`],\n styles[`mention-badge--digits-${digitCount}`],\n location !== 'Sidebar'\n ? styles[`mention-badge--location-${toKebab(location)}`]\n : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span\n className={rootClass}\n aria-label={`${count} mention${count === 1 ? '' : 's'}`}\n >\n {displayText}\n </span>\n );\n}\n","import GlobeIcon from '@mattermost/compass-icons/components/globe';\nimport LockOutlineIcon from '@mattermost/compass-icons/components/lock-outline';\nimport MessageTextOutlineIcon from '@mattermost/compass-icons/components/message-text-outline';\nimport SendOutlineIcon from '@mattermost/compass-icons/components/send-outline';\nimport ChartLineIcon from '@mattermost/compass-icons/components/chart-line';\nimport CircleMultipleOutlineIcon from '@mattermost/compass-icons/components/circle-multiple-outline';\nimport PhoneInTalkIcon from '@mattermost/compass-icons/components/phone-in-talk';\nimport DotsVerticalIcon from '@mattermost/compass-icons/components/dots-vertical';\nimport DialpadIcon from '@mattermost/compass-icons/components/dialpad';\nimport UserAvatar from '@/components/UserAvatar/UserAvatar';\nimport MentionBadge from '@/components/MentionBadge/MentionBadge';\nimport IconButton from '@/components/IconButton/IconButton';\nimport styles from './ChannelSidebarItem.module.scss';\n\nexport type ChannelSidebarItemLeadingVisual =\n | 'Public'\n | 'Private'\n | 'Group Message'\n | 'Direct Message'\n | 'Drafts'\n | 'Insights'\n | 'Threads'\n | 'Dial Pad';\n\nexport type ChannelSidebarItemStatus = 'Read' | 'Unread' | 'Mention';\n\nexport interface ChannelSidebarItemProps {\n className?: string;\n /** Channel or user display name. */\n name: string;\n /**\n * Text-only row (e.g. System Console navigation): no channel glyph or\n * overflow menu; name aligns with channel sidebar label padding.\n */\n hideLeadingVisual?: boolean;\n /** Leading visual type. Default: Public. Ignored when `hideLeadingVisual`. */\n leadingVisual?: ChannelSidebarItemLeadingVisual;\n /** Read/unread/mention state. Default: Read. */\n status?: ChannelSidebarItemStatus;\n /** Highlighted as the currently active item. */\n active?: boolean;\n /** Muted channel — reduces visual prominence. */\n muted?: boolean;\n /** Shows a call-in-progress indicator on the right. */\n callActive?: boolean;\n /** Shows the shared-channel icon after the name. */\n sharedChannel?: boolean;\n /** Mention count shown in the badge when status='Mention'. */\n mentionCount?: number;\n /** Member count shown in the group icon when leadingVisual='Group Message'. */\n memberCount?: number;\n /** Avatar image URL for leadingVisual='Direct Message'. */\n avatarSrc?: string;\n /** Avatar alt text for leadingVisual='Direct Message'. */\n avatarAlt?: string;\n /** Shows status badge on the avatar when leadingVisual='Direct Message'. */\n showAvatarStatus?: boolean;\n /** Custom status emoji shown after the name for leadingVisual='Direct Message'. */\n customStatusEmoji?: string;\n onClick?: () => void;\n}\n\nfunction LeadingVisualContent({\n leadingVisual,\n memberCount,\n avatarSrc,\n avatarAlt,\n showAvatarStatus,\n}: {\n leadingVisual: ChannelSidebarItemLeadingVisual;\n memberCount: number | undefined;\n avatarSrc: string | undefined;\n avatarAlt: string | undefined;\n showAvatarStatus: boolean | undefined;\n}) {\n switch (leadingVisual) {\n case 'Private':\n return <LockOutlineIcon size={16} />;\n case 'Group Message':\n return (\n <div className={styles['channel-sidebar-item__group-icon']}>\n {memberCount ?? 2}\n </div>\n );\n case 'Direct Message':\n return (\n <UserAvatar\n src={avatarSrc ?? ''}\n alt={avatarAlt ?? ''}\n size=\"20\"\n status={!!showAvatarStatus}\n />\n );\n case 'Drafts':\n return <SendOutlineIcon size={16} />;\n case 'Insights':\n return <ChartLineIcon size={16} />;\n case 'Threads':\n return <MessageTextOutlineIcon size={16} />;\n case 'Dial Pad':\n return <DialpadIcon size={16} />;\n case 'Public':\n default:\n return <GlobeIcon size={16} />;\n }\n}\n\nexport default function ChannelSidebarItem({\n className,\n name,\n hideLeadingVisual = false,\n leadingVisual = 'Public',\n status = 'Read',\n active = false,\n muted = false,\n callActive = false,\n sharedChannel = false,\n mentionCount,\n memberCount,\n avatarSrc,\n avatarAlt,\n showAvatarStatus = false,\n customStatusEmoji,\n onClick,\n}: ChannelSidebarItemProps) {\n const isDM = !hideLeadingVisual && leadingVisual === 'Direct Message';\n const isDrafts = !hideLeadingVisual && leadingVisual === 'Drafts';\n const effectiveStatus = isDrafts && status === 'Unread' ? 'Read' : status;\n const hasMentionBadge = effectiveStatus === 'Mention';\n const isChannelOrDM =\n !hideLeadingVisual &&\n ['Public', 'Private', 'Group Message', 'Direct Message'].includes(\n leadingVisual,\n );\n\n const rootClass = [\n styles['channel-sidebar-item'],\n hideLeadingVisual ? styles['channel-sidebar-item--text-only'] : '',\n active ? styles['channel-sidebar-item--active'] : '',\n muted ? styles['channel-sidebar-item--muted'] : '',\n styles[`channel-sidebar-item--status-${effectiveStatus.toLowerCase()}`],\n isDrafts ? styles['channel-sidebar-item--drafts'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const iconContainerClass = [\n styles['channel-sidebar-item__icon-container'],\n isDM ? styles['channel-sidebar-item__icon-container--dm'] : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const rightClass = styles['channel-sidebar-item__right'];\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={rootClass}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n >\n {active && (\n <div className={styles['channel-sidebar-item__active-border']} />\n )}\n <div className={styles['channel-sidebar-item__left']}>\n {!hideLeadingVisual && (\n <div className={iconContainerClass}>\n <LeadingVisualContent\n leadingVisual={leadingVisual}\n memberCount={memberCount}\n avatarSrc={avatarSrc}\n avatarAlt={avatarAlt}\n showAvatarStatus={showAvatarStatus}\n />\n </div>\n )}\n <div className={styles['channel-sidebar-item__content']}>\n <span className={styles['channel-sidebar-item__name']}>{name}</span>\n {sharedChannel && (\n <span className={styles['channel-sidebar-item__shared-icon']}>\n <CircleMultipleOutlineIcon size={12} />\n </span>\n )}\n {isDM && customStatusEmoji && (\n <span className={styles['channel-sidebar-item__custom-status']}>\n {customStatusEmoji}\n </span>\n )}\n </div>\n </div>\n <div className={rightClass}>\n {callActive && (\n <div className={styles['channel-sidebar-item__call']}>\n <PhoneInTalkIcon size={12} />\n </div>\n )}\n {hasMentionBadge && (\n <span className={styles['channel-sidebar-item__mention-badge']}>\n <MentionBadge\n count={mentionCount ?? 1}\n location=\"Sidebar\"\n size=\"Medium\"\n />\n </span>\n )}\n {isChannelOrDM && (\n <span className={styles['channel-sidebar-item__menu-button']}>\n <IconButton\n size=\"X-Small\"\n style=\"Inverted\"\n icon={<DotsVerticalIcon size={12} />}\n aria-label=\"Channel options\"\n onClick={(e) => e.stopPropagation()}\n />\n </span>\n )}\n </div>\n </div>\n );\n}\n","import Icon from '@/components/Icon/Icon';\nimport ArrowUpIcon from '@mattermost/compass-icons/components/arrow-up';\nimport ArrowDownIcon from '@mattermost/compass-icons/components/arrow-down';\nimport styles from './MoreUnreadsBanner.module.scss';\n\nexport type MoreUnreadsBannerDirection = 'Up' | 'Down';\nexport type MoreUnreadsBannerSize = 'Small' | 'Medium' | 'Large';\n\nexport interface MoreUnreadsBannerProps {\n /** Optional CSS class name. */\n className?: string;\n /** Arrow direction. Default: Up. */\n direction?: MoreUnreadsBannerDirection;\n /** Size variant. Default: Medium. */\n size?: MoreUnreadsBannerSize;\n /** Callback when the banner is clicked. */\n onClick?: () => void;\n}\n\n/**\n * More Unreads Banner — simple pill banner indicating unread messages\n * above or below the viewport in channel view.\n */\nexport default function MoreUnreadsBanner({\n className = '',\n direction = 'Up',\n size = 'Medium',\n onClick,\n}: MoreUnreadsBannerProps) {\n const sizeClass = styles[`more-unreads-banner--size-${size.toLowerCase()}`];\n\n const rootClass = [styles['more-unreads-banner'], sizeClass, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button className={rootClass} type=\"button\" onClick={onClick}>\n <span className={styles['more-unreads-banner__icon']} aria-hidden>\n {direction === 'Up' ? (\n <Icon size=\"12\" glyph={<ArrowUpIcon />} />\n ) : (\n <Icon size=\"12\" glyph={<ArrowDownIcon />} />\n )}\n </span>\n <span className={styles['more-unreads-banner__label']}>More unreads</span>\n </button>\n );\n}\n","import {\n forwardRef,\n useCallback,\n useRef,\n type CSSProperties,\n type ReactNode,\n} from 'react';\nimport SimpleBar from 'simplebar-react';\nimport 'simplebar-react/dist/simplebar.min.css';\nimport styles from './Scrollbar.module.scss';\n\nexport interface ScrollbarProps {\n /** Scrollable content. */\n children: ReactNode;\n /**\n * CSS variable name (including the leading `--`) for the thumb RGB triplet.\n * Use this to recolor the thumb in dark surfaces (e.g. `--sidebar-text-rgb`).\n * When omitted, the thumb uses `--center-channel-color-rgb`.\n */\n color?: string;\n /**\n * Disable auto-hide; the thumb is visible whenever content overflows.\n * Default: false (auto-hide).\n */\n alwaysVisible?: boolean;\n /** Class applied to the SimpleBar root. */\n className?: string;\n /** Inline style applied to the SimpleBar root. */\n style?: CSSProperties;\n /** Scroll handler attached to the inner scrollable element. */\n onScroll?: (e: Event) => void;\n}\n\n/**\n * Scrollbar — wraps content in a SimpleBar overlay scroller.\n *\n * The forwarded ref points at the inner scrollable `<div>`, so consumers can\n * call `.scrollTo(...)` or read `.scrollTop` for things like \"scroll to item\"\n * or \"more unreads above/below\" indicators.\n *\n * @see https://compass.mattermost.com/29be2c109/p/88cb9c-scrollbars\n */\nconst Scrollbar = forwardRef<HTMLDivElement, ScrollbarProps>(function Scrollbar(\n { children, color, alwaysVisible = false, className, style, onScroll },\n ref,\n) {\n const cleanup = useRef<(() => void) | undefined>(undefined);\n\n const setScrollNode = useCallback(\n (el: HTMLDivElement | null) => {\n cleanup.current?.();\n cleanup.current = undefined;\n\n if (el && onScroll) {\n el.addEventListener('scroll', onScroll);\n cleanup.current = () => el.removeEventListener('scroll', onScroll);\n }\n\n if (typeof ref === 'function') {\n ref(el);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = el;\n }\n },\n [onScroll, ref],\n );\n\n const mergedStyle: CSSProperties = {\n ...style,\n ...(color\n ? ({ '--scrollbar-color': `var(${color})` } as CSSProperties)\n : null),\n };\n\n const rootClass = [styles.scrollbar, className].filter(Boolean).join(' ');\n\n return (\n <SimpleBar\n autoHide={!alwaysVisible}\n scrollableNodeProps={{ ref: setScrollNode }}\n className={rootClass}\n style={mergedStyle}\n tabIndex={-1}\n >\n {children}\n </SimpleBar>\n );\n});\n\nexport default Scrollbar;\n","import type { ChannelSidebarItemProps } from '@/components/ChannelSidebarItem/ChannelSidebarItem';\n\nexport type ChannelsSidebarItemModel = Pick<\n ChannelSidebarItemProps,\n | 'name'\n | 'leadingVisual'\n | 'active'\n | 'status'\n | 'mentionCount'\n | 'memberCount'\n | 'avatarSrc'\n | 'avatarAlt'\n | 'showAvatarStatus'\n | 'onClick'\n>;\n\nexport interface ChannelsSidebarCategoryModel {\n label: string;\n showChevron?: boolean;\n showPlusButton?: boolean;\n}\n\nexport interface ChannelsSidebarGroupModel {\n key: string;\n category: ChannelsSidebarCategoryModel;\n items: ChannelsSidebarItemModel[];\n}\n\nexport interface ChannelsSidebarModel {\n topGroupItems: ChannelsSidebarItemModel[];\n groups: ChannelsSidebarGroupModel[];\n}\n\n/**\n * Applies per-page display renames (keys = default names from the model) to\n * `name` and `avatarAlt` on each row, matching pre-model `channelNameOverrides` behavior.\n */\nexport function applyChannelNameOverrides(\n model: ChannelsSidebarModel,\n channelNameOverrides?: Record<string, string>,\n): ChannelsSidebarModel {\n if (!channelNameOverrides || Object.keys(channelNameOverrides).length === 0) {\n return model;\n }\n\n const resolve = (s: string) => channelNameOverrides[s] ?? s;\n\n const mapRow = (row: ChannelsSidebarItemModel): ChannelsSidebarItemModel => ({\n ...row,\n name: resolve(row.name),\n avatarAlt: row.avatarAlt != null ? resolve(row.avatarAlt) : row.avatarAlt,\n });\n\n return {\n topGroupItems: model.topGroupItems.map(mapRow),\n groups: model.groups.map((g) => ({\n ...g,\n items: g.items.map(mapRow),\n })),\n };\n}\n","import { useMemo, type ReactNode } from 'react';\nimport ChevronDownIcon from '@mattermost/compass-icons/components/chevron-down';\nimport PlusIcon from '@mattermost/compass-icons/components/plus';\nimport MagnifyIcon from '@mattermost/compass-icons/components/magnify';\nimport FilterVariantIcon from '@mattermost/compass-icons/components/filter-variant';\nimport ChannelSidebarItem from '@/components/ChannelSidebarItem/ChannelSidebarItem';\nimport MoreUnreadsBanner from '@/components/MoreUnreadsBanner/MoreUnreadsBanner';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Icon from '@/components/Icon/Icon';\nimport Scrollbar from '@/components/Scrollbar/Scrollbar';\nimport {\n applyChannelNameOverrides,\n type ChannelsSidebarItemModel,\n type ChannelsSidebarModel,\n} from './channelsSidebarModel';\nimport styles from './ChannelsSidebar.module.scss';\n\nfunction applyChannelSidebarInteractivity(\n model: ChannelsSidebarModel,\n activeChannelName: string | undefined,\n onItemClick?: (name: string) => void,\n): ChannelsSidebarModel {\n const mapRow = (row: ChannelsSidebarItemModel) => ({\n ...row,\n active:\n activeChannelName === undefined\n ? row.active\n : row.name === activeChannelName,\n onClick: onItemClick ? () => onItemClick(row.name) : row.onClick,\n });\n return {\n topGroupItems: model.topGroupItems.map(mapRow),\n groups: model.groups.map((g) => ({\n ...g,\n items: g.items.map(mapRow),\n })),\n };\n}\n\nexport interface ChannelsSidebarHeaderProps {\n teamName: string;\n}\n\n/** Team row + Add control; same markup as the top of `ChannelsSidebar`. */\nexport function ChannelsSidebarHeader({ teamName }: ChannelsSidebarHeaderProps) {\n return (\n <div className={styles['channels-sidebar__header']}>\n <div className={styles['channels-sidebar__team-dropdown']}>\n <span className={styles['channels-sidebar__team-name']}>\n {teamName}\n </span>\n <span className={styles['channels-sidebar__team-chevron']}>\n <ChevronDownIcon size={16} />\n </span>\n </div>\n <IconButton\n aria-label=\"Add channels\"\n size=\"Small\"\n style=\"Inverted\"\n padding=\"Compact\"\n rounded\n icon={<Icon size=\"16\" glyph={<PlusIcon />} />}\n className={styles['channels-sidebar__sidebar-icon-button']}\n />\n </div>\n );\n}\n\nexport interface ChannelsSidebarNavigatorProps {\n showFilter?: boolean;\n}\n\n/** Find channels row + optional unread filter control; same markup as `ChannelsSidebar`. */\nexport function ChannelsSidebarNavigator({\n showFilter = false,\n}: ChannelsSidebarNavigatorProps) {\n return (\n <div className={styles['channels-sidebar__navigator']}>\n {showFilter && (\n <IconButton\n aria-label=\"Filter channels\"\n size=\"Small\"\n style=\"Inverted\"\n padding=\"Compact\"\n icon={<Icon size=\"16\" glyph={<FilterVariantIcon />} />}\n className={styles['channels-sidebar__sidebar-icon-button']}\n />\n )}\n <div className={styles['channels-sidebar__find-channels']}>\n <span className={styles['channels-sidebar__find-channels-icon']}>\n <MagnifyIcon size={16} />\n </span>\n <span className={styles['channels-sidebar__find-channels-label']}>\n Find channels\n </span>\n </div>\n </div>\n );\n}\n\nexport interface ChannelsSidebarCategoryProps {\n label: string;\n showChevron?: boolean;\n showPlusButton?: boolean;\n /** When set, shown instead of the expand chevron (e.g. System Console categories). */\n leadingIcon?: ReactNode;\n /** Pin category row to the top of the scroll container while scrolling (e.g. first console section). */\n sticky?: boolean;\n /** Full-opacity label + leading icon (System Console categories). Default: toned like channel sidebar. */\n opaqueCategory?: boolean;\n}\n\nexport function ChannelsSidebarCategory({\n label,\n showChevron = true,\n showPlusButton = false,\n leadingIcon,\n sticky = false,\n opaqueCategory = false,\n}: ChannelsSidebarCategoryProps) {\n const hasLeadingIcon = Boolean(leadingIcon);\n const showChevronRow = showChevron && !hasLeadingIcon;\n\n const categoryClass = [\n styles['channels-sidebar__category'],\n hasLeadingIcon ? styles['channels-sidebar__category--with-leading-icon'] : '',\n opaqueCategory ? styles['channels-sidebar__category--opaque'] : '',\n !showChevronRow && !hasLeadingIcon\n ? styles['channels-sidebar__category--no-chevron']\n : '',\n showPlusButton ? styles['channels-sidebar__category--has-action'] : '',\n sticky ? styles['channels-sidebar__category--sticky'] : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={categoryClass}>\n <div className={styles['channels-sidebar__category-left']}>\n {hasLeadingIcon && (\n <span className={styles['channels-sidebar__category-leading-icon']}>\n {leadingIcon}\n </span>\n )}\n {showChevronRow && (\n <span className={styles['channels-sidebar__category-chevron']}>\n <ChevronDownIcon size={12} />\n </span>\n )}\n <span className={styles['channels-sidebar__category-label']}>\n {label}\n </span>\n </div>\n {showPlusButton && (\n <IconButton\n aria-label={`New ${label.toLowerCase()}`}\n size=\"X-Small\"\n style=\"Inverted\"\n icon={<Icon size=\"12\" glyph={<PlusIcon />} />}\n />\n )}\n </div>\n );\n}\n\nexport interface ChannelsSidebarProps {\n teamName?: string;\n showUnreadsCategory?: boolean;\n showFilter?: boolean;\n showDialPad?: boolean;\n moreUnreadsAbove?: boolean;\n moreUnreadsBelow?: boolean;\n /**\n * Rename built-in channel/DM items without editing the model.\n * Keys are the default names; values are the display names to use instead.\n * Applies to `name` and `avatarAlt` on each item (same as the legacy hardcoded list).\n */\n channelNameOverrides?: Record<string, string>;\n /**\n * Match against **resolved** item names (after `channelNameOverrides`).\n * Omit to keep each row’s fixture `active` value; pass `''` to clear selection.\n */\n activeChannelName?: string;\n /** Receives the row's visible `name` (after overrides). */\n onItemClick?: (name: string) => void;\n avatarAikoTan?: string;\n avatarArjunPatel?: string;\n avatarDanielleOkoro?: string;\n avatarDariusCole?: string;\n avatarDavidLiang?: string;\n avatarEmmaNovak?: string;\n avatarEthanBrooks?: string;\n /** When set, overrides the default channel tree (for per-prototype sidebars). */\n model?: ChannelsSidebarModel;\n}\n\nexport default function ChannelsSidebar({\n teamName = 'Contributors',\n showFilter = false,\n moreUnreadsAbove = false,\n moreUnreadsBelow = false,\n channelNameOverrides,\n activeChannelName,\n onItemClick,\n model: modelProp,\n}: ChannelsSidebarProps) {\n const model = useMemo(() => {\n const baseModel = modelProp ?? { topGroupItems: [], groups: [] };\n const withOverrides = applyChannelNameOverrides(baseModel, channelNameOverrides);\n return applyChannelSidebarInteractivity(\n withOverrides,\n activeChannelName,\n onItemClick,\n );\n }, [\n modelProp,\n channelNameOverrides,\n activeChannelName,\n onItemClick,\n ]);\n\n return (\n <div className={styles['channels-sidebar']}>\n <ChannelsSidebarHeader teamName={teamName} />\n <ChannelsSidebarNavigator showFilter={showFilter} />\n\n <div className={styles['channels-sidebar__top-group']}>\n {model.topGroupItems.map((row, i) => (\n <ChannelSidebarItem key={`top-${i}-${row.name}`} {...row} />\n ))}\n </div>\n\n <div className={styles['channels-sidebar__scroll-view']}>\n <Scrollbar color=\"--sidebar-text-rgb\">\n <div className={styles['channels-sidebar__channel-groups']}>\n {model.groups.map((group) => (\n <div\n key={group.key}\n className={styles['channels-sidebar__channel-group']}\n >\n <ChannelsSidebarCategory\n label={group.category.label}\n showChevron={group.category.showChevron}\n showPlusButton={group.category.showPlusButton}\n />\n {group.items.map((row, index) => (\n <ChannelSidebarItem\n key={`${group.key}-${index}-${row.name}`}\n {...row}\n />\n ))}\n </div>\n ))}\n </div>\n </Scrollbar>\n\n {moreUnreadsAbove && (\n <MoreUnreadsBanner\n direction=\"Up\"\n className={`${styles['channels-sidebar__more-unreads']} ${styles['channels-sidebar__more-unreads--above']}`}\n />\n )}\n {moreUnreadsBelow && (\n <MoreUnreadsBanner\n direction=\"Down\"\n className={`${styles['channels-sidebar__more-unreads']} ${styles['channels-sidebar__more-unreads--below']}`}\n />\n )}\n </div>\n </div>\n );\n}\n\nexport type { ChannelsSidebarModel } from './channelsSidebarModel';\n","import { type ReactNode, useId } from 'react';\nimport ChevronDownIcon from '@mattermost/compass-icons/components/chevron-down';\nimport MagnifyIcon from '@mattermost/compass-icons/components/magnify';\nimport CreditCardOutlineIcon from '@mattermost/compass-icons/components/credit-card-outline';\nimport ChartLineIcon from '@mattermost/compass-icons/components/chart-line';\nimport AccountMultipleOutlineIcon from '@mattermost/compass-icons/components/account-multiple-outline';\nimport ServerOutlineIcon from '@mattermost/compass-icons/components/server-outline';\nimport TuneIcon from '@mattermost/compass-icons/components/tune';\nimport ShieldOutlineIcon from '@mattermost/compass-icons/components/shield-outline';\nimport AppsIcon from '@mattermost/compass-icons/components/apps';\nimport WebhookIcon from '@mattermost/compass-icons/components/webhook';\nimport FileTextOutlineIcon from '@mattermost/compass-icons/components/file-text-outline';\nimport FlaskOutlineIcon from '@mattermost/compass-icons/components/flask-outline';\nimport ChannelSidebarItem from '@/components/ChannelSidebarItem/ChannelSidebarItem';\nimport { ChannelsSidebarCategory } from '@/components/ChannelsSidebar/ChannelsSidebar';\nimport Scrollbar from '@/components/Scrollbar/Scrollbar';\nimport UserAvatar from '@/components/UserAvatar/UserAvatar';\nimport {\n type AdminConsoleSidebarCategoryIconKey,\n type AdminConsoleSidebarGroupModel,\n} from './adminConsoleSidebarModel';\nimport styles from './AdminConsoleSidebar.module.scss';\n\nconst CATEGORY_ICON_GLYPHS: Record<\n AdminConsoleSidebarCategoryIconKey,\n ReactNode\n> = {\n billing: <CreditCardOutlineIcon size={12} />,\n reporting: <ChartLineIcon size={12} />,\n users: <AccountMultipleOutlineIcon size={12} />,\n environment: <ServerOutlineIcon size={12} />,\n site: <TuneIcon size={12} />,\n authentication: <ShieldOutlineIcon size={12} />,\n plugins: <AppsIcon size={12} />,\n integrations: <WebhookIcon size={12} />,\n compliance: <FileTextOutlineIcon size={12} />,\n experimental: <FlaskOutlineIcon size={12} />,\n};\n\nfunction categoryLeadingIcon(\n key: AdminConsoleSidebarCategoryIconKey,\n): ReactNode {\n return CATEGORY_ICON_GLYPHS[key];\n}\n\nexport interface AdminConsoleSidebarProps {\n consoleTitle?: string;\n userHandle?: string;\n /** Used for avatar initials when `avatarSrc` is empty. */\n userDisplayName?: string;\n avatarSrc?: string;\n avatarAlt?: string;\n groups?: AdminConsoleSidebarGroupModel[];\n}\n\nexport default function AdminConsoleSidebar({\n consoleTitle = 'Admin Console',\n userHandle = '@leonard.riley',\n userDisplayName = 'Leonard Riley',\n avatarSrc = '',\n avatarAlt = 'Account avatar',\n groups = [],\n}: AdminConsoleSidebarProps) {\n const findSettingsId = useId();\n return (\n <div className={styles['admin-console-sidebar']}>\n <div className={styles['admin-console-sidebar__header']}>\n <div className={styles['admin-console-sidebar__identity']}>\n <UserAvatar\n src={avatarSrc}\n alt={avatarAlt}\n name={userDisplayName}\n size=\"40\"\n />\n <div className={styles['admin-console-sidebar__identity-text']}>\n <div className={styles['admin-console-sidebar__title-row']}>\n <span className={styles['admin-console-sidebar__title']}>\n {consoleTitle}\n </span>\n <span className={styles['admin-console-sidebar__title-chevron']}>\n <ChevronDownIcon size={16} />\n </span>\n </div>\n <div className={styles['admin-console-sidebar__handle']}>\n {userHandle}\n </div>\n </div>\n </div>\n <label\n className={styles['admin-console-sidebar__find']}\n htmlFor={findSettingsId}\n >\n <span className={styles['admin-console-sidebar__find-icon']} aria-hidden>\n <MagnifyIcon size={12} />\n </span>\n <input\n id={findSettingsId}\n type=\"search\"\n className={styles['admin-console-sidebar__find-field']}\n placeholder=\"Find settings\"\n aria-label=\"Find settings\"\n autoComplete=\"off\"\n spellCheck={false}\n enterKeyHint=\"search\"\n />\n </label>\n </div>\n\n <div className={styles['admin-console-sidebar__scroll']}>\n <Scrollbar color=\"--sidebar-text-rgb\">\n <div className={styles['admin-console-sidebar__nav']}>\n {groups.map((group) => (\n <div\n key={group.key}\n className={styles['admin-console-sidebar__group']}\n >\n <ChannelsSidebarCategory\n label={group.categoryLabel}\n showChevron={false}\n leadingIcon={categoryLeadingIcon(group.categoryIconKey)}\n sticky={group.stickyCategory}\n opaqueCategory\n />\n {group.items.map((row, index) => (\n <ChannelSidebarItem\n key={`${group.key}-${index}-${row.name}`}\n name={row.name}\n hideLeadingVisual\n active={row.active}\n status=\"Read\"\n />\n ))}\n </div>\n ))}\n </div>\n </Scrollbar>\n </div>\n </div>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport Icon from '@/components/Icon/Icon';\nimport type { IconSize } from '@/components/Icon/Icon';\nimport { toKebab } from '@/utils/string';\nimport styles from './Button.module.scss';\n\nexport type ButtonEmphasis =\n | 'Primary'\n | 'Secondary'\n | 'Tertiary'\n | 'Quaternary';\n\nexport type ButtonSize = 'X-Small' | 'Small' | 'Medium' | 'Large';\n\nexport type ButtonAppearance = 'Default' | 'Inverted';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Default | Inverted (for use on dark backgrounds). Maps to Figma \"Style\". */\n appearance?: ButtonAppearance;\n /** Optional CSS class name. */\n className?: string;\n /** Button label. */\n children: React.ReactNode;\n /** When true, uses destructive (danger) styling. */\n destructive?: boolean;\n /** Visual emphasis. Default: Primary. */\n emphasis?: ButtonEmphasis;\n /** Leading icon (e.g. <Icon glyph={<SomeIcon />} size=\"16\" />). Icon size should match button size. */\n leadingIcon?: ReactNode;\n /** Size variant. Default: Medium. */\n size?: ButtonSize;\n /** Trailing icon. */\n trailingIcon?: ReactNode;\n}\n\nconst SIZE_ICON_MAP: Record<ButtonSize, IconSize> = {\n 'X-Small': '12',\n Small: '16',\n Medium: '16',\n Large: '20',\n};\n\n/**\n * Button component matching Figma/Compass variants.\n * Use leadingIcon and trailingIcon with the Icon component for icons.\n *\n * @see https://compass.mattermost.com/29be2c109/p/40e456-buttons\n */\nexport default function Button({\n appearance = 'Default',\n className = '',\n destructive = false,\n emphasis = 'Primary',\n children,\n leadingIcon,\n size = 'Medium',\n trailingIcon,\n disabled,\n type = 'button',\n ...rest\n}: ButtonProps) {\n const iconSize = SIZE_ICON_MAP[size];\n const emphasisClass = styles[`button--emphasis-${toKebab(emphasis)}`];\n const sizeClass = styles[`button--size-${toKebab(size)}`];\n const appearanceClass =\n appearance === 'Inverted' ? styles['button--appearance-inverted'] : '';\n const destructiveClass = destructive ? styles['button--destructive'] : '';\n\n const rootClass = [\n styles.button,\n emphasisClass,\n sizeClass,\n appearanceClass,\n destructiveClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button className={rootClass} type={type} disabled={disabled} {...rest}>\n {leadingIcon != null ? (\n <span className={styles['button__icon-slot']} aria-hidden>\n {typeof leadingIcon === 'boolean' ? (\n <Icon size={iconSize} />\n ) : (\n leadingIcon\n )}\n </span>\n ) : null}\n <span className={styles['button__label']}>{children}</span>\n {trailingIcon != null ? (\n <span className={styles['button__icon-slot']} aria-hidden>\n {typeof trailingIcon === 'boolean' ? (\n <Icon size={iconSize} />\n ) : (\n trailingIcon\n )}\n </span>\n ) : null}\n </button>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport { useState } from 'react';\n\n/**\n * Handles the controlled/uncontrolled pattern for boolean inputs (checkbox, radio, switch).\n *\n * - If `controlled` is provided (not undefined), the component is controlled and the\n * caller owns the value. Changes are forwarded to `onChange` only.\n * - If `controlled` is undefined, the component manages its own state, initialised\n * from `defaultValue`.\n *\n * Returns `[value, handleChange]`.\n */\nexport function useControllable(\n controlled: boolean | undefined,\n defaultValue: boolean | undefined,\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void,\n): [boolean, (e: ChangeEvent<HTMLInputElement>) => void] {\n const isControlled = controlled !== undefined;\n const [uncontrolled, setUncontrolled] = useState(defaultValue ?? false);\n\n const value = isControlled ? controlled! : uncontrolled;\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setUncontrolled(e.target.checked);\n onChange?.(e);\n };\n\n return [value, handleChange];\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { useId } from 'react';\nimport { useControllable } from '@/hooks/useControllable';\nimport { toKebab } from '@/utils/string';\nimport styles from './Switch.module.scss';\n\nexport type SwitchSize = 'Small' | 'Medium' | 'Large';\n\nexport interface SwitchProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** Size variant. Figma: Small (16px), Medium (20px), Large (24px). Default: Medium. */\n size?: SwitchSize;\n /** Primary label content. Rendered to the left of the switch. */\n children?: React.ReactNode;\n /** Optional secondary label (e.g. description) below the primary label. */\n secondaryLabel?: React.ReactNode;\n /** When true, primary label uses semi-bold (600) weight. Default: false. */\n semiBold?: boolean;\n}\n\n/**\n * Switch component built on the native HTML checkbox.\n * Uses role=\"switch\" so assistive tech announces \"switch\" and on/off state.\n * Renders as a track + sliding knob; checked = on (right), unchecked = off (left).\n *\n * Supports label, optional secondary label, sizes (Small/Medium/Large), and\n * states: default, hover, focus, active, disabled. Matches Figma Switch v2.0.0.\n *\n * Use with a label: pass children for the primary label, or wrap in your own <label>.\n *\n * @see https://compass.mattermost.com (Switch)\n */\nexport default function Switch({\n className = '',\n size = 'Medium',\n children,\n secondaryLabel,\n semiBold = false,\n id: idProp,\n checked,\n defaultChecked,\n disabled,\n onChange,\n ...rest\n}: SwitchProps) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const [resolvedChecked, handleChange] = useControllable(\n checked,\n defaultChecked,\n onChange,\n );\n\n const sizeClass = styles[`switch--size-${toKebab(size)}`];\n const semiBoldClass = semiBold ? styles['switch--semi-bold'] : '';\n const secondaryClass =\n secondaryLabel != null ? styles['switch--with-secondary'] : '';\n\n const rootClass = [\n styles.switch,\n sizeClass,\n semiBoldClass,\n secondaryClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <label className={rootClass} htmlFor={id}>\n {(children != null || secondaryLabel != null) && (\n <span className={styles['switch__labels']}>\n {children != null && (\n <span className={styles['switch__label']}>{children}</span>\n )}\n {secondaryLabel != null && (\n <span className={styles['switch__secondary-label']}>\n {secondaryLabel}\n </span>\n )}\n </span>\n )}\n <span className={styles['switch__track']} aria-hidden>\n {/* Native checkbox (visually hidden via CSS); provides semantics, keyboard, and form support */}\n <input\n id={id}\n type=\"checkbox\"\n role=\"switch\"\n className={styles['switch__input']}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n aria-checked={resolvedChecked}\n onChange={handleChange}\n {...rest}\n />\n <span className={styles['switch__knob']} />\n </span>\n </label>\n );\n}\n","import { type ChangeEvent, type ReactNode } from 'react';\nimport ChevronDownIcon from '@mattermost/compass-icons/components/chevron-down';\nimport ChevronUpIcon from '@mattermost/compass-icons/components/chevron-up';\nimport CogOutlineIcon from '@mattermost/compass-icons/components/cog-outline';\nimport MattermostIcon from '@mattermost/compass-icons/components/mattermost';\nimport Button from '@/components/Button/Button';\nimport Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Tag from '@/components/Tag/Tag';\nimport Switch from '@/components/Switch/Switch';\nimport styles from './AdminPanelHeader.module.scss';\n\n/** System Console admin panel expand/collapse (`expandedState` in Figma). */\nexport type AdminPanelExpandedState = 'Collapsed' | 'Expanded';\n\nexport interface AdminPanelHeaderProps {\n /** Passed to the title `h2` for `aria-labelledby` on the parent panel. */\n titleId: string;\n title: ReactNode;\n subtitle?: ReactNode;\n /** Trailing accessory actions rendered after Switch / Primary button and before expand. */\n headerActions?: ReactNode;\n iconLeft?: boolean;\n leadingIcon?: ReactNode;\n showBeta?: boolean;\n betaLabel?: string;\n showEnterpriseLabel?: boolean;\n enterpriseLabel?: string;\n showButton?: boolean;\n buttonLabel?: string;\n onButtonClick?: () => void;\n showSwitch?: boolean;\n switchLabel?: ReactNode;\n switchChecked?: boolean;\n defaultSwitchChecked?: boolean;\n onSwitchChange?: (checked: boolean, event: ChangeEvent<HTMLInputElement>) => void;\n switchDisabled?: boolean;\n expandable?: boolean;\n isExpanded?: boolean;\n onToggleExpand?: () => void;\n /** Bottom border under the header row (hidden when expandable and collapsed). */\n showDivider?: boolean;\n className?: string;\n}\n\n/**\n * Titled rail for a System Console settings section: optional leading icon, tags,\n * subtitle, and trailing controls.\n */\nexport default function AdminPanelHeader({\n titleId,\n title,\n subtitle,\n headerActions,\n iconLeft = false,\n leadingIcon,\n showBeta = false,\n betaLabel = 'Beta',\n showEnterpriseLabel = false,\n enterpriseLabel = 'Enterprise',\n showButton = false,\n buttonLabel = 'Button',\n onButtonClick,\n showSwitch = false,\n switchLabel = 'Off',\n switchChecked,\n defaultSwitchChecked,\n onSwitchChange,\n switchDisabled,\n expandable = false,\n isExpanded = false,\n onToggleExpand,\n showDivider = true,\n className = '',\n}: AdminPanelHeaderProps) {\n const hasActions =\n showSwitch || showButton || headerActions != null || expandable;\n\n const defaultLeading = <Icon size=\"20\" glyph={<CogOutlineIcon />} />;\n\n return (\n <header\n className={[\n styles['admin-panel-header'],\n showDivider ? styles['admin-panel-header--divided'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n .trim()}\n >\n <div className={styles['admin-panel-header__main']}>\n <div className={styles['admin-panel-header__start']}>\n {iconLeft ? (\n <div\n className={styles['admin-panel-header__leading']}\n aria-hidden\n >\n {leadingIcon ?? defaultLeading}\n </div>\n ) : null}\n <div className={styles['admin-panel-header__title-stack']}>\n <div className={styles['admin-panel-header__title-row']}>\n <h2\n id={titleId}\n className={styles['admin-panel-header__title']}\n >\n {title}\n </h2>\n {showEnterpriseLabel ? (\n <Tag\n label={enterpriseLabel}\n size=\"X-Small\"\n type=\"Default\"\n leadingIcon={<Icon size=\"10\" glyph={<MattermostIcon />} />}\n />\n ) : null}\n {showBeta ? (\n <Tag label={betaLabel} size=\"X-Small\" type=\"Default\" />\n ) : null}\n </div>\n {subtitle != null ? (\n <p className={styles['admin-panel-header__subtitle']}>\n {subtitle}\n </p>\n ) : null}\n </div>\n </div>\n {hasActions ? (\n <div className={styles['admin-panel-header__actions']}>\n {showSwitch ? (\n <Switch\n size=\"Medium\"\n checked={switchChecked}\n defaultChecked={defaultSwitchChecked}\n disabled={switchDisabled}\n onChange={(e) => {\n onSwitchChange?.(e.target.checked, e);\n }}\n >\n {switchLabel}\n </Switch>\n ) : null}\n {showButton ? (\n <Button\n type=\"button\"\n size=\"Medium\"\n emphasis=\"Primary\"\n onClick={onButtonClick}\n >\n {buttonLabel}\n </Button>\n ) : null}\n {headerActions}\n {expandable ? (\n <IconButton\n type=\"button\"\n style=\"Default\"\n size=\"Medium\"\n aria-label={isExpanded ? 'Collapse section' : 'Expand section'}\n aria-expanded={isExpanded}\n onClick={onToggleExpand}\n icon={\n <Icon\n size=\"20\"\n glyph={isExpanded ? <ChevronUpIcon /> : <ChevronDownIcon />}\n />\n }\n />\n ) : null}\n </div>\n ) : null}\n </div>\n </header>\n );\n}\n","import { useId, useState, type ChangeEvent, type ReactNode } from 'react';\nimport AdminPanelHeader, {\n type AdminPanelExpandedState,\n} from '@/components/AdminPanelHeader/AdminPanelHeader';\nimport styles from './AdminPanel.module.scss';\n\nexport type { AdminPanelExpandedState };\n\nexport interface AdminPanelProps {\n title: ReactNode;\n subtitle?: ReactNode;\n children?: ReactNode;\n className?: string;\n headerActions?: ReactNode;\n iconLeft?: boolean;\n leadingIcon?: ReactNode;\n showBeta?: boolean;\n betaLabel?: string;\n showEnterpriseLabel?: boolean;\n enterpriseLabel?: string;\n showButton?: boolean;\n buttonLabel?: string;\n onButtonClick?: () => void;\n showSwitch?: boolean;\n switchLabel?: ReactNode;\n switchChecked?: boolean;\n defaultSwitchChecked?: boolean;\n onSwitchChange?: (checked: boolean, event: ChangeEvent<HTMLInputElement>) => void;\n switchDisabled?: boolean;\n expandable?: boolean;\n expandedState?: AdminPanelExpandedState;\n defaultExpandedState?: AdminPanelExpandedState;\n onExpandedStateChange?: (state: AdminPanelExpandedState) => void;\n}\n\n/**\n * System Console admin settings panel: `AdminPanelHeader` plus a body slot\n * for grouped fields. Expand/collapse state is owned here and passed to the header.\n */\nexport default function AdminPanel({\n title,\n subtitle,\n headerActions,\n children,\n className = '',\n iconLeft = false,\n leadingIcon,\n showBeta = false,\n betaLabel = 'Beta',\n showEnterpriseLabel = false,\n enterpriseLabel = 'Enterprise',\n showButton = false,\n buttonLabel = 'Button',\n onButtonClick,\n showSwitch = false,\n switchLabel = 'Off',\n switchChecked,\n defaultSwitchChecked,\n onSwitchChange,\n switchDisabled,\n expandable = false,\n expandedState: expandedStateProp,\n defaultExpandedState = 'Collapsed',\n onExpandedStateChange,\n}: AdminPanelProps) {\n const titleId = useId();\n\n const [uncontrolledExpanded, setUncontrolledExpanded] =\n useState<AdminPanelExpandedState>(defaultExpandedState);\n\n const isExpandControlled = expandable && expandedStateProp !== undefined;\n const resolvedExpandedState: AdminPanelExpandedState = !expandable\n ? 'Expanded'\n : isExpandControlled\n ? expandedStateProp!\n : uncontrolledExpanded;\n\n const isExpanded = resolvedExpandedState === 'Expanded';\n\n const setExpandedState = (next: AdminPanelExpandedState) => {\n if (!expandable) return;\n if (!isExpandControlled) {\n setUncontrolledExpanded(next);\n }\n onExpandedStateChange?.(next);\n };\n\n const toggleExpanded = () => {\n setExpandedState(isExpanded ? 'Collapsed' : 'Expanded');\n };\n\n const showHeaderDivider = !expandable || isExpanded;\n\n return (\n <section\n className={[styles['admin-panel'], className].join(' ').trim()}\n aria-labelledby={titleId}\n >\n <AdminPanelHeader\n titleId={titleId}\n title={title}\n subtitle={subtitle}\n headerActions={headerActions}\n iconLeft={iconLeft}\n leadingIcon={leadingIcon}\n showBeta={showBeta}\n betaLabel={betaLabel}\n showEnterpriseLabel={showEnterpriseLabel}\n enterpriseLabel={enterpriseLabel}\n showButton={showButton}\n buttonLabel={buttonLabel}\n onButtonClick={onButtonClick}\n showSwitch={showSwitch}\n switchLabel={switchLabel}\n switchChecked={switchChecked}\n defaultSwitchChecked={defaultSwitchChecked}\n onSwitchChange={onSwitchChange}\n switchDisabled={switchDisabled}\n expandable={expandable}\n isExpanded={isExpanded}\n onToggleExpand={toggleExpanded}\n showDivider={showHeaderDivider}\n />\n {expandable ? (\n <div\n className={[\n styles['admin-panel__collapse'],\n isExpanded ? styles['admin-panel__collapse--expanded'] : '',\n ]\n .filter(Boolean)\n .join(' ')}\n aria-hidden={!isExpanded}\n >\n <div className={styles['admin-panel__collapse-inner']}>\n <div className={styles['admin-panel__body']}>{children}</div>\n </div>\n </div>\n ) : (\n <div className={styles['admin-panel__body']}>{children}</div>\n )}\n </section>\n );\n}\n","import type { ReactNode } from 'react';\nimport AlertCircleOutlineIcon from '@mattermost/compass-icons/components/alert-circle-outline';\nimport AlertOutlineIcon from '@mattermost/compass-icons/components/alert-outline';\nimport Button from '@/components/Button/Button';\nimport styles from './AdminPanelFooter.module.scss';\n\nexport type AdminPanelFooterStatus = 'none' | 'warning' | 'error';\n\nexport interface AdminPanelFooterProps {\n /** Primary footer action label. */\n saveLabel?: string;\n cancelLabel?: string;\n onSave?: () => void;\n onCancel?: () => void;\n /** When true, Save uses disabled styling until the sheet is actionable. */\n saveDisabled?: boolean;\n /** Optional validation summary beside the buttons. */\n status?: AdminPanelFooterStatus;\n /** Override default copy when `warning` | `error`. */\n statusMessage?: ReactNode;\n className?: string;\n}\n\nconst DEFAULT_WARNING = 'There are outstanding issues in the form above.';\nconst DEFAULT_ERROR = 'There are errors in the form above.';\n\nexport default function AdminPanelFooter({\n saveLabel = 'Save',\n cancelLabel = 'Cancel',\n onSave,\n onCancel,\n saveDisabled = true,\n status = 'none',\n statusMessage,\n className = '',\n}: AdminPanelFooterProps) {\n let statusUi: ReactNode = null;\n\n if (status === 'warning') {\n const copy = statusMessage ?? DEFAULT_WARNING;\n statusUi = (\n <>\n <span className={styles['admin-panel-footer__status-icon']} aria-hidden>\n <AlertOutlineIcon size={12} />\n </span>\n <span>{copy}</span>\n </>\n );\n }\n\n if (status === 'error') {\n const copy = statusMessage ?? DEFAULT_ERROR;\n statusUi = (\n <>\n <span className={styles['admin-panel-footer__status-icon']} aria-hidden>\n <AlertCircleOutlineIcon size={12} />\n </span>\n <span>{copy}</span>\n </>\n );\n }\n\n const statusMod =\n status === 'warning'\n ? styles['admin-panel-footer--status-warning']\n : status === 'error'\n ? styles['admin-panel-footer--status-error']\n : '';\n\n return (\n <footer\n className={[styles['admin-panel-footer'], statusMod, className]\n .filter(Boolean)\n .join(' ')\n .trim()}\n role=\"contentinfo\"\n >\n <div className={styles['admin-panel-footer__inner']}>\n <div className={styles['admin-panel-footer__actions']}>\n <Button\n type=\"button\"\n size=\"Medium\"\n emphasis=\"Primary\"\n disabled={saveDisabled}\n onClick={onSave}\n >\n {saveLabel}\n </Button>\n <Button\n type=\"button\"\n size=\"Medium\"\n emphasis=\"Tertiary\"\n onClick={onCancel}\n >\n {cancelLabel}\n </Button>\n </div>\n {statusUi != null ? (\n <div\n className={styles['admin-panel-footer__status']}\n role=\"alert\"\n >\n {statusUi}\n </div>\n ) : null}\n </div>\n </footer>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './AppBarItem.module.scss';\n\nexport type AppBarItemState = 'Default' | 'Selected';\n\nexport interface AppBarItemProps {\n /** Icon element (image or SVG) representing the app. */\n icon: ReactNode;\n /** Accessible label for the app item. */\n label: string;\n /** Interaction state. Default: Default. */\n state?: AppBarItemState;\n /** When true, shows a mention count badge. */\n mentionBadge?: number;\n /** When true, shows an unread dot badge. */\n unreadBadge?: boolean;\n /** Click handler. */\n onClick?: () => void;\n /** Optional CSS class name. */\n className?: string;\n}\n\n/**\n * App Bar Item component matching Figma design.\n * Circular app icon for the right-side app bar with optional selection indicator and badges.\n */\nexport default function AppBarItem({\n icon,\n label,\n state = 'Default',\n mentionBadge,\n unreadBadge = false,\n onClick,\n className = '',\n}: AppBarItemProps) {\n const isSelected = state === 'Selected';\n\n const rootClass = [\n styles['app-bar-item'],\n isSelected ? styles['app-bar-item--selected'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n type=\"button\"\n className={rootClass}\n aria-label={label}\n aria-pressed={isSelected}\n onClick={onClick}\n >\n <span className={styles['app-bar-item__icon']}>{icon}</span>\n\n {mentionBadge != null && mentionBadge > 0 && (\n <span\n className={styles['app-bar-item__mention-badge']}\n aria-label={`${mentionBadge} mentions`}\n >\n {mentionBadge}\n </span>\n )}\n\n {unreadBadge && mentionBadge == null && (\n <span\n className={styles['app-bar-item__unread-badge']}\n aria-label=\"Unread\"\n />\n )}\n </button>\n );\n}\n","import type { ComponentType } from 'react';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport DotsVerticalIcon from '@mattermost/compass-icons/components/dots-vertical';\nimport DownloadOutlineIcon from '@mattermost/compass-icons/components/download-outline';\nimport FileAudioOutlineLargeIcon from '@mattermost/compass-icons/components/file-audio-outline-large';\nimport FileCodeOutlineLargeIcon from '@mattermost/compass-icons/components/file-code-outline-large';\nimport FileExcelOutlineLargeIcon from '@mattermost/compass-icons/components/file-excel-outline-large';\nimport FileGenericOutlineLargeIcon from '@mattermost/compass-icons/components/file-generic-outline-large';\nimport FileImageOutlineLargeIcon from '@mattermost/compass-icons/components/file-image-outline-large';\nimport FilePatchOutlineLargeIcon from '@mattermost/compass-icons/components/file-patch-outline-large';\nimport FilePdfOutlineLargeIcon from '@mattermost/compass-icons/components/file-pdf-outline-large';\nimport FilePowerpointOutlineLargeIcon from '@mattermost/compass-icons/components/file-powerpoint-outline-large';\nimport FileTextOutlineLargeIcon from '@mattermost/compass-icons/components/file-text-outline-large';\nimport FileVideoOutlineLargeIcon from '@mattermost/compass-icons/components/file-video-outline-large';\nimport FileWordOutlineLargeIcon from '@mattermost/compass-icons/components/file-word-outline-large';\nimport FileZipOutlineLargeIcon from '@mattermost/compass-icons/components/file-zip-outline-large';\nimport Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Tag from '@/components/Tag/Tag';\nimport styles from './AttachmentCard.module.scss';\n\nexport type AttachmentCardFileType =\n | 'text'\n | 'word'\n | 'excel'\n | 'powerpoint'\n | 'pdf'\n | 'image-icon'\n | 'image-thumbnail'\n | 'video'\n | 'audio'\n | 'generic'\n | 'patch'\n | 'zip'\n | 'code';\n\nexport type AttachmentCardState = 'default' | 'uploading' | 'uploaded';\n\nexport interface AttachmentCardProps {\n className?: string;\n /** File name to display. */\n fileName: string;\n /** File type + size string shown below the filename, e.g. \"TXT 15KB\". */\n fileMeta?: string;\n /** Controls the icon shown on the left. Default: \"generic\". */\n fileType?: AttachmentCardFileType;\n /** Card state. Default: \"default\" (browsing context). */\n state?: AttachmentCardState;\n /** Upload progress 0–100. Used when state=\"uploading\". */\n progress?: number;\n /** Thumbnail image URL. Used when fileType=\"image-thumbnail\". */\n thumbnailSrc?: string;\n /** Optional channel tag label shown below the filename, e.g. \"UX Design\". */\n channelTag?: string;\n /** Optional date/time stamp, e.g. \"Sep 24 5:14 PM\". */\n dateTimeStamp?: string;\n /** Called when the remove or cancel button is clicked. */\n onRemove?: () => void;\n /** Called when the download button is clicked (visible on hover in default state). */\n onDownload?: () => void;\n /** Called when the more-options button is clicked (visible on hover in default state). */\n onMore?: () => void;\n}\n\ntype IconComponent = ComponentType<{ size: number; className?: string }>;\n\nconst FILE_TYPE_ICONS: Record<\n Exclude<AttachmentCardFileType, 'image-thumbnail'>,\n IconComponent\n> = {\n audio: FileAudioOutlineLargeIcon,\n code: FileCodeOutlineLargeIcon,\n excel: FileExcelOutlineLargeIcon,\n generic: FileGenericOutlineLargeIcon,\n 'image-icon': FileImageOutlineLargeIcon,\n patch: FilePatchOutlineLargeIcon,\n pdf: FilePdfOutlineLargeIcon,\n powerpoint: FilePowerpointOutlineLargeIcon,\n text: FileTextOutlineLargeIcon,\n video: FileVideoOutlineLargeIcon,\n word: FileWordOutlineLargeIcon,\n zip: FileZipOutlineLargeIcon,\n};\n\nconst FILE_TYPE_COLORS: Record<\n Exclude<AttachmentCardFileType, 'image-thumbnail'>,\n string | undefined\n> = {\n audio: 'var(--attachment-blue)',\n code: undefined,\n excel: 'var(--attachment-green)',\n generic: undefined,\n 'image-icon': 'var(--attachment-blue)',\n patch: undefined,\n pdf: 'var(--attachment-red)',\n powerpoint: 'var(--attachment-orange)',\n text: undefined,\n video: 'var(--attachment-blue)',\n word: 'var(--attachment-blue)',\n zip: undefined,\n};\n\nexport default function AttachmentCard({\n className = '',\n fileName,\n fileMeta,\n fileType = 'generic',\n state = 'default',\n progress = 0,\n thumbnailSrc,\n channelTag,\n dateTimeStamp,\n onRemove,\n onDownload,\n onMore,\n}: AttachmentCardProps) {\n const isUploading = state === 'uploading';\n const isUploaded = state === 'uploaded';\n const isDefault = state === 'default';\n\n const stateClass = !isDefault ? styles[`attachment-card--${state}`] : '';\n const rootClass = [styles['attachment-card'], stateClass, className]\n .filter(Boolean)\n .join(' ');\n\n const FileIcon =\n fileType !== 'image-thumbnail'\n ? FILE_TYPE_ICONS[fileType]\n : FileGenericOutlineLargeIcon;\n\n const iconColor =\n fileType !== 'image-thumbnail' ? FILE_TYPE_COLORS[fileType] : undefined;\n\n return (\n <div className={rootClass}>\n <div className={styles['attachment-card__container']}>\n <div className={styles['attachment-card__inner']}>\n <div className={styles['attachment-card__left']}>\n {fileType === 'image-thumbnail' && thumbnailSrc ? (\n <img\n src={thumbnailSrc}\n alt=\"\"\n className={styles['attachment-card__thumbnail']}\n />\n ) : (\n <div\n className={styles['attachment-card__icon']}\n style={iconColor ? { color: iconColor } : undefined}\n >\n <Icon glyph={<FileIcon size={40} />} size=\"40\" />\n </div>\n )}\n\n <div className={styles['attachment-card__text']}>\n <p className={styles['attachment-card__filename']}>{fileName}</p>\n <div className={styles['attachment-card__secondary-details']}>\n {isUploading ? (\n <span className={styles['attachment-card__uploading-text']}>\n {`Uploading… (${progress}%)`}\n </span>\n ) : (\n <>\n {channelTag && <Tag label={channelTag} />}\n {fileMeta && (\n <div className={styles['attachment-card__details']}>\n <span>{fileMeta}</span>\n {dateTimeStamp && (\n <span className={styles['attachment-card__datetime']}>\n <span>{'•'}</span>\n <span>{dateTimeStamp}</span>\n </span>\n )}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n\n <div className={styles['attachment-card__right']}>\n <div className={styles['attachment-card__actions']}>\n {(isUploaded || isUploading) && (\n <IconButton\n size=\"Small\"\n icon={<Icon glyph={<CloseIcon />} size=\"16\" />}\n aria-label={\n isUploading ? 'Cancel upload' : 'Remove attachment'\n }\n onClick={onRemove}\n />\n )}\n {isDefault && (\n <>\n <IconButton\n size=\"Small\"\n icon={<Icon glyph={<DotsVerticalIcon />} size=\"16\" />}\n aria-label=\"More options\"\n onClick={onMore}\n />\n <IconButton\n size=\"Small\"\n icon={<Icon glyph={<DownloadOutlineIcon />} size=\"16\" />}\n aria-label=\"Download\"\n onClick={onDownload}\n />\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {isUploading && (\n <div className={styles['attachment-card__progress-bar']}>\n <div\n className={styles['attachment-card__progress-fill']}\n style={{ width: `${Math.min(100, Math.max(0, progress))}%` }}\n />\n </div>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport StarOutlineIcon from '@mattermost/compass-icons/components/star-outline';\nimport StarIcon from '@mattermost/compass-icons/components/star';\nimport ChevronDownIcon from '@mattermost/compass-icons/components/chevron-down';\nimport BellOffOutlineIcon from '@mattermost/compass-icons/components/bell-off-outline';\nimport AccountOutlineIcon from '@mattermost/compass-icons/components/account-outline';\nimport PinOutlineIcon from '@mattermost/compass-icons/components/pin-outline';\nimport FileTextOutlineIcon from '@mattermost/compass-icons/components/file-text-outline';\nimport PhoneIcon from '@mattermost/compass-icons/components/phone';\nimport InformationOutlineIcon from '@mattermost/compass-icons/components/information-outline';\nimport Button from '@/components/Button/Button';\nimport Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Tag from '@/components/Tag/Tag';\nimport UserAvatar from '@/components/UserAvatar/UserAvatar';\nimport styles from './ChannelHeader.module.scss';\n\nexport type ChannelHeaderType =\n | 'Channel'\n | 'Bot'\n | 'DM'\n | 'GM'\n | 'Threads'\n | 'Drafts';\n\nexport interface ChannelHeaderProps {\n /** Channel type variant. Default: Channel. */\n type?: ChannelHeaderType;\n /** Channel or conversation name. */\n name?: string;\n /** Subtitle shown to the right of the stat icons (Bot) or next to the title (Threads, Drafts). */\n description?: string;\n /** Member count shown for Channel and GM types. */\n memberCount?: number;\n /** Number of pinned messages shown as a stat. */\n pinnedCount?: number;\n /** Whether the channel is favorited (filled star). */\n favorited?: boolean;\n /** Whether the channel is muted (bell-off icon shown). */\n muted?: boolean;\n /** Avatar image URL for DM and Bot types. */\n avatarSrc?: string;\n /** Show online status badge on the DM avatar. */\n avatarStatus?: boolean;\n /** Called when the favorite star is clicked. */\n onFavoriteClick?: () => void;\n /** Called when the channel name is clicked. */\n onNameClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n /** Called when the Start a Call button is clicked. */\n onCallClick?: () => void;\n /** Replaces the default Start a Call button when provided. */\n callButton?: ReactNode;\n /** Called when the channel info button is clicked. */\n onInfoClick?: () => void;\n /** Whether the info button is in a toggled (active) state. */\n infoToggled?: boolean;\n className?: string;\n}\n\nexport default function ChannelHeader({\n type = 'Channel',\n name = '',\n description,\n memberCount,\n pinnedCount,\n favorited = false,\n muted = false,\n avatarSrc,\n avatarStatus = false,\n onFavoriteClick,\n onNameClick,\n onCallClick,\n callButton,\n onInfoClick,\n infoToggled = false,\n className = '',\n}: ChannelHeaderProps) {\n const isSimple = type === 'Threads' || type === 'Drafts';\n const showCallButton = type === 'Channel' || type === 'DM' || type === 'GM';\n const showMembers =\n (type === 'Channel' || type === 'GM') && memberCount != null;\n const showFiles = type === 'Channel' || type === 'DM' || type === 'GM';\n const showChevron = type === 'Channel' || type === 'DM' || type === 'GM';\n const hasDmAvatar = (type === 'DM' || type === 'Bot') && Boolean(avatarSrc);\n\n const rootClass = [\n styles['channel-header'],\n isSimple ? styles['channel-header--simple'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n if (isSimple) {\n return (\n <div className={rootClass}>\n <span className={styles['channel-header__title']}>{name}</span>\n {description && (\n <span className={styles['channel-header__description']}>\n {description}\n </span>\n )}\n </div>\n );\n }\n\n return (\n <div className={rootClass}>\n <div className={styles['channel-header__left']}>\n <div className={styles['channel-header__top-row']}>\n <IconButton\n size=\"X-Small\"\n aria-label={\n favorited ? 'Remove from favorites' : 'Add to favorites'\n }\n onClick={onFavoriteClick}\n icon={\n favorited ? (\n <span\n style={{ color: 'var(--button-bg)', display: 'inline-flex' }}\n >\n <StarIcon size={18} />\n </span>\n ) : (\n <StarOutlineIcon size={18} />\n )\n }\n />\n\n {hasDmAvatar && (\n <div className={styles['channel-header__identity']}>\n <UserAvatar\n src={avatarSrc!}\n alt={name}\n size=\"24\"\n status={type === 'DM' ? avatarStatus : false}\n />\n {type === 'Bot' ? (\n <div className={styles['channel-header__bot-name-group']}>\n <button\n className={styles['channel-header__name-area']}\n type=\"button\"\n onClick={onNameClick}\n >\n <span className={styles['channel-header__name']}>\n {name}\n </span>\n </button>\n <span className={styles['channel-header__bot-tag']}>\n <Tag label=\"BOT\" casing=\"All Caps\" />\n </span>\n </div>\n ) : (\n <button\n className={styles['channel-header__name-area']}\n type=\"button\"\n onClick={onNameClick}\n >\n <span className={styles['channel-header__name']}>{name}</span>\n <Icon size=\"16\" glyph={<ChevronDownIcon />} />\n </button>\n )}\n </div>\n )}\n\n {!hasDmAvatar && (\n <button\n className={styles['channel-header__name-area']}\n type=\"button\"\n onClick={onNameClick}\n >\n <span className={styles['channel-header__name']}>{name}</span>\n {showChevron && <Icon size=\"16\" glyph={<ChevronDownIcon />} />}\n </button>\n )}\n\n <div className={styles['channel-header__stat-icons']}>\n {muted && (\n <IconButton\n size=\"X-Small\"\n aria-label=\"Notifications muted\"\n icon={<Icon size=\"12\" glyph={<BellOffOutlineIcon />} />}\n />\n )}\n {showMembers && (\n <IconButton\n size=\"X-Small\"\n aria-label={`${memberCount} members`}\n count={memberCount}\n icon={<Icon size=\"12\" glyph={<AccountOutlineIcon />} />}\n />\n )}\n {pinnedCount != null && (\n <IconButton\n size=\"X-Small\"\n aria-label={`${pinnedCount} pinned messages`}\n count={pinnedCount}\n icon={<Icon size=\"12\" glyph={<PinOutlineIcon />} />}\n />\n )}\n {showFiles && (\n <IconButton\n size=\"X-Small\"\n aria-label=\"Files\"\n icon={<Icon size=\"12\" glyph={<FileTextOutlineIcon />} />}\n />\n )}\n </div>\n </div>\n\n <div className={styles['channel-header__description']}>\n {description ?? null}\n </div>\n </div>\n\n <div className={styles['channel-header__right']}>\n {showCallButton && (callButton ?? (\n <Button\n className={styles['channel-header__call-btn']}\n emphasis=\"Quaternary\"\n size=\"Small\"\n leadingIcon={<Icon size=\"16\" glyph={<PhoneIcon />} />}\n onClick={onCallClick}\n >\n Start a Call\n </Button>\n ))}\n <IconButton\n size=\"Small\"\n aria-label=\"Channel info\"\n icon={<Icon size=\"16\" glyph={<InformationOutlineIcon />} />}\n onClick={onInfoClick}\n toggled={infoToggled}\n />\n </div>\n </div>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport EmoticonHappyOutlineIcon from '@mattermost/compass-icons/components/emoticon-happy-outline';\nimport CheckIcon from '@mattermost/compass-icons/components/check';\nimport Icon from '@/components/Icon/Icon';\nimport Tag from '@/components/Tag/Tag';\nimport MentionBadge from '@/components/MentionBadge/MentionBadge';\nimport styles from './MenuItem.module.scss';\n\nexport interface MenuItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Primary label text. */\n label: string;\n /** Optional secondary label. */\n secondaryLabel?: ReactNode;\n /** Where the secondary label appears. Default: 'Below'. */\n secondaryLabelPosition?: 'Inline' | 'Below';\n /** Custom content for the leading slot. When omitted, shows placeholder icon. */\n leadingVisual?: ReactNode;\n /** Show the leading visual slot. Default: true. */\n leadingElement?: boolean;\n /** Custom content for the trailing slot. When omitted with trailingElement=true, shows check icon. */\n trailingVisual?: ReactNode;\n /** Show the trailing visual slot. Default: false. */\n trailingElement?: boolean;\n /** Emoji character for custom status, shown inline after the label. */\n customStatusEmoji?: string;\n /** Show \"NEW\" label tag. */\n tag?: boolean;\n /** Inline mention count badge. */\n mentionCount?: number;\n /** Destructive (danger) styling. */\n destructive?: boolean;\n /** Highlight row (e.g. submenu parent while child menu is open). */\n active?: boolean;\n}\n\n/**\n * Menu item matching Figma/Compass Menu Item v2.0.0.\n *\n * @see https://compass.mattermost.com/29be2c109/p/1092d5-menu-item\n */\nexport default function MenuItem({\n label,\n secondaryLabel,\n secondaryLabelPosition = 'Below',\n leadingVisual,\n leadingElement = true,\n trailingVisual,\n trailingElement = false,\n customStatusEmoji,\n tag = false,\n mentionCount,\n destructive = false,\n active = false,\n className = '',\n disabled,\n type = 'button',\n ...rest\n}: MenuItemProps) {\n const rootClass = [\n styles['menu-item'],\n destructive ? styles['menu-item--destructive'] : '',\n active ? styles['menu-item--active'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button className={rootClass} type={type} disabled={disabled} {...rest}>\n <div className={styles['menu-item__content']}>\n {leadingElement && (\n <div className={styles['menu-item__left']}>\n <span className={styles['menu-item__leading-visual']}>\n {leadingVisual ?? (\n <Icon glyph={<EmoticonHappyOutlineIcon />} size=\"16\" />\n )}\n </span>\n </div>\n )}\n <div className={styles['menu-item__middle']}>\n <div className={styles['menu-item__top-row']}>\n <span className={styles['menu-item__label']}>{label}</span>\n {secondaryLabel && secondaryLabelPosition === 'Inline' && (\n <span className={styles['menu-item__secondary-label-inline']}>\n {secondaryLabel}\n </span>\n )}\n {customStatusEmoji && (\n <span className={styles['menu-item__custom-status']} aria-hidden>\n {customStatusEmoji}\n </span>\n )}\n {tag && <Tag label=\"NEW\" />}\n {mentionCount != null && mentionCount > 0 && (\n <MentionBadge\n count={mentionCount}\n location=\"Menu Item\"\n size=\"Small\"\n />\n )}\n </div>\n {secondaryLabel && secondaryLabelPosition === 'Below' && (\n <div className={styles['menu-item__bottom-row']}>\n <span className={styles['menu-item__secondary-label-below']}>\n {secondaryLabel}\n </span>\n </div>\n )}\n </div>\n {trailingElement && (\n <div className={styles['menu-item__right']}>\n <span\n className={[\n styles['menu-item__trailing-visual'],\n !trailingVisual\n ? styles['menu-item__trailing-visual--check']\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {trailingVisual ?? <Icon glyph={<CheckIcon />} size=\"16\" />}\n </span>\n </div>\n )}\n </div>\n </button>\n );\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport Scrollbar from '@/components/Scrollbar/Scrollbar';\nimport styles from './PopoverMenu.module.scss';\n\nexport interface PopoverMenuProps extends HTMLAttributes<HTMLDivElement> {\n /** Parent menus use Elevation 4; nested child menus use Elevation 5. */\n variant?: 'parent' | 'child';\n children: ReactNode;\n}\n\n/**\n * Surface container for popover-style menus — border, fill, elevation, and width\n * constraints per Compass. Compose with {@link MenuItem} rows and optional\n * titles, group labels, and dividers. Use {@link PopoverMenuScroll} when the item\n * list should scroll while a {@link PopoverMenuTitle} stays pinned.\n */\nexport default function PopoverMenu({\n variant = 'parent',\n children,\n className = '',\n ...rest\n}: PopoverMenuProps) {\n const rootClass = [\n styles['popover-menu'],\n variant === 'child'\n ? styles['popover-menu--child']\n : styles['popover-menu--parent'],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass} {...rest}>\n {children}\n </div>\n );\n}\n\nexport interface PopoverMenuScrollProps {\n children: ReactNode;\n /** Maximum height of the scrollable region (coerces numbers to px). */\n maxHeight: string | number;\n className?: string;\n}\n\n/** Scrollable region for long item lists; keeps a sibling title visible when used with `maxHeight`. */\nexport function PopoverMenuScroll({\n maxHeight,\n children,\n className = '',\n}: PopoverMenuScrollProps) {\n const maxH =\n typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n return (\n <Scrollbar\n className={[styles['popover-menu__scroll'], className]\n .filter(Boolean)\n .join(' ')}\n style={{ maxHeight: maxH }}\n >\n {children}\n </Scrollbar>\n );\n}\n\nexport interface PopoverMenuTitleProps extends HTMLAttributes<HTMLParagraphElement> {\n children: ReactNode;\n}\n\n/** Optional heading above menu items; keep pinned outside a scrolling body when using `maxHeight` on `PopoverMenu`. */\nexport function PopoverMenuTitle({\n children,\n className = '',\n ...rest\n}: PopoverMenuTitleProps) {\n return (\n <p\n className={[styles['popover-menu__title'], className].filter(Boolean).join(' ')}\n {...rest}\n >\n {children}\n </p>\n );\n}\n\nexport interface PopoverMenuGroupProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /** Accessible label when the group has no visible `PopoverMenuGroupTitle`. */\n 'aria-label'?: string;\n}\n\n/** Groups related menu items. */\nexport function PopoverMenuGroup({\n children,\n className = '',\n ...rest\n}: PopoverMenuGroupProps) {\n return (\n <div\n role=\"group\"\n className={[styles['popover-menu__group'], className].filter(Boolean).join(' ')}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\nexport interface PopoverMenuGroupTitleProps extends HTMLAttributes<HTMLParagraphElement> {\n children: ReactNode;\n}\n\n/** Optional label for a `PopoverMenuGroup`. */\nexport function PopoverMenuGroupTitle({\n children,\n className = '',\n ...rest\n}: PopoverMenuGroupTitleProps) {\n return (\n <p\n className={[styles['popover-menu__group-title'], className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </p>\n );\n}\n\nexport interface PopoverMenuDividerProps extends HTMLAttributes<HTMLDivElement> {}\n\n/** Horizontal rule between groups or below a menu title. */\nexport function PopoverMenuDivider({\n className = '',\n ...rest\n}: PopoverMenuDividerProps) {\n return (\n <div\n className={[styles['popover-menu__divider'], className].filter(Boolean).join(' ')}\n role=\"separator\"\n {...rest}\n />\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport AccountOutlineIcon from '@mattermost/compass-icons/components/account-outline';\nimport AppsIcon from '@mattermost/compass-icons/components/apps';\nimport ArchiveOutlineIcon from '@mattermost/compass-icons/components/archive-outline';\nimport BellOffOutlineIcon from '@mattermost/compass-icons/components/bell-off-outline';\nimport BellOutlineIcon from '@mattermost/compass-icons/components/bell-outline';\nimport BookmarkOutlineIcon from '@mattermost/compass-icons/components/bookmark-outline';\nimport ChevronRightIcon from '@mattermost/compass-icons/components/chevron-right';\nimport CogOutlineIcon from '@mattermost/compass-icons/components/cog-outline';\nimport ExitToAppIcon from '@mattermost/compass-icons/components/exit-to-app';\nimport FolderMoveOutlineIcon from '@mattermost/compass-icons/components/folder-move-outline';\nimport InformationOutlineIcon from '@mattermost/compass-icons/components/information-outline';\nimport Icon from '@/components/Icon/Icon';\nimport MenuItem from '@/components/MenuItem/MenuItem';\nimport PopoverMenu, {\n PopoverMenuDivider,\n PopoverMenuGroup,\n} from '@/components/PopoverMenu/PopoverMenu';\n\nexport interface ChannelHeaderMenuProps extends HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Channel header overflow menu — settings, members, more actions, and archive.\n */\nexport default function ChannelHeaderMenu({\n className = '',\n ...rest\n}: ChannelHeaderMenuProps) {\n return (\n <PopoverMenu className={className} {...rest}>\n <PopoverMenuGroup>\n <MenuItem\n label=\"View info\"\n leadingVisual={<Icon glyph={<InformationOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Mute channel\"\n leadingVisual={<Icon glyph={<BellOffOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Notification preferences\"\n leadingVisual={<Icon glyph={<BellOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Channel settings\"\n leadingVisual={<Icon glyph={<CogOutlineIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={<Icon glyph={<ChevronRightIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Bookmarks bar\"\n leadingVisual={<Icon glyph={<BookmarkOutlineIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={<Icon glyph={<ChevronRightIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Members\"\n leadingVisual={<Icon glyph={<AccountOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Move to\"\n leadingVisual={<Icon glyph={<FolderMoveOutlineIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={<Icon glyph={<ChevronRightIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"More actions\"\n leadingVisual={<Icon glyph={<AppsIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={<Icon glyph={<ChevronRightIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Leave channel\"\n destructive\n leadingVisual={<Icon glyph={<ExitToAppIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Archive channel\"\n destructive\n leadingVisual={<Icon glyph={<ArchiveOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n </PopoverMenu>\n );\n}\n","import styles from './ChannelInfoMsgHeader.module.scss';\n\nexport interface ChannelInfoMsgHeaderTab {\n /** Label text for this tab. */\n label: string;\n /** Whether this tab is currently active/selected. */\n active?: boolean;\n /** Click handler. */\n onClick?: () => void;\n}\n\nexport interface ChannelInfoMsgHeaderProps {\n /**\n * Channel (or section) label — primary API for Mentions / Saved message\n * indicators. Prefer this over `tabs` for a single channel chip.\n */\n channelName?: string;\n /** Called when the channel label is pressed (`channelName` mode). */\n onChannelClick?: () => void;\n /**\n * Multi-section tabs for channel info panels. Used when `channelName` is\n * omitted.\n */\n tabs?: ChannelInfoMsgHeaderTab[];\n /**\n * Team name after the channel divider. Omit when the workspace has only one\n * team or the team is already clear from context.\n */\n teamName?: string;\n /** Optional CSS class name. */\n className?: string;\n}\n\n/**\n * Channel + optional team label bar. Used above messages in Mentions / Saved\n * lists and as section tabs in the channel info panel.\n *\n * @see Figma Components — Channel Info Message Header\n * @see https://www.figma.com/design/VLpUbaoHEh2GR3XekSqmI6/Components---Channel-Info-Message-Header?node-id=1215-615\n */\nexport default function ChannelInfoMsgHeader({\n channelName,\n onChannelClick,\n tabs,\n teamName,\n className = '',\n}: ChannelInfoMsgHeaderProps) {\n const resolvedTabs: ChannelInfoMsgHeaderTab[] =\n channelName != null && channelName !== ''\n ? [{label: channelName, onClick: onChannelClick}]\n : (tabs ?? [{label: 'Spec Reviews', active: true}]);\n\n const rootClass = [styles['channel-info-msg-header'], className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass}>\n <div className={styles['channel-info-msg-header__container']}>\n {resolvedTabs.map((tab, index) => (\n <div\n key={`${tab.label}-${index}`}\n className={[\n styles['channel-info-msg-header__tab-area'],\n tab.active\n ? styles['channel-info-msg-header__tab-area--active']\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <button\n type='button'\n className={[\n styles['channel-info-msg-header__tab'],\n tab.active\n ? styles['channel-info-msg-header__tab--active']\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={tab.onClick}\n >\n {tab.label}\n </button>\n </div>\n ))}\n {teamName != null && teamName !== '' && (\n <div className={styles['channel-info-msg-header__team']}>\n <span className={styles['channel-info-msg-header__team-name']}>\n {teamName}\n </span>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport AccountPlusOutlineIcon from '@mattermost/compass-icons/components/account-plus-outline';\nimport BellOffOutlineIcon from '@mattermost/compass-icons/components/bell-off-outline';\nimport ChevronRightIcon from '@mattermost/compass-icons/components/chevron-right';\nimport ExitToAppIcon from '@mattermost/compass-icons/components/exit-to-app';\nimport FolderMoveOutlineIcon from '@mattermost/compass-icons/components/folder-move-outline';\nimport LinkVariantIcon from '@mattermost/compass-icons/components/link-variant';\nimport MarkAsUnreadIcon from '@mattermost/compass-icons/components/mark-as-unread';\nimport StarOutlineIcon from '@mattermost/compass-icons/components/star-outline';\nimport Icon from '@/components/Icon/Icon';\nimport MenuItem from '@/components/MenuItem/MenuItem';\nimport PopoverMenu, {\n PopoverMenuDivider,\n PopoverMenuGroup,\n} from '@/components/PopoverMenu/PopoverMenu';\n\nexport interface ChannelMenuProps extends HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Narrow channel sidebar context menu (174px).\n */\nexport default function ChannelMenu({\n className = '',\n style,\n ...rest\n}: ChannelMenuProps) {\n return (\n <PopoverMenu\n className={className}\n style={{ width: '174px', ...style }}\n {...rest}\n >\n <PopoverMenuGroup>\n <MenuItem\n label=\"Mark as read\"\n leadingVisual={<Icon glyph={<MarkAsUnreadIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Favorite\"\n leadingVisual={<Icon glyph={<StarOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Mute channel\"\n leadingVisual={<Icon glyph={<BellOffOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Move to\"\n leadingVisual={<Icon glyph={<FolderMoveOutlineIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={<Icon glyph={<ChevronRightIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Copy link\"\n leadingVisual={<Icon glyph={<LinkVariantIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Add members\"\n leadingVisual={<Icon glyph={<AccountPlusOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Leave channel\"\n destructive\n leadingVisual={<Icon glyph={<ExitToAppIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n </PopoverMenu>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport BellOffOutlineIcon from '@mattermost/compass-icons/components/bell-off-outline';\nimport ChevronRightIcon from '@mattermost/compass-icons/components/chevron-right';\nimport FolderMoveOutlineIcon from '@mattermost/compass-icons/components/folder-move-outline';\nimport GlobeIcon from '@mattermost/compass-icons/components/globe';\nimport PencilOutlineIcon from '@mattermost/compass-icons/components/pencil-outline';\nimport PlusIcon from '@mattermost/compass-icons/components/plus';\nimport SortAlphabeticalAscendingIcon from '@mattermost/compass-icons/components/sort-alphabetical-ascending';\nimport TrashCanOutlineIcon from '@mattermost/compass-icons/components/trash-can-outline';\nimport Icon from '@/components/Icon/Icon';\nimport MenuItem from '@/components/MenuItem/MenuItem';\nimport PopoverMenu, {\n PopoverMenuDivider,\n PopoverMenuGroup,\n} from '@/components/PopoverMenu/PopoverMenu';\nimport styles from './ChannelCategoryMenu.module.scss';\n\nexport interface ChannelCategoryMenuProps\n extends HTMLAttributes<HTMLDivElement> {\n /** Label shown in the Sort row trailing detail. Default: Alphabetically. */\n sortLabel?: string;\n}\n\n/**\n * Channel category context menu — mute/rename/delete, sort, browse/create.\n */\nexport default function ChannelCategoryMenu({\n sortLabel = 'Alphabetically',\n className = '',\n style,\n ...rest\n}: ChannelCategoryMenuProps) {\n const rootClass = [styles['channel-category-menu'], className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <PopoverMenu\n className={rootClass}\n style={{ width: '247px', ...style }}\n {...rest}\n >\n <PopoverMenuGroup>\n <MenuItem\n label=\"Mute category\"\n leadingVisual={<Icon glyph={<BellOffOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Rename category\"\n leadingVisual={<Icon glyph={<PencilOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Delete category\"\n destructive\n leadingVisual={<Icon glyph={<TrashCanOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Sort\"\n leadingVisual={\n <Icon glyph={<SortAlphabeticalAscendingIcon />} size=\"16\" />\n }\n trailingElement\n trailingVisual={\n <span className={styles['channel-category-menu__sort-trailing']}>\n <span\n className={styles['channel-category-menu__sort-label']}\n >\n {sortLabel}\n </span>\n <Icon glyph={<ChevronRightIcon />} size=\"16\" />\n </span>\n }\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Browse channels\"\n leadingVisual={<Icon glyph={<GlobeIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Create new channel\"\n leadingVisual={<Icon glyph={<PlusIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Create new category\"\n leadingVisual={<Icon glyph={<FolderMoveOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n </PopoverMenu>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { useRef, useEffect, useId } from 'react';\nimport { useControllable } from '@/hooks/useControllable';\nimport Icon from '@/components/Icon/Icon';\nimport type { IconSize } from '@/components/Icon/Icon';\nimport type { ElementType } from 'react';\nimport CheckIcon from '@mattermost/compass-icons/components/check';\nimport MinusIcon from '@mattermost/compass-icons/components/minus';\nimport { toKebab } from '@/utils/string';\nimport styles from './Checkbox.module.scss';\n\nexport type CheckboxSize = 'Small' | 'Medium' | 'Large';\n\nexport interface CheckboxProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** When true, shows indeterminate (minus) state. Syncs to native input.indeterminate. */\n indeterminate?: boolean;\n /** Size variant. Figma: Small (12px), Medium (16px), Large (20px). Default: Medium. */\n size?: CheckboxSize;\n /** When false, uses error/destructive styling (red fill when checked). Default: true. */\n valid?: boolean;\n /** Label content. Rendered next to the checkbox. */\n children?: React.ReactNode;\n}\n\n/** Icon size from design system scale for each checkbox size (fits inside box). */\nconst CHECKBOX_ICON_SIZE: Record<CheckboxSize, IconSize> = {\n Small: '10',\n Medium: '12',\n Large: '16',\n};\n\n/** Compass icon component per checked/indeterminate state. */\nconst ICON_COMPONENT: Record<'check' | 'minus', ElementType> = {\n check: CheckIcon,\n minus: MinusIcon,\n};\n\n/**\n * Checkbox component built on the native HTML checkbox.\n * Supports checked, unchecked, and indeterminate states; sizes and valid/invalid\n * styling match Figma Checkbox (Checkbox Selector) v2.0.2.\n *\n * Use with a label: pass children to render label text, or wrap in your own <label>.\n * Indeterminate must be set via the `indeterminate` prop (native attribute is not reflectable).\n *\n * @see https://compass.mattermost.com (Checkbox)\n */\nexport default function Checkbox({\n className = '',\n indeterminate = false,\n size = 'Medium',\n valid = true,\n children,\n id: idProp,\n checked,\n defaultChecked,\n disabled,\n onChange,\n ...rest\n}: CheckboxProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const [resolvedChecked, handleChange] = useControllable(\n checked,\n defaultChecked,\n onChange,\n );\n\n const showingIcon = indeterminate\n ? 'minus'\n : resolvedChecked\n ? 'check'\n : null;\n\n useEffect(() => {\n const input = inputRef.current;\n if (input) input.indeterminate = indeterminate;\n }, [indeterminate]);\n\n const sizeClass = styles[`checkbox--size-${toKebab(size)}`];\n const invalidClass = valid ? '' : styles['checkbox--invalid'];\n const indeterminateClass = indeterminate\n ? styles['checkbox--indeterminate']\n : '';\n\n const rootClass = [\n styles.checkbox,\n sizeClass,\n invalidClass,\n indeterminateClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const iconSize = CHECKBOX_ICON_SIZE[size];\n\n return (\n <label className={rootClass} htmlFor={id}>\n <input\n ref={inputRef}\n id={id}\n type=\"checkbox\"\n className={styles['checkbox__input']}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n aria-invalid={valid ? undefined : true}\n onChange={handleChange}\n {...rest}\n />\n <span className={styles['checkbox__box']}>\n {showingIcon !== null &&\n (() => {\n const IconComponent = ICON_COMPONENT[showingIcon];\n return (\n <span key={showingIcon} className={styles['checkbox__icon']}>\n <Icon glyph={<IconComponent />} size={iconSize} />\n </span>\n );\n })()}\n </span>\n {children != null && (\n <span className={styles['checkbox__label']}>{children}</span>\n )}\n </label>\n );\n}\n","import type { HTMLAttributes, MouseEvent, ReactNode } from 'react';\nimport CloseCircleIcon from '@mattermost/compass-icons/components/close-circle';\nimport Icon from '@/components/Icon/Icon';\nimport type { IconSize } from '@/components/Icon/Icon';\nimport UserAvatar from '@/components/UserAvatar/UserAvatar';\nimport type { UserAvatarSize } from '@/components/UserAvatar/UserAvatar';\nimport { toKebab } from '@/utils/string';\nimport styles from './Chip.module.scss';\n\nexport type ChipSize = 'Small' | 'Medium' | 'Medium Compact' | 'Large';\n\nexport interface ChipProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n /** Chip label. */\n children: ReactNode;\n /** Visual size. Default: Medium. */\n size?: ChipSize;\n /** Leading icon from @mattermost/compass-icons. */\n leadingIcon?: ReactNode;\n /** Leading avatar. Overrides leadingIcon when both are provided. */\n leadingAvatar?: { src: string; alt: string };\n /** When provided, shows the remove (×) button and calls this on click. */\n onRemove?: (e: MouseEvent<HTMLButtonElement>) => void;\n /** Accessible label for the remove button. Default: \"Remove\". */\n removeLabel?: string;\n /** Shows an error border. */\n error?: boolean;\n /** Adds a colored background overlay. */\n colored?: boolean;\n className?: string;\n}\n\nconst ICON_SIZE_MAP: Record<ChipSize, IconSize> = {\n Small: '10',\n Medium: '12',\n 'Medium Compact': '12',\n Large: '16',\n};\n\nconst AVATAR_SIZE_MAP: Record<ChipSize, UserAvatarSize> = {\n Small: '12',\n Medium: '16',\n 'Medium Compact': '16',\n Large: '20',\n};\n\nexport default function Chip({\n children,\n size = 'Medium',\n leadingIcon,\n leadingAvatar,\n onRemove,\n removeLabel = 'Remove',\n error = false,\n colored = false,\n className = '',\n ...rest\n}: ChipProps) {\n const iconSize = ICON_SIZE_MAP[size];\n const avatarSize = AVATAR_SIZE_MAP[size];\n\n const rootClass = [\n styles.chip,\n styles[`chip--size-${toKebab(size)}`],\n error && styles['chip--error'],\n colored && styles['chip--colored'],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass} {...rest}>\n {leadingAvatar != null ? (\n <span className={styles['chip__avatar-slot']}>\n <UserAvatar\n src={leadingAvatar.src}\n alt={leadingAvatar.alt}\n size={avatarSize}\n />\n </span>\n ) : leadingIcon != null ? (\n <span className={styles['chip__icon-slot']} aria-hidden>\n <Icon glyph={leadingIcon} size={iconSize} />\n </span>\n ) : null}\n <span className={styles['chip__label']}>{children}</span>\n {onRemove != null ? (\n <button\n type=\"button\"\n className={styles['chip__remove']}\n onClick={onRemove}\n aria-label={removeLabel}\n >\n <CloseCircleIcon size={Number(iconSize)} aria-hidden />\n </button>\n ) : null}\n </div>\n );\n}\n","export type PopupPlacement = 'above' | 'below';\n\nexport const ANCHORED_POPUP_GAP = 4;\nexport const ANCHORED_POPUP_VIEWPORT_MARGIN = 48;\nexport const ANCHORED_POPUP_MIN_HEIGHT = 120;\n/** Default stacking above typical product chrome; hosts can override via zIndex. */\nexport const ANCHORED_POPUP_Z_INDEX = 1000;\n\nexport interface AnchoredPopupPlacementOptions {\n /** Gap between trigger and popup. Default: 4. */\n gap?: number;\n /** Reserved space at the viewport edge. Default: 48. */\n viewportMargin?: number;\n /** Height used to decide whether the popup fits below. */\n preferredHeight: number;\n /** Cap for scrollable menus (e.g. Select/Combobox 280). */\n maxHeightCap?: number;\n /** Floor so short viewports still show a scrollable list. Default: 120. */\n minHeight?: number;\n}\n\nexport interface AnchoredPopupPlacementResult {\n placement: PopupPlacement;\n maxHeight: number;\n}\n\n/**\n * Prefers opening below the anchor; flips above when there isn’t enough room\n * below and there is more space above. Max-height is the available space in the\n * chosen direction, optionally capped.\n */\nexport function computeAnchoredPopupPlacement(\n anchorRect: Pick<DOMRect, 'top' | 'bottom'>,\n viewportHeight: number,\n options: AnchoredPopupPlacementOptions & {\n /** When set, flip/max-height use this box instead of the viewport. */\n bounds?: Pick<DOMRect, 'top' | 'bottom'>;\n },\n): AnchoredPopupPlacementResult {\n const gap = options.gap ?? ANCHORED_POPUP_GAP;\n const viewportMargin =\n options.viewportMargin ?? ANCHORED_POPUP_VIEWPORT_MARGIN;\n const minHeight = options.minHeight ?? ANCHORED_POPUP_MIN_HEIGHT;\n const preferredHeight = Math.max(options.preferredHeight, 0);\n\n const boundsTop = options.bounds?.top ?? 0;\n const boundsBottom = options.bounds?.bottom ?? viewportHeight;\n\n const spaceBelow = Math.max(\n 0,\n boundsBottom - anchorRect.bottom - gap - viewportMargin,\n );\n const spaceAbove = Math.max(0, anchorRect.top - boundsTop - gap - viewportMargin);\n\n const placement: PopupPlacement =\n spaceBelow < preferredHeight && spaceAbove > spaceBelow ? 'above' : 'below';\n\n const available = placement === 'below' ? spaceBelow : spaceAbove;\n const capped =\n options.maxHeightCap != null\n ? Math.min(options.maxHeightCap, available)\n : available;\n\n return {\n placement,\n maxHeight: Math.max(minHeight, capped),\n };\n}\n\nexport interface AnchoredPopupFixedStyle {\n position: 'fixed' | 'absolute';\n top?: number;\n bottom?: number;\n left: number;\n width: number;\n zIndex: number;\n}\n\nexport type AnchoredPopupBounds = Pick<\n DOMRect,\n 'top' | 'bottom' | 'left' | 'width' | 'height'\n>;\n\n/** Mount element metrics for portaled absolute positioning. */\nexport interface AnchoredPopupContainerFrame {\n /** Visible viewport bounds used for flip/max-height. */\n bounds: Pick<DOMRect, 'top' | 'bottom'>;\n /** Maps a viewport anchor rect into mount padding-box coordinates. */\n anchorInContainer: (\n anchorRect: Pick<DOMRect, 'top' | 'bottom' | 'left' | 'width'>,\n ) => {\n left: number;\n top: number;\n bottom: number;\n width: number;\n };\n /** Visible padding-box height used for above `bottom` anchoring. */\n clientHeight: number;\n /** Current vertical scroll offset of the mount. */\n scrollTop: number;\n}\n\nexport function getAnchoredPopupContainerFrame(\n mount: HTMLElement,\n): AnchoredPopupContainerFrame {\n const borderRect = mount.getBoundingClientRect();\n const boundsTop = borderRect.top + mount.clientTop;\n const boundsBottom = boundsTop + mount.clientHeight;\n\n return {\n bounds: { top: boundsTop, bottom: boundsBottom },\n anchorInContainer: (anchorRect: Pick<DOMRect, 'top' | 'bottom' | 'left' | 'width'>) => ({\n left:\n anchorRect.left -\n borderRect.left -\n mount.clientLeft +\n mount.scrollLeft,\n top:\n anchorRect.top -\n borderRect.top -\n mount.clientTop +\n mount.scrollTop,\n bottom:\n anchorRect.bottom -\n borderRect.top -\n mount.clientTop +\n mount.scrollTop,\n width: anchorRect.width,\n }),\n clientHeight: mount.clientHeight,\n scrollTop: mount.scrollTop,\n };\n}\n\n/**\n * Fixed box coords for a portaled popup anchored to a trigger rect.\n * Below: top edge sits `gap` px under the trigger bottom.\n * Above: bottom edge sits `gap` px above the trigger top (uses `bottom` so\n * height does not affect the gap).\n *\n * When `containerFrame` is provided, returns `absolute` coords in the mount\n * padding box (accounts for scroll and client border offsets). Otherwise uses\n * viewport `fixed` coords (document.body default).\n */\nexport function computeAnchoredPopupFixedStyle(\n anchorRect: Pick<DOMRect, 'top' | 'bottom' | 'left' | 'width'>,\n placement: PopupPlacement,\n options: {\n gap?: number;\n zIndex?: number;\n /** Override width (defaults to trigger width). */\n width?: number;\n viewportHeight?: number;\n containerFrame?: AnchoredPopupContainerFrame;\n },\n): AnchoredPopupFixedStyle {\n const gap = options.gap ?? ANCHORED_POPUP_GAP;\n const width = options.width ?? anchorRect.width;\n const zIndex = options.zIndex ?? ANCHORED_POPUP_Z_INDEX;\n const containerFrame = options.containerFrame;\n\n if (containerFrame) {\n const anchor = containerFrame.anchorInContainer(anchorRect);\n if (placement === 'below') {\n return {\n position: 'absolute',\n top: anchor.bottom + gap,\n left: anchor.left,\n width,\n zIndex,\n };\n }\n const visibleTop = anchor.top - containerFrame.scrollTop;\n return {\n position: 'absolute',\n bottom: containerFrame.clientHeight - visibleTop + gap,\n left: anchor.left,\n width,\n zIndex,\n };\n }\n\n const viewportHeight = options.viewportHeight ?? window.innerHeight;\n\n if (placement === 'below') {\n return {\n position: 'fixed',\n top: anchorRect.bottom + gap,\n left: anchorRect.left,\n width,\n zIndex,\n };\n }\n\n return {\n position: 'fixed',\n bottom: viewportHeight - anchorRect.top + gap,\n left: anchorRect.left,\n width,\n zIndex,\n };\n}\n","import {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n ANCHORED_POPUP_GAP,\n ANCHORED_POPUP_Z_INDEX,\n computeAnchoredPopupFixedStyle,\n computeAnchoredPopupPlacement,\n getAnchoredPopupContainerFrame,\n type PopupPlacement,\n} from '@/utils/anchoredPopupPlacement';\n\nexport interface UseAnchoredPopupPortalOptions {\n /** Height used for the flip decision when content isn’t measured yet. */\n preferredHeight: number;\n /** Cap for scrollable menus (Select/Combobox). Omit for intrinsic panels. */\n maxHeightCap?: number;\n /** Ref to the portaled panel for measuring intrinsic height (DateRangePicker). */\n contentRef?: RefObject<HTMLElement | null>;\n /**\n * Portal mount node; defaults to `document.body` with viewport-fixed coords.\n * Custom containers must establish a positioning context (`position` other\n * than `static`); coords are converted to that container’s space.\n */\n portalContainer?: HTMLElement | null;\n zIndex?: number;\n /**\n * When true (default), fixed width matches the trigger.\n * DateRangePicker sets false and keeps its CSS width.\n */\n matchWidth?: boolean;\n gap?: number;\n}\n\nexport interface UseAnchoredPopupPortalResult {\n placement: PopupPlacement;\n maxHeight: number;\n style: CSSProperties;\n /** Ref for the portaled surface — pass to `useOutsideClose` as a second root. */\n portalRef: RefObject<HTMLDivElement | null>;\n /** Wraps children in a portal to `portalContainer` or `document.body`. */\n renderPortal: (children: ReactNode) => ReactNode;\n}\n\nconst DEFAULT_PLACEMENT: PopupPlacement = 'below';\n\nfunction resolvePortalMount(\n portalContainer: HTMLElement | null | undefined,\n): HTMLElement | null {\n if (typeof document === 'undefined') return null;\n return portalContainer ?? document.body;\n}\n\nfunction usesViewportFixedCoords(mount: HTMLElement): boolean {\n return mount === document.body;\n}\n\n/**\n * Positions a form-widget popup in a portal with viewport-aware above/below flip.\n * Internal to compass-ui form widgets — not a general overlay positioning API.\n */\nexport function useAnchoredPopupPortal(\n anchorRef: RefObject<HTMLElement | null>,\n isOpen: boolean,\n options: UseAnchoredPopupPortalOptions,\n): UseAnchoredPopupPortalResult {\n const {\n preferredHeight,\n maxHeightCap,\n contentRef,\n portalContainer = null,\n zIndex = ANCHORED_POPUP_Z_INDEX,\n matchWidth = true,\n gap = ANCHORED_POPUP_GAP,\n } = options;\n\n const portalRef = useRef<HTMLDivElement | null>(null);\n const [placement, setPlacement] = useState<PopupPlacement>(DEFAULT_PLACEMENT);\n const [maxHeight, setMaxHeight] = useState(\n maxHeightCap ?? preferredHeight,\n );\n const [style, setStyle] = useState<CSSProperties>({\n position: 'fixed',\n top: 0,\n left: 0,\n width: matchWidth ? 0 : undefined,\n zIndex,\n });\n\n const update = useCallback(() => {\n const anchor = anchorRef.current;\n if (!anchor) return;\n\n const mount = resolvePortalMount(portalContainer);\n if (!mount) return;\n\n const rect = anchor.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportFixed = usesViewportFixedCoords(mount);\n const containerFrame = viewportFixed\n ? undefined\n : getAnchoredPopupContainerFrame(mount);\n\n const measured =\n contentRef?.current?.offsetHeight ??\n portalRef.current?.offsetHeight ??\n 0;\n const heightForFlip = measured > 0 ? measured : preferredHeight;\n\n const { placement: nextPlacement, maxHeight: nextMaxHeight } =\n computeAnchoredPopupPlacement(rect, viewportHeight, {\n gap,\n preferredHeight: heightForFlip,\n maxHeightCap,\n bounds: containerFrame?.bounds,\n });\n\n const fixed = computeAnchoredPopupFixedStyle(rect, nextPlacement, {\n gap,\n zIndex,\n width: matchWidth ? rect.width : undefined,\n viewportHeight,\n containerFrame,\n });\n\n setPlacement(nextPlacement);\n setMaxHeight(nextMaxHeight);\n setStyle({\n position: fixed.position,\n left: fixed.left,\n zIndex: fixed.zIndex,\n ...(matchWidth ? { width: fixed.width } : null),\n ...(nextPlacement === 'below'\n ? { top: fixed.top, bottom: 'auto' }\n : { bottom: fixed.bottom, top: 'auto' }),\n });\n }, [\n anchorRef,\n contentRef,\n gap,\n matchWidth,\n maxHeightCap,\n portalContainer,\n preferredHeight,\n zIndex,\n ]);\n\n useLayoutEffect(() => {\n if (!isOpen) return;\n\n update();\n\n function handle() {\n update();\n }\n\n window.addEventListener('resize', handle);\n // Capture phase so nested scroll containers (modals, RHS) are covered.\n document.addEventListener('scroll', handle, true);\n return () => {\n window.removeEventListener('resize', handle);\n document.removeEventListener('scroll', handle, true);\n };\n }, [isOpen, update]);\n\n // Re-measure after content mounts / changes size (calendar, long lists).\n useLayoutEffect(() => {\n if (!isOpen) return;\n const el = contentRef?.current ?? portalRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n\n const ro = new ResizeObserver(() => update());\n ro.observe(el);\n return () => ro.disconnect();\n }, [isOpen, contentRef, update]);\n\n const renderPortal = useCallback(\n (children: ReactNode) => {\n const mount = resolvePortalMount(portalContainer);\n if (!mount) return null;\n return createPortal(children, mount);\n },\n [portalContainer],\n );\n\n return {\n placement,\n maxHeight,\n style,\n portalRef,\n renderPortal,\n };\n}\n","import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\ntype MaybeRef = RefObject<HTMLElement | null>;\n\n/**\n * Closes a dropdown or popover when the user mousedowns outside the container(s).\n * Listeners attach only while `open` is true.\n *\n * Pass `portalRef` when the popup is portaled outside `ref` so menu clicks\n * still count as inside.\n *\n * @param ref - Primary container (e.g. field root).\n * @param open - When true, the listener is active.\n * @param onClose - Called when a mousedown lands outside all containers.\n * @param portalRef - Optional portaled surface to treat as inside.\n */\nexport function useOutsideClose(\n ref: MaybeRef,\n open: boolean,\n onClose: () => void,\n portalRef?: MaybeRef,\n): void {\n useEffect(() => {\n if (!open) return;\n function handle(e: MouseEvent) {\n const target = e.target as Node;\n if (ref.current?.contains(target)) return;\n if (portalRef?.current?.contains(target)) return;\n onClose();\n }\n document.addEventListener('mousedown', handle);\n return () => document.removeEventListener('mousedown', handle);\n }, [ref, portalRef, open, onClose]);\n}\n","import { useEffect, useState } from 'react';\n\n// --duration-quick is 150ms; keep in sync if that token changes.\nexport const POPOVER_TRANSITION_MS = 150;\n\n/**\n * Keeps a popover mounted for the duration of its exit animation so the close\n * transition can play before React unmounts the node. See CLAUDE.md:\n * \"Animation: popover panel open/close\".\n */\nexport function usePopoverTransition(open: boolean) {\n const [mounted, setMounted] = useState(open);\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setVisible(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }\n setVisible(false);\n const t = window.setTimeout(() => setMounted(false), POPOVER_TRANSITION_MS);\n return () => window.clearTimeout(t);\n }, [open]);\n\n return { mounted, visible };\n}\n","import type {\n ChangeEvent,\n FocusEvent,\n KeyboardEvent,\n MouseEvent,\n ReactNode,\n} from 'react';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport ChevronDownIcon from '@mattermost/compass-icons/components/chevron-down';\nimport Chip from '@/components/Chip/Chip';\nimport type { ChipSize } from '@/components/Chip/Chip';\nimport Icon from '@/components/Icon/Icon';\nimport MenuItem from '@/components/MenuItem/MenuItem';\nimport PopoverMenu, {\n PopoverMenuScroll,\n} from '@/components/PopoverMenu/PopoverMenu';\nimport UserAvatar from '@/components/UserAvatar/UserAvatar';\nimport { useAnchoredPopupPortal } from '@/hooks/useAnchoredPopupPortal';\nimport { useOutsideClose } from '@/hooks/useOutsideClose';\nimport { usePopoverTransition } from '@/hooks/usePopoverTransition';\nimport { toKebab } from '@/utils/string';\nimport styles from './Combobox.module.scss';\n\nexport type ComboboxSize = 'Small' | 'Medium' | 'Large';\n\nexport type ComboboxOption = {\n value: string;\n label: string;\n disabled?: boolean;\n /** Leading content for the list row (icon or avatar node). */\n leadingVisual?: ReactNode;\n /** Avatar for chips / list when a photo is preferred over `leadingVisual`. */\n leadingAvatar?: { src: string; alt: string };\n secondaryLabel?: string;\n};\n\nexport interface ComboboxProps {\n options: ComboboxOption[];\n /** When true, selected values render as removable chips. Default: false. */\n multiple?: boolean;\n value?: string | string[] | null;\n defaultValue?: string | string[] | null;\n onChange?: (value: string | string[] | null) => void;\n inputValue?: string;\n defaultInputValue?: string;\n onInputChange?: (value: string) => void;\n label?: ReactNode;\n placeholder?: string;\n leadingIcon?: ReactNode;\n size?: ComboboxSize;\n invalid?: boolean;\n disabled?: boolean;\n /**\n * Client-side filter. `true` (default) matches labels case-insensitively.\n * `false` shows all options (caller filters via `inputValue` / `onInputChange`).\n */\n filter?: boolean | ((option: ComboboxOption, query: string) => boolean);\n emptyMessage?: string;\n className?: string;\n id?: string;\n 'aria-label'?: string;\n /** Portal mount node for the menu; defaults to `document.body`. */\n portalContainer?: HTMLElement | null;\n /** Stacking order for the portaled menu. */\n zIndex?: number;\n}\n\nconst POPUP_MAX_HEIGHT = 280;\n\nconst CHIP_SIZE_BY_COMBOBOX: Record<ComboboxSize, ChipSize> = {\n Small: 'Small',\n Medium: 'Medium',\n Large: 'Large',\n};\n\nfunction defaultFilter(option: ComboboxOption, query: string): boolean {\n if (!query) return true;\n return option.label.toLowerCase().includes(query.toLowerCase());\n}\n\nfunction toSingleValue(\n value: string | string[] | null | undefined,\n): string | null {\n if (value == null) return null;\n if (Array.isArray(value)) return value[0] ?? null;\n return value === '' ? null : value;\n}\n\nfunction toMultiValue(\n value: string | string[] | null | undefined,\n): string[] {\n if (value == null) return [];\n if (Array.isArray(value)) return value;\n return value === '' ? [] : [value];\n}\n\nfunction optionLeadingVisual(option: ComboboxOption): ReactNode | undefined {\n if (option.leadingVisual != null) return option.leadingVisual;\n if (option.leadingAvatar != null) {\n return (\n <UserAvatar\n src={option.leadingAvatar.src}\n alt={option.leadingAvatar.alt}\n size=\"24\"\n />\n );\n }\n return undefined;\n}\n\n/**\n * Autocomplete combobox with optional multi-selection chips.\n * Field chrome matches Select / Text Input; list uses PopoverMenu + MenuItem.\n */\nconst Combobox = forwardRef<HTMLInputElement, ComboboxProps>(function Combobox(\n {\n options,\n multiple = false,\n value: valueProp,\n defaultValue,\n onChange,\n inputValue: inputValueProp,\n defaultInputValue = '',\n onInputChange,\n label,\n placeholder,\n leadingIcon,\n size = 'Medium',\n invalid = false,\n disabled = false,\n filter = true,\n emptyMessage = 'No results',\n className = '',\n id: idProp,\n 'aria-label': ariaLabel,\n portalContainer = null,\n zIndex,\n },\n ref,\n) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const listboxId = `${id}-listbox`;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n const isValueControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState<\n string | string[] | null\n >(() => {\n if (defaultValue !== undefined) return defaultValue;\n return multiple ? [] : null;\n });\n\n const rawValue = isValueControlled ? valueProp! : uncontrolledValue;\n const singleValue = multiple ? null : toSingleValue(rawValue);\n const multiValue = multiple ? toMultiValue(rawValue) : [];\n\n const isInputControlled = inputValueProp !== undefined;\n const [uncontrolledInput, setUncontrolledInput] = useState(defaultInputValue);\n const [isOpen, setIsOpen] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const [queryOverride, setQueryOverride] = useState<string | null>(null);\n\n const selectedOption = useMemo(\n () =>\n singleValue == null\n ? undefined\n : options.find((o) => o.value === singleValue),\n [options, singleValue],\n );\n\n // Single-select: show the selected label until the user starts typing a filter.\n // `queryOverride !== null` means the field is in filter-edit mode.\n const displayInput = (() => {\n if (isInputControlled) return inputValueProp!;\n if (multiple) return uncontrolledInput;\n if (queryOverride !== null) return queryOverride;\n return selectedOption?.label ?? uncontrolledInput;\n })();\n\n const filterQuery = (() => {\n if (isInputControlled) return inputValueProp!;\n if (multiple) return uncontrolledInput;\n if (queryOverride !== null) return queryOverride;\n return '';\n })();\n\n const setInputDisplay = useCallback(\n (next: string) => {\n if (!isInputControlled) {\n setUncontrolledInput(next);\n if (!multiple) setQueryOverride(next);\n }\n onInputChange?.(next);\n },\n [isInputControlled, multiple, onInputChange],\n );\n\n const commitValue = useCallback(\n (next: string | string[] | null) => {\n if (!isValueControlled) setUncontrolledValue(next);\n onChange?.(next);\n },\n [isValueControlled, onChange],\n );\n\n const filteredOptions = useMemo(() => {\n if (filter === false) return options;\n const fn = typeof filter === 'function' ? filter : defaultFilter;\n return options.filter((o) => fn(o, filterQuery));\n }, [options, filter, filterQuery]);\n\n const { mounted: popupMounted, visible: popupVisible } =\n usePopoverTransition(isOpen);\n\n const {\n placement,\n maxHeight,\n style: popupStyle,\n portalRef,\n renderPortal,\n } = useAnchoredPopupPortal(anchorRef, popupMounted, {\n preferredHeight: POPUP_MAX_HEIGHT,\n maxHeightCap: POPUP_MAX_HEIGHT,\n portalContainer,\n zIndex,\n });\n\n const close = useCallback(() => {\n setIsOpen(false);\n setActiveIndex(-1);\n if (!multiple && !isInputControlled) {\n setQueryOverride(null);\n setUncontrolledInput('');\n }\n }, [multiple, isInputControlled]);\n\n const open = useCallback(() => {\n if (disabled) return;\n setIsOpen(true);\n }, [disabled]);\n\n useOutsideClose(rootRef, isOpen, close, portalRef);\n\n useEffect(() => {\n if (!isOpen) return;\n setActiveIndex((prev) => {\n if (filteredOptions.length === 0) return -1;\n if (prev >= 0 && prev < filteredOptions.length) return prev;\n const selectedIdx = multiple\n ? filteredOptions.findIndex((o) => multiValue.includes(o.value))\n : filteredOptions.findIndex((o) => o.value === singleValue);\n return selectedIdx >= 0 ? selectedIdx : 0;\n });\n }, [isOpen, filteredOptions, multiple, multiValue, singleValue]);\n\n const isSelected = useCallback(\n (optionValue: string) =>\n multiple\n ? multiValue.includes(optionValue)\n : singleValue === optionValue,\n [multiple, multiValue, singleValue],\n );\n\n const selectOption = useCallback(\n (option: ComboboxOption) => {\n if (option.disabled) return;\n\n if (multiple) {\n const next = multiValue.includes(option.value)\n ? multiValue.filter((v) => v !== option.value)\n : [...multiValue, option.value];\n commitValue(next);\n setInputDisplay('');\n close();\n inputRef.current?.focus();\n return;\n }\n\n commitValue(option.value);\n if (!isInputControlled) {\n setUncontrolledInput('');\n setQueryOverride(null);\n } else {\n onInputChange?.(option.label);\n }\n close();\n },\n [\n multiple,\n multiValue,\n commitValue,\n setInputDisplay,\n isInputControlled,\n onInputChange,\n close,\n ],\n );\n\n const removeValue = useCallback(\n (optionValue: string) => {\n if (!multiple) return;\n commitValue(multiValue.filter((v) => v !== optionValue));\n inputRef.current?.focus();\n },\n [multiple, multiValue, commitValue],\n );\n\n const moveActive = useCallback(\n (delta: number) => {\n const enabled = filteredOptions\n .map((o, i) => ({ o, i }))\n .filter(({ o }) => !o.disabled);\n if (enabled.length === 0) {\n setActiveIndex(-1);\n return;\n }\n setActiveIndex((prev) => {\n const currentPos = enabled.findIndex(({ i }) => i === prev);\n const nextPos =\n currentPos < 0\n ? delta > 0\n ? 0\n : enabled.length - 1\n : (currentPos + delta + enabled.length) % enabled.length;\n return enabled[nextPos].i;\n });\n },\n [filteredOptions],\n );\n\n useEffect(() => {\n if (!isOpen || activeIndex < 0) return;\n const option = filteredOptions[activeIndex];\n if (!option) return;\n const el = document.getElementById(\n `${listboxId}-option-${option.value}`,\n );\n el?.scrollIntoView({ block: 'nearest' });\n }, [isOpen, activeIndex, filteredOptions, listboxId]);\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n const next = e.target.value;\n setInputDisplay(next);\n if (!isOpen) open();\n setActiveIndex(0);\n };\n\n const handleFocus = () => {\n setIsFocused(true);\n open();\n // Select-all so the next keystroke replaces the selected label (filter mode).\n if (!multiple && !isInputControlled && selectedOption) {\n requestAnimationFrame(() => {\n inputRef.current?.select();\n });\n }\n };\n\n const handleBlur = (e: FocusEvent<HTMLInputElement>) => {\n // Delay so option mousedown can run first\n const related = e.relatedTarget as Node | null;\n if (related && rootRef.current?.contains(related)) return;\n setIsFocused(false);\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(-1);\n break;\n case 'Home':\n if (isOpen && filteredOptions.length > 0) {\n e.preventDefault();\n setActiveIndex(\n filteredOptions.findIndex((o) => !o.disabled) >= 0\n ? filteredOptions.findIndex((o) => !o.disabled)\n : 0,\n );\n }\n break;\n case 'End':\n if (isOpen && filteredOptions.length > 0) {\n e.preventDefault();\n for (let i = filteredOptions.length - 1; i >= 0; i--) {\n if (!filteredOptions[i]?.disabled) {\n setActiveIndex(i);\n break;\n }\n }\n }\n break;\n case 'Enter':\n if (isOpen && activeIndex >= 0 && filteredOptions[activeIndex]) {\n e.preventDefault();\n selectOption(filteredOptions[activeIndex]);\n }\n break;\n case 'Escape':\n if (isOpen) {\n e.preventDefault();\n close();\n }\n break;\n case 'Backspace':\n if (\n multiple &&\n displayInput === '' &&\n multiValue.length > 0\n ) {\n e.preventDefault();\n removeValue(multiValue[multiValue.length - 1]);\n }\n break;\n case 'Tab':\n close();\n break;\n default:\n break;\n }\n };\n\n const handleWrapperMouseDown = (e: MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // Don't steal focus from chip remove buttons\n if ((e.target as HTMLElement).closest('button')) return;\n if (e.target !== inputRef.current) {\n e.preventDefault();\n inputRef.current?.focus();\n }\n if (!isOpen) open();\n };\n\n const hasSelection = multiple\n ? multiValue.length > 0\n : singleValue != null && singleValue !== '';\n const hasInputText = displayInput.length > 0;\n const labelFloated = isFocused || isOpen || hasSelection || hasInputText;\n\n const activeOption =\n activeIndex >= 0 ? filteredOptions[activeIndex] : undefined;\n const activeDescendant =\n activeOption != null ? `${listboxId}-option-${activeOption.value}` : undefined;\n\n const selectedOptions = useMemo(\n () => options.filter((o) => multiValue.includes(o.value)),\n [options, multiValue],\n );\n\n const sizeClass = styles[`combobox--size-${toKebab(size)}`];\n const hasChips = multiple && selectedOptions.length > 0;\n const rootClass = [\n styles.combobox,\n sizeClass,\n invalid ? styles['combobox--invalid'] : '',\n label != null && labelFloated ? styles['combobox--label-floated'] : '',\n leadingIcon != null ? styles['combobox--has-leading-icon'] : '',\n hasChips ? styles['combobox--has-chips'] : '',\n isOpen ? styles['combobox--open'] : '',\n disabled ? styles['combobox--disabled'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass} ref={rootRef}>\n <div\n className={styles.combobox__wrapper}\n ref={anchorRef}\n >\n {label != null && (\n <label className={styles.combobox__label} htmlFor={id}>\n {label}\n </label>\n )}\n <div\n className={styles.combobox__inner}\n onMouseDown={handleWrapperMouseDown}\n >\n {leadingIcon != null && (\n <span className={styles.combobox__leadingIcon} aria-hidden>\n {leadingIcon}\n </span>\n )}\n <div className={styles.combobox__value}>\n {multiple &&\n selectedOptions.map((option) => (\n <Chip\n key={option.value}\n size={CHIP_SIZE_BY_COMBOBOX[size]}\n leadingAvatar={option.leadingAvatar}\n leadingIcon={\n option.leadingAvatar == null\n ? option.leadingVisual\n : undefined\n }\n onRemove={\n disabled\n ? undefined\n : (ev) => {\n ev.stopPropagation();\n removeValue(option.value);\n }\n }\n removeLabel={`Remove ${option.label}`}\n >\n {option.label}\n </Chip>\n ))}\n <input\n ref={setInputRef}\n id={id}\n className={styles.combobox__control}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={disabled}\n placeholder={\n multiple && selectedOptions.length > 0\n ? undefined\n : placeholder\n }\n value={displayInput}\n aria-label={ariaLabel}\n aria-invalid={invalid ? true : undefined}\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeDescendant}\n onChange={handleInputChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n />\n </div>\n <span className={styles.combobox__trailingIcon} aria-hidden>\n <Icon size=\"12\" glyph={<ChevronDownIcon />} />\n </span>\n </div>\n </div>\n\n {popupMounted &&\n renderPortal(\n <div\n ref={portalRef}\n className={[\n styles.combobox__popup,\n placement === 'above' ? styles['combobox__popup--above'] : '',\n popupVisible ? styles['combobox__popup--visible'] : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={popupStyle}\n >\n <PopoverMenu className={styles.combobox__menu}>\n <PopoverMenuScroll maxHeight={maxHeight}>\n {filteredOptions.length === 0 ? (\n <p className={styles.combobox__empty}>{emptyMessage}</p>\n ) : (\n <ul\n id={listboxId}\n className={styles.combobox__list}\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n aria-label={\n typeof label === 'string'\n ? label\n : (ariaLabel ?? 'Options')\n }\n >\n {filteredOptions.map((option, index) => {\n const selected = isSelected(option.value);\n const active = index === activeIndex;\n const leading = optionLeadingVisual(option);\n return (\n <li\n key={option.value}\n className={styles.combobox__option}\n role=\"presentation\"\n >\n <MenuItem\n id={`${listboxId}-option-${option.value}`}\n role=\"option\"\n label={option.label}\n secondaryLabel={option.secondaryLabel}\n leadingElement={leading != null}\n leadingVisual={leading}\n trailingElement={selected}\n active={active}\n disabled={option.disabled}\n aria-selected={selected}\n onMouseDown={(ev) => {\n // Prevent input blur before click handler\n ev.preventDefault();\n }}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => selectOption(option)}\n />\n </li>\n );\n })}\n </ul>\n )}\n </PopoverMenuScroll>\n </PopoverMenu>\n </div>,\n )}\n </div>\n );\n});\n\nexport default Combobox;\n","import type { InputHTMLAttributes, KeyboardEvent } from 'react';\nimport { useState, useCallback, useEffect, useId, useRef } from 'react';\nimport Button from '@/components/Button/Button';\nimport IconButton, {\n ICON_BUTTON_ICON_SIZES,\n} from '@/components/IconButton/IconButton';\nimport Icon from '@/components/Icon/Icon';\nimport CalendarOutlineIcon from '@mattermost/compass-icons/components/calendar-outline';\nimport ChevronDownIcon from '@mattermost/compass-icons/components/chevron-down';\nimport ChevronLeftIcon from '@mattermost/compass-icons/components/chevron-left';\nimport ChevronRightIcon from '@mattermost/compass-icons/components/chevron-right';\nimport { useAnchoredPopupPortal } from '@/hooks/useAnchoredPopupPortal';\nimport { useOutsideClose } from '@/hooks/useOutsideClose';\nimport { usePopoverTransition } from '@/hooks/usePopoverTransition';\nimport styles from './DateRangePicker.module.scss';\n\nexport type DateRangePickerMode = 'date' | 'range';\n\nexport interface DateRangePickerProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'type' | 'size'\n> {\n /** Optional CSS class name applied to the root element. */\n className?: string;\n /** Selection mode: single date or range. Default: 'date'. */\n mode?: DateRangePickerMode;\n /** Controlled selected date (single mode). ISO string yyyy-mm-dd. */\n value?: string;\n /** Controlled start date (range mode). ISO string. */\n startDate?: string;\n /** Controlled end date (range mode). ISO string. */\n endDate?: string;\n /** Called when a date is selected (single mode). */\n onChange?: (date: string) => void;\n /** Called when range changes (range mode). */\n onRangeChange?: (start: string, end: string) => void;\n /** Portal mount node for the calendar; defaults to `document.body`. */\n portalContainer?: HTMLElement | null;\n /** Stacking order for the portaled calendar. */\n zIndex?: number;\n}\n\n/** Approximate calendar panel height for the initial flip decision. */\nconst CALENDAR_PREFERRED_HEIGHT = 360;\n\nconst WEEKDAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\n\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nfunction formatDateDisplay(iso: string): string {\n if (!iso) return '';\n const [y, m, d] = iso.split('-');\n return `${m}/${d}/${y}`;\n}\n\nfunction toIso(year: number, month: number, day: number): string {\n return `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n}\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\nfunction getFirstDayOfWeek(year: number, month: number): number {\n return new Date(year, month, 1).getDay();\n}\n\nfunction isSameDay(a: string, b: string): boolean {\n return a === b;\n}\n\nfunction isBetween(date: string, start: string, end: string): boolean {\n if (!start || !end) return false;\n const [s, e] = start < end ? [start, end] : [end, start];\n return date > s && date < e;\n}\n\nfunction dayFromIso(iso: string, year: number, month: number): number | null {\n if (!iso) return null;\n const [y, m, d] = iso.split('-').map(Number);\n if (y === year && m === month + 1) return d;\n return null;\n}\n\n/**\n * DateRangePicker — calendar popover for single date or date-range selection.\n * Month/year nav, today shortcut. Matches Figma Date & Range Picker v2.0.0.\n * Used in boards and admin scheduling.\n */\nexport default function DateRangePicker({\n className = '',\n mode = 'date',\n value,\n startDate,\n endDate,\n onChange,\n onRangeChange,\n disabled,\n id: idProp,\n portalContainer = null,\n zIndex,\n}: DateRangePickerProps) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const popoverId = `${id}-popover`;\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n\n const today = new Date();\n const todayIso = toIso(\n today.getFullYear(),\n today.getMonth(),\n today.getDate(),\n );\n\n // Calendar display state\n const [displayYear, setDisplayYear] = useState(today.getFullYear());\n const [displayMonth, setDisplayMonth] = useState(today.getMonth());\n const [isOpen, setIsOpen] = useState(false);\n /** Roving tabindex day-of-month within the visible grid. */\n const [focusedDay, setFocusedDay] = useState(1);\n\n // Internal selection state (uncontrolled fallback)\n const [internalDate, setInternalDate] = useState('');\n const [internalStart, setInternalStart] = useState('');\n const [internalEnd, setInternalEnd] = useState('');\n\n const selectedDate = value ?? internalDate;\n const selectedStart = startDate ?? internalStart;\n const selectedEnd = endDate ?? internalEnd;\n\n const hasValue =\n mode === 'date' ? Boolean(selectedDate) : Boolean(selectedStart);\n\n const { mounted: popoverMounted, visible: popoverVisible } =\n usePopoverTransition(isOpen);\n\n const {\n placement,\n style: popoverStyle,\n portalRef,\n renderPortal,\n } = useAnchoredPopupPortal(triggerRef, popoverMounted, {\n preferredHeight: CALENDAR_PREFERRED_HEIGHT,\n portalContainer,\n zIndex,\n matchWidth: false,\n });\n\n const close = useCallback((restoreFocus = true) => {\n setIsOpen(false);\n if (restoreFocus) {\n triggerRef.current?.focus();\n }\n }, []);\n\n useOutsideClose(rootRef, isOpen, () => close(true), portalRef);\n\n useEffect(() => {\n if (!isOpen) return;\n function handleKeyDown(e: globalThis.KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n close(true);\n }\n }\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, close]);\n\n // Close when focus leaves the field and the portaled calendar.\n useEffect(() => {\n if (!isOpen) return;\n\n function handleFocusIn(e: FocusEvent) {\n const target = e.target as Node | null;\n if (!target) return;\n if (rootRef.current?.contains(target)) return;\n if (portalRef.current?.contains(target)) return;\n close(false);\n }\n\n document.addEventListener('focusin', handleFocusIn);\n return () => document.removeEventListener('focusin', handleFocusIn);\n }, [isOpen, close, portalRef]);\n\n const daysInMonth = getDaysInMonth(displayYear, displayMonth);\n\n const initialFocusDay = useCallback(() => {\n if (mode === 'date') {\n const fromValue = dayFromIso(selectedDate, displayYear, displayMonth);\n if (fromValue) return fromValue;\n } else {\n const fromEnd = dayFromIso(selectedEnd, displayYear, displayMonth);\n if (fromEnd) return fromEnd;\n const fromStart = dayFromIso(selectedStart, displayYear, displayMonth);\n if (fromStart) return fromStart;\n }\n const fromToday = dayFromIso(todayIso, displayYear, displayMonth);\n if (fromToday) return fromToday;\n return 1;\n }, [\n mode,\n selectedDate,\n selectedStart,\n selectedEnd,\n displayYear,\n displayMonth,\n todayIso,\n ]);\n\n // On open: after the enter transition enables pointer-events, move focus\n // into the day grid (selected day, today, or the 1st).\n useEffect(() => {\n if (!isOpen || !popoverVisible) return;\n const day = initialFocusDay();\n setFocusedDay(day);\n const frame = requestAnimationFrame(() => {\n gridRef.current\n ?.querySelector<HTMLElement>(`[data-day=\"${day}\"]`)\n ?.focus();\n });\n return () => cancelAnimationFrame(frame);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- open/visible transition only\n }, [isOpen, popoverVisible]);\n\n const focusDayButton = useCallback((day: number) => {\n setFocusedDay(day);\n requestAnimationFrame(() => {\n gridRef.current\n ?.querySelector<HTMLElement>(`[data-day=\"${day}\"]`)\n ?.focus();\n });\n }, []);\n\n const handleToggle = useCallback(() => {\n if (disabled) return;\n setIsOpen((open) => !open);\n }, [disabled]);\n\n const handlePrevMonth = useCallback(() => {\n setDisplayMonth((m) => {\n if (m === 0) {\n setDisplayYear((y) => y - 1);\n return 11;\n }\n return m - 1;\n });\n }, []);\n\n const handleNextMonth = useCallback(() => {\n setDisplayMonth((m) => {\n if (m === 11) {\n setDisplayYear((y) => y + 1);\n return 0;\n }\n return m + 1;\n });\n }, []);\n\n const goToAdjacentMonth = useCallback(\n (direction: -1 | 1, preferDay: number) => {\n const nextMonth =\n direction === -1\n ? displayMonth === 0\n ? 11\n : displayMonth - 1\n : displayMonth === 11\n ? 0\n : displayMonth + 1;\n const nextYear =\n direction === -1\n ? displayMonth === 0\n ? displayYear - 1\n : displayYear\n : displayMonth === 11\n ? displayYear + 1\n : displayYear;\n const maxDay = getDaysInMonth(nextYear, nextMonth);\n setDisplayYear(nextYear);\n setDisplayMonth(nextMonth);\n focusDayButton(Math.min(preferDay, maxDay));\n },\n [displayMonth, displayYear, focusDayButton],\n );\n\n const handleToday = useCallback(() => {\n const now = new Date();\n setDisplayYear(now.getFullYear());\n setDisplayMonth(now.getMonth());\n focusDayButton(now.getDate());\n }, [focusDayButton]);\n\n const handleDayClick = useCallback(\n (iso: string, day: number) => {\n if (mode === 'date') {\n if (onChange) {\n onChange(iso);\n } else {\n setInternalDate(iso);\n }\n close(true);\n } else {\n // range mode: first click = start, second = end\n if (!selectedStart || (selectedStart && selectedEnd)) {\n setInternalStart(iso);\n setInternalEnd('');\n setFocusedDay(day);\n } else {\n const [s, e] =\n iso >= selectedStart ? [selectedStart, iso] : [iso, selectedStart];\n if (onRangeChange) {\n onRangeChange(s, e);\n } else {\n setInternalStart(s);\n setInternalEnd(e);\n }\n close(true);\n }\n }\n },\n [mode, selectedStart, selectedEnd, onChange, onRangeChange, close],\n );\n\n const moveFocusedDay = useCallback(\n (delta: number) => {\n const next = focusedDay + delta;\n if (next >= 1 && next <= daysInMonth) {\n focusDayButton(next);\n return;\n }\n if (next < 1) {\n goToAdjacentMonth(-1, getDaysInMonth(\n displayMonth === 0 ? displayYear - 1 : displayYear,\n displayMonth === 0 ? 11 : displayMonth - 1,\n ) + next);\n } else {\n goToAdjacentMonth(1, next - daysInMonth);\n }\n },\n [\n focusedDay,\n daysInMonth,\n displayMonth,\n displayYear,\n focusDayButton,\n goToAdjacentMonth,\n ],\n );\n\n const handleDayKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>, day: number) => {\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n moveFocusedDay(-1);\n break;\n case 'ArrowRight':\n e.preventDefault();\n moveFocusedDay(1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n moveFocusedDay(-7);\n break;\n case 'ArrowDown':\n e.preventDefault();\n moveFocusedDay(7);\n break;\n case 'Home':\n e.preventDefault();\n focusDayButton(1);\n break;\n case 'End':\n e.preventDefault();\n focusDayButton(daysInMonth);\n break;\n case 'PageUp':\n e.preventDefault();\n goToAdjacentMonth(-1, day);\n break;\n case 'PageDown':\n e.preventDefault();\n goToAdjacentMonth(1, day);\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n setFocusedDay(day);\n handleDayClick(toIso(displayYear, displayMonth, day), day);\n break;\n default:\n break;\n }\n },\n [\n moveFocusedDay,\n focusDayButton,\n daysInMonth,\n goToAdjacentMonth,\n handleDayClick,\n displayYear,\n displayMonth,\n ],\n );\n\n const handleTriggerKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n handleToggle();\n break;\n case 'ArrowDown':\n if (!isOpen) {\n e.preventDefault();\n setIsOpen(true);\n }\n break;\n case 'Escape':\n if (isOpen) {\n e.preventDefault();\n close(true);\n }\n break;\n default:\n break;\n }\n },\n [disabled, handleToggle, isOpen, close],\n );\n\n // Keep focusedDay in range when the month changes (nav buttons / PageUp).\n useEffect(() => {\n if (!isOpen) return;\n setFocusedDay((d) => Math.min(Math.max(1, d), daysInMonth));\n }, [isOpen, daysInMonth, displayMonth, displayYear]);\n\n // Build calendar grid\n const firstDay = getFirstDayOfWeek(displayYear, displayMonth);\n\n // Build weeks (rows of 7 cells; null = empty)\n const cells: (number | null)[] = [\n ...Array(firstDay).fill(null),\n ...Array.from({ length: daysInMonth }, (_, i) => i + 1),\n ];\n // Pad to complete last row\n while (cells.length % 7 !== 0) cells.push(null);\n const weeks: (number | null)[][] = [];\n for (let i = 0; i < cells.length; i += 7) weeks.push(cells.slice(i, i + 7));\n\n const displayValue =\n mode === 'date'\n ? formatDateDisplay(selectedDate)\n : selectedStart\n ? `${formatDateDisplay(selectedStart)}${selectedEnd ? ` – ${formatDateDisplay(selectedEnd)}` : ''}`\n : '';\n\n const rootClass = [\n styles.dateRangePicker,\n isOpen ? styles['dateRangePicker--open'] : '',\n disabled ? styles['dateRangePicker--disabled'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div ref={rootRef} className={rootClass}>\n {/* Trigger input */}\n <div\n ref={triggerRef}\n className={styles.dateRangePicker__trigger}\n role=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={popoverMounted ? popoverId : undefined}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : 0}\n id={id}\n data-has-value={hasValue ? '' : undefined}\n onClick={handleToggle}\n onKeyDown={handleTriggerKeyDown}\n >\n <span className={styles.dateRangePicker__calendarIcon} aria-hidden>\n <Icon size=\"16\" glyph={<CalendarOutlineIcon />} />\n </span>\n <span className={styles.dateRangePicker__value}>\n {displayValue || 'mm/dd/yyyy'}\n </span>\n <span className={styles.dateRangePicker__chevron} aria-hidden>\n <Icon size=\"16\" glyph={<ChevronDownIcon />} />\n </span>\n </div>\n\n {/* Calendar popover */}\n {popoverMounted &&\n renderPortal(\n <div\n ref={portalRef}\n id={popoverId}\n className={[\n styles.dateRangePicker__popover,\n placement === 'above'\n ? styles['dateRangePicker__popover--above']\n : '',\n popoverVisible\n ? styles['dateRangePicker__popover--visible']\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={popoverStyle}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label=\"Date picker\"\n >\n {/* Header */}\n <div className={styles.dateRangePicker__header}>\n <span className={styles.dateRangePicker__monthLabel} aria-live=\"polite\">\n {MONTHS[displayMonth]} {displayYear}\n </span>\n <div className={styles.dateRangePicker__headerActions}>\n <Button\n emphasis=\"Quaternary\"\n size=\"Small\"\n leadingIcon={<Icon size=\"16\" glyph={<CalendarOutlineIcon />} />}\n onClick={handleToday}\n >\n Today\n </Button>\n <div className={styles.dateRangePicker__navButtons}>\n <IconButton\n size=\"Medium\"\n padding=\"Compact\"\n icon={\n <Icon\n size={ICON_BUTTON_ICON_SIZES['Medium']}\n glyph={<ChevronLeftIcon />}\n />\n }\n onClick={handlePrevMonth}\n aria-label=\"Previous month\"\n />\n <IconButton\n size=\"Medium\"\n padding=\"Compact\"\n icon={\n <Icon\n size={ICON_BUTTON_ICON_SIZES['Medium']}\n glyph={<ChevronRightIcon />}\n />\n }\n onClick={handleNextMonth}\n aria-label=\"Next month\"\n />\n </div>\n </div>\n </div>\n\n {/* Weekday headers */}\n <div className={styles.dateRangePicker__weekdays} aria-hidden>\n {WEEKDAYS.map((d) => (\n <span key={d} className={styles.dateRangePicker__weekday}>\n {d}\n </span>\n ))}\n </div>\n\n {/* Date grid */}\n <div\n ref={gridRef}\n className={styles.dateRangePicker__grid}\n role=\"grid\"\n aria-label={`${MONTHS[displayMonth]} ${displayYear}`}\n >\n {weeks.map((week, wi) => (\n <div\n key={wi}\n className={styles.dateRangePicker__week}\n role=\"row\"\n >\n {week.map((day, di) => {\n if (day == null) {\n return (\n <span\n key={di}\n className={styles.dateRangePicker__dayEmpty}\n role=\"gridcell\"\n />\n );\n }\n const iso = toIso(displayYear, displayMonth, day);\n const isToday = iso === todayIso;\n const isRangeStart =\n mode === 'range' && isSameDay(iso, selectedStart);\n const isRangeEnd =\n mode === 'range' &&\n Boolean(selectedEnd) &&\n isSameDay(iso, selectedEnd);\n const isSelected =\n mode === 'date'\n ? isSameDay(iso, selectedDate)\n : isRangeStart || isRangeEnd;\n const isInRange =\n mode === 'range' &&\n isBetween(iso, selectedStart, selectedEnd);\n const hasRangeSpan =\n mode === 'range' &&\n Boolean(selectedStart) &&\n Boolean(selectedEnd) &&\n selectedStart !== selectedEnd;\n\n const cellClass = [\n styles.dateRangePicker__dayCell,\n isInRange\n ? styles['dateRangePicker__dayCell--in-range']\n : '',\n hasRangeSpan && isRangeStart\n ? styles['dateRangePicker__dayCell--range-start']\n : '',\n hasRangeSpan && isRangeEnd\n ? styles['dateRangePicker__dayCell--range-end']\n : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const dayClass = [\n styles.dateRangePicker__day,\n isSelected ? styles['dateRangePicker__day--selected'] : '',\n isToday && !isSelected\n ? styles['dateRangePicker__day--today']\n : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div key={di} className={cellClass} role=\"gridcell\">\n <button\n type=\"button\"\n className={dayClass}\n data-day={day}\n tabIndex={focusedDay === day ? 0 : -1}\n onClick={() => handleDayClick(iso, day)}\n onFocus={() => setFocusedDay(day)}\n onKeyDown={(e) => handleDayKeyDown(e, day)}\n aria-label={iso}\n aria-pressed={isSelected}\n aria-current={isToday ? 'date' : undefined}\n >\n {day}\n </button>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>,\n )}\n </div>\n );\n}\n","import styles from './Divider.module.scss';\n\nexport default function Divider() {\n return (\n <div className={styles.divider}>\n <hr className={styles['divider__line']} />\n </div>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport Button from '@/components/Button/Button';\nimport { toKebab } from '@/utils/string';\nimport Icon from '@/components/Icon/Icon';\nimport ChevronDownIcon from '@mattermost/compass-icons/components/chevron-down';\nimport styles from './Dropdown.module.scss';\n\nexport type DropdownSize = 'X-Small' | 'Small' | 'Medium' | 'Large' | 'X-Large';\nexport type DropdownAppearance = 'Default' | 'Inverted';\nexport type DropdownPadding = 'Tight' | 'Compact';\n\nexport interface DropdownProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'size'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** Label text shown in the trigger. */\n children: ReactNode;\n /** Optional leading icon. */\n leadingIcon?: ReactNode;\n /** Trigger inset. Tight is default; Compact adds more padding (Figma). Default: Tight. */\n padding?: DropdownPadding;\n /** Size variant. Default: Medium. */\n size?: DropdownSize;\n /** Light or dark background context. Default: Default. */\n appearance?: DropdownAppearance;\n /** When true, the dropdown is in an open/active state. */\n isOpen?: boolean;\n}\n\n/**\n * Dropdown trigger component — inline select/dropdown button composed with a chevron.\n * Multiple sizes. Light and dark background variants. Composed with Menu Items.\n * Matches Figma Dropdown v2.1.3.\n *\n * @see https://compass.mattermost.com/29be2c109/p/78f994-dropdowns\n */\nexport default function Dropdown({\n className = '',\n children,\n leadingIcon,\n padding = 'Tight',\n size = 'Medium',\n appearance = 'Default',\n isOpen = false,\n disabled,\n type = 'button',\n ...rest\n}: DropdownProps) {\n const sizeClass = styles[`dropdown--size-${toKebab(size)}`];\n const paddingClass =\n padding === 'Compact' ? styles['dropdown--padding-compact'] : '';\n const appearanceClass =\n appearance === 'Inverted' ? styles['dropdown--appearance-inverted'] : '';\n const openClass = isOpen ? styles['dropdown--open'] : '';\n\n const rootClass = [\n styles.dropdown,\n sizeClass,\n paddingClass,\n appearanceClass,\n openClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Button\n className={rootClass}\n emphasis=\"Quaternary\"\n size=\"Medium\"\n type={type}\n disabled={disabled}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n {...rest}\n >\n <span className={styles.dropdown__trigger}>\n <span className={styles.dropdown__content}>\n {leadingIcon != null && (\n <span className={styles.dropdown__leadingIcon} aria-hidden>\n {leadingIcon}\n </span>\n )}\n <span className={styles.dropdown__label}>{children}</span>\n </span>\n <span className={styles.dropdown__chevron} aria-hidden>\n <Icon size=\"12\" glyph={<ChevronDownIcon />} />\n </span>\n </span>\n </Button>\n );\n}\n","import styles from './Emoji.module.scss';\n\nexport type EmojiSize =\n | '10'\n | '12'\n | '16'\n | '20'\n | '24'\n | '28'\n | '32'\n | '40'\n | '52'\n | '64'\n | '104';\n\nexport interface EmojiProps {\n /** Optional CSS class name. */\n className?: string;\n /** Emoji character(s) to display (e.g. \"👍\", \"🎉\"). */\n emoji: string;\n /** Size from the Mattermost icon scale. Default 24. */\n size?: EmojiSize;\n}\n\nconst SIZE_CLASS_MAP: Record<EmojiSize, string> = {\n '10': styles['emoji--size-10'],\n '12': styles['emoji--size-12'],\n '16': styles['emoji--size-16'],\n '20': styles['emoji--size-20'],\n '24': styles['emoji--size-24'],\n '28': styles['emoji--size-28'],\n '32': styles['emoji--size-32'],\n '40': styles['emoji--size-40'],\n '52': styles['emoji--size-52'],\n '64': styles['emoji--size-64'],\n '104': styles['emoji--size-104'],\n};\n\n/**\n * Renders an emoji at a consistent size from the Mattermost icon scale.\n */\nexport default function Emoji({\n className = '',\n emoji,\n size = '24',\n}: EmojiProps) {\n const sizeClass = SIZE_CLASS_MAP[size];\n const rootClass = [\n styles.emoji,\n sizeClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span className={rootClass} role=\"img\" aria-hidden>\n {emoji}\n </span>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './Illustration.module.scss';\n\nexport interface IllustrationProps {\n /** SVG component from an illustration import (e.g. from `@/assets/illustrations/name.svg?react`). */\n children: ReactNode;\n /** Optional CSS class name. */\n className?: string;\n /** Optional inline width (e.g. \"100%\", \"320px\"). */\n width?: string;\n /** Optional inline height. */\n height?: string;\n /** Accessible label; set to empty string for decorative only. */\n 'aria-label'?: string;\n}\n\n/**\n * Wrapper for illustration SVGs. Import SVGs as React components with the ?react suffix\n * and pass them as children.\n *\n * @example\n * import EmptyStateSvg from '@/assets/illustrations/empty-state.svg?react'\n * <Illustration aria-label=\"No items yet\"><EmptyStateSvg /></Illustration>\n */\nexport default function Illustration({\n children,\n className = '',\n width,\n height,\n 'aria-label': ariaLabel,\n}: IllustrationProps) {\n const rootClass = [styles.illustration, className].filter(Boolean).join(' ');\n const hasLabel = ariaLabel !== undefined && ariaLabel !== '';\n\n return (\n <span\n className={rootClass}\n style={{ width, height }}\n role={hasLabel ? 'img' : undefined}\n aria-label={hasLabel ? ariaLabel : undefined}\n aria-hidden={!hasLabel}\n >\n {children}\n </span>\n );\n}\n","import type { ReactNode } from 'react';\nimport Button from '@/components/Button/Button';\nimport type { ButtonProps } from '@/components/Button/Button';\nimport Illustration from '@/components/Illustration/Illustration';\nimport type { IllustrationProps } from '@/components/Illustration/Illustration';\nimport Scrollbar from '@/components/Scrollbar/Scrollbar';\nimport styles from './EmptyState.module.scss';\n\nexport interface EmptyStateProps {\n /** Illustration props (children = the SVG component). Rendered above the title. */\n illustration?: IllustrationProps;\n /** Main heading text. */\n title: string;\n /** Body description. Supports ReactNode for inline formatting. */\n description?: ReactNode;\n /** Button props (children = label). Rendered below the description. */\n action?: ButtonProps;\n /** Optional CSS class name. */\n className?: string;\n}\n\n/**\n * Empty State — illustration + message shown when a view has no content.\n * ~12 context-specific variants: no saved messages, no mentions, no results, no files, etc.\n *\n * @see https://compass.mattermost.com\n */\nexport default function EmptyState({\n illustration,\n title,\n description,\n action,\n className = '',\n}: EmptyStateProps) {\n return (\n <Scrollbar\n className={[styles['empty-state'], className].filter(Boolean).join(' ')}\n >\n <div className={styles['empty-state__container']}>\n {illustration != null && (\n <div className={styles['empty-state__illustration']}>\n <Illustration {...illustration} />\n </div>\n )}\n <div className={styles['empty-state__titles']}>\n <h2 className={styles['empty-state__title']}>{title}</h2>\n {description != null && (\n <p className={styles['empty-state__description']}>{description}</p>\n )}\n </div>\n {action != null && (\n <div className={styles['empty-state__action']}>\n <Button {...action} />\n </div>\n )}\n </div>\n </Scrollbar>\n );\n}\n","import Icon from '@/components/Icon/Icon';\nimport AlertCircleOutlineIcon from '@mattermost/compass-icons/components/alert-circle-outline';\nimport styles from './ErrorMessage.module.scss';\n\nexport interface ErrorMessageProps {\n /** Optional CSS class name. */\n className?: string;\n /** The error message text to display. */\n message: string;\n}\n\n/**\n * Error Message — inline red error text for form validation.\n * Displays an error icon alongside the message. Used below form inputs.\n */\nexport default function ErrorMessage({\n className = '',\n message,\n}: ErrorMessageProps) {\n const rootClass = [styles['error-message'], className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass} role=\"alert\">\n <span className={styles['error-message__icon']} aria-hidden>\n <Icon size=\"12\" glyph={<AlertCircleOutlineIcon />} />\n </span>\n <span className={styles['error-message__text']}>{message}</span>\n </div>\n );\n}\n","import Button from '@/components/Button/Button';\nimport type { ButtonProps } from '@/components/Button/Button';\nimport Icon from '@/components/Icon/Icon';\nimport Illustration from '@/components/Illustration/Illustration';\nimport type { IllustrationProps } from '@/components/Illustration/Illustration';\nimport Tag from '@/components/Tag/Tag';\nimport MattermostIcon from '@mattermost/compass-icons/components/mattermost';\nimport styles from './FeatureDiscoveryPanel.module.scss';\n\nexport interface FeatureDiscoveryPanelProps {\n /** SKU tag label (e.g. \"PROFESSIONAL\"). Set to null to hide. */\n skuLabel?: string | null;\n /** Panel heading title. */\n title: string;\n /** Body description text. */\n description: string;\n /** Primary CTA button props (children = label). */\n primaryAction?: ButtonProps;\n /** Secondary CTA button props (children = label). */\n secondaryAction?: ButtonProps;\n /** Illustration props (children = the SVG component). Rendered in the right column. */\n illustration?: IllustrationProps;\n /** Optional CSS class name. */\n className?: string;\n}\n\n/**\n * Feature Discovery Panel — highlights capabilities only available in higher-tier SKUs.\n * Contains an illustration, SKU tag, title, description, and CTA buttons.\n *\n * @see https://compass.mattermost.com/29be2c109/p/865664-feature-discovery-panel\n */\nexport default function FeatureDiscoveryPanel({\n skuLabel = 'PROFESSIONAL',\n title,\n description,\n primaryAction,\n secondaryAction,\n illustration,\n className = '',\n}: FeatureDiscoveryPanelProps) {\n return (\n <div\n className={[styles['feature-discovery-panel'], className]\n .filter(Boolean)\n .join(' ')}\n >\n <div className={styles['feature-discovery-panel__content']}>\n <div className={styles['feature-discovery-panel__text']}>\n <div className={styles['feature-discovery-panel__title-group']}>\n {skuLabel != null && (\n <Tag\n label={skuLabel}\n casing=\"All Caps\"\n leadingIcon={<Icon size=\"10\" glyph={<MattermostIcon />} />}\n />\n )}\n <h2 className={styles['feature-discovery-panel__title']}>\n {title}\n </h2>\n </div>\n <p className={styles['feature-discovery-panel__description']}>\n {description}\n </p>\n </div>\n\n {(primaryAction != null || secondaryAction != null) && (\n <div className={styles['feature-discovery-panel__actions']}>\n {primaryAction != null && (\n <div className={styles['feature-discovery-panel__action']}>\n <Button size=\"Medium\" {...primaryAction} />\n </div>\n )}\n {secondaryAction != null && (\n <div className={styles['feature-discovery-panel__action']}>\n <Button size=\"Medium\" {...secondaryAction} />\n </div>\n )}\n </div>\n )}\n </div>\n\n {illustration != null && (\n <div className={styles['feature-discovery-panel__illustration']}>\n <Illustration {...illustration} />\n </div>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport Button from '@/components/Button/Button';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Icon from '@/components/Icon/Icon';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport styles from './GlobalBanner.module.scss';\n\nexport type GlobalBannerType =\n | 'General'\n | 'Warning'\n | 'Danger'\n | 'Info'\n | 'Success';\n\nexport interface GlobalBannerProps {\n /** Optional CSS class name. */\n className?: string;\n /** The message text. */\n message: string;\n /** Optional type for color-coding. Default: General. */\n type?: GlobalBannerType;\n /** Optional leading icon. */\n leadingIcon?: ReactNode;\n /** Label for the optional action button. */\n actionLabel?: string;\n /** Callback when the action button is clicked. */\n onAction?: () => void;\n /** Called when dismiss button is clicked. When omitted, dismiss button is hidden. */\n onDismiss?: () => void;\n}\n\n/**\n * Global Banner — full-width persistent banner at the top of the app.\n * Used for system alerts: maintenance, license, updates.\n * Fixed 40px height. Dismissable.\n */\nexport default function GlobalBanner({\n className = '',\n message,\n type = 'General',\n leadingIcon,\n actionLabel,\n onAction,\n onDismiss,\n}: GlobalBannerProps) {\n const typeClass =\n type !== 'General'\n ? styles[`global-banner--type-${type.toLowerCase()}`]\n : '';\n\n const rootClass = [styles['global-banner'], typeClass, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass} role=\"banner\">\n <div className={styles['global-banner__content']}>\n {leadingIcon != null && (\n <span className={styles['global-banner__icon']} aria-hidden>\n {leadingIcon}\n </span>\n )}\n <span className={styles['global-banner__message']}>{message}</span>\n {actionLabel != null && (\n <Button\n className={styles['global-banner__action']}\n appearance=\"Default\"\n emphasis=\"Tertiary\"\n size=\"X-Small\"\n onClick={onAction}\n >\n {actionLabel}\n </Button>\n )}\n </div>\n {onDismiss != null && (\n <IconButton\n className={styles['global-banner__dismiss']}\n aria-label=\"Dismiss\"\n size=\"Small\"\n icon={<Icon glyph={<CloseIcon />} size=\"16\" />}\n onClick={onDismiss}\n />\n )}\n </div>\n );\n}\n","import ProductsIcon from '@mattermost/compass-icons/components/products';\nimport ProductChannelsIcon from '@mattermost/compass-icons/components/product-channels';\nimport ProductPlaybooksIcon from '@mattermost/compass-icons/components/product-playbooks';\nimport ProductBoardsIcon from '@mattermost/compass-icons/components/product-boards';\nimport ArrowLeftIcon from '@mattermost/compass-icons/components/arrow-left';\nimport ArrowRightIcon from '@mattermost/compass-icons/components/arrow-right';\nimport MagnifyIcon from '@mattermost/compass-icons/components/magnify';\nimport HelpCircleOutlineIcon from '@mattermost/compass-icons/components/help-circle-outline';\nimport CogOutlineIcon from '@mattermost/compass-icons/components/cog-outline';\nimport AtIcon from '@mattermost/compass-icons/components/at';\nimport BookmarkOutlineIcon from '@mattermost/compass-icons/components/bookmark-outline';\nimport CheckboxMultipleMarkedOutlineIcon from '@mattermost/compass-icons/components/checkbox-multiple-marked-outline';\nimport Button from '@/components/Button/Button';\nimport Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport UserAvatar from '@/components/UserAvatar/UserAvatar';\nimport type { ComponentType } from 'react';\nimport styles from './GlobalHeader.module.scss';\n\nexport type GlobalHeaderProduct = 'Channels' | 'Playbooks' | 'Boards';\n\nexport interface GlobalHeaderProps {\n /** Optional CSS class name. */\n className?: string;\n /** Product context. Controls branding + right-side controls. Default: Channels. */\n product?: GlobalHeaderProduct;\n /** When true and product is Channels, shows the Channels product icon + label. */\n showChannelsBranding?: boolean;\n /** When true, shows the Upgrade button in the right controls. */\n showUpgradeButton?: boolean;\n /** URL for the signed-in user avatar. Omit for initials fallback. */\n userAvatarSrc?: string;\n /** Alt text for the signed-in user avatar. */\n userAvatarAlt?: string;\n}\n\nconst PRODUCT_ICON: Record<\n GlobalHeaderProduct,\n ComponentType<{ size?: number }>\n> = {\n Channels: ProductChannelsIcon,\n Playbooks: ProductPlaybooksIcon,\n Boards: ProductBoardsIcon,\n};\n\nfunction InvertedIconButton({\n ariaLabel,\n glyph,\n}: {\n ariaLabel: string;\n glyph: React.ReactNode;\n}) {\n return (\n <IconButton\n aria-label={ariaLabel}\n size=\"Small\"\n padding=\"Compact\"\n style=\"Inverted\"\n icon={<Icon size=\"16\" glyph={glyph} />}\n />\n );\n}\n\nfunction ProductBrand({ product }: { product: GlobalHeaderProduct }) {\n const ProductIcon = PRODUCT_ICON[product];\n return (\n <div className={styles['global-header__product']}>\n <span className={styles['global-header__product-icon']} aria-hidden>\n <Icon size=\"20\" glyph={<ProductIcon />} />\n </span>\n <span className={styles['global-header__product-name']}>{product}</span>\n </div>\n );\n}\n\nfunction Navigator() {\n return (\n <div className={styles['global-header__navigator']}>\n <InvertedIconButton ariaLabel=\"Back\" glyph={<ArrowLeftIcon />} />\n <InvertedIconButton ariaLabel=\"Forward\" glyph={<ArrowRightIcon />} />\n </div>\n );\n}\n\n/**\n * Global Header pattern — top bar spanning the full viewport that contains\n * the product switcher, product branding, navigator, and session-level\n * controls (search, mentions, saved, settings, account).\n *\n * Layout uses a three-column CSS grid for Channels (left | centered search + help | session)\n * so session controls stay anchored to the trailing edge. Playbooks/Boards omit the center\n * column and use two tracks (left product block | session).\n *\n * Matches Figma Global Header v1.2.1 (node 613:4135).\n */\nexport default function GlobalHeader({\n className = '',\n product = 'Channels',\n showChannelsBranding = true,\n showUpgradeButton = false,\n userAvatarSrc,\n userAvatarAlt = 'User',\n}: GlobalHeaderProps) {\n const isChannels = product === 'Channels';\n const showBrand = isChannels ? showChannelsBranding : true;\n\n const rootClass = [\n styles['global-header'],\n isChannels\n ? styles['global-header--channels']\n : styles['global-header--product-only'],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <header className={rootClass}>\n <div className={styles['global-header__left']}>\n <InvertedIconButton\n ariaLabel=\"Product switcher\"\n glyph={<ProductsIcon />}\n />\n {showBrand && <ProductBrand product={product} />}\n <Navigator />\n </div>\n\n {isChannels && (\n <div className={styles['global-header__center']}>\n <div className={styles['global-header__search']}>\n <span className={styles['global-header__search-icon']} aria-hidden>\n <Icon size=\"12\" glyph={<MagnifyIcon />} />\n </span>\n <input\n type=\"search\"\n className={styles['global-header__search-input']}\n placeholder=\"Search\"\n aria-label=\"Search\"\n />\n </div>\n <InvertedIconButton\n ariaLabel=\"Help\"\n glyph={<HelpCircleOutlineIcon />}\n />\n </div>\n )}\n\n <div className={styles['global-header__right']}>\n {showUpgradeButton && (\n <Button emphasis=\"Primary\" size=\"X-Small\">\n Upgrade\n </Button>\n )}\n {product === 'Playbooks' && (\n <InvertedIconButton\n ariaLabel=\"Tasks\"\n glyph={<CheckboxMultipleMarkedOutlineIcon />}\n />\n )}\n {isChannels && (\n <>\n <InvertedIconButton\n ariaLabel=\"Recent mentions\"\n glyph={<AtIcon />}\n />\n <InvertedIconButton\n ariaLabel=\"Saved messages\"\n glyph={<BookmarkOutlineIcon />}\n />\n </>\n )}\n {!isChannels && (\n <InvertedIconButton\n ariaLabel=\"Help\"\n glyph={<HelpCircleOutlineIcon />}\n />\n )}\n <InvertedIconButton ariaLabel=\"Settings\" glyph={<CogOutlineIcon />} />\n <button\n className={styles['global-header__account']}\n aria-label=\"Account menu\"\n >\n <UserAvatar\n src={userAvatarSrc}\n alt={userAvatarAlt}\n size=\"24\"\n status\n />\n </button>\n </div>\n </header>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport AlertOutlineIcon from '@mattermost/compass-icons/components/alert-outline';\nimport FileTextOutlineIcon from '@mattermost/compass-icons/components/file-text-outline';\nimport HelpCircleOutlineIcon from '@mattermost/compass-icons/components/help-circle-outline';\nimport KeyboardOutlineIcon from '@mattermost/compass-icons/components/keyboard-outline';\nimport LightbulbOutlineIcon from '@mattermost/compass-icons/components/lightbulb-outline';\nimport Icon from '@/components/Icon/Icon';\nimport MenuItem from '@/components/MenuItem/MenuItem';\nimport PopoverMenu, {\n PopoverMenuGroup,\n} from '@/components/PopoverMenu/PopoverMenu';\n\nexport interface HelpMenuProps extends HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Global header help menu — docs, community, and shortcuts.\n */\nexport default function HelpMenu({\n className = '',\n style,\n ...rest\n}: HelpMenuProps) {\n return (\n <PopoverMenu\n className={className}\n style={{ width: '232px', ...style }}\n {...rest}\n >\n <PopoverMenuGroup>\n <MenuItem\n label=\"Mattermost user guide\"\n leadingVisual={<Icon glyph={<FileTextOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Training resources\"\n leadingVisual={<Icon glyph={<LightbulbOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Ask the community\"\n leadingVisual={<Icon glyph={<HelpCircleOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Report a problem\"\n leadingVisual={<Icon glyph={<AlertOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Keyboard shortcuts\"\n leadingVisual={<Icon glyph={<KeyboardOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n </PopoverMenu>\n );\n}\n","import Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport { usePopoverTransition } from '@/hooks/usePopoverTransition';\nimport LinkVariantIcon from '@mattermost/compass-icons/components/link-variant';\nimport DownloadOutlineIcon from '@mattermost/compass-icons/components/download-outline';\nimport MenuDownIcon from '@mattermost/compass-icons/components/menu-down';\nimport MenuRightIcon from '@mattermost/compass-icons/components/menu-right';\nimport styles from './ImagePreview.module.scss';\n\nexport type ImagePreviewAspectRatio = '16:9' | '4:3' | '1:1';\n\nexport interface ImagePreviewProps {\n /** Image src URL. */\n src: string;\n /** Alt text. */\n alt?: string;\n /** Whether the preview is collapsed (shows toggle label only). */\n collapsed?: boolean;\n /** Callback when the collapse toggle is clicked. */\n onToggleCollapse?: () => void;\n /** Callback when the copy-link action is clicked. */\n onCopyLink?: () => void;\n /** Callback when the download action is clicked. */\n onDownload?: () => void;\n /** Aspect ratio of the image container. Default: 16:9 */\n aspectRatio?: ImagePreviewAspectRatio;\n /** Optional CSS class name. */\n className?: string;\n}\n\n/**\n * Image preview / lightbox for viewing attached images. Supports collapsed\n * state and hover action overlay (copy link, download). Corresponds to Figma\n * Image Preview v1.0.0.\n */\nexport default function ImagePreview({\n src,\n alt = '',\n collapsed = false,\n onToggleCollapse,\n onCopyLink,\n onDownload,\n aspectRatio = '16:9',\n className = '',\n}: ImagePreviewProps) {\n const frameTransition = usePopoverTransition(!collapsed);\n const labelTransition = usePopoverTransition(collapsed);\n\n const rootClass = [\n styles['image-preview'],\n collapsed ? styles['image-preview--collapsed'] : '',\n aspectRatio === '4:3' ? styles['image-preview--ratio-4-3'] : '',\n aspectRatio === '1:1' ? styles['image-preview--ratio-1-1'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass}>\n <div className={styles['image-preview__stage']}>\n {labelTransition.mounted && (\n <button\n type=\"button\"\n className={[\n styles['image-preview__collapsed-trigger'],\n labelTransition.visible\n ? styles['image-preview__collapsed-trigger--visible']\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={onToggleCollapse}\n aria-label=\"Show image preview\"\n >\n <span className={styles['image-preview__show-label']}>\n <span\n className={styles['image-preview__show-icon']}\n aria-hidden=\"true\"\n >\n <Icon size=\"12\" glyph={<MenuRightIcon />} />\n </span>\n Show Image preview\n </span>\n </button>\n )}\n\n {frameTransition.mounted && (\n <div\n className={[\n styles['image-preview__frame'],\n frameTransition.visible\n ? styles['image-preview__frame--visible']\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div className={styles['image-preview__media']}>\n <img src={src} alt={alt} className={styles['image-preview__img']} />\n </div>\n\n <div className={styles['image-preview__actions']}>\n {onCopyLink != null && (\n <IconButton\n size=\"Small\"\n padding=\"Compact\"\n aria-label=\"Copy link\"\n icon={<Icon size=\"16\" glyph={<LinkVariantIcon />} />}\n onClick={onCopyLink}\n />\n )}\n {onDownload != null && (\n <IconButton\n size=\"Small\"\n padding=\"Compact\"\n aria-label=\"Download\"\n icon={<Icon size=\"16\" glyph={<DownloadOutlineIcon />} />}\n onClick={onDownload}\n />\n )}\n </div>\n\n {onToggleCollapse != null && (\n <button\n type=\"button\"\n className={styles['image-preview__collapse-btn']}\n onClick={onToggleCollapse}\n aria-label=\"Collapse image preview\"\n >\n <Icon size=\"16\" glyph={<MenuDownIcon />} />\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport ImagePreview from '@/components/ImagePreview/ImagePreview';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport styles from './LinkPreview.module.scss';\n\nexport type LinkPreviewImageSize = 'none' | 'small' | 'large';\n\nexport interface LinkPreviewProps {\n /** The site/domain label shown above the title. */\n siteName?: string;\n /** The main link title. */\n title?: string;\n /** Description text. */\n description?: string;\n /** Preview image URL. Pair with `imageSize` to choose layout. */\n imageSrc?: string;\n /** Alt text for the preview image. */\n imageAlt?: string;\n /** Small: square thumbnail on the right. Large: ImagePreview below text. */\n imageSize?: LinkPreviewImageSize;\n /** Whether the large image preview is collapsed. Only applies when `imageSize` is `large`. */\n imageCollapsed?: boolean;\n /** Callback when the large image collapse toggle is clicked. */\n onToggleImageCollapse?: () => void;\n /** Callback when copy-link is clicked on the large image preview. */\n onCopyImageLink?: () => void;\n /** Callback when download is clicked on the large image preview. */\n onDownloadImage?: () => void;\n /** Called when the dismiss control is clicked. Shown on hover when provided. */\n onDismiss?: () => void;\n /** Optional CSS class name. */\n className?: string;\n}\n\n/**\n * Rich URL preview card shown in messages. Displays site name, title (linked),\n * and description. Corresponds to the Figma Link Preview component v2.0.0.\n */\nexport default function LinkPreview({\n siteName = 'Mattermost.com',\n title = 'Mattermost: Open-source, high-trust, developer-centric collaboration platform',\n description = 'Mattermost is a secure, open source platform for communication, collaboration, and workflow orchestration across tools and teams.',\n imageSrc,\n imageAlt = '',\n imageSize = 'none',\n imageCollapsed = false,\n onToggleImageCollapse,\n onCopyImageLink,\n onDownloadImage,\n onDismiss,\n className = '',\n}: LinkPreviewProps) {\n const resolvedImageSize =\n imageSrc != null && imageSize === 'none' ? 'large' : imageSize;\n const hasSmallImage = resolvedImageSize === 'small' && imageSrc != null;\n const hasLargeImage = resolvedImageSize === 'large' && imageSrc != null;\n\n const rootClass = [styles['link-preview'], className]\n .filter(Boolean)\n .join(' ');\n\n const cardClass = [\n styles['link-preview__card'],\n hasSmallImage ? styles['link-preview__card--small-image'] : '',\n hasLargeImage && !imageCollapsed\n ? styles['link-preview__card--large-image']\n : '',\n hasLargeImage && imageCollapsed\n ? styles['link-preview__card--collapsed-image']\n : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass}>\n {onDismiss != null && (\n <>\n <div\n className={styles['link-preview__dismiss-bridge']}\n aria-hidden\n />\n <IconButton\n className={styles['link-preview__dismiss']}\n size=\"X-Small\"\n padding=\"Compact\"\n aria-label=\"Remove link preview\"\n icon={<Icon size=\"12\" glyph={<CloseIcon />} />}\n onClick={onDismiss}\n />\n </>\n )}\n\n <div className={cardClass}>\n <div className={styles['link-preview__text']}>\n <p className={styles['link-preview__site-name']}>{siteName}</p>\n <p className={styles['link-preview__title']}>{title}</p>\n <p className={styles['link-preview__description']}>{description}</p>\n </div>\n\n {hasSmallImage && (\n <div className={styles['link-preview__thumbnail']}>\n <img\n src={imageSrc}\n alt={imageAlt}\n className={styles['link-preview__thumbnail-img']}\n />\n </div>\n )}\n\n {hasLargeImage && (\n <ImagePreview\n className={styles['link-preview__image-preview']}\n src={imageSrc}\n alt={imageAlt}\n collapsed={imageCollapsed}\n onToggleCollapse={onToggleImageCollapse}\n onCopyLink={onCopyImageLink}\n onDownload={onDownloadImage}\n />\n )}\n </div>\n </div>\n );\n}\n","import Tag from '@/components/Tag/Tag';\nimport styles from './MessageHeader.module.scss';\n\ntype MessageHeaderProps = {\n username: string;\n timestamp: string;\n isBot?: boolean;\n botLabel?: string;\n};\n\nexport default function MessageHeader({\n username,\n timestamp,\n isBot = false,\n botLabel = 'Bot',\n}: MessageHeaderProps) {\n return (\n <div className={styles['message-header']}>\n <span className={styles['message-header__username']}>{username}</span>\n {isBot && <Tag label={botLabel} />}\n <span className={styles['message-header__timestamp']}>{timestamp}</span>\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport Emoji from '@/components/Emoji/Emoji';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Icon from '@/components/Icon/Icon';\nimport EmoticonPlusOutlineIcon from '@mattermost/compass-icons/components/emoticon-plus-outline';\nimport DotsHorizontalIcon from '@mattermost/compass-icons/components/dots-horizontal';\nimport BookmarkOutlineIcon from '@mattermost/compass-icons/components/bookmark-outline';\nimport CreationOutlineIcon from '@mattermost/compass-icons/components/creation-outline';\nimport AppsIcon from '@mattermost/compass-icons/components/apps';\nimport ReplyOutlineIcon from '@mattermost/compass-icons/components/reply-outline';\nimport styles from './MessageActions.module.scss';\n\nexport type MessageActionsType = 'Center Channel' | 'RHS' | 'Search Results';\n\nexport interface MessageActionsProps extends HTMLAttributes<HTMLDivElement> {\n /** Context variant. Default: Center Channel. */\n type?: MessageActionsType;\n /** Whether the hover toolbar is visible. Default: true. */\n visible?: boolean;\n /** Whether collapsed reply threads feature is on. Default: true. */\n collapsedReplyThreads?: boolean;\n /** Whether quick reactions are shown. Default: true. */\n quickReactions?: boolean;\n /** Optional CSS class name. */\n className?: string;\n}\n\n/**\n * Hover toolbar on messages. Context-aware variants for Center Channel, RHS,\n * and Search Results. Quick Reactions toggle shows emoji shortcuts.\n */\nexport default function MessageActions({\n type = 'Center Channel',\n visible = true,\n collapsedReplyThreads = true,\n quickReactions = true,\n className = '',\n ...rest\n}: MessageActionsProps) {\n if (!visible) return null;\n\n const isCenterChannel = type === 'Center Channel';\n const isRHS = type === 'RHS';\n const isSearchResults = type === 'Search Results';\n const showQuickReactions = quickReactions && collapsedReplyThreads;\n\n const rootClass = [styles['message-actions'], className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n className={rootClass}\n role=\"toolbar\"\n aria-label=\"Message actions\"\n {...rest}\n >\n {/* Quick reaction emojis — center channel + RHS */}\n {showQuickReactions && !isSearchResults && (\n <>\n <IconButton\n aria-label=\"React with thumbs up\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Emoji emoji=\"👍\" size=\"16\" />}\n />\n {isCenterChannel && (\n <>\n <IconButton\n aria-label=\"React with raised hands\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Emoji emoji=\"🙌\" size=\"16\" />}\n />\n <IconButton\n aria-label=\"React with OK hand\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Emoji emoji=\"👌\" size=\"16\" />}\n />\n </>\n )}\n <IconButton\n aria-label=\"Add reaction\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Icon size=\"16\" glyph={<EmoticonPlusOutlineIcon />} />}\n />\n </>\n )}\n\n {/* Search results only: more button first */}\n {isSearchResults && (\n <IconButton\n aria-label=\"More actions\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Icon size=\"16\" glyph={<DotsHorizontalIcon />} />}\n />\n )}\n\n {/* Center channel actions */}\n {isCenterChannel && (\n <>\n <IconButton\n aria-label=\"Save message\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Icon size=\"16\" glyph={<BookmarkOutlineIcon />} />}\n />\n <IconButton\n aria-label=\"AI actions\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Icon size=\"16\" glyph={<CreationOutlineIcon />} />}\n />\n <IconButton\n aria-label=\"Plugin actions\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Icon size=\"16\" glyph={<AppsIcon />} />}\n />\n <IconButton\n aria-label=\"Reply in thread\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Icon size=\"16\" glyph={<ReplyOutlineIcon />} />}\n />\n <IconButton\n aria-label=\"More actions\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Icon size=\"16\" glyph={<DotsHorizontalIcon />} />}\n />\n </>\n )}\n\n {/* RHS actions */}\n {isRHS && (\n <IconButton\n aria-label=\"More actions\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Icon size=\"16\" glyph={<DotsHorizontalIcon />} />}\n />\n )}\n\n {/* Search results additional buttons */}\n {isSearchResults && (\n <>\n <IconButton\n aria-label=\"Save message\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Icon size=\"16\" glyph={<BookmarkOutlineIcon />} />}\n />\n <IconButton\n aria-label=\"Reply in thread\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Icon size=\"16\" glyph={<ReplyOutlineIcon />} />}\n />\n <button\n type=\"button\"\n className={styles['message-actions__jump']}\n aria-label=\"Jump to message\"\n >\n Jump\n </button>\n </>\n )}\n </div>\n );\n}\n","import PinOutlineIcon from '@mattermost/compass-icons/components/pin-outline';\nimport BookmarkOutlineIcon from '@mattermost/compass-icons/components/bookmark-outline';\nimport Icon from '@/components/Icon/Icon';\nimport styles from './PinnedSavedIndicators.module.scss';\n\nexport interface PinnedSavedIndicatorsProps {\n /** Optional CSS class on the root. */\n className?: string;\n}\n\n/**\n * Pinned + Saved row shown above a message when applicable (Patterns — Message).\n */\nexport default function PinnedSavedIndicators({\n className = '',\n}: PinnedSavedIndicatorsProps) {\n const rootClass = [styles['pinned-saved-indicators'], className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass} aria-label=\"Pinned and Saved\">\n <div className={styles['pinned-saved-indicators__icons']}>\n <Icon size=\"12\" glyph={<PinOutlineIcon />} aria-hidden />\n <Icon size=\"12\" glyph={<BookmarkOutlineIcon />} aria-hidden />\n </div>\n <div className={styles['pinned-saved-indicators__labels']}>\n <span className={styles['pinned-saved-indicators__label']}>Pinned</span>\n <span className={styles['pinned-saved-indicators__sep']} aria-hidden>\n •\n </span>\n <span className={styles['pinned-saved-indicators__label']}>Saved</span>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport UserAvatar from '@/components/UserAvatar/UserAvatar';\nimport MessageHeader from '@/components/MessageHeader/MessageHeader';\nimport MessageActions from '@/components/MessageActions/MessageActions';\nimport type { MessageActionsType } from '@/components/MessageActions/MessageActions';\nimport PinnedSavedIndicators from '@/components/PinnedSavedIndicators/PinnedSavedIndicators';\nimport styles from './Message.module.scss';\n\ntype MessageProps = {\n avatarSrc?: string;\n avatarAlt: string;\n username: string;\n timestamp: string;\n isBot?: boolean;\n botLabel?: string;\n /** Hover toolbar context. Default: Center Channel. */\n messageActionsType?: MessageActionsType;\n /** When false, the hover Message Actions toolbar is omitted. Default: true. */\n showMessageActions?: boolean;\n /** When true, Pinned + Saved row appears at the top of the message container. */\n showPinnedSavedIndicators?: boolean;\n /** Merged onto the root element (e.g. documentation modifiers). */\n className?: string;\n /**\n * Primary body content (e.g. message text). When using structured slots, this\n * is usually the markdown/text block only. For plain `<p>` copy, use the\n * `message__body-text` class from `Message.module.scss` so typography matches\n * the component and host shells (docs, patterns) cannot restyle bare tags.\n */\n children: React.ReactNode;\n /** Link Preview block — renders after `children`. */\n linkPreview?: React.ReactNode;\n /** Image Preview block(s) — renders after the link preview slot. */\n imagePreviews?: React.ReactNode;\n /** Trailing body content — e.g. attachments and reactions — renders last. */\n footer?: React.ReactNode;\n};\n\nexport default function Message({\n avatarSrc,\n avatarAlt,\n username,\n timestamp,\n isBot = false,\n botLabel,\n messageActionsType = 'Center Channel',\n showMessageActions = true,\n showPinnedSavedIndicators = false,\n className = '',\n children,\n linkPreview,\n imagePreviews,\n footer,\n}: MessageProps) {\n const rootClass = [styles.message, className].filter(Boolean).join(' ');\n\n return (\n <div className={rootClass}>\n {showPinnedSavedIndicators && (\n <div className={styles['message__pinned']}>\n <PinnedSavedIndicators />\n </div>\n )}\n <div className={styles['message__layout']}>\n <div className={styles['message__avatar-col']}>\n <UserAvatar src={avatarSrc} alt={avatarAlt} size=\"32\" />\n </div>\n <div className={styles['message__content']}>\n <div className={styles['message__header-row']}>\n <div className={styles['message__header-block']}>\n <MessageHeader\n username={username}\n timestamp={timestamp}\n isBot={isBot}\n botLabel={botLabel}\n />\n </div>\n {showMessageActions && (\n <div className={styles['message__actions-slot']}>\n <MessageActions type={messageActionsType} />\n </div>\n )}\n </div>\n <div className={styles['message__body']}>\n {children}\n {linkPreview != null && (\n <div className={styles['message__link-preview-slot']}>\n {linkPreview}\n </div>\n )}\n {imagePreviews != null && (\n <div className={styles['message__images-slot']}>{imagePreviews}</div>\n )}\n {footer != null && (\n <div className={styles['message__footer-slot']}>{footer}</div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useState, useRef, useCallback } from 'react';\nimport AlertCircleOutlineIcon from '@mattermost/compass-icons/components/alert-circle-outline';\nimport ChevronDownIcon from '@mattermost/compass-icons/components/chevron-down';\nimport ChevronUpIcon from '@mattermost/compass-icons/components/chevron-up';\nimport DotsHorizontalIcon from '@mattermost/compass-icons/components/dots-horizontal';\nimport CodeTagsIcon from '@mattermost/compass-icons/components/code-tags';\nimport CreationOutlineIcon from '@mattermost/compass-icons/components/creation-outline';\nimport EmoticonHappyOutlineIcon from '@mattermost/compass-icons/components/emoticon-happy-outline';\nimport EyeOutlineIcon from '@mattermost/compass-icons/components/eye-outline';\nimport FireIcon from '@mattermost/compass-icons/components/fire';\nimport FormatBoldIcon from '@mattermost/compass-icons/components/format-bold';\nimport FormatHeaderIcon from '@mattermost/compass-icons/components/format-header';\nimport FormatItalicIcon from '@mattermost/compass-icons/components/format-italic';\nimport FormatLetterCaseIcon from '@mattermost/compass-icons/components/format-letter-case';\nimport FormatListBulletedIcon from '@mattermost/compass-icons/components/format-list-bulleted';\nimport FormatListNumberedIcon from '@mattermost/compass-icons/components/format-list-numbered';\nimport FormatQuoteOpenIcon from '@mattermost/compass-icons/components/format-quote-open';\nimport FormatStrikethroughVariantIcon from '@mattermost/compass-icons/components/format-strikethrough-variant';\nimport LinkVariantIcon from '@mattermost/compass-icons/components/link-variant';\nimport PaperclipIcon from '@mattermost/compass-icons/components/paperclip';\nimport SendIcon from '@mattermost/compass-icons/components/send';\nimport Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Tag from '@/components/Tag/Tag';\nimport AttachmentCard from '@/components/AttachmentCard/AttachmentCard';\nimport styles from './MessageInput.module.scss';\n\nexport type MessageInputWidth = 'wide' | 'narrow';\n\nexport interface MessageInputProps {\n className?: string;\n placeholder?: string;\n showPriorityIndicator?: boolean;\n showAttachments?: boolean;\n value?: string;\n onChange?: (value: string) => void;\n onSelectionChange?: () => void;\n inputRef?: React.RefObject<HTMLTextAreaElement | null>;\n /** `narrow` matches the Figma Message Input “Narrow” / right-sidebar layout. */\n width?: MessageInputWidth;\n}\n\nexport default function MessageInput({\n className = '',\n placeholder = 'Message channel…',\n showPriorityIndicator = false,\n showAttachments = false,\n value,\n onChange,\n onSelectionChange,\n inputRef,\n width = 'wide',\n}: MessageInputProps) {\n const [internalText, setInternalText] = useState('');\n const isControlled = value !== undefined;\n const text = isControlled ? value : internalText;\n const setText = (next: string) => {\n if (isControlled) onChange?.(next);\n else setInternalText(next);\n };\n const [formattingOpen, setFormattingOpen] = useState(false);\n const internalRef = useRef<HTMLTextAreaElement>(null);\n\n const setTextareaRef = (node: HTMLTextAreaElement | null) => {\n internalRef.current = node;\n if (inputRef) {\n (inputRef as React.MutableRefObject<HTMLTextAreaElement | null>).current = node;\n }\n };\n\n const handleInput = useCallback(() => {\n const el = internalRef.current;\n if (!el) return;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n }, []);\n\n useEffect(() => {\n handleInput();\n }, [text, handleInput]);\n\n const hasSendValue = text.trim().length > 0;\n\n const cls = (base: string, mod?: string) =>\n [styles[base], mod ? styles[mod] : ''].filter(Boolean).join(' ');\n\n const isNarrowFormattingOpen = width === 'narrow' && formattingOpen;\n const showWideFormattingBar = formattingOpen && width === 'wide';\n\n const composerActions = (\n <>\n <button\n type=\"button\"\n className={cls(\n 'message-input__format-btn',\n formattingOpen ? 'message-input__format-btn--active' : '',\n )}\n aria-label={\n formattingOpen\n ? 'Hide formatting toolbar'\n : 'Show formatting toolbar'\n }\n aria-pressed={formattingOpen}\n onClick={() => setFormattingOpen((prev) => !prev)}\n >\n <Icon glyph={<FormatLetterCaseIcon />} size=\"16\" />\n {isNarrowFormattingOpen ? (\n <span className={styles['message-input__format-chevron']}>\n <Icon glyph={<ChevronUpIcon />} size=\"12\" />\n </span>\n ) : (\n <span\n className={cls(\n 'message-input__format-chevron',\n formattingOpen ? 'message-input__format-chevron--rotated' : '',\n )}\n >\n <Icon glyph={<ChevronDownIcon />} size=\"12\" />\n </span>\n )}\n </button>\n\n <span\n className={styles['message-input__actions-divider']}\n aria-hidden\n />\n\n <IconButton\n icon={<Icon glyph={<PaperclipIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Attach a file\"\n />\n <IconButton\n icon={<Icon glyph={<EmoticonHappyOutlineIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Add an emoji\"\n />\n\n <div\n className={cls(\n 'message-input__send',\n !hasSendValue ? 'message-input__send--disabled' : '',\n )}\n >\n <button\n type=\"button\"\n className={styles['message-input__send-main']}\n aria-label=\"Send message\"\n disabled={!hasSendValue}\n >\n <Icon glyph={<SendIcon />} size=\"16\" />\n </button>\n <button\n type=\"button\"\n className={styles['message-input__send-dropdown']}\n aria-label=\"Send options\"\n disabled={!hasSendValue}\n >\n <Icon glyph={<ChevronDownIcon />} size=\"16\" />\n </button>\n </div>\n </>\n );\n\n const rootClass = [\n styles['message-input'],\n width === 'narrow' ? styles['message-input--width-narrow'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass}>\n <div\n className={cls(\n 'message-input__container',\n formattingOpen ? 'message-input__container--formatting-open' : '',\n )}\n >\n {/* Preview button — fades in when formatting is open */}\n <button\n type=\"button\"\n className={cls(\n 'message-input__preview-btn',\n formattingOpen ? 'message-input__preview-btn--visible' : '',\n )}\n aria-label=\"Preview\"\n tabIndex={formattingOpen ? 0 : -1}\n >\n <Icon glyph={<EyeOutlineIcon />} size=\"16\" />\n </button>\n\n {/* Main text area */}\n <div\n className={cls(\n 'message-input__body',\n formattingOpen ? 'message-input__body--formatting-open' : '',\n )}\n >\n {showPriorityIndicator && (\n <div className={styles['message-input__priority-row']}>\n <Tag\n label=\"IMPORTANT\"\n type=\"Info\"\n size=\"X-Small\"\n casing=\"All Caps\"\n leadingIcon={\n <Icon glyph={<AlertCircleOutlineIcon />} size=\"10\" />\n }\n />\n </div>\n )}\n <textarea\n ref={setTextareaRef}\n className={styles['message-input__textarea']}\n placeholder={placeholder}\n value={text}\n onChange={(e) => setText(e.target.value)}\n onInput={handleInput}\n onSelect={onSelectionChange}\n onKeyUp={onSelectionChange}\n onClick={onSelectionChange}\n rows={1}\n />\n </div>\n\n {/* Attachment cards */}\n {showAttachments && (\n <div className={styles['message-input__attachments']}>\n <div className={styles['message-input__attachments-list']}>\n <AttachmentCard\n fileName=\"Design_Brief.pdf\"\n fileMeta=\"PDF 240KB\"\n fileType=\"pdf\"\n state=\"default\"\n onRemove={() => {}}\n />\n <AttachmentCard\n fileName=\"Wireframes_v3.png\"\n fileMeta=\"PNG 1.2MB\"\n fileType=\"image-icon\"\n state=\"default\"\n onRemove={() => {}}\n />\n </div>\n </div>\n )}\n\n {/* Formatting toolbar — full bar (wide only); narrow uses collapsed strip in footer */}\n <div\n className={cls(\n 'message-input__formatting-bar',\n showWideFormattingBar ? 'message-input__formatting-bar--open' : '',\n )}\n aria-hidden={!showWideFormattingBar}\n >\n <div className={styles['message-input__toolbar-controls']}>\n {/* Style */}\n <div className={styles['message-input__toolbar-group']}>\n <IconButton\n icon={<Icon glyph={<FormatBoldIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Bold\"\n />\n <IconButton\n icon={<Icon glyph={<FormatItalicIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Italic\"\n />\n <IconButton\n icon={\n <Icon glyph={<FormatStrikethroughVariantIcon />} size=\"16\" />\n }\n size=\"Small\"\n aria-label=\"Strikethrough\"\n />\n <IconButton\n icon={<Icon glyph={<FormatHeaderIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Heading\"\n />\n </div>\n\n <span\n className={styles['message-input__toolbar-divider']}\n aria-hidden\n />\n\n {/* Links + Code */}\n <div className={styles['message-input__toolbar-group']}>\n <IconButton\n icon={<Icon glyph={<LinkVariantIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Add link\"\n />\n <IconButton\n icon={<Icon glyph={<CodeTagsIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Code\"\n />\n </div>\n\n <span\n className={styles['message-input__toolbar-divider']}\n aria-hidden\n />\n\n {/* Paragraph */}\n <div className={styles['message-input__toolbar-group']}>\n <IconButton\n icon={<Icon glyph={<FormatQuoteOpenIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Quote\"\n />\n <IconButton\n icon={<Icon glyph={<FormatListBulletedIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Bulleted list\"\n />\n <IconButton\n icon={<Icon glyph={<FormatListNumberedIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Numbered list\"\n />\n </div>\n\n <span\n className={styles['message-input__toolbar-divider']}\n aria-hidden\n />\n\n {/* Tools */}\n <div className={styles['message-input__toolbar-group']}>\n <IconButton\n icon={<Icon glyph={<AlertCircleOutlineIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Message priority\"\n />\n <IconButton\n icon={<Icon glyph={<FireIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Burn on read\"\n />\n <IconButton\n icon={<Icon glyph={<CreationOutlineIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"AI assistance\"\n />\n </div>\n </div>\n </div>\n\n {width === 'narrow' ? (\n <div className={styles['message-input__narrow-chrome']}>\n <div className={styles['message-input__narrow-chrome-left']}>\n {formattingOpen && (\n <div className={styles['message-input__formatting-collapsed']}>\n <IconButton\n icon={<Icon glyph={<FormatBoldIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Bold\"\n />\n <IconButton\n icon={<Icon glyph={<FormatItalicIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Italic\"\n />\n <IconButton\n icon={<Icon glyph={<LinkVariantIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"Add link\"\n />\n <IconButton\n icon={<Icon glyph={<DotsHorizontalIcon />} size=\"16\" />}\n size=\"Small\"\n aria-label=\"More formatting options\"\n />\n </div>\n )}\n </div>\n <div\n className={[\n styles['message-input__actions'],\n styles['message-input__actions--narrow-chrome'],\n ].join(' ')}\n >\n {composerActions}\n </div>\n </div>\n ) : (\n <div className={styles['message-input__actions']}>{composerActions}</div>\n )}\n </div>\n </div>\n );\n}\n","import styles from './ShortcutTag.module.scss';\n\nexport type ShortcutTagSize = 'Small' | 'Medium' | 'Large';\nexport type ShortcutTagLocation = 'Default' | 'Tooltips';\n\nexport type ShortcutTagProps = {\n /** Key label (e.g. `⌘`, `Shift`, `K`). */\n label: string;\n size?: ShortcutTagSize;\n /** Default for menus and light surfaces; Tooltips for dark overlays. */\n location?: ShortcutTagLocation;\n className?: string;\n};\n\nconst SIZE_CLASS: Record<ShortcutTagSize, string> = {\n Small: styles['shortcut-tag__key--size-small'],\n Medium: styles['shortcut-tag__key--size-medium'],\n Large: styles['shortcut-tag__key--size-large'],\n};\n\nconst LOCATION_CLASS: Record<ShortcutTagLocation, string> = {\n Default: styles['shortcut-tag__key--location-default'],\n Tooltips: styles['shortcut-tag__key--location-tooltips'],\n};\n\n/**\n * Keyboard shortcut key chip for menus, tooltips, and popovers.\n *\n * @see Figma Shortcut Tag (Source: xkm54Q9IQcyo3c0pGeNIMH)\n */\nexport default function ShortcutTag({\n label,\n size = 'Small',\n location = 'Default',\n className = '',\n}: ShortcutTagProps) {\n const rootClass = [\n styles['shortcut-tag__key'],\n SIZE_CLASS[size],\n LOCATION_CLASS[location],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return <kbd className={rootClass}>{label}</kbd>;\n}\n\nexport type ShortcutTagGroupProps = {\n /** Individual key labels (e.g. `['Ctrl', 'K']`). */\n labels: string[];\n size?: ShortcutTagSize;\n location?: ShortcutTagLocation;\n className?: string;\n};\n\n/** Inline row of shortcut tags for prose and notice copy. */\nexport function ShortcutTagGroup({\n labels,\n size = 'Small',\n location = 'Default',\n className = '',\n}: ShortcutTagGroupProps) {\n const groupClass = [styles['shortcut-tag-group'], className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span className={groupClass}>\n {labels.map((label, index) => (\n <ShortcutTag\n key={`${label}-${index}`}\n label={label}\n size={size}\n location={location}\n />\n ))}\n </span>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport ArrowRightBoldOutlineIcon from '@mattermost/compass-icons/components/arrow-right-bold-outline';\nimport BookmarkOutlineIcon from '@mattermost/compass-icons/components/bookmark-outline';\nimport ChevronRightIcon from '@mattermost/compass-icons/components/chevron-right';\nimport ClockOutlineIcon from '@mattermost/compass-icons/components/clock-outline';\nimport ContentCopyIcon from '@mattermost/compass-icons/components/content-copy';\nimport FlagOutlineIcon from '@mattermost/compass-icons/components/flag-outline';\nimport LinkVariantIcon from '@mattermost/compass-icons/components/link-variant';\nimport MarkAsUnreadIcon from '@mattermost/compass-icons/components/mark-as-unread';\nimport MessageCheckOutlineIcon from '@mattermost/compass-icons/components/message-check-outline';\nimport PencilOutlineIcon from '@mattermost/compass-icons/components/pencil-outline';\nimport PinOutlineIcon from '@mattermost/compass-icons/components/pin-outline';\nimport ReplyOutlineIcon from '@mattermost/compass-icons/components/reply-outline';\nimport TranslateIcon from '@mattermost/compass-icons/components/translate';\nimport TrashCanOutlineIcon from '@mattermost/compass-icons/components/trash-can-outline';\nimport Icon from '@/components/Icon/Icon';\nimport MenuItem from '@/components/MenuItem/MenuItem';\nimport PopoverMenu, {\n PopoverMenuDivider,\n PopoverMenuGroup,\n} from '@/components/PopoverMenu/PopoverMenu';\nimport ShortcutTag from '@/components/ShortcutTag/ShortcutTag';\n\nexport interface MessageMoreOptionsMenuProps\n extends HTMLAttributes<HTMLDivElement> {\n /** Shows Edit and Delete rows. Default: true. */\n permissionToEdit?: boolean;\n /** Shows Flag message row. Default: true. */\n showFlagOption?: boolean;\n}\n\nfunction shortcutLabel(text: string) {\n return <ShortcutTag label={text} size=\"Small\" />;\n}\n\n/**\n * Message “more options” menu — actions with keyboard hints, optional edit/flag.\n */\nexport default function MessageMoreOptionsMenu({\n permissionToEdit = true,\n showFlagOption = true,\n className = '',\n style,\n ...rest\n}: MessageMoreOptionsMenuProps) {\n return (\n <PopoverMenu\n className={className}\n style={{ width: '236px', ...style }}\n {...rest}\n >\n <PopoverMenuGroup>\n <MenuItem\n label=\"Reply\"\n leadingVisual={<Icon glyph={<ReplyOutlineIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={shortcutLabel('R')}\n />\n <MenuItem\n label=\"Forward\"\n leadingVisual={\n <Icon glyph={<ArrowRightBoldOutlineIcon />} size=\"16\" />\n }\n trailingElement\n trailingVisual={shortcutLabel('Shift + F')}\n />\n <MenuItem\n label=\"Follow thread\"\n leadingVisual={<Icon glyph={<MessageCheckOutlineIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={shortcutLabel('F')}\n />\n <MenuItem\n label=\"Mark as unread\"\n leadingVisual={<Icon glyph={<MarkAsUnreadIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={shortcutLabel('U')}\n />\n <MenuItem\n label=\"Save\"\n leadingVisual={<Icon glyph={<BookmarkOutlineIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={shortcutLabel('S')}\n />\n <MenuItem\n label=\"Remind\"\n leadingVisual={<Icon glyph={<ClockOutlineIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={<Icon glyph={<ChevronRightIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Pin to channel\"\n leadingVisual={<Icon glyph={<PinOutlineIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={shortcutLabel('P')}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Copy text\"\n leadingVisual={<Icon glyph={<ContentCopyIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={shortcutLabel('C')}\n />\n <MenuItem\n label=\"Show translation\"\n leadingVisual={<Icon glyph={<TranslateIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Copy link\"\n leadingVisual={<Icon glyph={<LinkVariantIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={shortcutLabel('K')}\n />\n </PopoverMenuGroup>\n {permissionToEdit && (\n <>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Edit\"\n leadingVisual={<Icon glyph={<PencilOutlineIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={shortcutLabel('E')}\n />\n <MenuItem\n label=\"Delete\"\n destructive\n leadingVisual={<Icon glyph={<TrashCanOutlineIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={shortcutLabel('delete')}\n />\n </PopoverMenuGroup>\n </>\n )}\n {showFlagOption && (\n <>\n {!permissionToEdit && <PopoverMenuDivider />}\n <PopoverMenuGroup>\n <MenuItem\n label=\"Flag message\"\n destructive\n leadingVisual={<Icon glyph={<FlagOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n </>\n )}\n </PopoverMenu>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Icon from '@/components/Icon/Icon';\nimport CheckCircleOutlineIcon from '@mattermost/compass-icons/components/check-circle-outline';\nimport EmoticonPlusOutlineIcon from '@mattermost/compass-icons/components/emoticon-plus-outline';\nimport styles from './MessageReactions.module.scss';\n\nexport interface ReactionItem {\n emoji: string;\n count: number;\n /** Whether the current user reacted with this emoji. */\n byCurrentUser?: boolean;\n}\n\nexport interface MessageReactionsProps extends HTMLAttributes<HTMLDivElement> {\n /** List of reactions to display. */\n reactions?: ReactionItem[];\n /** Whether to show the add-reaction button. Default: false. */\n showAddReaction?: boolean;\n /** Whether to show the acknowledge button. */\n acknowledged?: boolean;\n /** Acknowledge count. */\n acknowledgeCount?: number;\n /** Whether the current user has acknowledged. Default: false. */\n currentUserAcknowledged?: boolean;\n /** Called when add-reaction is clicked. */\n onAddReaction?: () => void;\n /** Called when a reaction pill is clicked. */\n onReactionClick?: (emoji: string) => void;\n /** Called when the acknowledge button is clicked. */\n onAcknowledge?: () => void;\n /** Optional CSS class name. */\n className?: string;\n}\n\nconst DEFAULT_REACTIONS: ReactionItem[] = [\n { emoji: '👍', count: 1 },\n { emoji: '😀', count: 4 },\n { emoji: '🙌', count: 1 },\n];\n\n/**\n * Emoji reaction chips displayed below messages.\n * Distinguishes the current user's own reactions (highlighted) from others.\n * Includes an add-reaction button and an optional Acknowledge variant.\n */\nexport default function MessageReactions({\n reactions = DEFAULT_REACTIONS,\n showAddReaction = false,\n acknowledged = false,\n acknowledgeCount = 0,\n currentUserAcknowledged = false,\n onAddReaction,\n onReactionClick,\n onAcknowledge,\n className = '',\n ...rest\n}: MessageReactionsProps) {\n const rootClass = [styles['message-reactions'], className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass} {...rest}>\n {/* Acknowledge button */}\n {acknowledged && (\n <button\n type=\"button\"\n className={[\n styles['message-reactions__ack'],\n currentUserAcknowledged\n ? styles['message-reactions__ack--active']\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={onAcknowledge}\n aria-pressed={currentUserAcknowledged}\n aria-label=\"Acknowledge message\"\n >\n <span className={styles['message-reactions__ack-icon']} aria-hidden>\n <Icon size=\"16\" glyph={<CheckCircleOutlineIcon />} />\n </span>\n {currentUserAcknowledged ? (\n <span className={styles['message-reactions__ack-count']}>\n {acknowledgeCount}\n </span>\n ) : (\n <span className={styles['message-reactions__ack-label']}>\n Acknowledge\n </span>\n )}\n </button>\n )}\n\n {/* Reaction pills */}\n <div className={styles['message-reactions__pills']}>\n {reactions.map(({ emoji, count, byCurrentUser }) => (\n <button\n key={emoji}\n type=\"button\"\n className={[\n styles['message-reactions__pill'],\n byCurrentUser ? styles['message-reactions__pill--mine'] : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onReactionClick?.(emoji)}\n aria-label={`${emoji} ${count} reaction${count !== 1 ? 's' : ''}`}\n aria-pressed={byCurrentUser}\n >\n <span\n className={styles['message-reactions__pill-emoji']}\n aria-hidden\n >\n {emoji}\n </span>\n <span className={styles['message-reactions__pill-count']}>\n {count}\n </span>\n </button>\n ))}\n\n {/* Add reaction button */}\n {showAddReaction && (\n <IconButton\n aria-label=\"Add reaction\"\n className={styles['message-reactions__add-reaction']}\n size=\"X-Small\"\n onClick={onAddReaction}\n icon={<Icon size=\"16\" glyph={<EmoticonPlusOutlineIcon />} />}\n />\n )}\n </div>\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport Icon from '@/components/Icon/Icon';\nimport CreationOutlineIcon from '@mattermost/compass-icons/components/creation-outline';\nimport styles from './MessageSeparator.module.scss';\n\nexport type MessageSeparatorType = 'Date' | 'New Messages' | 'Reply Count';\n\nexport interface MessageSeparatorProps extends HTMLAttributes<HTMLDivElement> {\n /** Separator variant. Default: Date. */\n type?: MessageSeparatorType;\n /** Label text. Defaults: 'Today' / 'New Messages' / '4 replies'. */\n label?: string;\n /** Show AI summarize button (New Messages type only). Default: false. */\n showAiSummary?: boolean;\n /** Called when Summarize button is clicked. */\n onSummarize?: () => void;\n /** Optional CSS class name. */\n className?: string;\n}\n\nconst DEFAULT_LABELS: Record<MessageSeparatorType, string> = {\n Date: 'Today',\n 'New Messages': 'New Messages',\n 'Reply Count': '4 replies',\n};\n\n/**\n * Horizontal divider lines in the message stream.\n * Three types: date separator, new-message indicator (gold), and reply count.\n */\nexport default function MessageSeparator({\n type = 'Date',\n label,\n showAiSummary = false,\n onSummarize,\n className = '',\n ...rest\n}: MessageSeparatorProps) {\n const displayLabel = label ?? DEFAULT_LABELS[type];\n\n const rootClass = [\n styles['message-separator'],\n styles[\n `message-separator--${type === 'New Messages' ? 'new' : type === 'Reply Count' ? 'reply' : 'date'}`\n ],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const labelBlock = (\n <div className={styles['message-separator__label']}>\n <span className={styles['message-separator__text']}>\n {displayLabel}\n </span>\n\n {type === 'New Messages' && showAiSummary && (\n <button\n type=\"button\"\n className={styles['message-separator__summarize']}\n onClick={onSummarize}\n aria-label=\"Summarize new messages with AI\"\n >\n <span\n className={styles['message-separator__summarize-icon']}\n aria-hidden\n >\n <Icon size=\"12\" glyph={<CreationOutlineIcon />} />\n </span>\n Summarize\n </button>\n )}\n </div>\n );\n\n return (\n <div className={rootClass} role=\"separator\" {...rest}>\n {type === 'Reply Count' ? (\n <>\n <div className={styles['message-separator__reply-gutter']} aria-hidden>\n <div className={styles['message-separator__reply-line-start']} />\n </div>\n {labelBlock}\n <div className={styles['message-separator__line']} aria-hidden />\n </>\n ) : (\n <>\n <div className={styles['message-separator__line']} aria-hidden />\n {labelBlock}\n <div className={styles['message-separator__line']} aria-hidden />\n </>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useId } from 'react';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Icon from '@/components/Icon/Icon';\nimport Scrollbar from '@/components/Scrollbar/Scrollbar';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport ArrowLeftIcon from '@mattermost/compass-icons/components/arrow-left';\nimport { toKebab } from '@/utils/string';\nimport styles from './Modal.module.scss';\n\nexport type ModalSize = 'Small' | 'Medium' | 'Large';\n\nexport interface ModalProps {\n /** Width variant. Figma: Size — Small 600px, Medium 704px, Large 832px. */\n size?: ModalSize;\n /** Modal heading text. Always visible. */\n title: ReactNode;\n /** Optional secondary line below the title. */\n subtitle?: ReactNode;\n /** When true, shows a back-arrow button before the title. */\n showBackButton?: boolean;\n /** Called when the back button is clicked. */\n onBack?: () => void;\n /** Called when the × close button is clicked. */\n onClose?: () => void;\n /** Show divider between header and body. Figma: Divider = On. Default: true. */\n headerDivider?: boolean;\n /** Body content. */\n children: ReactNode;\n /** Footer slot — typically a group of Buttons, right-aligned by default. */\n footer?: ReactNode;\n /** Show divider between body and footer. Figma: Divider = On. Default: true. */\n footerDivider?: boolean;\n}\n\nexport default function Modal({\n size = 'Small',\n title,\n subtitle,\n showBackButton = false,\n onBack,\n onClose,\n headerDivider = true,\n children,\n footer,\n footerDivider = true,\n}: ModalProps) {\n const titleId = useId();\n const sizeClass = styles[`modal--size-${toKebab(size)}`];\n\n return (\n <div\n className={[styles.modal, sizeClass].filter(Boolean).join(' ')}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n >\n <div\n className={[\n styles['modal__header'],\n !headerDivider && styles['modal__header--no-divider'],\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div className={styles['modal__header-inner']}>\n {showBackButton && (\n <IconButton\n aria-label=\"Go back\"\n icon={<Icon glyph={<ArrowLeftIcon />} size=\"20\" />}\n onClick={onBack}\n />\n )}\n <div className={styles['modal__title-group']}>\n <h2 id={titleId} className={styles['modal__title']}>\n {title}\n </h2>\n {subtitle && (\n <p className={styles['modal__subtitle']}>{subtitle}</p>\n )}\n </div>\n </div>\n <IconButton\n aria-label=\"Close\"\n className={styles['modal__close']}\n icon={<Icon glyph={<CloseIcon />} size=\"20\" />}\n onClick={onClose}\n />\n </div>\n\n <div className={styles['modal__body']}>\n <Scrollbar>\n <div className={styles['modal__body-inner']}>{children}</div>\n </Scrollbar>\n </div>\n\n {footer && (\n <div\n className={[\n styles['modal__footer'],\n !footerDivider && styles['modal__footer--no-divider'],\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {footer}\n </div>\n )}\n </div>\n );\n}\n","import Icon from '@/components/Icon/Icon';\nimport ArrowDownIcon from '@mattermost/compass-icons/components/arrow-down';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport styles from './NewMessageBanner.module.scss';\n\nexport type NewMessageBannerType = 'JumpToUnreads' | 'NewReplies';\n\nexport interface NewMessageBannerProps {\n /** Optional CSS class name. */\n className?: string;\n /** Type controls the layout. Default: JumpToUnreads. */\n type?: NewMessageBannerType;\n /** Unread count label text (e.g. \"21 new messages since Saturday\"). Used in JumpToUnreads type. */\n countLabel?: string;\n /** Called when the banner itself is clicked. */\n onClick?: () => void;\n /** Called when the dismiss (×) button is clicked. */\n onDismiss?: () => void;\n}\n\n/**\n * New Message Banner — blue pill banner for unread message navigation.\n * 'Jump to unreads' shows full-width with count. 'New replies' is compact.\n * Dismissable with X button.\n */\nexport default function NewMessageBanner({\n className = '',\n type = 'JumpToUnreads',\n countLabel,\n onClick,\n onDismiss,\n}: NewMessageBannerProps) {\n const typeClass =\n styles[\n `new-message-banner--type-${type === 'JumpToUnreads' ? 'jump-to-unreads' : 'new-replies'}`\n ];\n\n const rootClass = [\n styles['new-message-banner'],\n typeClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass}>\n <button\n className={styles['new-message-banner__main']}\n type=\"button\"\n onClick={onClick}\n aria-label={\n type === 'JumpToUnreads'\n ? countLabel != null\n ? `Jump to unreads, ${countLabel}`\n : 'Jump to unreads'\n : undefined\n }\n >\n <span className={styles['new-message-banner__left']}>\n <span className={styles['new-message-banner__icon']} aria-hidden>\n <Icon size=\"16\" glyph={<ArrowDownIcon />} />\n </span>\n <span className={styles['new-message-banner__jump-label']}>\n {type === 'JumpToUnreads' ? 'Jump to unreads' : 'New replies'}\n </span>\n </span>\n </button>\n {type === 'JumpToUnreads' && countLabel != null && (\n <span className={styles['new-message-banner__count']} aria-hidden>\n {countLabel}\n </span>\n )}\n {onDismiss != null && (\n <button\n className={styles['new-message-banner__dismiss']}\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n >\n <Icon size=\"16\" glyph={<CloseIcon />} />\n </button>\n )}\n </div>\n );\n}\n","import styles from './PaginationDots.module.scss';\n\nexport type PaginationDotsOrientation = 'Horizontal' | 'Vertical';\nexport type PaginationDotsStyle = 'Default' | 'Inverted' | 'OnPrimary';\n\nexport interface PaginationDotsProps {\n /** Total number of pages/steps. */\n pages: number;\n /** Currently active page (1-indexed). */\n activePage: number;\n /** Layout orientation. Default: Horizontal. */\n orientation?: PaginationDotsOrientation;\n /** Color style. Default: Default. */\n dotStyle?: PaginationDotsStyle;\n /** Called when a dot is clicked. Receives the 1-indexed page number. */\n onPageChange?: (page: number) => void;\n /** Optional CSS class name. */\n className?: string;\n}\n\n/**\n * Pagination Dots — step/progress indicator dots for multi-step flows.\n * Horizontal and vertical orientations. Default, inverted (sidebar), and\n * on-primary (light dots on `--button-bg` / info surfaces via `--button-color`).\n * Used in onboarding wizards.\n */\nexport default function PaginationDots({\n pages,\n activePage,\n orientation = 'Horizontal',\n dotStyle = 'Default',\n onPageChange,\n className = '',\n}: PaginationDotsProps) {\n const isVertical = orientation === 'Vertical';\n const isInverted = dotStyle === 'Inverted';\n const isOnPrimary = dotStyle === 'OnPrimary';\n\n const orientationClass = isVertical\n ? styles['pagination-dots--vertical']\n : styles['pagination-dots--horizontal'];\n const styleClass = isInverted\n ? styles['pagination-dots--inverted']\n : isOnPrimary\n ? styles['pagination-dots--on-primary']\n : '';\n\n return (\n <div\n className={[\n styles['pagination-dots'],\n orientationClass,\n styleClass,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n role=\"tablist\"\n aria-label=\"Pages\"\n >\n {Array.from({ length: pages }, (_, i) => {\n const page = i + 1;\n const isActive = page === activePage;\n const dotClass = [\n styles['pagination-dots__dot'],\n isActive ? styles['pagination-dots__dot--active'] : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n key={page}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`Page ${page}`}\n className={styles['pagination-dots__item']}\n onClick={() => onPageChange?.(page)}\n >\n <span className={dotClass} />\n </button>\n );\n })}\n </div>\n );\n}\n","import UserAvatar from '@/components/UserAvatar/UserAvatar';\nimport MessageHeader from '@/components/MessageHeader/MessageHeader';\nimport Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport styles from './PermalinkPreview.module.scss';\n\nexport interface PermalinkPreviewProps {\n /** Sender's display name. */\n authorName?: string;\n /** Avatar image src. */\n avatarSrc: string;\n /** Timestamp label. */\n timestamp?: string;\n /** The quoted message body text. */\n messageText?: string;\n /** \"Originally posted in ~Channel\" footer text. */\n originalChannel?: string;\n /** Called when the dismiss control is clicked. Shown on hover when provided. */\n onDismiss?: () => void;\n /** Optional CSS class name. */\n className?: string;\n}\n\n/**\n * Inline preview of a linked message within a thread or channel. Shows sender\n * avatar, name, timestamp, and message content. Corresponds to Figma\n * Permalink Preview v1.0.0.\n */\nexport default function PermalinkPreview({\n authorName = 'Leonard Riley',\n avatarSrc,\n timestamp = '10:43 AM',\n messageText = 'At eu sed tristique gravida et fames vel pellentesque. Urna phasellus integer eu tempor mauris amet sagittis. Mollis risus mi felis magna.',\n originalChannel = '~Desktop App',\n onDismiss,\n className = '',\n}: PermalinkPreviewProps) {\n const rootClass = [styles['permalink-preview'], className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass}>\n {onDismiss != null && (\n <>\n <div\n className={styles['permalink-preview__dismiss-bridge']}\n aria-hidden\n />\n <IconButton\n className={styles['permalink-preview__dismiss']}\n size=\"X-Small\"\n padding=\"Compact\"\n aria-label=\"Remove permalink preview\"\n icon={<Icon size=\"12\" glyph={<CloseIcon />} />}\n onClick={onDismiss}\n />\n </>\n )}\n\n <div className={styles['permalink-preview__card']}>\n <div className={styles['permalink-preview__message']}>\n <div className={styles['permalink-preview__header']}>\n <UserAvatar src={avatarSrc} alt={authorName} size=\"24\" />\n <MessageHeader username={authorName} timestamp={timestamp} />\n </div>\n <div className={styles['permalink-preview__body']}>\n <p className={styles['permalink-preview__text']}>{messageText}</p>\n </div>\n </div>\n <p className={styles['permalink-preview__origin']}>\n Originally posted in {originalChannel}\n </p>\n </div>\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport AccountOutlineIcon from '@mattermost/compass-icons/components/account-outline';\nimport AccountPlusOutlineIcon from '@mattermost/compass-icons/components/account-plus-outline';\nimport FolderPlusOutlineIcon from '@mattermost/compass-icons/components/folder-plus-outline';\nimport GlobeIcon from '@mattermost/compass-icons/components/globe';\nimport PlusIcon from '@mattermost/compass-icons/components/plus';\nimport Icon from '@/components/Icon/Icon';\nimport MenuItem from '@/components/MenuItem/MenuItem';\nimport PopoverMenu, {\n PopoverMenuDivider,\n PopoverMenuGroup,\n} from '@/components/PopoverMenu/PopoverMenu';\n\nexport interface PlusMenuProps extends HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Channel sidebar “+” menu — browse/create channels, DM, category, invite.\n */\nexport default function PlusMenu({\n className = '',\n style,\n ...rest\n}: PlusMenuProps) {\n return (\n <PopoverMenu\n className={className}\n style={{ width: '260px', ...style }}\n {...rest}\n >\n <PopoverMenuGroup>\n <MenuItem\n label=\"Browse channels\"\n leadingVisual={<Icon glyph={<GlobeIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Create new channel\"\n leadingVisual={<Icon glyph={<PlusIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Open a direct message\"\n leadingVisual={<Icon glyph={<AccountOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Create new category\"\n leadingVisual={<Icon glyph={<FolderPlusOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Invite people\"\n secondaryLabel=\"Add or invite people to team\"\n leadingVisual={<Icon glyph={<AccountPlusOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n </PopoverMenu>\n );\n}\n","import type { ReactNode } from 'react';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport InformationOutlineIcon from '@mattermost/compass-icons/components/information-outline';\nimport CheckCircleOutlineIcon from '@mattermost/compass-icons/components/check-circle-outline';\nimport AlertCircleOutlineIcon from '@mattermost/compass-icons/components/alert-circle-outline';\nimport AlertOutlineIcon from '@mattermost/compass-icons/components/alert-outline';\nimport Button from '@/components/Button/Button';\nimport Checkbox from '@/components/Checkbox/Checkbox';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Icon from '@/components/Icon/Icon';\nimport styles from './PopoverNotice.module.scss';\n\nexport type PopoverNoticeVariant = 'info' | 'success' | 'warning' | 'danger';\n\nexport interface PopoverNoticeAction {\n label: string;\n onClick?: () => void;\n emphasis?: 'primary' | 'tertiary';\n}\n\nexport interface PopoverNoticeProps {\n /** Popover title text. */\n title: string;\n /** Body content. */\n children: ReactNode;\n /**\n * Semantic variant — sets the icon and its color automatically.\n * Ignored if `icon` is also provided.\n */\n variant?: PopoverNoticeVariant;\n /** Optional icon shown to the left of the title. Overrides variant icon. */\n icon?: ReactNode;\n /** Action buttons rendered below the body. */\n actions?: PopoverNoticeAction[];\n /** When true, shows a \"Don't show this again\" checkbox. */\n showCheckbox?: boolean;\n /** Checkbox label override. */\n checkboxLabel?: string;\n /** Callback when close button is clicked. */\n onClose?: () => void;\n /** Optional CSS class name. */\n className?: string;\n}\n\nconst VARIANT_ICONS: Record<PopoverNoticeVariant, ReactNode> = {\n info: <Icon size=\"20\" glyph={<InformationOutlineIcon />} />,\n success: <Icon size=\"20\" glyph={<CheckCircleOutlineIcon />} />,\n warning: <Icon size=\"20\" glyph={<AlertCircleOutlineIcon />} />,\n danger: <Icon size=\"20\" glyph={<AlertOutlineIcon />} />,\n};\n\nconst VARIANT_ICON_CLASS: Record<PopoverNoticeVariant, string> = {\n info: styles['popover-notice__icon--info'],\n success: styles['popover-notice__icon--success'],\n warning: styles['popover-notice__icon--warning'],\n danger: styles['popover-notice__icon--danger'],\n};\n\nexport default function PopoverNotice({\n title,\n children,\n variant,\n icon,\n actions,\n showCheckbox = false,\n checkboxLabel = \"Don't show this confirmation again\",\n onClose,\n className = '',\n}: PopoverNoticeProps) {\n const rootClass = [styles['popover-notice'], className]\n .filter(Boolean)\n .join(' ');\n\n const resolvedIcon = icon ?? (variant ? VARIANT_ICONS[variant] : null);\n const iconColorClass = !icon && variant ? VARIANT_ICON_CLASS[variant] : '';\n\n return (\n <div className={rootClass}>\n <div className={styles['popover-notice__content']}>\n {resolvedIcon != null && (\n <div\n className={[styles['popover-notice__icon'], iconColorClass]\n .filter(Boolean)\n .join(' ')}\n aria-hidden\n >\n {resolvedIcon}\n </div>\n )}\n\n <div className={styles['popover-notice__body']}>\n <div className={styles['popover-notice__title-row']}>\n <span className={styles['popover-notice__title']}>{title}</span>\n </div>\n\n <div className={styles['popover-notice__description']}>\n {children}\n </div>\n\n {actions && actions.length > 0 && (\n <div className={styles['popover-notice__actions']}>\n {actions.map((action, i) => (\n <Button\n key={i}\n emphasis={\n action.emphasis === 'tertiary' ? 'Tertiary' : 'Primary'\n }\n size=\"Small\"\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n ))}\n </div>\n )}\n\n {showCheckbox && <Checkbox size=\"Medium\">{checkboxLabel}</Checkbox>}\n </div>\n </div>\n\n {onClose && (\n <IconButton\n className={styles['popover-notice__close']}\n aria-label=\"Close\"\n size=\"Small\"\n icon={<Icon size=\"16\" glyph={<CloseIcon />} />}\n onClick={onClose}\n />\n )}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport ApplicationCogIcon from '@mattermost/compass-icons/components/application-cog';\nimport AppsIcon from '@mattermost/compass-icons/components/apps';\nimport DownloadOutlineIcon from '@mattermost/compass-icons/components/download-outline';\nimport InformationOutlineIcon from '@mattermost/compass-icons/components/information-outline';\nimport ProductBoardsIcon from '@mattermost/compass-icons/components/product-boards';\nimport ProductChannelsIcon from '@mattermost/compass-icons/components/product-channels';\nimport ProductPlaybooksIcon from '@mattermost/compass-icons/components/product-playbooks';\nimport WebhookIcon from '@mattermost/compass-icons/components/webhook';\nimport Icon from '@/components/Icon/Icon';\nimport MenuItem from '@/components/MenuItem/MenuItem';\nimport PopoverMenu, {\n PopoverMenuDivider,\n PopoverMenuGroup,\n} from '@/components/PopoverMenu/PopoverMenu';\nimport styles from './ProductSwitcherMenu.module.scss';\n\n/** Built-in products shipped with the switcher. */\nexport type BuiltInProductSwitcherProduct = 'Channels' | 'Boards' | 'Playbooks';\n\n/**\n * Product id for selection. Built-ins use their labels; prototypes use any\n * string id from {@link ProductSwitcherProductItem.id}.\n */\nexport type ProductSwitcherProduct = BuiltInProductSwitcherProduct | (string & {});\n\nexport interface ProductSwitcherProductItem {\n /** Stable id used for `selectedProduct` and `onProductSelect`. */\n id: string;\n /** Menu row label. */\n label: string;\n /**\n * Leading icon glyph (e.g. a compass-icons component). Rendered at 24px in\n * the product row slot.\n */\n icon: ReactNode;\n /** Optional row click handler (also fires `onProductSelect` when provided). */\n onClick?: () => void;\n}\n\nexport interface ProductSwitcherMenuProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Currently active product id; shows trailing check on that row.\n * Default: `Channels`.\n */\n selectedProduct?: ProductSwitcherProduct;\n /**\n * Extra products appended after Channels, Boards, and Playbooks.\n * Use this from prototypes to register custom products in the top section.\n */\n additionalProducts?: ProductSwitcherProductItem[];\n /** Called when any product row (built-in or additional) is activated. */\n onProductSelect?: (productId: string) => void;\n}\n\nexport const DEFAULT_PRODUCT_SWITCHER_PRODUCTS: ProductSwitcherProductItem[] = [\n {\n id: 'Channels',\n label: 'Channels',\n icon: <ProductChannelsIcon />,\n },\n {\n id: 'Boards',\n label: 'Boards',\n icon: <ProductBoardsIcon />,\n },\n {\n id: 'Playbooks',\n label: 'Playbooks',\n icon: <ProductPlaybooksIcon />,\n },\n];\n\nfunction productLeadingVisual(glyph: ReactNode) {\n return (\n <span className={styles['product-switcher-menu__product-icon']}>\n <Icon glyph={glyph} size=\"24\" />\n </span>\n );\n}\n\n/**\n * Product switcher popover opened from the Global Header products control.\n * Products use 24px button-bg icons and semibold center-channel labels; the\n * active product shows a trailing check. Utility links follow in a second group.\n *\n * Prototypes can append products via {@link ProductSwitcherMenuProps.additionalProducts}.\n *\n * Matches Figma Patterns — Popover Menus (node 1423:8667).\n */\nexport default function ProductSwitcherMenu({\n selectedProduct = 'Channels',\n additionalProducts = [],\n onProductSelect,\n className = '',\n style,\n ...rest\n}: ProductSwitcherMenuProps) {\n const rootClass = [styles['product-switcher-menu'], className]\n .filter(Boolean)\n .join(' ');\n\n const products = [...DEFAULT_PRODUCT_SWITCHER_PRODUCTS, ...additionalProducts];\n\n return (\n <PopoverMenu\n className={rootClass}\n style={{ width: '273px', ...style }}\n {...rest}\n >\n <PopoverMenuGroup>\n {products.map((product) => (\n <MenuItem\n key={product.id}\n className={styles['product-switcher-menu__product-item']}\n label={product.label}\n leadingVisual={productLeadingVisual(product.icon)}\n trailingElement={selectedProduct === product.id}\n onClick={() => {\n product.onClick?.();\n onProductSelect?.(product.id);\n }}\n />\n ))}\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"System console\"\n leadingVisual={<Icon glyph={<ApplicationCogIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Integrations\"\n leadingVisual={<Icon glyph={<WebhookIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Marketplace\"\n leadingVisual={<Icon glyph={<AppsIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Download apps\"\n leadingVisual={<Icon glyph={<DownloadOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"About Mattermost\"\n leadingVisual={<Icon glyph={<InformationOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n </PopoverMenu>\n );\n}\n","import type { ReactNode } from 'react';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport EmailOutlineIcon from '@mattermost/compass-icons/components/email-outline';\nimport CircleMultipleOutlineIcon from '@mattermost/compass-icons/components/circle-multiple-outline';\nimport GithubCircleIcon from '@mattermost/compass-icons/components/github-circle';\nimport MattermostIcon from '@mattermost/compass-icons/components/mattermost';\nimport AccountPlusOutlineIcon from '@mattermost/compass-icons/components/account-plus-outline';\nimport PhoneIcon from '@mattermost/compass-icons/components/phone';\nimport AtIcon from '@mattermost/compass-icons/components/at';\nimport SendOutlineIcon from '@mattermost/compass-icons/components/send-outline';\nimport PencilOutlineIcon from '@mattermost/compass-icons/components/pencil-outline';\nimport Button from '@/components/Button/Button';\nimport IconButton from '@/components/IconButton/IconButton';\nimport UserAvatar from '@/components/UserAvatar/UserAvatar';\nimport Tag from '@/components/Tag/Tag';\nimport Icon from '@/components/Icon/Icon';\nimport styles from './ProfilePopover.module.scss';\n\nexport type ProfilePopoverUser = 'Others' | 'You';\n\nexport interface ProfilePopoverCustomStatus {\n emoji: string;\n text: string;\n /** Label suffix like \"Until Tomorrow\". */\n expiresLabel?: string;\n}\n\nexport interface ProfilePopoverLocalTime {\n /** Local time, e.g. \"10:42 PM\". */\n time: string;\n /** Timezone abbreviation, e.g. \"EST\". */\n timezone: string;\n /** Hour difference relative to viewer, e.g. \"3 hrs behind\". */\n hourDifference?: string;\n}\n\nexport interface ProfilePopoverPhone {\n number: string;\n /** Category label, e.g. \"NIPR\", \"NIPR Conf Bridge\", \"SIPR Extension\". */\n label?: string;\n /** Trunk / gateway identifier, e.g. \"DSN\", \"DISN Gateway\". */\n sipTrunk?: string;\n /** Per-row phone glyph; overrides the popover-level `phoneIcon` when set. */\n icon?: ReactNode;\n href?: string;\n /** When provided, the number click runs this handler instead of navigating. */\n onClick?: () => void;\n}\n\nexport interface ProfilePopoverProps {\n /** Whose profile is shown. Default: 'Others'. */\n user?: ProfilePopoverUser;\n /** Avatar image URL. */\n avatarSrc: string;\n /** Avatar alt text. */\n avatarAlt: string;\n /** Full name. */\n name: string;\n /** @handle. */\n username: string;\n /** Job title. */\n title?: string;\n /** Email address. */\n email?: string;\n /** Phone rows shown under the email. */\n phones?: ProfilePopoverPhone[];\n /** Caption above the name, e.g. \"Last online 6 hrs ago\". */\n lastOnline?: string;\n /** Role tag shown at the very top, e.g. \"System Admin\". (Named `jobRole` to avoid clashing with the ARIA `role` attribute in JSX.) */\n jobRole?: string;\n /** Local time block. */\n localTime?: ProfilePopoverLocalTime;\n /** Custom status. */\n customStatus?: ProfilePopoverCustomStatus;\n /** Shared member org name. */\n sharedOrg?: string;\n /** Shows a Staff row. */\n staff?: boolean;\n /** Shows a Core Committer row. */\n coreCommitter?: boolean;\n /** GitHub handle — shows the GitHub profile row. */\n githubHandle?: string;\n onClose?: () => void;\n onPrimaryAction?: () => void;\n /** Inserts an @mention for this user in the active channel message input. */\n onMention?: () => void;\n /** Opens the Add to Channel flow for this user. */\n onAddToChannel?: () => void;\n /** Used when `callButton` is not provided; starts a simple outbound call action. */\n onCall?: () => void;\n onSend?: () => void;\n /** Replaces the default Call icon button in the footer when provided. */\n callButton?: ReactNode;\n /** Replaces the default phone glyph shown next to the phone number. */\n phoneIcon?: ReactNode;\n /** Animation state. Set to 'closing' to play the exit animation — listen via onAnimationEnd to unmount. */\n state?: 'open' | 'closing';\n /** Fires when an animation on the popover root ends (entrance or exit). */\n onAnimationEnd?: (e: React.AnimationEvent<HTMLDivElement>) => void;\n className?: string;\n}\n\ninterface MetaRowProps {\n icon: ReactNode;\n children: ReactNode;\n href?: string;\n}\n\nfunction MetaRow({ icon, children, href }: MetaRowProps) {\n const textClass = href\n ? styles['profile-popover__meta-link']\n : styles['profile-popover__meta-text'];\n\n return (\n <div className={styles['profile-popover__meta-item']}>\n <span className={styles['profile-popover__meta-icon']} aria-hidden>\n {icon}\n </span>\n {href ? (\n <a className={textClass} href={href}>\n {children}\n </a>\n ) : (\n <span className={textClass}>{children}</span>\n )}\n </div>\n );\n}\n\nexport default function ProfilePopover({\n user = 'Others',\n avatarSrc,\n avatarAlt,\n name,\n username,\n title,\n email,\n phones,\n lastOnline,\n jobRole,\n localTime,\n customStatus,\n sharedOrg,\n staff = false,\n coreCommitter = false,\n githubHandle,\n onClose,\n onPrimaryAction,\n onMention,\n onAddToChannel,\n onCall,\n onSend,\n callButton,\n phoneIcon,\n state = 'open',\n onAnimationEnd,\n className = '',\n}: ProfilePopoverProps) {\n const isYou = user === 'You';\n\n const rootClass = [\n styles['profile-popover'],\n state === 'closing' ? styles['profile-popover--closing'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const hasPhones = Boolean(phones && phones.length > 0);\n const hasTitlesBlock =\n Boolean(email) ||\n hasPhones ||\n Boolean(sharedOrg) ||\n staff ||\n coreCommitter ||\n Boolean(githubHandle);\n const hasSecondary =\n hasTitlesBlock || Boolean(localTime) || Boolean(customStatus);\n\n return (\n <div className={rootClass} onAnimationEnd={onAnimationEnd}>\n {jobRole && (\n <div className={styles['profile-popover__role-tag']}>\n <Tag label={jobRole} casing=\"All Caps\" size=\"X-Small\" />\n </div>\n )}\n\n {onClose && (\n <IconButton\n className={styles['profile-popover__close']}\n aria-label=\"Close\"\n size=\"Small\"\n padding=\"Compact\"\n icon={<Icon size=\"16\" glyph={<CloseIcon />} />}\n onClick={onClose}\n />\n )}\n\n <section className={styles['profile-popover__primary']}>\n <UserAvatar src={avatarSrc} alt={avatarAlt} size=\"120\" status />\n {lastOnline && (\n <p className={styles['profile-popover__last-online']}>{lastOnline}</p>\n )}\n <div className={styles['profile-popover__names']}>\n <p className={styles['profile-popover__name']}>{name}</p>\n <p className={styles['profile-popover__handle']}>{username}</p>\n {title && <p className={styles['profile-popover__title']}>{title}</p>}\n </div>\n </section>\n\n {hasSecondary && (\n <section className={styles['profile-popover__secondary']}>\n {hasTitlesBlock && (\n <div className={styles['profile-popover__titles']}>\n {email && (\n <MetaRow\n icon={<Icon size=\"16\" glyph={<EmailOutlineIcon />} />}\n href={`mailto:${email}`}\n >\n {email}\n </MetaRow>\n )}\n {phones?.map((p, i) => {\n const subParts = [p.label, p.sipTrunk].filter(Boolean);\n const subText = subParts.join(' • ');\n return (\n <div\n key={`${p.number}-${i}`}\n className={[\n styles['profile-popover__meta-item'],\n styles['profile-popover__meta-item--stacked'],\n ].join(' ')}\n >\n <span className={styles['profile-popover__meta-icon']} aria-hidden>\n <Icon size=\"16\" glyph={p.icon ?? phoneIcon ?? <PhoneIcon />} />\n </span>\n <div className={styles['profile-popover__phone-body']}>\n {subText && (\n <span className={styles['profile-popover__phone-sub']}>\n {subText}\n </span>\n )}\n {p.onClick ? (\n <button\n type=\"button\"\n className={styles['profile-popover__meta-link']}\n onClick={p.onClick}\n >\n {p.number}\n </button>\n ) : (\n <a\n className={styles['profile-popover__meta-link']}\n href={p.href ?? `tel:${p.number}`}\n >\n {p.number}\n </a>\n )}\n </div>\n </div>\n );\n })}\n {sharedOrg && (\n <MetaRow\n icon={\n <Icon size=\"16\" glyph={<CircleMultipleOutlineIcon />} />\n }\n >\n {sharedOrg}\n </MetaRow>\n )}\n {staff && (\n <MetaRow icon={<Icon size=\"16\" glyph={<MattermostIcon />} />}>\n Staff\n </MetaRow>\n )}\n {coreCommitter && (\n <MetaRow icon={<Icon size=\"16\" glyph={<MattermostIcon />} />}>\n Core Committer\n </MetaRow>\n )}\n {githubHandle && (\n <MetaRow icon={<Icon size=\"16\" glyph={<GithubCircleIcon />} />}>\n {githubHandle}\n </MetaRow>\n )}\n </div>\n )}\n\n {localTime && (\n <div className={styles['profile-popover__local-time']}>\n <p className={styles['profile-popover__section-label']}>\n Local time ({localTime.timezone})\n </p>\n <div className={styles['profile-popover__time']}>\n <span>{localTime.time}</span>\n {localTime.hourDifference && (\n <span>({localTime.hourDifference})</span>\n )}\n </div>\n </div>\n )}\n\n {customStatus && (\n <div className={styles['profile-popover__custom-status']}>\n <p className={styles['profile-popover__section-label']}>\n Status\n {customStatus.expiresLabel\n ? ` (${customStatus.expiresLabel})`\n : ''}\n </p>\n <div className={styles['profile-popover__status-row']}>\n <span\n className={styles['profile-popover__status-emoji']}\n aria-hidden\n >\n {customStatus.emoji}\n </span>\n <span>{customStatus.text}</span>\n </div>\n </div>\n )}\n </section>\n )}\n\n <footer\n className={[\n styles['profile-popover__footer'],\n isYou\n ? styles['profile-popover__footer--you']\n : styles['profile-popover__footer--others'],\n ].join(' ')}\n >\n <div\n className={[\n styles['profile-popover__primary-action'],\n isYou\n ? styles['profile-popover__primary-action--you']\n : styles['profile-popover__primary-action--others'],\n ].join(' ')}\n >\n <Button\n className={styles['profile-popover__primary-button']}\n size=\"Small\"\n emphasis=\"Primary\"\n leadingIcon={\n isYou ? (\n <Icon size=\"12\" glyph={<PencilOutlineIcon />} />\n ) : (\n <Icon size=\"12\" glyph={<SendOutlineIcon />} />\n )\n }\n onClick={onPrimaryAction}\n >\n {isYou ? 'Edit profile' : 'Message'}\n </Button>\n </div>\n <div className={styles['profile-popover__secondary-actions']}>\n {isYou ? (\n <IconButton\n aria-label=\"Send message\"\n size=\"Small\"\n icon={<Icon size=\"16\" glyph={<SendOutlineIcon />} />}\n onClick={onSend}\n />\n ) : (\n <>\n <IconButton\n aria-label=\"Mention user\"\n size=\"Small\"\n icon={<Icon size=\"16\" glyph={<AtIcon />} />}\n onClick={onMention}\n />\n <IconButton\n aria-label=\"Add to channel\"\n size=\"Small\"\n icon={<Icon size=\"16\" glyph={<AccountPlusOutlineIcon />} />}\n onClick={onAddToChannel}\n />\n {callButton ??\n (onCall ? (\n <IconButton\n aria-label=\"Call\"\n size=\"Small\"\n icon={<Icon size=\"16\" glyph={<PhoneIcon />} />}\n onClick={onCall}\n />\n ) : null)}\n </>\n )}\n </div>\n </footer>\n </div>\n );\n}\n","import styles from './ProgressBar.module.scss';\n\nexport type ProgressBarSize = 'Small' | 'Large';\n\nexport interface ProgressBarProps {\n /** Progress value 0–100. Default: 0. */\n value?: number;\n /** Size variant. Default: Large. */\n size?: ProgressBarSize;\n /**\n * When true, fill color shifts from green→yellow→red based on percentage.\n * When false, uses the default brand blue. Default: false.\n */\n semanticColors?: boolean;\n /** Accessible label for the progress bar. */\n 'aria-label'?: string;\n /** Optional CSS class name. */\n className?: string;\n}\n\nfunction getSemanticColorClass(value: number): string {\n if (value >= 90) return styles['progress-bar__fill--danger'];\n if (value >= 70) return styles['progress-bar__fill--warning'];\n return styles['progress-bar__fill--success'];\n}\n\n/**\n * Progress Bar — horizontal progress indicator.\n * Size (Small/Large). Semantic colors mode changes fill color by percentage.\n * Used in upload progress, quota usage.\n */\nexport default function ProgressBar({\n value = 0,\n size = 'Large',\n semanticColors = false,\n 'aria-label': ariaLabel = 'Progress',\n className = '',\n}: ProgressBarProps) {\n const clampedValue = Math.min(100, Math.max(0, value));\n const sizeClass =\n size === 'Small'\n ? styles['progress-bar--size-small']\n : styles['progress-bar--size-large'];\n\n const fillColorClass = semanticColors\n ? getSemanticColorClass(clampedValue)\n : styles['progress-bar__fill--default'];\n\n return (\n <div\n role=\"progressbar\"\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={ariaLabel}\n className={[styles['progress-bar'], sizeClass, className]\n .filter(Boolean)\n .join(' ')}\n >\n <div\n className={[styles['progress-bar__fill'], fillColorClass]\n .filter(Boolean)\n .join(' ')}\n style={{ width: `${clampedValue}%` }}\n />\n </div>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { useId } from 'react';\nimport { useControllable } from '@/hooks/useControllable';\nimport { toKebab } from '@/utils/string';\nimport styles from './Radio.module.scss';\n\nexport type RadioSize = 'Small' | 'Medium' | 'Large';\n\nexport interface RadioProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** Size variant. Figma: Small (12px), Medium (16px), Large (20px). Default: Medium. */\n size?: RadioSize;\n /** When false, uses error/destructive styling (red when checked). Default: true. */\n valid?: boolean;\n /** Label content. Rendered next to the radio. */\n children?: React.ReactNode;\n}\n\n/**\n * Radio component built on the native HTML radio input.\n * Supports checked/unchecked; sizes and valid/invalid styling match Figma Radio v2.0.0.\n *\n * Use with a shared `name` when grouping options so only one is selected.\n * Use with a label: pass children to render label text, or wrap in your own <label>.\n *\n * @see https://compass.mattermost.com (Radio)\n */\nexport default function Radio({\n className = '',\n size = 'Medium',\n valid = true,\n children,\n id: idProp,\n checked,\n defaultChecked,\n disabled,\n onChange,\n name,\n value,\n ...rest\n}: RadioProps) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const [, handleChange] = useControllable(checked, defaultChecked, onChange);\n\n const sizeClass = styles[`radio--size-${toKebab(size)}`];\n const invalidClass = valid ? '' : styles['radio--invalid'];\n\n const rootClass = [styles.radio, sizeClass, invalidClass, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <label className={rootClass} htmlFor={id}>\n <input\n id={id}\n type=\"radio\"\n name={name}\n value={value}\n className={styles['radio__input']}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n aria-invalid={valid ? undefined : true}\n onChange={handleChange}\n {...rest}\n />\n <span className={styles['radio__circle']}>\n <span className={styles['radio__dot']} aria-hidden />\n </span>\n {children != null && (\n <span className={styles['radio__label']}>{children}</span>\n )}\n </label>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport Icon from '@/components/Icon/Icon';\nimport HandRightOutlineIcon from '@mattermost/compass-icons/components/hand-right-outline';\nimport MicrophoneOffIcon from '@mattermost/compass-icons/components/microphone-off';\nimport CloseCircleIcon from '@mattermost/compass-icons/components/close-circle';\nimport styles from './ReactionPill.module.scss';\n\nexport type ReactionPillSize = 'Small' | 'Medium' | 'Large';\nexport type ReactionPillType = 'Reaction' | 'Hand Raise' | 'Other';\n\nexport interface ReactionPillProps extends HTMLAttributes<HTMLDivElement> {\n /** Size variant. Default: Small. */\n size?: ReactionPillSize;\n /** Pill type. Default: Reaction. */\n type?: ReactionPillType;\n /** Emoji to display for Reaction type. Default: 😀 */\n emoji?: string;\n /** Participant name / label text. */\n label?: string;\n /** Notification message for 'Other' type. */\n message?: string;\n /** Optional CSS class name. */\n className?: string;\n}\n\n/**\n * Call-specific reaction pills showing emoji, hand-raise, or notification reactions\n * during calls. Anatomy: Leading Icon + Label (+ Trailing Icon for Other type).\n */\nexport default function ReactionPill({\n size = 'Small',\n type = 'Reaction',\n emoji = '😀',\n label = 'Leonard R.',\n message = 'You have been muted by the host',\n className = '',\n ...rest\n}: ReactionPillProps) {\n const rootClass = [\n styles['reaction-pill'],\n styles[`reaction-pill--size-${size.toLowerCase()}`],\n styles[\n `reaction-pill--type-${type === 'Hand Raise' ? 'hand-raise' : type === 'Other' ? 'other' : 'reaction'}`\n ],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass} {...rest}>\n <div className={styles['reaction-pill__inner']}>\n {/* Reaction type: emoji + name */}\n {type === 'Reaction' && (\n <>\n <span className={styles['reaction-pill__emoji']} aria-hidden>\n {emoji}\n </span>\n <span className={styles['reaction-pill__label']}>{label}</span>\n </>\n )}\n\n {/* Hand Raise: icon + name */}\n {type === 'Hand Raise' && (\n <>\n <span className={styles['reaction-pill__leading-icon']} aria-hidden>\n <Icon size=\"12\" glyph={<HandRightOutlineIcon />} />\n </span>\n <span className={styles['reaction-pill__label']}>\n {label} Raised Hand\n </span>\n </>\n )}\n\n {/* Other type: icon + message + dismiss */}\n {type === 'Other' && (\n <>\n <span className={styles['reaction-pill__leading-icon']} aria-hidden>\n <Icon size=\"12\" glyph={<MicrophoneOffIcon />} />\n </span>\n <span className={styles['reaction-pill__label']}>{message}</span>\n <span\n className={styles['reaction-pill__trailing-icon']}\n aria-hidden\n >\n <Icon size=\"12\" glyph={<CloseCircleIcon />} />\n </span>\n </>\n )}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport Scrollbar from '@/components/Scrollbar/Scrollbar';\nimport styles from './RightSidebar.module.scss';\n\nexport interface RightSidebarProps {\n /** Header element (typically <RightSidebarHeader />). */\n header: ReactNode;\n /** Optional element rendered at the bottom of the sidebar (e.g. a reply composer). */\n footer?: ReactNode;\n /** Body content — anything. Scrolls when it overflows. The body has no padding;\n * add your own when the content calls for it. */\n children?: ReactNode;\n className?: string;\n /**\n * When true, the sidebar grows horizontally instead of staying at 400px.\n * Pair with a parent flex row and `channel-shell__right-sidebar--fill` in full layouts.\n */\n fill?: boolean;\n /**\n * When `end`, short body content sits on the bottom of the scroll viewport (e.g.\n * thread replies). Default `start` keeps content top-aligned (e.g. channel info).\n */\n alignBody?: 'start' | 'end';\n}\n\nexport default function RightSidebar({\n header,\n footer,\n children,\n className = '',\n fill = false,\n alignBody = 'start',\n}: RightSidebarProps) {\n const rootClass = [\n styles['right-sidebar'],\n fill ? styles['right-sidebar--fill'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const bodyClass = [\n styles['right-sidebar__body'],\n alignBody === 'end' ? styles['right-sidebar__body--align-end'] : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <aside className={rootClass} aria-label=\"Right sidebar\">\n <div className={styles['right-sidebar__header']}>{header}</div>\n <div className={bodyClass}>\n <Scrollbar>{children}</Scrollbar>\n </div>\n {footer && (\n <div className={styles['right-sidebar__footer']}>{footer}</div>\n )}\n </aside>\n );\n}\n","import type { ReactNode } from 'react';\nimport ArrowBackIosIcon from '@mattermost/compass-icons/components/arrow-back-ios';\nimport ArrowExpandIcon from '@mattermost/compass-icons/components/arrow-expand';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Tag from '@/components/Tag/Tag';\nimport type { TagType } from '@/components/Tag/Tag';\nimport styles from './RightSidebarHeader.module.scss';\n\nexport interface RightSidebarHeaderProps {\n /** Primary title text. */\n title: string;\n /** Secondary title shown to the right of a vertical divider (e.g. parent channel name). */\n secondaryTitle?: string;\n /** Optional tag rendered next to the title (e.g. \"BETA\"). */\n tag?: string;\n /** Tag visual style. Default: Info. */\n tagType?: TagType;\n /** Optional leading element shown before the title — typically a UserAvatar or Icon. */\n leadingIcon?: ReactNode;\n /** When set, shows a back button and calls this on click. */\n onBack?: () => void;\n /** When set, shows an expand button and calls this on click. */\n onExpand?: () => void;\n /** When set, shows a close button and calls this on click. */\n onClose?: () => void;\n /** Optional inline action label (e.g. \"Follow\"). */\n actionLabel?: string;\n /** Click handler for the action label. */\n onActionClick?: () => void;\n /** When true, the action button shows in its active state. */\n actionActive?: boolean;\n className?: string;\n}\n\nexport default function RightSidebarHeader({\n title,\n secondaryTitle,\n tag,\n tagType = 'Info',\n leadingIcon,\n onBack,\n onExpand,\n onClose,\n actionLabel,\n onActionClick,\n actionActive = false,\n className = '',\n}: RightSidebarHeaderProps) {\n const rootClass = [styles['right-sidebar-header'], className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass}>\n <div className={styles['right-sidebar-header__left']}>\n <div className={styles['right-sidebar-header__primary']}>\n {onBack && (\n <IconButton\n className={styles['right-sidebar-header__back']}\n size=\"Small\"\n aria-label=\"Back\"\n onClick={onBack}\n icon={<Icon size=\"16\" glyph={<ArrowBackIosIcon />} />}\n />\n )}\n {leadingIcon && (\n <span className={styles['right-sidebar-header__leading-icon']}>\n {leadingIcon}\n </span>\n )}\n <span className={styles['right-sidebar-header__title']}>{title}</span>\n {tag && (\n <span className={styles['right-sidebar-header__tag']}>\n <Tag\n label={tag}\n type={tagType}\n size=\"X-Small\"\n casing=\"All Caps\"\n />\n </span>\n )}\n </div>\n {secondaryTitle && (\n <div className={styles['right-sidebar-header__secondary']}>\n <span className={styles['right-sidebar-header__secondary-text']}>\n {secondaryTitle}\n </span>\n </div>\n )}\n </div>\n\n <div className={styles['right-sidebar-header__actions']}>\n {actionLabel && (\n <button\n type=\"button\"\n className={[\n styles['right-sidebar-header__action'],\n actionActive\n ? styles['right-sidebar-header__action--active']\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={onActionClick}\n aria-pressed={actionActive ? true : undefined}\n >\n {actionLabel}\n </button>\n )}\n {onExpand && (\n <IconButton\n size=\"Small\"\n aria-label=\"Expand\"\n onClick={onExpand}\n icon={<Icon size=\"16\" glyph={<ArrowExpandIcon />} />}\n />\n )}\n {onClose && (\n <IconButton\n size=\"Small\"\n aria-label=\"Close\"\n onClick={onClose}\n icon={<Icon size=\"16\" glyph={<CloseIcon />} />}\n />\n )}\n </div>\n </div>\n );\n}\n","import type { ChangeEvent, InputHTMLAttributes, ReactNode } from 'react';\nimport {\n forwardRef,\n useId,\n useState,\n useCallback,\n useRef,\n} from 'react';\nimport { toKebab } from '@/utils/string';\nimport type { IconSize } from '@/components/Icon/Icon';\nimport Icon from '@/components/Icon/Icon';\nimport MagnifyIcon from '@mattermost/compass-icons/components/magnify';\nimport CloseCircleIcon from '@mattermost/compass-icons/components/close-circle';\nimport styles from './SearchInput.module.scss';\n\nexport type SearchInputSize = 'Small' | 'Medium' | 'Large';\n\nconst ICON_SIZE_MAP: Record<SearchInputSize, IconSize> = {\n Small: '12',\n Medium: '16',\n Large: '20',\n};\n\nexport interface SearchInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** Floating label (placeholder-style). Floats above border when filled. */\n label?: ReactNode;\n /** Size variant. Default: Medium. */\n size?: SearchInputSize;\n /** Called when the clear button is pressed. Omit to use built-in clearing. */\n onClear?: () => void;\n}\n\n/**\n * Search Input component — text input with leading magnifier icon.\n * Used in global search bar, channel search, user search, and filter inputs.\n * Matches Figma Search Input (State: Default/Focus/Filled × Size S/M/L).\n */\nconst SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(\n function SearchInput(\n {\n className = '',\n size = 'Medium',\n label,\n onClear,\n id: idProp,\n value: valueProp,\n defaultValue,\n placeholder,\n onFocus,\n onBlur,\n onChange,\n disabled,\n ...rest\n },\n ref,\n ) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const inputRef = useRef<HTMLInputElement>(null);\n\n const isControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? '',\n );\n const value = isControlled ? (valueProp as string) : uncontrolledValue;\n const hasValue = value != null && value !== '';\n\n const [isFocused, setIsFocused] = useState(false);\n const labelFloated = isFocused || hasValue;\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n onFocus?.(e);\n },\n [onFocus],\n );\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n onBlur?.(e);\n },\n [onBlur],\n );\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setUncontrolledValue(e.target.value);\n onChange?.(e);\n },\n [isControlled, onChange],\n );\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const handleClear = useCallback(() => {\n if (disabled) return;\n\n if (onClear) {\n onClear();\n inputRef.current?.focus();\n return;\n }\n\n const input = inputRef.current;\n if (input == null) return;\n\n input.value = '';\n if (!isControlled) setUncontrolledValue('');\n\n onChange?.({\n target: input,\n currentTarget: input,\n } as ChangeEvent<HTMLInputElement>);\n\n input.focus();\n }, [disabled, isControlled, onChange, onClear]);\n\n const showClearButton = hasValue && !disabled;\n\n const sizeClass = styles[`searchInput--size-${toKebab(size)}`];\n const labelFloatedClass =\n label != null && labelFloated ? styles['searchInput--label-floated'] : '';\n const hasLeadingClass = styles['searchInput--has-leading-icon'];\n const hasTrailingClass = showClearButton\n ? styles['searchInput--has-trailing-icon']\n : '';\n const iconSize = ICON_SIZE_MAP[size];\n\n const rootClass = [\n styles.searchInput,\n sizeClass,\n labelFloatedClass,\n hasLeadingClass,\n hasTrailingClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass}>\n <div className={styles.searchInput__wrapper}>\n {label != null && (\n <label className={styles.searchInput__label} htmlFor={id}>\n {label}\n </label>\n )}\n <div className={styles.searchInput__inner}>\n <span className={styles.searchInput__leadingIcon} aria-hidden>\n <Icon size={iconSize} glyph={<MagnifyIcon />} />\n </span>\n <input\n ref={setInputRef}\n id={id}\n type=\"search\"\n className={styles.searchInput__input}\n value={isControlled ? valueProp : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n placeholder={placeholder}\n disabled={disabled}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n {...rest}\n />\n {showClearButton && (\n <span className={styles.searchInput__trailingIcon}>\n <button\n type=\"button\"\n className={styles.searchInput__clearButton}\n onClick={handleClear}\n aria-label=\"Clear search\"\n tabIndex={-1}\n >\n <Icon size={iconSize} glyph={<CloseCircleIcon />} />\n </button>\n </span>\n )}\n </div>\n </div>\n </div>\n );\n },\n);\n\nexport default SearchInput;\n","import type { ReactNode } from 'react';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Icon from '@/components/Icon/Icon';\nimport { ShortcutTagGroup } from '@/components/ShortcutTag/ShortcutTag';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport styles from './SearchTipBanner.module.scss';\n\nexport interface ShortcutKey {\n label: string;\n}\n\nexport interface SearchTipBannerProps {\n /** Text shown before the shortcut keys. Default: \"Tip: Try\". */\n prefix?: string;\n /** Text shown after the shortcut keys. Default: \"to search this channel\". */\n suffix?: string;\n /** Keyboard shortcut keys to display. */\n shortcutKeys?: ShortcutKey[];\n /** Called when the dismiss button is clicked. */\n onDismiss?: () => void;\n /** Optional CSS class name. */\n className?: string;\n /** Custom content to replace the default tip content. */\n children?: ReactNode;\n}\n\n/**\n * Search Tip Banner — dismissable hint banner showing keyboard shortcut tips.\n * Used contextually to surface relevant keyboard shortcuts to users.\n */\nexport default function SearchTipBanner({\n prefix = 'Tip: Try',\n suffix = 'to search this channel',\n shortcutKeys = [{ label: '⌘' }, { label: 'Shift' }, { label: 'F' }],\n onDismiss,\n className = '',\n children,\n}: SearchTipBannerProps) {\n return (\n <div\n className={[styles['search-tip-banner'], className]\n .filter(Boolean)\n .join(' ')}\n >\n <div className={styles['search-tip-banner__content']}>\n {children ?? (\n <>\n <span className={styles['search-tip-banner__text']}>{prefix}</span>\n <ShortcutTagGroup\n labels={shortcutKeys.map((key) => key.label)}\n size=\"Medium\"\n />\n <span className={styles['search-tip-banner__text']}>{suffix}</span>\n </>\n )}\n </div>\n {onDismiss != null && (\n <IconButton\n aria-label=\"Dismiss tip\"\n size=\"Small\"\n icon={<Icon size=\"16\" glyph={<CloseIcon />} />}\n onClick={onDismiss}\n />\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport Button from '@/components/Button/Button';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Icon from '@/components/Icon/Icon';\nimport InformationOutlineIcon from '@mattermost/compass-icons/components/information-outline';\nimport AlertOutlineIcon from '@mattermost/compass-icons/components/alert-outline';\nimport AlertCircleOutlineIcon from '@mattermost/compass-icons/components/alert-circle-outline';\nimport CheckCircleOutlineIcon from '@mattermost/compass-icons/components/check-circle-outline';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport styles from './SectionNotice.module.scss';\n\nexport type SectionNoticeType =\n | 'Info'\n | 'Warning'\n | 'Danger'\n | 'Success'\n | 'Hint';\n\nexport interface SectionNoticeProps {\n /** Optional CSS class name. */\n className?: string;\n /** Type controls color-coding. Default: Info. */\n type?: SectionNoticeType;\n /** Optional leading icon. When omitted a default type icon is shown. */\n icon?: ReactNode;\n /** Title / headline text. */\n title: string;\n /** Optional body description. */\n description?: ReactNode;\n /** Primary action button label. */\n primaryButtonLabel?: string;\n /** Primary action callback. */\n onPrimaryAction?: () => void;\n /** Secondary action button label. */\n secondaryButtonLabel?: string;\n /** Secondary action callback. */\n onSecondaryAction?: () => void;\n /** Called when dismiss (×) button is clicked. When omitted, dismiss button is hidden. */\n onDismiss?: () => void;\n}\n\nconst DEFAULT_ICONS: Record<SectionNoticeType, ReactNode> = {\n Info: <Icon size=\"20\" glyph={<InformationOutlineIcon />} />,\n Warning: <Icon size=\"20\" glyph={<AlertCircleOutlineIcon />} />,\n Danger: <Icon size=\"20\" glyph={<AlertOutlineIcon />} />,\n Success: <Icon size=\"20\" glyph={<CheckCircleOutlineIcon />} />,\n Hint: <Icon size=\"20\" glyph={<InformationOutlineIcon />} />,\n};\n\n/**\n * Section Notice — in-context notice block for settings and admin panels.\n * Color-coded by severity. Supports title, description, primary/secondary\n * action buttons, and dismiss.\n */\nexport default function SectionNotice({\n className = '',\n type = 'Info',\n icon,\n title,\n description,\n primaryButtonLabel,\n onPrimaryAction,\n secondaryButtonLabel,\n onSecondaryAction,\n onDismiss,\n}: SectionNoticeProps) {\n const typeClass = styles[`section-notice--type-${type.toLowerCase()}`];\n\n const rootClass = [styles['section-notice'], typeClass, className]\n .filter(Boolean)\n .join(' ');\n\n const resolvedIcon = icon !== undefined ? icon : DEFAULT_ICONS[type];\n\n const hasActions = primaryButtonLabel != null || secondaryButtonLabel != null;\n\n return (\n <div className={rootClass}>\n <div className={styles['section-notice__content']}>\n {resolvedIcon != null && (\n <span className={styles['section-notice__icon']} aria-hidden>\n {resolvedIcon}\n </span>\n )}\n <div className={styles['section-notice__body']}>\n <p className={styles['section-notice__title']}>{title}</p>\n {description != null && (\n <div className={styles['section-notice__description']}>\n {description}\n </div>\n )}\n {hasActions && (\n <div className={styles['section-notice__actions']}>\n {primaryButtonLabel != null && (\n <Button\n emphasis=\"Primary\"\n size=\"Small\"\n onClick={onPrimaryAction}\n >\n {primaryButtonLabel}\n </Button>\n )}\n {secondaryButtonLabel != null && (\n <Button\n emphasis=\"Secondary\"\n size=\"Small\"\n onClick={onSecondaryAction}\n >\n {secondaryButtonLabel}\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n {onDismiss != null && (\n <IconButton\n className={styles['section-notice__dismiss']}\n aria-label=\"Dismiss\"\n size=\"Small\"\n icon={<Icon size=\"16\" glyph={<CloseIcon />} />}\n onClick={onDismiss}\n />\n )}\n </div>\n );\n}\n","import type { KeyboardEvent, ReactNode } from 'react';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport ChevronDownIcon from '@mattermost/compass-icons/components/chevron-down';\nimport CheckIcon from '@mattermost/compass-icons/components/check';\nimport Icon from '@/components/Icon/Icon';\nimport PopoverMenu, {\n PopoverMenuScroll,\n} from '@/components/PopoverMenu/PopoverMenu';\nimport menuItemStyles from '@/components/MenuItem/MenuItem.module.scss';\nimport { useAnchoredPopupPortal } from '@/hooks/useAnchoredPopupPortal';\nimport { useOutsideClose } from '@/hooks/useOutsideClose';\nimport { usePopoverTransition } from '@/hooks/usePopoverTransition';\nimport { toKebab } from '@/utils/string';\nimport styles from './Select.module.scss';\n\nexport type SelectSize = 'Small' | 'Medium' | 'Large';\n\nexport type SelectOption = {\n value: string;\n label: string;\n disabled?: boolean;\n leadingVisual?: ReactNode;\n secondaryLabel?: string;\n};\n\nexport interface SelectProps {\n options: SelectOption[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n /** Shown on the trigger when no value is selected. Empty-value options are not listed in the menu. */\n placeholder?: string;\n label?: ReactNode;\n leadingIcon?: ReactNode;\n size?: SelectSize;\n invalid?: boolean;\n disabled?: boolean;\n id?: string;\n name?: string;\n className?: string;\n 'aria-label'?: string;\n /** Portal mount node for the menu; defaults to `document.body`. */\n portalContainer?: HTMLElement | null;\n /** Stacking order for the portaled menu. */\n zIndex?: number;\n}\n\nconst POPUP_MAX_HEIGHT = 280;\n\nfunction SelectOptionRow({\n option,\n listboxId,\n selected,\n active,\n onSelect,\n onHover,\n}: {\n option: SelectOption;\n listboxId: string;\n selected: boolean;\n active: boolean;\n onSelect: (option: SelectOption) => void;\n onHover: () => void;\n}) {\n const rowClass = [\n menuItemStyles['menu-item'],\n active ? menuItemStyles['menu-item--active'] : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <li\n id={`${listboxId}-option-${option.value}`}\n role=\"option\"\n className={[styles.select__option, rowClass].filter(Boolean).join(' ')}\n aria-selected={selected}\n aria-disabled={option.disabled || undefined}\n onMouseDown={(ev) => ev.preventDefault()}\n onMouseEnter={onHover}\n onPointerUp={() => {\n if (!option.disabled) onSelect(option);\n }}\n >\n <div\n className={[\n menuItemStyles['menu-item__content'],\n option.disabled ? styles['select__option-content--disabled'] : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {option.leadingVisual != null && (\n <div className={menuItemStyles['menu-item__left']}>\n <span className={menuItemStyles['menu-item__leading-visual']}>\n {option.leadingVisual}\n </span>\n </div>\n )}\n <div className={menuItemStyles['menu-item__middle']}>\n <div className={menuItemStyles['menu-item__top-row']}>\n <span className={menuItemStyles['menu-item__label']}>\n {option.label}\n </span>\n </div>\n {option.secondaryLabel != null && (\n <div className={menuItemStyles['menu-item__bottom-row']}>\n <span className={menuItemStyles['menu-item__secondary-label-below']}>\n {option.secondaryLabel}\n </span>\n </div>\n )}\n </div>\n {selected && (\n <div className={menuItemStyles['menu-item__right']}>\n <span\n className={[\n menuItemStyles['menu-item__trailing-visual'],\n menuItemStyles['menu-item__trailing-visual--check'],\n ].join(' ')}\n >\n <Icon glyph={<CheckIcon />} size=\"16\" />\n </span>\n </div>\n )}\n </div>\n </li>\n );\n}\n\n/**\n * Select with floating label and PopoverMenu list.\n * Field chrome matches Combobox / Text Input; list uses PopoverMenu + MenuItem.\n *\n * @see https://compass.mattermost.com (Select)\n */\nconst Select = forwardRef<HTMLButtonElement, SelectProps>(function Select(\n {\n options,\n value: valueProp,\n defaultValue = '',\n onChange,\n placeholder,\n label,\n leadingIcon,\n size = 'Medium',\n invalid = false,\n disabled = false,\n id: idProp,\n name,\n className = '',\n 'aria-label': ariaLabel,\n portalContainer = null,\n zIndex,\n },\n ref,\n) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const listboxId = `${id}-listbox`;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n\n const setButtonRef = useCallback(\n (node: HTMLButtonElement | null) => {\n buttonRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n const isControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const value = isControlled ? valueProp! : uncontrolledValue;\n\n const [isOpen, setIsOpen] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n\n const selectedOption = useMemo(\n () => options.find((o) => o.value === value),\n [options, value],\n );\n\n const listOptions = useMemo(\n () => options.filter((o) => o.value !== ''),\n [options],\n );\n\n const hasValue = value !== '';\n\n const { mounted: popupMounted, visible: popupVisible } =\n usePopoverTransition(isOpen);\n\n const {\n placement,\n maxHeight,\n style: popupStyle,\n portalRef,\n renderPortal,\n } = useAnchoredPopupPortal(anchorRef, popupMounted, {\n preferredHeight: POPUP_MAX_HEIGHT,\n maxHeightCap: POPUP_MAX_HEIGHT,\n portalContainer,\n zIndex,\n });\n\n const close = useCallback(() => {\n setIsOpen(false);\n setActiveIndex(-1);\n }, []);\n\n const open = useCallback(() => {\n if (disabled) return;\n setIsOpen(true);\n }, [disabled]);\n\n useOutsideClose(rootRef, isOpen, close, portalRef);\n\n useEffect(() => {\n if (!isOpen) return;\n setActiveIndex((prev) => {\n if (listOptions.length === 0) return -1;\n if (prev >= 0 && prev < listOptions.length) return prev;\n const selectedIdx = listOptions.findIndex((o) => o.value === value);\n if (selectedIdx >= 0) return selectedIdx;\n const firstEnabled = listOptions.findIndex((o) => !o.disabled);\n return firstEnabled >= 0 ? firstEnabled : 0;\n });\n }, [isOpen, listOptions, value]);\n\n const commitValue = useCallback(\n (next: string) => {\n if (!isControlled) setUncontrolledValue(next);\n onChange?.(next);\n },\n [isControlled, onChange],\n );\n\n const selectOption = useCallback(\n (option: SelectOption) => {\n if (option.disabled) return;\n commitValue(option.value);\n close();\n buttonRef.current?.focus();\n },\n [commitValue, close],\n );\n\n const moveActive = useCallback(\n (delta: number) => {\n const enabled = listOptions\n .map((o, i) => ({ o, i }))\n .filter(({ o }) => !o.disabled);\n if (enabled.length === 0) {\n setActiveIndex(-1);\n return;\n }\n setActiveIndex((prev) => {\n const currentPos = enabled.findIndex(({ i }) => i === prev);\n const nextPos =\n currentPos < 0\n ? delta > 0\n ? 0\n : enabled.length - 1\n : (currentPos + delta + enabled.length) % enabled.length;\n return enabled[nextPos].i;\n });\n },\n [listOptions],\n );\n\n useEffect(() => {\n if (!isOpen || activeIndex < 0) return;\n const option = listOptions[activeIndex];\n if (!option) return;\n const el = document.getElementById(`${listboxId}-option-${option.value}`);\n el?.scrollIntoView({ block: 'nearest' });\n }, [isOpen, activeIndex, listOptions, listboxId]);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(-1);\n break;\n case 'Home':\n if (isOpen && listOptions.length > 0) {\n e.preventDefault();\n const idx = listOptions.findIndex((o) => !o.disabled);\n setActiveIndex(idx >= 0 ? idx : 0);\n }\n break;\n case 'End':\n if (isOpen && listOptions.length > 0) {\n e.preventDefault();\n for (let i = listOptions.length - 1; i >= 0; i--) {\n if (!listOptions[i]?.disabled) {\n setActiveIndex(i);\n break;\n }\n }\n }\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (isOpen && activeIndex >= 0 && listOptions[activeIndex]) {\n selectOption(listOptions[activeIndex]);\n } else if (!isOpen) {\n open();\n }\n break;\n case 'Escape':\n if (isOpen) {\n e.preventDefault();\n close();\n }\n break;\n case 'Tab':\n close();\n break;\n default:\n break;\n }\n };\n\n const labelFloated = isFocused || isOpen || hasValue;\n const displayLabel = selectedOption?.label ?? placeholder ?? '';\n const showPlaceholderStyle = !hasValue && displayLabel !== '';\n\n const activeOption =\n activeIndex >= 0 ? listOptions[activeIndex] : undefined;\n const activeDescendant =\n isOpen && activeOption != null\n ? `${listboxId}-option-${activeOption.value}`\n : undefined;\n\n const sizeClass = styles[`select--size-${toKebab(size)}`];\n const rootClass = [\n styles.select,\n sizeClass,\n invalid ? styles['select--invalid'] : '',\n label != null && labelFloated ? styles['select--label-floated'] : '',\n leadingIcon != null ? styles['select--has-leading-icon'] : '',\n isOpen ? styles['select--open'] : '',\n disabled ? styles['select--disabled'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const controlClass = [\n styles.select__control,\n showPlaceholderStyle ? styles['select__control--placeholder'] : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass} ref={rootRef}>\n <div className={styles.select__wrapper} ref={anchorRef}>\n {label != null && (\n <label className={styles.select__label} htmlFor={id}>\n {label}\n </label>\n )}\n <button\n ref={setButtonRef}\n id={id}\n type=\"button\"\n role=\"combobox\"\n className={controlClass}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-activedescendant={activeDescendant}\n aria-invalid={invalid ? true : undefined}\n aria-label={\n ariaLabel ??\n (typeof label === 'string' ? label : undefined)\n }\n onClick={() => (isOpen ? close() : open())}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onKeyDown={handleKeyDown}\n >\n {leadingIcon != null && (\n <span className={styles.select__leadingIcon} aria-hidden>\n {leadingIcon}\n </span>\n )}\n <span className={styles.select__value}>{displayLabel}</span>\n <span className={styles.select__trailingIcon} aria-hidden>\n <Icon size=\"12\" glyph={<ChevronDownIcon />} />\n </span>\n </button>\n </div>\n\n {name != null && !disabled && (\n <input type=\"hidden\" name={name} value={value} />\n )}\n\n {popupMounted &&\n renderPortal(\n <div\n ref={portalRef}\n className={[\n styles.select__popup,\n placement === 'above' ? styles['select__popup--above'] : '',\n popupVisible ? styles['select__popup--visible'] : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={popupStyle}\n >\n <PopoverMenu className={styles.select__menu}>\n <PopoverMenuScroll maxHeight={maxHeight}>\n <ul\n id={listboxId}\n className={styles.select__list}\n role=\"listbox\"\n aria-label={\n typeof label === 'string' ? label : (ariaLabel ?? 'Options')\n }\n >\n {listOptions.map((option, index) => (\n <SelectOptionRow\n key={option.value}\n option={option}\n listboxId={listboxId}\n selected={option.value === value}\n active={index === activeIndex}\n onSelect={selectOption}\n onHover={() => setActiveIndex(index)}\n />\n ))}\n </ul>\n </PopoverMenuScroll>\n </PopoverMenu>\n </div>,\n )}\n </div>\n );\n});\n\nexport default Select;\n","import type { HTMLAttributes } from 'react';\nimport styles from './Spinner.module.scss';\n\nexport type SpinnerSize = 10 | 12 | 16 | 20 | 24 | 28 | 32;\n\nexport interface SpinnerProps extends Omit<\n HTMLAttributes<HTMLSpanElement>,\n 'role'\n> {\n size?: SpinnerSize;\n inverted?: boolean;\n 'aria-label'?: string;\n}\n\nexport default function Spinner({\n size = 16,\n inverted = false,\n className = '',\n 'aria-label': ariaLabel = 'Loading',\n style,\n ...htmlProps\n}: SpinnerProps) {\n const strokeWidth = Math.max(1, Math.min(3, Math.round(size * 0.1)));\n\n const rootClass = [\n styles.spinner,\n inverted ? styles['spinner--inverted'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span\n className={rootClass}\n role=\"status\"\n aria-label={ariaLabel}\n style={{\n width: `${size}px`,\n height: `${size}px`,\n ['--spinner-stroke-width' as string]: `${strokeWidth}px`,\n ...style,\n }}\n {...htmlProps}\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './Tabs.module.scss';\n\nexport interface TabItem {\n /** Unique key for this tab. */\n key: string;\n /** Tab label text. */\n label: string;\n /** Optional count badge number. */\n countBadge?: number;\n /** When true, shows an unread dot badge. */\n unreadBadge?: boolean;\n}\n\nexport interface TabsProps {\n /** Array of tab items to display. */\n tabs: TabItem[];\n /** Key of the currently active tab. */\n activeKey: string;\n /** Called when a tab is selected. */\n onChange: (key: string) => void;\n /** Optional CSS class name. */\n className?: string;\n /** Optional trailing controls rendered to the right of the tabs. */\n controls?: ReactNode;\n}\n\n/**\n * Tabs component matching Figma design.\n * Horizontal tab navigation with active state, count badges, and unread indicators.\n */\nexport default function Tabs({\n tabs,\n activeKey,\n onChange,\n className = '',\n controls,\n}: TabsProps) {\n const rootClass = [styles.tabs, className].filter(Boolean).join(' ');\n\n return (\n <div className={rootClass}>\n <div className={styles['tabs__tab-list']} role=\"tablist\">\n {tabs.map((tab) => {\n const isActive = tab.key === activeKey;\n const tabClass = [\n styles['tabs__tab'],\n isActive ? styles['tabs__tab--active'] : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n key={tab.key}\n role=\"tab\"\n type=\"button\"\n aria-selected={isActive}\n className={tabClass}\n onClick={() => onChange(tab.key)}\n >\n <span className={styles['tabs__tab-label']}>{tab.label}</span>\n\n {tab.countBadge != null && (\n <span\n className={[\n styles['tabs__count-badge'],\n isActive ? styles['tabs__count-badge--active'] : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {tab.countBadge}\n </span>\n )}\n\n {tab.unreadBadge && !isActive && (\n <span\n className={styles['tabs__unread-badge']}\n aria-label=\"Unread\"\n />\n )}\n </button>\n );\n })}\n </div>\n\n {controls != null && (\n <div className={styles['tabs__controls']}>{controls}</div>\n )}\n </div>\n );\n}\n","import MentionBadge from '../MentionBadge/MentionBadge';\nimport styles from './TeamAvatar.module.scss';\n\nexport type TeamAvatarSize =\n | '24'\n | '28'\n | '32'\n | '40'\n | '48'\n | '56'\n | '64'\n | '72'\n | '96'\n | '120';\nexport type TeamAvatarState = 'Default' | 'Active';\n\nexport interface TeamAvatarProps {\n alt?: string;\n badge?: number;\n className?: string;\n initials?: string;\n size?: TeamAvatarSize;\n src?: string;\n state?: TeamAvatarState;\n}\n\nexport default function TeamAvatar({\n alt = '',\n badge,\n className = '',\n initials = 'Ac',\n size = '40',\n src,\n state = 'Default',\n}: TeamAvatarProps) {\n const numSize = parseInt(size, 10);\n const isActive = state === 'Active';\n const showBadge = badge != null && badge > 0 && numSize <= 64 && !isActive;\n\n const rootClasses = [\n styles['team-avatar'],\n styles[`team-avatar--size-${size}`],\n isActive && styles['team-avatar--active'],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClasses}>\n <div className={styles['team-avatar__inner']}>\n {src ? (\n <img src={src} alt={alt} className={styles['team-avatar__image']} />\n ) : (\n <div\n className={styles['team-avatar__fallback']}\n aria-label={alt || initials}\n >\n {initials}\n </div>\n )}\n </div>\n {showBadge && (\n <MentionBadge\n count={badge!}\n size=\"Medium\"\n className={styles['team-avatar__badge']}\n />\n )}\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport AccountMultipleOutlineIcon from '@mattermost/compass-icons/components/account-multiple-outline';\nimport AccountPlusOutlineIcon from '@mattermost/compass-icons/components/account-plus-outline';\nimport CogOutlineIcon from '@mattermost/compass-icons/components/cog-outline';\nimport ExitToAppIcon from '@mattermost/compass-icons/components/exit-to-app';\nimport LightbulbOutlineIcon from '@mattermost/compass-icons/components/lightbulb-outline';\nimport PlusIcon from '@mattermost/compass-icons/components/plus';\nimport Icon from '@/components/Icon/Icon';\nimport MenuItem from '@/components/MenuItem/MenuItem';\nimport PopoverMenu, {\n PopoverMenuDivider,\n PopoverMenuGroup,\n} from '@/components/PopoverMenu/PopoverMenu';\nimport styles from './TeamMenu.module.scss';\n\nexport interface TeamMenuProps extends HTMLAttributes<HTMLDivElement> {\n /** Shows Manage members and Manage groups (team admin). */\n adminOptions?: boolean;\n /** Shows Create a team. */\n createTeamPermission?: boolean;\n /** Shows Join another team. Default: true. */\n joinTeamPermission?: boolean;\n}\n\n/**\n * Team menu from the team switcher / team header — invite, settings, and\n * optional admin / create-team rows.\n */\nexport default function TeamMenu({\n adminOptions = false,\n createTeamPermission = false,\n joinTeamPermission = true,\n className = '',\n style,\n ...rest\n}: TeamMenuProps) {\n const rootClass = [styles['team-menu'], className].filter(Boolean).join(' ');\n\n return (\n <PopoverMenu\n className={rootClass}\n style={{ width: '260px', ...style }}\n {...rest}\n >\n <PopoverMenuGroup>\n <MenuItem\n label=\"Invite people\"\n secondaryLabel=\"Add or invite people to team\"\n leadingVisual={<Icon glyph={<AccountPlusOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Team settings\"\n leadingVisual={<Icon glyph={<CogOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"View members\"\n leadingVisual={\n <Icon glyph={<AccountMultipleOutlineIcon />} size=\"16\" />\n }\n />\n {adminOptions && (\n <MenuItem\n label=\"Manage members\"\n leadingVisual={\n <Icon glyph={<AccountMultipleOutlineIcon />} size=\"16\" />\n }\n />\n )}\n {adminOptions && (\n <MenuItem\n label=\"Manage groups\"\n leadingVisual={\n <Icon glyph={<AccountMultipleOutlineIcon />} size=\"16\" />\n }\n />\n )}\n <MenuItem\n label=\"Leave team\"\n destructive\n leadingVisual={<Icon glyph={<ExitToAppIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n {joinTeamPermission && (\n <MenuItem\n label=\"Join another team\"\n leadingVisual={<Icon glyph={<PlusIcon />} size=\"16\" />}\n />\n )}\n {createTeamPermission && (\n <MenuItem\n label=\"Create a team\"\n leadingVisual={<Icon glyph={<PlusIcon />} size=\"16\" />}\n />\n )}\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n className={styles['team-menu__learn-item']}\n label=\"Learn about teams\"\n leadingVisual={<Icon glyph={<LightbulbOutlineIcon />} size=\"16\" />}\n />\n </PopoverMenuGroup>\n </PopoverMenu>\n );\n}\n","import { toKebab } from '@/utils/string';\nimport styles from './UnreadBadge.module.scss';\n\nexport type UnreadBadgeSize = '6' | '8';\n\nexport type UnreadBadgeContext = 'Team Icon' | 'Icon Button';\n\nexport interface UnreadBadgeProps {\n /** Dot size in px. Default: 8. */\n size?: UnreadBadgeSize;\n /** Display context affects dot colour. Default: Team Icon (same fill as MentionBadge). */\n context?: UnreadBadgeContext;\n /** Optional CSS class name. */\n className?: string;\n /** Accessible label. Default: \"Unread\". */\n 'aria-label'?: string;\n}\n\n/**\n * Small unread dot indicator (no number).\n * Signals \"something unread\" without a count.\n * Two sizes (6/8 px) and two contexts (Team Icon / Icon Button).\n *\n * @see Figma Unread Badge (v2.0.0, Source: F3fippSczUZwF6C5yXoNFf)\n */\nexport default function UnreadBadge({\n 'aria-label': ariaLabel = 'Unread',\n className = '',\n context = 'Team Icon',\n size = '8',\n}: UnreadBadgeProps) {\n const sizeClass = styles[`unread-badge--size-${size}`];\n const contextClass = styles[`unread-badge--context-${toKebab(context)}`];\n const rootClass = [styles['unread-badge'], sizeClass, contextClass, className]\n .filter(Boolean)\n .join(' ');\n\n return <span className={rootClass} role=\"status\" aria-label={ariaLabel} />;\n}\n","import PlusIcon from '@mattermost/compass-icons/components/plus';\nimport DialpadIcon from '@mattermost/compass-icons/components/dialpad';\nimport Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport TeamAvatar from '@/components/TeamAvatar/TeamAvatar';\nimport UnreadBadge from '@/components/UnreadBadge/UnreadBadge';\nimport styles from './TeamSidebar.module.scss';\n\nexport interface TeamSidebarItem {\n id: string;\n name: string;\n src?: string;\n initials?: string;\n unread?: boolean;\n mentions?: number;\n}\n\nexport interface TeamSidebarProps {\n className?: string;\n teams: TeamSidebarItem[];\n activeTeamId?: string;\n showAddTeam?: boolean;\n showDialPad?: boolean;\n dialPadActive?: boolean;\n onSelectTeam?: (id: string) => void;\n onAddTeam?: () => void;\n onDialPadClick?: () => void;\n}\n\nexport default function TeamSidebar({\n className = '',\n teams,\n activeTeamId,\n showAddTeam = true,\n showDialPad = false,\n dialPadActive = false,\n onSelectTeam,\n onAddTeam,\n onDialPadClick,\n}: TeamSidebarProps) {\n const rootClass = [styles['team-sidebar'], className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass}>\n <div className={styles['team-sidebar__teams']}>\n {teams.map((team) => {\n const active = team.id === activeTeamId;\n const hasMentions = team.mentions != null && team.mentions > 0;\n const showUnreadDot = team.unread && !active && !hasMentions;\n return (\n <button\n key={team.id}\n type=\"button\"\n className={styles['team-sidebar__team']}\n aria-label={team.name}\n aria-current={active ? 'true' : undefined}\n onClick={() => onSelectTeam?.(team.id)}\n >\n <TeamAvatar\n src={team.src}\n alt={team.name}\n initials={team.initials}\n state={active ? 'Active' : 'Default'}\n badge={hasMentions ? team.mentions : undefined}\n />\n {showUnreadDot && (\n <UnreadBadge\n className={styles['team-sidebar__unread']}\n aria-label={`${team.name} has unread messages`}\n />\n )}\n </button>\n );\n })}\n {showAddTeam && (\n <IconButton\n aria-label=\"Add team\"\n size=\"Medium\"\n style=\"Inverted\"\n icon={<Icon size=\"20\" glyph={<PlusIcon />} />}\n onClick={onAddTeam}\n className={styles['team-sidebar__add']}\n />\n )}\n </div>\n {showDialPad && (\n <div className={styles['team-sidebar__footer']}>\n <IconButton\n aria-label=\"Dial pad\"\n size=\"Small\"\n style=\"Inverted\"\n active={dialPadActive}\n icon={<Icon size=\"16\" glyph={<DialpadIcon />} />}\n onClick={onDialPadClick}\n className={styles['team-sidebar__dial-pad']}\n />\n </div>\n )}\n </div>\n );\n}\n","import type { TextareaHTMLAttributes, ReactNode, ChangeEvent } from 'react';\nimport { forwardRef, useId, useState, useCallback } from 'react';\nimport { toKebab } from '@/utils/string';\nimport styles from './TextArea.module.scss';\n\nexport type TextAreaSize = 'Small' | 'Medium' | 'Large';\n\nexport interface TextAreaProps extends Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'size'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** When true, shows invalid/error styling. */\n invalid?: boolean;\n /** Floating label content. When provided, label floats on focus or when value is non-empty. */\n label?: ReactNode;\n /** Max length for the textarea; used with showCharacterCount for counter. */\n maxLength?: number;\n /** When true with maxLength, shows \"current / max\" character count below textarea. */\n showCharacterCount?: boolean;\n /** Size variant. Default: Medium. */\n size?: TextAreaSize;\n}\n\n/**\n * Text Area component with optional floating label and character counter.\n * Multi-line text input for long-form content. Matches Figma Text Area v2.0.0.\n * Used in message compose, post editing, admin settings.\n *\n * @see https://compass.mattermost.com (Text Area)\n */\nconst TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n function TextArea(\n {\n className = '',\n size = 'Medium',\n label,\n invalid = false,\n maxLength,\n showCharacterCount = false,\n id: idProp,\n value: valueProp,\n defaultValue,\n placeholder,\n onFocus,\n onBlur,\n onChange,\n disabled,\n readOnly,\n rows = 3,\n ...rest\n },\n ref,\n ) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n\n const isControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? '',\n );\n const value = isControlled ? (valueProp as string) : uncontrolledValue;\n const hasValue = value != null && value !== '';\n\n const [isFocused, setIsFocused] = useState(false);\n const labelFloated = isFocused || hasValue;\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n onFocus?.(e);\n },\n [onFocus],\n );\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n onBlur?.(e);\n },\n [onBlur],\n );\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) setUncontrolledValue(e.target.value);\n onChange?.(e);\n },\n [isControlled, onChange],\n );\n\n const sizeClass = styles[`textArea--size-${toKebab(size)}`];\n const invalidClass = invalid ? styles['textArea--invalid'] : '';\n const labelFloatedClass =\n label != null && labelFloated ? styles['textArea--label-floated'] : '';\n\n const rootClass = [\n styles.textArea,\n sizeClass,\n invalidClass,\n labelFloatedClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const currentLength = typeof value === 'string' ? value.length : 0;\n const counterId =\n showCharacterCount && maxLength != null ? `${id}-counter` : undefined;\n\n return (\n <div className={rootClass}>\n <div className={styles.textArea__wrapper}>\n {label != null && (\n <label className={styles.textArea__label} htmlFor={id}>\n {label}\n </label>\n )}\n <textarea\n ref={ref}\n id={id}\n className={styles.textArea__input}\n value={isControlled ? valueProp : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n readOnly={readOnly}\n rows={rows}\n aria-invalid={invalid ? true : undefined}\n aria-describedby={counterId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n {...rest}\n />\n </div>\n {showCharacterCount && maxLength != null && (\n <div\n id={counterId}\n className={styles.textArea__counter}\n aria-live=\"polite\"\n >\n {currentLength} / {maxLength}\n </div>\n )}\n </div>\n );\n },\n);\n\nexport default TextArea;\n","import type {\n InputHTMLAttributes,\n ReactNode,\n ChangeEvent,\n RefCallback,\n} from 'react';\nimport { forwardRef, useId, useState, useCallback, useRef } from 'react';\nimport { toKebab } from '@/utils/string';\nimport styles from './TextInput.module.scss';\n\nexport type TextInputSize = 'Small' | 'Medium' | 'Large';\n\nexport interface TextInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** When true, shows invalid/error styling. */\n invalid?: boolean;\n /** Floating label content. When provided, label floats on focus or when value is non-empty. */\n label?: ReactNode;\n /** Leading icon (e.g. <Icon glyph={<SearchIcon />} size=\"16\" />). */\n leadingIcon?: ReactNode;\n /** Max length for the input; used with showCharacterCount for counter. */\n maxLength?: number;\n /** When true with maxLength, shows \"current / max\" character count below input. */\n showCharacterCount?: boolean;\n /** Size variant. Figma: Small (32px), Medium (40px), Large (48px). Default: Medium. */\n size?: TextInputSize;\n /** Trailing icon. */\n trailingIcon?: ReactNode;\n}\n\n/**\n * Text Input component with optional floating label, leading/trailing icons, and character counter.\n * Matches Figma Text Input v2.0.1 (Border=On only). Uses theme variables only.\n * When label is provided, the label floats above the border on focus or when the field has a value.\n *\n * @see https://compass.mattermost.com (Text Input)\n */\nconst TextInput = forwardRef<HTMLInputElement, TextInputProps>(\n function TextInput(\n {\n className = '',\n size = 'Medium',\n label,\n leadingIcon,\n trailingIcon,\n invalid = false,\n maxLength,\n showCharacterCount = false,\n id: idProp,\n value: valueProp,\n defaultValue,\n placeholder,\n onFocus,\n onBlur,\n onChange,\n disabled,\n readOnly,\n ...rest\n },\n ref,\n ) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n const cleanup = (ref as RefCallback<HTMLInputElement>)(node);\n return () => {\n inputRef.current = null;\n if (typeof cleanup === 'function') cleanup();\n };\n }\n if (ref) ref.current = node;\n },\n [ref],\n );\n\n const isControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? '',\n );\n const value = isControlled ? (valueProp as string) : uncontrolledValue;\n const hasValue = value != null && value !== '';\n\n const [isFocused, setIsFocused] = useState(false);\n const labelFloated = isFocused || hasValue;\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n onFocus?.(e);\n },\n [onFocus],\n );\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n onBlur?.(e);\n },\n [onBlur],\n );\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setUncontrolledValue(e.target.value);\n onChange?.(e);\n },\n [isControlled, onChange],\n );\n\n const sizeClass = styles[`textInput--size-${toKebab(size)}`];\n const invalidClass = invalid ? styles['textInput--invalid'] : '';\n const labelFloatedClass =\n label != null && labelFloated ? styles['textInput--label-floated'] : '';\n const hasLeadingClass =\n leadingIcon != null ? styles['textInput--has-leading-icon'] : '';\n const hasTrailingClass =\n trailingIcon != null ? styles['textInput--has-trailing-icon'] : '';\n\n const rootClass = [\n styles.textInput,\n sizeClass,\n invalidClass,\n labelFloatedClass,\n hasLeadingClass,\n hasTrailingClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const currentLength = typeof value === 'string' ? value.length : 0;\n const counterId =\n showCharacterCount && maxLength != null ? `${id}-counter` : undefined;\n\n return (\n <div className={rootClass}>\n <div className={styles.textInput__wrapper}>\n <label className={styles.textInput__inner}>\n {label != null && (\n <span className={styles.textInput__label}>{label}</span>\n )}\n {leadingIcon != null && (\n <span className={styles.textInput__leadingIcon}>\n {leadingIcon}\n </span>\n )}\n <input\n ref={setInputRef}\n id={id}\n className={styles.textInput__input}\n value={isControlled ? valueProp : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n readOnly={readOnly}\n aria-invalid={invalid ? true : undefined}\n aria-describedby={counterId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n {...rest}\n />\n {trailingIcon != null && (\n <span className={styles.textInput__trailingIcon}>\n {trailingIcon}\n </span>\n )}\n </label>\n </div>\n {showCharacterCount && maxLength != null && (\n <div\n id={counterId}\n className={styles.textInput__counter}\n aria-live=\"polite\"\n >\n {currentLength} / {maxLength}\n </div>\n )}\n </div>\n );\n },\n);\n\nexport default TextInput;\n","import type { HTMLAttributes } from 'react';\nimport BookmarkOutlineIcon from '@mattermost/compass-icons/components/bookmark-outline';\nimport LinkVariantIcon from '@mattermost/compass-icons/components/link-variant';\nimport MarkAsUnreadIcon from '@mattermost/compass-icons/components/mark-as-unread';\nimport MessageMinusOutlineIcon from '@mattermost/compass-icons/components/message-minus-outline';\nimport OpenInNewIcon from '@mattermost/compass-icons/components/open-in-new';\nimport Icon from '@/components/Icon/Icon';\nimport MenuItem from '@/components/MenuItem/MenuItem';\nimport PopoverMenu, {\n PopoverMenuDivider,\n PopoverMenuGroup,\n} from '@/components/PopoverMenu/PopoverMenu';\nimport ShortcutTag from '@/components/ShortcutTag/ShortcutTag';\n\nexport interface ThreadActionsMenuProps extends HTMLAttributes<HTMLDivElement> {}\n\nfunction shortcutLabel(text: string) {\n return <ShortcutTag label={text} size=\"Small\" />;\n}\n\n/**\n * Thread list / thread header actions menu.\n */\nexport default function ThreadActionsMenu({\n className = '',\n style,\n ...rest\n}: ThreadActionsMenuProps) {\n return (\n <PopoverMenu\n className={className}\n style={{ width: '268px', ...style }}\n {...rest}\n >\n <PopoverMenuGroup>\n <MenuItem\n label=\"Unfollow thread\"\n leadingVisual={<Icon glyph={<MessageMinusOutlineIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Open in channel\"\n leadingVisual={<Icon glyph={<OpenInNewIcon />} size=\"16\" />}\n />\n <MenuItem\n label=\"Mark as unread\"\n leadingVisual={<Icon glyph={<MarkAsUnreadIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={shortcutLabel('U')}\n />\n <MenuItem\n label=\"Save\"\n leadingVisual={<Icon glyph={<BookmarkOutlineIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={shortcutLabel('S')}\n />\n </PopoverMenuGroup>\n <PopoverMenuDivider />\n <PopoverMenuGroup>\n <MenuItem\n label=\"Copy link\"\n leadingVisual={<Icon glyph={<LinkVariantIcon />} size=\"16\" />}\n trailingElement\n trailingVisual={shortcutLabel('K')}\n />\n </PopoverMenuGroup>\n </PopoverMenu>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport UserAvatar from '@/components/UserAvatar/UserAvatar';\nimport Button from '@/components/Button/Button';\nimport Icon from '@/components/Icon/Icon';\nimport ReplyOutlineIcon from '@mattermost/compass-icons/components/reply-outline';\nimport styles from './ThreadFooter.module.scss';\n\nexport type ThreadFooterBadge = 'None' | 'Unread' | 'Mention';\n\nexport interface AvatarData {\n src: string;\n alt: string;\n}\n\nexport interface ThreadFooterProps extends HTMLAttributes<HTMLDivElement> {\n /** Reply count. Default: 3. */\n replyCount?: number;\n /** Participant avatars (first 3 shown, overflow as +N). */\n avatars?: AvatarData[];\n /** Badge variant. Default: None. */\n badge?: ThreadFooterBadge;\n /** Whether the current user is following the thread. Default: false. */\n following?: boolean;\n /** Last reply timestamp label. Shown when following. */\n lastReplyTime?: string;\n /** Called when Reply is clicked. */\n onReply?: () => void;\n /** Called when Follow/Following is clicked. */\n onFollowToggle?: () => void;\n /** Hover / active state for button highlight. Default: false. */\n hovered?: boolean;\n /** Optional CSS class name. */\n className?: string;\n}\n\n/**\n * Reply summary bar at the bottom of messages.\n * Shows participant avatars, reply count, Follow/Following toggle,\n * and last reply time. Badge variants: None, Unread dot, Mention count.\n */\nexport default function ThreadFooter({\n replyCount = 3,\n avatars = [],\n badge = 'None',\n following = false,\n lastReplyTime,\n onReply,\n onFollowToggle,\n hovered = false,\n className = '',\n ...rest\n}: ThreadFooterProps) {\n const rootClass = [styles['thread-footer'], className]\n .filter(Boolean)\n .join(' ');\n\n const MAX_VISIBLE = 3;\n const visibleAvatars = avatars.slice(0, MAX_VISIBLE);\n const overflowCount =\n avatars.length > MAX_VISIBLE ? avatars.length - MAX_VISIBLE : 0;\n\n return (\n <div className={rootClass} {...rest}>\n <div className={styles['thread-footer__inner']}>\n {/* Badge + Avatars */}\n <div className={styles['thread-footer__avatars-group']}>\n {badge === 'Unread' && (\n <span\n className={styles['thread-footer__unread-dot']}\n aria-label=\"Unread replies\"\n />\n )}\n {badge === 'Mention' && (\n <span className={styles['thread-footer__mention-badge']}>@</span>\n )}\n\n {/* Avatar stack */}\n {visibleAvatars.length > 0 && (\n <div className={styles['thread-footer__avatars']}>\n {visibleAvatars.map((av, i) => (\n <UserAvatar\n key={i}\n src={av.src}\n alt={av.alt}\n size=\"20\"\n className={styles['thread-footer__avatar']}\n />\n ))}\n {overflowCount > 0 && (\n <span className={styles['thread-footer__avatar-overflow']}>\n +{overflowCount}\n </span>\n )}\n </div>\n )}\n\n {/* Placeholder avatars when none provided */}\n {visibleAvatars.length === 0 && (\n <div className={styles['thread-footer__avatars']}>\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className={styles['thread-footer__avatar-placeholder']}\n />\n ))}\n <span className={styles['thread-footer__avatar-overflow']}>\n +2\n </span>\n </div>\n )}\n </div>\n\n {/* Buttons */}\n <div className={styles['thread-footer__buttons']}>\n {/* Reply button */}\n <Button\n emphasis=\"Quaternary\"\n size=\"X-Small\"\n className={[\n styles['thread-footer__reply-btn'],\n hovered ? styles['thread-footer__reply-btn--hovered'] : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={onReply}\n aria-label={`${replyCount} repl${replyCount === 1 ? 'y' : 'ies'}`}\n leadingIcon={<Icon size=\"12\" glyph={<ReplyOutlineIcon />} />}\n >\n <span className={styles['thread-footer__btn-label']}>\n {replyCount} {replyCount === 1 ? 'reply' : 'replies'}\n </span>\n </Button>\n\n <div className={styles['thread-footer__divider']} aria-hidden />\n\n {/* Follow / Following button */}\n <Button\n emphasis=\"Quaternary\"\n size=\"X-Small\"\n className={[\n styles['thread-footer__follow-btn'],\n following ? styles['thread-footer__follow-btn--following'] : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={onFollowToggle}\n aria-pressed={following}\n aria-label={following ? 'Unfollow thread' : 'Follow thread'}\n >\n {following ? 'Following' : 'Follow'}\n </Button>\n\n {/* Last reply time — visible when following */}\n {following && lastReplyTime && (\n <>\n <div className={styles['thread-footer__divider']} aria-hidden />\n <span className={styles['thread-footer__last-reply']}>\n {lastReplyTime}\n </span>\n </>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { ShortcutTagGroup } from '@/components/ShortcutTag/ShortcutTag';\nimport styles from './Tooltip.module.scss';\n\nexport type TooltipArrow = 'Top' | 'Right' | 'Bottom' | 'Left';\n\nexport interface TooltipShortcutKey {\n label: string;\n}\n\nexport interface TooltipProps {\n /** Tooltip label text. */\n label: string;\n /** Arrow direction. Default: Right. */\n arrow?: TooltipArrow;\n /** Optional hint text shown below label. */\n hint?: string;\n /** Optional keyboard shortcut keys shown below label. */\n shortcutKeys?: TooltipShortcutKey[];\n /** Optional leading icon node. */\n icon?: ReactNode;\n /** Optional CSS class name. */\n className?: string;\n}\n\n/**\n * Tooltip component matching Figma design.\n * Dark overlay for hover context with optional arrow, hint, and keyboard shortcuts.\n */\nexport default function Tooltip({\n label,\n arrow = 'Right',\n hint,\n shortcutKeys,\n icon,\n className = '',\n}: TooltipProps) {\n const arrowClass = styles[`tooltip--arrow-${arrow.toLowerCase()}`] ?? '';\n\n const rootClass = [styles.tooltip, arrowClass, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass}>\n <div className={styles['tooltip__container']}>\n <div className={styles['tooltip__content']}>\n {icon != null && (\n <span className={styles['tooltip__icon']} aria-hidden>\n {icon}\n </span>\n )}\n <span className={styles['tooltip__label']}>{label}</span>\n </div>\n\n {shortcutKeys && shortcutKeys.length > 0 && (\n <div className={styles['tooltip__shortcuts']}>\n <ShortcutTagGroup\n labels={shortcutKeys.map((key) => key.label)}\n location=\"Tooltips\"\n size=\"Small\"\n />\n </div>\n )}\n\n {hint && <span className={styles['tooltip__hint']}>{hint}</span>}\n </div>\n\n <div className={styles['tooltip__arrow']} aria-hidden />\n </div>\n );\n}\n","import Tooltip from '@/components/Tooltip/Tooltip';\nimport UserAvatar from '@/components/UserAvatar/UserAvatar';\nimport styles from './UserAvatarGroup.module.scss';\n\nexport type UserAvatarGroupSize =\n | '20'\n | '24'\n | '28'\n | '32'\n | '40'\n | '48'\n | '56'\n | '64'\n | '72';\n\nexport interface UserAvatarGroupItem {\n /** Unique key for the list item. */\n key: string;\n /** Image URL for the avatar. Omit to render the Fallback (initials) variant. */\n src?: string;\n /** Alt text / display name for the avatar. Drives initials and fallback colour. */\n name: string;\n}\n\nexport interface UserAvatarGroupProps {\n /** Array of avatar items to display. */\n avatars: UserAvatarGroupItem[];\n /** Maximum number of avatars to show before showing the overflow count. Default: 3. */\n max?: number;\n /** Avatar size in px. Matches Figma Avatar Group size options. Default: '20'. */\n size?: UserAvatarGroupSize;\n /** Optional CSS class name. */\n className?: string;\n}\n\nfunction overflowNamesLabel(hidden: UserAvatarGroupItem[]): string {\n if (hidden.length === 0) return '';\n if (hidden.length === 1) return hidden[0].name;\n if (hidden.length <= 3) return hidden.map((a) => a.name).join(', ');\n return `${hidden\n .slice(0, 2)\n .map((a) => a.name)\n .join(', ')}, +${hidden.length - 2} more`;\n}\n\n/**\n * Stacked, overlapping user avatars showing multiple participants.\n * Displays up to `max` avatars then shows an overflow \"+N\" chip.\n * Hover shows a `Tooltip` with each participant’s display name.\n * Used in thread footers, call cards, and playbook run info.\n *\n * @see Figma Avatar Group (v1.0.1)\n */\nexport default function UserAvatarGroup({\n avatars,\n className = '',\n max = 3,\n size = '20',\n}: UserAvatarGroupProps) {\n const visible = avatars.slice(0, max);\n const hidden = avatars.slice(max);\n const overflow = hidden.length;\n\n const rootClass = [\n styles['user-avatar-group'],\n size !== '20' ? styles[`user-avatar-group--size-${size}`] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n className={rootClass}\n role=\"group\"\n aria-label={`${avatars.length} participants`}\n >\n {visible.map((avatar) => (\n <span\n key={avatar.key}\n className={styles['user-avatar-group__item']}\n >\n <span className={styles['user-avatar-group__trigger']}>\n <UserAvatar\n src={avatar.src}\n alt={avatar.name}\n name={avatar.name}\n size={size}\n />\n </span>\n <div\n className={styles['user-avatar-group__tooltip-layer']}\n role=\"presentation\"\n >\n <Tooltip\n arrow=\"Bottom\"\n className={styles['user-avatar-group__tooltip']}\n label={avatar.name}\n />\n </div>\n </span>\n ))}\n {overflow > 0 && (\n <span\n className={[\n styles['user-avatar-group__item'],\n styles['user-avatar-group__overflow'],\n ].join(' ')}\n aria-label={`${overflow} more participants`}\n >\n <span className={styles['user-avatar-group__trigger']}>\n +{overflow}\n </span>\n <div\n className={styles['user-avatar-group__tooltip-layer']}\n role=\"presentation\"\n >\n <Tooltip\n arrow=\"Bottom\"\n className={styles['user-avatar-group__tooltip']}\n label={overflowNamesLabel(hidden)}\n />\n </div>\n </span>\n )}\n </div>\n );\n}\n","import DotsHorizontalIcon from '@mattermost/compass-icons/components/dots-horizontal';\nimport { type KeyboardEvent, type MouseEvent, useCallback } from 'react';\nimport Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport Tag from '@/components/Tag/Tag';\nimport MentionBadge from '../MentionBadge/MentionBadge';\nimport UnreadBadge from '../UnreadBadge/UnreadBadge';\nimport UserAvatarGroup, {\n type UserAvatarGroupItem,\n} from '../UserAvatarGroup/UserAvatarGroup';\nimport styles from './ThreadListItem.module.scss';\n\nconst DEFAULT_PARTICIPANTS: UserAvatarGroupItem[] = [\n { key: 'leonard', name: 'Leonard Riley' },\n { key: 'aiko', name: 'Aiko Tan' },\n { key: 'arjun', name: 'Arjun Patel' },\n { key: 'marco', name: 'Marco Rinaldi' },\n { key: 'sofia', name: 'Sofia Bauer' },\n];\n\nexport interface ThreadListItemProps {\n /** Whether this item is the active/selected thread. */\n active?: boolean;\n /** Badge in the left gutter. Default: None. Hidden when `active` is true. */\n badge?: 'None' | 'Unread' | 'Mention';\n /** Shown when `badge` is Mention. Default: 1. */\n mentionCount?: number;\n /** Author name. */\n authorName?: string;\n /** Channel/team label. */\n channelLabel?: string;\n /** Message preview text. */\n previewText?: string;\n /** Timestamp label. */\n timestamp?: string;\n /** Number of replies. */\n replyCount?: number;\n /** Stacked avatars for recent participants. Pass `[]` to hide. When omitted, uses demo participants. */\n participants?: UserAvatarGroupItem[];\n /** Optional thread title. */\n threadTitle?: string;\n /** Optional CSS class name. */\n className?: string;\n /** Click handler. */\n onClick?: () => void;\n /** Thread overflow menu handler. */\n onMenuClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n}\n\n/**\n * Thread entry in the Threads view. Shows author, team badge, preview text,\n * timestamp, participant avatars, reply count. Badge variants: None, Unread,\n * Mention. More actions (⋯) appear on row hover or focus.\n */\nexport default function ThreadListItem({\n active = false,\n badge = 'None',\n mentionCount = 1,\n authorName = 'Martin Kraft',\n channelLabel = 'ENTERPRISE TEAM',\n previewText = 'Do we have a guideline for what minimum width we should support in the system console? I know that…',\n timestamp = '5 mins ago',\n replyCount = 3,\n participants: participantsProp,\n threadTitle,\n className = '',\n onClick,\n onMenuClick,\n}: ThreadListItemProps) {\n const participants =\n participantsProp === undefined ? DEFAULT_PARTICIPANTS : participantsProp;\n const showParticipants = participants.length > 0;\n const showGutterBadge =\n !active && (badge === 'Unread' || badge === 'Mention');\n const replyLabel = replyCount === 1 ? '1 reply' : `${replyCount} replies`;\n\n const rootClass = [\n styles['thread-list-item'],\n active ? styles['thread-list-item--active'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (!onClick) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onClick();\n }\n },\n [onClick],\n );\n\n return (\n <div\n className={rootClass}\n onClick={onClick}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={onClick ? handleKeyDown : undefined}\n >\n <div className={styles['thread-list-item__thread']}>\n <div className={styles['thread-list-item__container']}>\n <div className={styles['thread-list-item__post-content']}>\n <div className={styles['thread-list-item__gutter']}>\n {showGutterBadge && badge === 'Unread' && (\n <UnreadBadge\n className={styles['thread-list-item__unread-badge']}\n context=\"Icon Button\"\n />\n )}\n {showGutterBadge && badge === 'Mention' && (\n <span className={styles['thread-list-item__mention-gutter']}>\n <MentionBadge\n count={mentionCount}\n location=\"Channel\"\n size=\"Medium\"\n />\n </span>\n )}\n </div>\n <div className={styles['thread-list-item__post-body']}>\n <div className={styles['thread-list-item__post-body-content']}>\n <div className={styles['thread-list-item__name-row']}>\n <div className={styles['thread-list-item__name-group']}>\n <span className={styles['thread-list-item__author']}>\n {authorName}\n </span>\n <Tag\n casing=\"All Caps\"\n label={channelLabel}\n />\n </div>\n <span className={styles['thread-list-item__timestamp']}>\n {timestamp}\n </span>\n </div>\n {threadTitle != null && (\n <div className={styles['thread-list-item__title-row']}>\n <p className={styles['thread-list-item__title']}>\n {threadTitle}\n </p>\n </div>\n )}\n <p className={styles['thread-list-item__preview']}>\n {previewText}\n </p>\n </div>\n </div>\n </div>\n <div className={styles['thread-list-item__replies']}>\n <div className={styles['thread-list-item__replies-inner']}>\n {showParticipants && (\n <UserAvatarGroup\n avatars={participants}\n className={styles['thread-list-item__avatar-group']}\n max={3}\n size=\"20\"\n />\n )}\n <span className={styles['thread-list-item__reply-count']}>\n {replyLabel}\n </span>\n </div>\n </div>\n </div>\n </div>\n <div className={styles['thread-list-item__actions']}>\n <span className={styles['thread-list-item__menu-button']}>\n <IconButton\n aria-label=\"Thread actions\"\n icon={<Icon size=\"16\" glyph={<DotsHorizontalIcon />} />}\n padding=\"Compact\"\n size=\"Small\"\n style=\"Default\"\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onMenuClick?.(e);\n }}\n />\n </span>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport AlertCircleOutlineIcon from '@mattermost/compass-icons/components/alert-circle-outline';\nimport AlertOutlineIcon from '@mattermost/compass-icons/components/alert-outline';\nimport CheckIcon from '@mattermost/compass-icons/components/check';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport InformationOutlineIcon from '@mattermost/compass-icons/components/information-outline';\nimport Button from '@/components/Button/Button';\nimport Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport styles from './Toast.module.scss';\n\nexport type ToastType =\n | 'General'\n | 'Info'\n | 'Success'\n | 'Warning'\n | 'Danger';\n\nexport interface ToastProps {\n className?: string;\n message: string;\n type?: ToastType;\n actionLabel?: string;\n onAction?: () => void;\n onDismiss?: () => void;\n}\n\nconst TYPE_ICONS: Record<ToastType, ReactNode> = {\n General: <AlertCircleOutlineIcon />,\n Info: <InformationOutlineIcon />,\n Success: <CheckIcon />,\n Danger: <AlertOutlineIcon />,\n Warning: <AlertCircleOutlineIcon />,\n};\n\nexport default function Toast({\n className = '',\n message,\n type = 'General',\n actionLabel,\n onAction,\n onDismiss,\n}: ToastProps) {\n const typeClass = styles[`toast--type-${type.toLowerCase()}`];\n const rootClass = [styles.toast, typeClass, className].filter(Boolean).join(' ');\n\n return (\n <div className={rootClass} role=\"status\" aria-live=\"polite\">\n <div className={styles['toast__content']}>\n <span className={styles['toast__icon']} aria-hidden>\n <Icon glyph={TYPE_ICONS[type]} size=\"16\" />\n </span>\n <span className={styles['toast__message']}>{message}</span>\n {actionLabel != null && (\n <Button\n appearance=\"Default\"\n emphasis=\"Tertiary\"\n size=\"X-Small\"\n className={styles['toast__action-btn--on-dark']}\n onClick={onAction}\n >\n {actionLabel}\n </Button>\n )}\n </div>\n {onDismiss != null && (\n <IconButton\n aria-label=\"Dismiss\"\n size=\"Small\"\n className={styles['toast__dismiss']}\n icon={<Icon glyph={<CloseIcon />} size=\"16\" />}\n onClick={onDismiss}\n />\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport CloseIcon from '@mattermost/compass-icons/components/close';\nimport ChevronRightIcon from '@mattermost/compass-icons/components/chevron-right';\nimport Button from '@/components/Button/Button';\nimport Icon from '@/components/Icon/Icon';\nimport IconButton from '@/components/IconButton/IconButton';\nimport PaginationDots from '@/components/PaginationDots/PaginationDots';\nimport { toKebab } from '@/utils/string';\nimport styles from './TourPoint.module.scss';\n\nexport type TourPointPointerPosition =\n | 'top-center'\n | 'top-left'\n | 'top-right'\n | 'bottom-center'\n | 'bottom-left'\n | 'bottom-right'\n | 'left-center'\n | 'right-center';\n\nexport interface TourPointProgress {\n pages: number;\n activePage: number;\n onPageChange?: (page: number) => void;\n}\n\nexport interface TourPointPrimaryAction {\n label: string;\n onClick?: () => void;\n}\n\nexport interface TourPointProps {\n title: string;\n children: ReactNode;\n /** Optional image between body copy and footer (e.g. screenshot as an img). */\n media?: ReactNode;\n /** Where the pointer sits on the card edge; omit or `none` to hide the pointer. */\n pointerPosition?: TourPointPointerPosition | 'none';\n /**\n * Animated marker at the arrow tip (Figma Pulsing Dot). Only applies when a\n * pointer is shown. Default on; set false for reduced motion preference at the\n * callsite or a static tour step.\n */\n showPulsingDot?: boolean;\n onClose?: () => void;\n progress?: TourPointProgress;\n primaryAction?: TourPointPrimaryAction;\n className?: string;\n}\n\nexport default function TourPoint({\n title,\n children,\n media,\n pointerPosition = 'top-center',\n showPulsingDot = true,\n onClose,\n progress,\n primaryAction,\n className = '',\n}: TourPointProps) {\n const showPointer = pointerPosition !== 'none';\n const pointerModifier =\n showPointer &&\n styles[`tour-point--pointer-${toKebab(pointerPosition as TourPointPointerPosition)}`];\n\n const rootClass = [\n styles['tour-point'],\n pointerModifier,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const showFooter = progress != null || primaryAction != null;\n\n return (\n <div className={rootClass}>\n {showPointer && (\n <span className={styles['tour-point__pointer']} aria-hidden>\n <span className={styles['tour-point__pointer-triangle']} />\n {showPulsingDot && (\n <span className={styles['tour-point__pointer-pulse']}>\n <span className={styles['tour-point__pointer-pulse-ring']} />\n <span\n className={[\n styles['tour-point__pointer-pulse-ring'],\n styles['tour-point__pointer-pulse-ring--delay'],\n ].join(' ')}\n />\n <span className={styles['tour-point__pointer-pulse-core']} />\n </span>\n )}\n </span>\n )}\n\n <div className={styles['tour-point__panel']}>\n <div className={styles['tour-point__header']}>\n <h2 className={styles['tour-point__title']}>{title}</h2>\n {onClose && (\n <IconButton\n className={styles['tour-point__close']}\n aria-label=\"Close\"\n size=\"Small\"\n padding=\"Compact\"\n style=\"Default\"\n icon={<Icon size=\"16\" glyph={<CloseIcon />} />}\n onClick={onClose}\n />\n )}\n </div>\n\n <div className={styles['tour-point__body']}>\n <div className={styles['tour-point__description']}>{children}</div>\n {media != null && (\n <div className={styles['tour-point__media']}>{media}</div>\n )}\n </div>\n\n {showFooter && (\n <div className={styles['tour-point__footer']}>\n {progress != null ? (\n <PaginationDots\n className={styles['tour-point__progress']}\n pages={progress.pages}\n activePage={progress.activePage}\n dotStyle=\"OnPrimary\"\n onPageChange={progress.onPageChange}\n />\n ) : (\n <span className={styles['tour-point__footer-spacer']} aria-hidden />\n )}\n\n {primaryAction != null ? (\n <div className={styles['tour-point__next-wrap']}>\n <Button\n emphasis=\"Primary\"\n size=\"Small\"\n trailingIcon={\n <Icon size=\"16\" glyph={<ChevronRightIcon />} />\n }\n onClick={primaryAction.onClick}\n >\n {primaryAction.label}\n </Button>\n </div>\n ) : null}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\n\n/**\n * Keeps a panel mounted through its exit animation. While `open` is true the\n * panel renders normally. When `open` flips false, the panel keeps rendering\n * for `durationMs` with `exiting: true` so an exit animation can play before\n * the DOM node is removed.\n */\nexport function useExitAnimation(open: boolean, durationMs: number) {\n const [rendered, setRendered] = useState(open);\n const [exiting, setExiting] = useState(false);\n\n useEffect(() => {\n if (open) {\n setRendered(true);\n setExiting(false);\n return;\n }\n if (!rendered) return;\n setExiting(true);\n const t = window.setTimeout(() => {\n setRendered(false);\n setExiting(false);\n }, durationMs);\n return () => window.clearTimeout(t);\n }, [open, rendered, durationMs]);\n\n return { rendered, exiting };\n}\n"],"names":["ActionButton","icon","label","active","destructive","className","htmlProps","rootClass","styles","jsx","SVG_SIZE_MAP","SIZE_CLASS_MAP","Icon","glyph","size","sizeClass","svgSize","glyphContent","EmoticonHappyOutlineIcon","React","toKebab","s","ICON_BUTTON_ICON_SIZES","IconButton","count","padding","rounded","style","toggled","unreadBadge","disabled","type","ariaLabel","rest","paddingClass","styleClass","destructiveClass","roundedClass","toggledClass","activeClass","hasCount","hasCountClass","jsxs","TYPE_CLASS","Tag","casing","leadingIcon","classes","AdminConsoleHeader","title","showBack","ariaLabelBack","onBackClick","enterpriseBadge","enterpriseBadgeLabel","trailing","enterpriseChip","MattermostIcon","ArrowBackIosIcon","BADGE_ICON_SIZE_PX","GLYPH_COMPONENT","CheckCircleIcon","ClockIcon","MinusCircleIcon","CircleOutlineIcon","StatusBadge","status","statusClass","iconSizePx","GlyphIcon","FALLBACK_COLORS","USER_AVATAR_TO_BADGE_SIZE","hashFallbackColor","h","i","getInitials","name","trimmed","firstName","_a","UserAvatar","alt","src","fallbackColor","imgProps","isFallback","displayName","initials","color","fallbackColorClass","MentionBadge","location","displayText","digitCount","LeadingVisualContent","leadingVisual","memberCount","avatarSrc","avatarAlt","showAvatarStatus","LockOutlineIcon","SendOutlineIcon","ChartLineIcon","MessageTextOutlineIcon","DialpadIcon","GlobeIcon","ChannelSidebarItem","hideLeadingVisual","muted","callActive","sharedChannel","mentionCount","customStatusEmoji","onClick","isDM","isDrafts","effectiveStatus","hasMentionBadge","isChannelOrDM","iconContainerClass","rightClass","e","CircleMultipleOutlineIcon","PhoneInTalkIcon","DotsVerticalIcon","MoreUnreadsBanner","direction","ArrowUpIcon","ArrowDownIcon","Scrollbar","forwardRef","children","alwaysVisible","onScroll","ref","cleanup","useRef","setScrollNode","useCallback","el","mergedStyle","SimpleBar","applyChannelNameOverrides","model","channelNameOverrides","resolve","mapRow","row","g","applyChannelSidebarInteractivity","activeChannelName","onItemClick","ChannelsSidebarHeader","teamName","ChevronDownIcon","PlusIcon","ChannelsSidebarNavigator","showFilter","FilterVariantIcon","MagnifyIcon","ChannelsSidebarCategory","showChevron","showPlusButton","sticky","opaqueCategory","hasLeadingIcon","showChevronRow","categoryClass","ChannelsSidebar","moreUnreadsAbove","moreUnreadsBelow","modelProp","useMemo","withOverrides","group","index","CATEGORY_ICON_GLYPHS","CreditCardOutlineIcon","AccountMultipleOutlineIcon","ServerOutlineIcon","TuneIcon","ShieldOutlineIcon","AppsIcon","WebhookIcon","FileTextOutlineIcon","FlaskOutlineIcon","categoryLeadingIcon","key","AdminConsoleSidebar","consoleTitle","userHandle","userDisplayName","groups","findSettingsId","useId","SIZE_ICON_MAP","Button","appearance","emphasis","trailingIcon","iconSize","emphasisClass","appearanceClass","useControllable","controlled","defaultValue","onChange","isControlled","uncontrolled","setUncontrolled","useState","Switch","secondaryLabel","semiBold","idProp","checked","defaultChecked","generatedId","id","resolvedChecked","handleChange","semiBoldClass","secondaryClass","AdminPanelHeader","titleId","subtitle","headerActions","iconLeft","showBeta","betaLabel","showEnterpriseLabel","enterpriseLabel","showButton","buttonLabel","onButtonClick","showSwitch","switchLabel","switchChecked","defaultSwitchChecked","onSwitchChange","switchDisabled","expandable","isExpanded","onToggleExpand","showDivider","hasActions","defaultLeading","CogOutlineIcon","ChevronUpIcon","AdminPanel","expandedStateProp","defaultExpandedState","onExpandedStateChange","uncontrolledExpanded","setUncontrolledExpanded","isExpandControlled","setExpandedState","next","toggleExpanded","showHeaderDivider","DEFAULT_WARNING","DEFAULT_ERROR","AdminPanelFooter","saveLabel","cancelLabel","onSave","onCancel","saveDisabled","statusMessage","statusUi","copy","Fragment","AlertOutlineIcon","AlertCircleOutlineIcon","statusMod","AppBarItem","state","mentionBadge","isSelected","FILE_TYPE_ICONS","FileAudioOutlineLargeIcon","FileCodeOutlineLargeIcon","FileExcelOutlineLargeIcon","FileGenericOutlineLargeIcon","FileImageOutlineLargeIcon","FilePatchOutlineLargeIcon","FilePdfOutlineLargeIcon","FilePowerpointOutlineLargeIcon","FileTextOutlineLargeIcon","FileVideoOutlineLargeIcon","FileWordOutlineLargeIcon","FileZipOutlineLargeIcon","FILE_TYPE_COLORS","AttachmentCard","fileName","fileMeta","fileType","progress","thumbnailSrc","channelTag","dateTimeStamp","onRemove","onDownload","onMore","isUploading","isUploaded","isDefault","stateClass","FileIcon","iconColor","CloseIcon","DownloadOutlineIcon","ChannelHeader","description","pinnedCount","favorited","avatarStatus","onFavoriteClick","onNameClick","onCallClick","callButton","onInfoClick","infoToggled","isSimple","showCallButton","showMembers","showFiles","hasDmAvatar","StarIcon","StarOutlineIcon","BellOffOutlineIcon","AccountOutlineIcon","PinOutlineIcon","PhoneIcon","InformationOutlineIcon","MenuItem","secondaryLabelPosition","leadingElement","trailingVisual","trailingElement","tag","CheckIcon","PopoverMenu","variant","PopoverMenuScroll","maxHeight","maxH","PopoverMenuTitle","PopoverMenuGroup","PopoverMenuGroupTitle","PopoverMenuDivider","ChannelHeaderMenu","BellOutlineIcon","ChevronRightIcon","BookmarkOutlineIcon","FolderMoveOutlineIcon","ExitToAppIcon","ArchiveOutlineIcon","ChannelInfoMsgHeader","channelName","onChannelClick","tabs","resolvedTabs","tab","ChannelMenu","MarkAsUnreadIcon","LinkVariantIcon","AccountPlusOutlineIcon","ChannelCategoryMenu","sortLabel","PencilOutlineIcon","TrashCanOutlineIcon","SortAlphabeticalAscendingIcon","CHECKBOX_ICON_SIZE","ICON_COMPONENT","MinusIcon","Checkbox","indeterminate","valid","inputRef","showingIcon","useEffect","input","invalidClass","indeterminateClass","IconComponent","ICON_SIZE_MAP","AVATAR_SIZE_MAP","Chip","leadingAvatar","removeLabel","error","colored","avatarSize","CloseCircleIcon","ANCHORED_POPUP_GAP","ANCHORED_POPUP_VIEWPORT_MARGIN","ANCHORED_POPUP_MIN_HEIGHT","ANCHORED_POPUP_Z_INDEX","computeAnchoredPopupPlacement","anchorRect","viewportHeight","options","gap","viewportMargin","minHeight","preferredHeight","boundsTop","boundsBottom","_b","spaceBelow","spaceAbove","placement","available","capped","getAnchoredPopupContainerFrame","mount","borderRect","computeAnchoredPopupFixedStyle","width","zIndex","containerFrame","anchor","visibleTop","DEFAULT_PLACEMENT","resolvePortalMount","portalContainer","usesViewportFixedCoords","useAnchoredPopupPortal","anchorRef","isOpen","maxHeightCap","contentRef","matchWidth","portalRef","setPlacement","setMaxHeight","setStyle","update","rect","measured","heightForFlip","nextPlacement","nextMaxHeight","fixed","useLayoutEffect","handle","ro","renderPortal","createPortal","useOutsideClose","open","onClose","target","POPOVER_TRANSITION_MS","usePopoverTransition","mounted","setMounted","visible","setVisible","raf2","raf1","t","POPUP_MAX_HEIGHT","CHIP_SIZE_BY_COMBOBOX","defaultFilter","option","query","toSingleValue","value","toMultiValue","optionLeadingVisual","Combobox","multiple","valueProp","inputValueProp","defaultInputValue","onInputChange","placeholder","invalid","filter","emptyMessage","listboxId","rootRef","setInputRef","node","isValueControlled","uncontrolledValue","setUncontrolledValue","rawValue","singleValue","multiValue","isInputControlled","uncontrolledInput","setUncontrolledInput","setIsOpen","isFocused","setIsFocused","activeIndex","setActiveIndex","queryOverride","setQueryOverride","selectedOption","o","displayInput","filterQuery","setInputDisplay","commitValue","filteredOptions","fn","popupMounted","popupVisible","popupStyle","close","prev","selectedIdx","optionValue","selectOption","v","removeValue","moveActive","delta","enabled","currentPos","nextPos","handleInputChange","handleFocus","handleBlur","related","handleKeyDown","handleWrapperMouseDown","hasSelection","hasInputText","labelFloated","activeOption","activeDescendant","selectedOptions","hasChips","ev","selected","leading","CALENDAR_PREFERRED_HEIGHT","WEEKDAYS","MONTHS","formatDateDisplay","iso","y","m","d","toIso","year","month","day","getDaysInMonth","getFirstDayOfWeek","isSameDay","b","isBetween","date","start","end","dayFromIso","DateRangePicker","mode","startDate","endDate","onRangeChange","popoverId","triggerRef","gridRef","today","todayIso","displayYear","setDisplayYear","displayMonth","setDisplayMonth","focusedDay","setFocusedDay","internalDate","setInternalDate","internalStart","setInternalStart","internalEnd","setInternalEnd","selectedDate","selectedStart","selectedEnd","hasValue","popoverMounted","popoverVisible","popoverStyle","restoreFocus","handleFocusIn","daysInMonth","initialFocusDay","fromValue","fromEnd","fromStart","fromToday","frame","focusDayButton","handleToggle","handlePrevMonth","handleNextMonth","goToAdjacentMonth","preferDay","nextMonth","nextYear","maxDay","handleToday","now","handleDayClick","moveFocusedDay","handleDayKeyDown","handleTriggerKeyDown","firstDay","cells","_","weeks","displayValue","CalendarOutlineIcon","ChevronLeftIcon","week","wi","di","isToday","isRangeStart","isRangeEnd","isInRange","hasRangeSpan","cellClass","dayClass","Divider","Dropdown","openClass","Emoji","emoji","Illustration","height","hasLabel","EmptyState","illustration","action","ErrorMessage","message","FeatureDiscoveryPanel","skuLabel","primaryAction","secondaryAction","GlobalBanner","actionLabel","onAction","onDismiss","typeClass","PRODUCT_ICON","ProductChannelsIcon","ProductPlaybooksIcon","ProductBoardsIcon","InvertedIconButton","ProductBrand","product","ProductIcon","Navigator","ArrowLeftIcon","ArrowRightIcon","GlobalHeader","showChannelsBranding","showUpgradeButton","userAvatarSrc","userAvatarAlt","isChannels","showBrand","ProductsIcon","HelpCircleOutlineIcon","CheckboxMultipleMarkedOutlineIcon","AtIcon","HelpMenu","LightbulbOutlineIcon","KeyboardOutlineIcon","ImagePreview","collapsed","onToggleCollapse","onCopyLink","aspectRatio","frameTransition","labelTransition","MenuRightIcon","MenuDownIcon","LinkPreview","siteName","imageSrc","imageAlt","imageSize","imageCollapsed","onToggleImageCollapse","onCopyImageLink","onDownloadImage","resolvedImageSize","hasSmallImage","hasLargeImage","cardClass","MessageHeader","username","timestamp","isBot","botLabel","MessageActions","collapsedReplyThreads","quickReactions","isCenterChannel","isRHS","isSearchResults","showQuickReactions","EmoticonPlusOutlineIcon","DotsHorizontalIcon","CreationOutlineIcon","ReplyOutlineIcon","PinnedSavedIndicators","Message","messageActionsType","showMessageActions","showPinnedSavedIndicators","linkPreview","imagePreviews","footer","MessageInput","showPriorityIndicator","showAttachments","onSelectionChange","internalText","setInternalText","text","setText","formattingOpen","setFormattingOpen","internalRef","setTextareaRef","handleInput","hasSendValue","cls","base","mod","isNarrowFormattingOpen","showWideFormattingBar","composerActions","FormatLetterCaseIcon","PaperclipIcon","SendIcon","EyeOutlineIcon","FormatBoldIcon","FormatItalicIcon","FormatStrikethroughVariantIcon","FormatHeaderIcon","CodeTagsIcon","FormatQuoteOpenIcon","FormatListBulletedIcon","FormatListNumberedIcon","FireIcon","SIZE_CLASS","LOCATION_CLASS","ShortcutTag","ShortcutTagGroup","labels","groupClass","shortcutLabel","MessageMoreOptionsMenu","permissionToEdit","showFlagOption","ArrowRightBoldOutlineIcon","MessageCheckOutlineIcon","ClockOutlineIcon","ContentCopyIcon","TranslateIcon","FlagOutlineIcon","DEFAULT_REACTIONS","MessageReactions","reactions","showAddReaction","acknowledged","acknowledgeCount","currentUserAcknowledged","onAddReaction","onReactionClick","onAcknowledge","CheckCircleOutlineIcon","byCurrentUser","DEFAULT_LABELS","MessageSeparator","showAiSummary","onSummarize","displayLabel","labelBlock","Modal","showBackButton","onBack","headerDivider","footerDivider","NewMessageBanner","countLabel","PaginationDots","pages","activePage","orientation","dotStyle","onPageChange","isVertical","isInverted","isOnPrimary","orientationClass","page","isActive","dotClass","PermalinkPreview","authorName","messageText","originalChannel","PlusMenu","FolderPlusOutlineIcon","VARIANT_ICONS","VARIANT_ICON_CLASS","PopoverNotice","actions","showCheckbox","checkboxLabel","resolvedIcon","iconColorClass","DEFAULT_PRODUCT_SWITCHER_PRODUCTS","productLeadingVisual","ProductSwitcherMenu","selectedProduct","additionalProducts","onProductSelect","products","ApplicationCogIcon","MetaRow","href","textClass","ProfilePopover","user","email","phones","lastOnline","jobRole","localTime","customStatus","sharedOrg","staff","coreCommitter","githubHandle","onPrimaryAction","onMention","onAddToChannel","onCall","onSend","phoneIcon","onAnimationEnd","isYou","hasPhones","hasTitlesBlock","hasSecondary","EmailOutlineIcon","p","subText","GithubCircleIcon","getSemanticColorClass","ProgressBar","semanticColors","clampedValue","fillColorClass","Radio","ReactionPill","HandRightOutlineIcon","MicrophoneOffIcon","RightSidebar","header","fill","alignBody","bodyClass","RightSidebarHeader","secondaryTitle","tagType","onExpand","onActionClick","actionActive","ArrowExpandIcon","SearchInput","onClear","onFocus","onBlur","handleClear","showClearButton","labelFloatedClass","hasLeadingClass","hasTrailingClass","SearchTipBanner","prefix","suffix","shortcutKeys","DEFAULT_ICONS","SectionNotice","primaryButtonLabel","secondaryButtonLabel","onSecondaryAction","SelectOptionRow","onSelect","onHover","rowClass","menuItemStyles","Select","buttonRef","setButtonRef","listOptions","firstEnabled","idx","showPlaceholderStyle","controlClass","Spinner","inverted","strokeWidth","Tabs","activeKey","controls","tabClass","TeamAvatar","badge","numSize","showBadge","rootClasses","TeamMenu","adminOptions","createTeamPermission","joinTeamPermission","UnreadBadge","context","contextClass","TeamSidebar","teams","activeTeamId","showAddTeam","showDialPad","dialPadActive","onSelectTeam","onAddTeam","onDialPadClick","team","hasMentions","showUnreadDot","TextArea","maxLength","showCharacterCount","readOnly","rows","currentLength","counterId","TextInput","ThreadActionsMenu","MessageMinusOutlineIcon","OpenInNewIcon","ThreadFooter","replyCount","avatars","following","lastReplyTime","onReply","onFollowToggle","hovered","MAX_VISIBLE","visibleAvatars","overflowCount","av","Tooltip","arrow","hint","arrowClass","overflowNamesLabel","hidden","a","UserAvatarGroup","max","overflow","avatar","DEFAULT_PARTICIPANTS","ThreadListItem","channelLabel","previewText","participantsProp","threadTitle","onMenuClick","participants","showParticipants","showGutterBadge","replyLabel","event","TYPE_ICONS","Toast","TourPoint","media","pointerPosition","showPulsingDot","showPointer","pointerModifier","showFooter","useExitAnimation","durationMs","rendered","setRendered","exiting","setExiting"],"mappings":"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"}