@mattermost/compass-ui 0.1.0-alpha.11 → 0.1.0-alpha.13

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 (380) hide show
  1. package/README.md +15 -3
  2. package/dist/compass-ui-standalone.css +270 -276
  3. package/dist/compass-ui.css +293 -290
  4. package/dist/components/action-button/ActionButton.cjs.map +1 -1
  5. package/dist/components/action-button/ActionButton.d.ts +2 -1
  6. package/dist/components/action-button/ActionButton.d.ts.map +1 -1
  7. package/dist/components/action-button/ActionButton.js.map +1 -1
  8. package/dist/components/admin-console-header/AdminConsoleHeader.cjs.map +1 -1
  9. package/dist/components/admin-console-header/AdminConsoleHeader.d.ts +3 -1
  10. package/dist/components/admin-console-header/AdminConsoleHeader.d.ts.map +1 -1
  11. package/dist/components/admin-console-header/AdminConsoleHeader.js.map +1 -1
  12. package/dist/components/admin-panel/AdminPanel.cjs +1 -1
  13. package/dist/components/admin-panel/AdminPanel.cjs.map +1 -1
  14. package/dist/components/admin-panel/AdminPanel.d.ts +13 -6
  15. package/dist/components/admin-panel/AdminPanel.d.ts.map +1 -1
  16. package/dist/components/admin-panel/AdminPanel.js +21 -15
  17. package/dist/components/admin-panel/AdminPanel.js.map +1 -1
  18. package/dist/components/admin-panel-footer/AdminPanelFooter.cjs.map +1 -1
  19. package/dist/components/admin-panel-footer/AdminPanelFooter.d.ts +8 -4
  20. package/dist/components/admin-panel-footer/AdminPanelFooter.d.ts.map +1 -1
  21. package/dist/components/admin-panel-footer/AdminPanelFooter.js.map +1 -1
  22. package/dist/components/admin-panel-header/AdminPanelHeader.cjs +1 -1
  23. package/dist/components/admin-panel-header/AdminPanelHeader.cjs.map +1 -1
  24. package/dist/components/admin-panel-header/AdminPanelHeader.css +1 -1
  25. package/dist/components/admin-panel-header/AdminPanelHeader.d.ts +11 -4
  26. package/dist/components/admin-panel-header/AdminPanelHeader.d.ts.map +1 -1
  27. package/dist/components/admin-panel-header/AdminPanelHeader.js +25 -23
  28. package/dist/components/admin-panel-header/AdminPanelHeader.js.map +1 -1
  29. package/dist/components/admin-panel-header/AdminPanelHeader.module.scss.cjs +1 -1
  30. package/dist/components/admin-panel-header/AdminPanelHeader.module.scss.js +10 -10
  31. package/dist/components/attachment-card/AttachmentCard.cjs +1 -1
  32. package/dist/components/attachment-card/AttachmentCard.cjs.map +1 -1
  33. package/dist/components/attachment-card/AttachmentCard.d.ts +18 -5
  34. package/dist/components/attachment-card/AttachmentCard.d.ts.map +1 -1
  35. package/dist/components/attachment-card/AttachmentCard.js +85 -79
  36. package/dist/components/attachment-card/AttachmentCard.js.map +1 -1
  37. package/dist/components/card-button/CardButton.css +1 -1
  38. package/dist/components/card-button/CardButton.module.scss.cjs +1 -1
  39. package/dist/components/card-button/CardButton.module.scss.js +7 -7
  40. package/dist/components/channel-info-msg-header/ChannelInfoMsgHeader.cjs +1 -1
  41. package/dist/components/channel-info-msg-header/ChannelInfoMsgHeader.cjs.map +1 -1
  42. package/dist/components/channel-info-msg-header/ChannelInfoMsgHeader.d.ts +5 -4
  43. package/dist/components/channel-info-msg-header/ChannelInfoMsgHeader.d.ts.map +1 -1
  44. package/dist/components/channel-info-msg-header/ChannelInfoMsgHeader.js +7 -7
  45. package/dist/components/channel-info-msg-header/ChannelInfoMsgHeader.js.map +1 -1
  46. package/dist/components/channel-sidebar-item/ChannelSidebarItem.cjs +1 -1
  47. package/dist/components/channel-sidebar-item/ChannelSidebarItem.cjs.map +1 -1
  48. package/dist/components/channel-sidebar-item/ChannelSidebarItem.d.ts +10 -4
  49. package/dist/components/channel-sidebar-item/ChannelSidebarItem.d.ts.map +1 -1
  50. package/dist/components/channel-sidebar-item/ChannelSidebarItem.js +64 -60
  51. package/dist/components/channel-sidebar-item/ChannelSidebarItem.js.map +1 -1
  52. package/dist/components/chip/Chip.cjs.map +1 -1
  53. package/dist/components/chip/Chip.css +1 -1
  54. package/dist/components/chip/Chip.d.ts +4 -0
  55. package/dist/components/chip/Chip.d.ts.map +1 -1
  56. package/dist/components/chip/Chip.js.map +1 -1
  57. package/dist/components/chip/Chip.module.scss.cjs +1 -1
  58. package/dist/components/chip/Chip.module.scss.js +11 -11
  59. package/dist/components/combobox/Combobox.cjs +1 -1
  60. package/dist/components/combobox/Combobox.cjs.map +1 -1
  61. package/dist/components/combobox/Combobox.css +1 -1
  62. package/dist/components/combobox/Combobox.d.ts +24 -1
  63. package/dist/components/combobox/Combobox.d.ts.map +1 -1
  64. package/dist/components/combobox/Combobox.js +307 -271
  65. package/dist/components/combobox/Combobox.js.map +1 -1
  66. package/dist/components/combobox/Combobox.module.scss.cjs +1 -1
  67. package/dist/components/combobox/Combobox.module.scss.js +28 -26
  68. package/dist/components/combobox/Combobox.module.scss.js.map +1 -1
  69. package/dist/components/date-range-picker/DateRangePicker.cjs +1 -1
  70. package/dist/components/date-range-picker/DateRangePicker.cjs.map +1 -1
  71. package/dist/components/date-range-picker/DateRangePicker.css +1 -1
  72. package/dist/components/date-range-picker/DateRangePicker.d.ts +18 -2
  73. package/dist/components/date-range-picker/DateRangePicker.d.ts.map +1 -1
  74. package/dist/components/date-range-picker/DateRangePicker.js +134 -126
  75. package/dist/components/date-range-picker/DateRangePicker.js.map +1 -1
  76. package/dist/components/date-range-picker/DateRangePicker.module.scss.cjs +1 -1
  77. package/dist/components/date-range-picker/DateRangePicker.module.scss.js +26 -26
  78. package/dist/components/emoji-popover/EmojiPopover.cjs +1 -1
  79. package/dist/components/emoji-popover/EmojiPopover.cjs.map +1 -1
  80. package/dist/components/emoji-popover/EmojiPopover.d.ts +25 -4
  81. package/dist/components/emoji-popover/EmojiPopover.d.ts.map +1 -1
  82. package/dist/components/emoji-popover/EmojiPopover.js +84 -73
  83. package/dist/components/emoji-popover/EmojiPopover.js.map +1 -1
  84. package/dist/components/empty-state/EmptyState.cjs +1 -1
  85. package/dist/components/empty-state/EmptyState.cjs.map +1 -1
  86. package/dist/components/empty-state/EmptyState.d.ts +3 -3
  87. package/dist/components/empty-state/EmptyState.d.ts.map +1 -1
  88. package/dist/components/empty-state/EmptyState.js +11 -9
  89. package/dist/components/empty-state/EmptyState.js.map +1 -1
  90. package/dist/components/error-message/ErrorMessage.cjs +1 -1
  91. package/dist/components/error-message/ErrorMessage.cjs.map +1 -1
  92. package/dist/components/error-message/ErrorMessage.d.ts +3 -3
  93. package/dist/components/error-message/ErrorMessage.d.ts.map +1 -1
  94. package/dist/components/error-message/ErrorMessage.js +10 -9
  95. package/dist/components/error-message/ErrorMessage.js.map +1 -1
  96. package/dist/components/feature-discovery-panel/FeatureDiscoveryPanel.cjs.map +1 -1
  97. package/dist/components/feature-discovery-panel/FeatureDiscoveryPanel.d.ts +7 -6
  98. package/dist/components/feature-discovery-panel/FeatureDiscoveryPanel.d.ts.map +1 -1
  99. package/dist/components/feature-discovery-panel/FeatureDiscoveryPanel.js.map +1 -1
  100. package/dist/components/global-banner/GlobalBanner.cjs +1 -1
  101. package/dist/components/global-banner/GlobalBanner.cjs.map +1 -1
  102. package/dist/components/global-banner/GlobalBanner.d.ts +10 -5
  103. package/dist/components/global-banner/GlobalBanner.d.ts.map +1 -1
  104. package/dist/components/global-banner/GlobalBanner.js +33 -26
  105. package/dist/components/global-banner/GlobalBanner.js.map +1 -1
  106. package/dist/components/icon-button/IconButton.css +1 -1
  107. package/dist/components/icon-button/IconButton.module.scss.cjs +1 -1
  108. package/dist/components/icon-button/IconButton.module.scss.js +15 -15
  109. package/dist/components/image-preview/ImagePreview.cjs +1 -1
  110. package/dist/components/image-preview/ImagePreview.cjs.map +1 -1
  111. package/dist/components/image-preview/ImagePreview.css +1 -1
  112. package/dist/components/image-preview/ImagePreview.d.ts +12 -1
  113. package/dist/components/image-preview/ImagePreview.d.ts.map +1 -1
  114. package/dist/components/image-preview/ImagePreview.js +25 -20
  115. package/dist/components/image-preview/ImagePreview.js.map +1 -1
  116. package/dist/components/image-preview/ImagePreview.module.scss.cjs +1 -1
  117. package/dist/components/image-preview/ImagePreview.module.scss.js +15 -15
  118. package/dist/components/link-preview/LinkPreview.cjs +1 -1
  119. package/dist/components/link-preview/LinkPreview.cjs.map +1 -1
  120. package/dist/components/link-preview/LinkPreview.d.ts +12 -6
  121. package/dist/components/link-preview/LinkPreview.d.ts.map +1 -1
  122. package/dist/components/link-preview/LinkPreview.js +19 -16
  123. package/dist/components/link-preview/LinkPreview.js.map +1 -1
  124. package/dist/components/mention-badge/MentionBadge.cjs +1 -1
  125. package/dist/components/mention-badge/MentionBadge.cjs.map +1 -1
  126. package/dist/components/mention-badge/MentionBadge.d.ts +3 -1
  127. package/dist/components/mention-badge/MentionBadge.d.ts.map +1 -1
  128. package/dist/components/mention-badge/MentionBadge.js +18 -23
  129. package/dist/components/mention-badge/MentionBadge.js.map +1 -1
  130. package/dist/components/menu-group-heading/MenuGroupHeading.cjs.map +1 -1
  131. package/dist/components/menu-group-heading/MenuGroupHeading.d.ts +3 -3
  132. package/dist/components/menu-group-heading/MenuGroupHeading.d.ts.map +1 -1
  133. package/dist/components/menu-group-heading/MenuGroupHeading.js.map +1 -1
  134. package/dist/components/menu-item/MenuItem.cjs +1 -1
  135. package/dist/components/menu-item/MenuItem.cjs.map +1 -1
  136. package/dist/components/menu-item/MenuItem.d.ts +2 -0
  137. package/dist/components/menu-item/MenuItem.d.ts.map +1 -1
  138. package/dist/components/menu-item/MenuItem.js +29 -28
  139. package/dist/components/menu-item/MenuItem.js.map +1 -1
  140. package/dist/components/message-actions/MessageActions.cjs +1 -1
  141. package/dist/components/message-actions/MessageActions.cjs.map +1 -1
  142. package/dist/components/message-actions/MessageActions.d.ts +26 -2
  143. package/dist/components/message-actions/MessageActions.d.ts.map +1 -1
  144. package/dist/components/message-actions/MessageActions.js +67 -55
  145. package/dist/components/message-actions/MessageActions.js.map +1 -1
  146. package/dist/components/message-header/MessageHeader.cjs.map +1 -1
  147. package/dist/components/message-header/MessageHeader.d.ts +5 -3
  148. package/dist/components/message-header/MessageHeader.d.ts.map +1 -1
  149. package/dist/components/message-header/MessageHeader.js.map +1 -1
  150. package/dist/components/message-separator/MessageSeparator.cjs +1 -1
  151. package/dist/components/message-separator/MessageSeparator.cjs.map +1 -1
  152. package/dist/components/message-separator/MessageSeparator.d.ts +8 -4
  153. package/dist/components/message-separator/MessageSeparator.d.ts.map +1 -1
  154. package/dist/components/message-separator/MessageSeparator.js +16 -14
  155. package/dist/components/message-separator/MessageSeparator.js.map +1 -1
  156. package/dist/components/modal/Modal.cjs +1 -1
  157. package/dist/components/modal/Modal.cjs.map +1 -1
  158. package/dist/components/modal/Modal.d.ts +17 -3
  159. package/dist/components/modal/Modal.d.ts.map +1 -1
  160. package/dist/components/modal/Modal.js +38 -26
  161. package/dist/components/modal/Modal.js.map +1 -1
  162. package/dist/components/modal-header/ModalHeader.cjs +1 -1
  163. package/dist/components/modal-header/ModalHeader.cjs.map +1 -1
  164. package/dist/components/modal-header/ModalHeader.css +1 -1
  165. package/dist/components/modal-header/ModalHeader.d.ts +16 -1
  166. package/dist/components/modal-header/ModalHeader.d.ts.map +1 -1
  167. package/dist/components/modal-header/ModalHeader.js +72 -57
  168. package/dist/components/modal-header/ModalHeader.js.map +1 -1
  169. package/dist/components/modal-header/ModalHeader.module.scss.cjs +1 -1
  170. package/dist/components/modal-header/ModalHeader.module.scss.js +15 -13
  171. package/dist/components/modal-header/ModalHeader.module.scss.js.map +1 -1
  172. package/dist/components/more-unreads-banner/MoreUnreadsBanner.cjs +1 -1
  173. package/dist/components/more-unreads-banner/MoreUnreadsBanner.cjs.map +1 -1
  174. package/dist/components/more-unreads-banner/MoreUnreadsBanner.d.ts +4 -1
  175. package/dist/components/more-unreads-banner/MoreUnreadsBanner.d.ts.map +1 -1
  176. package/dist/components/more-unreads-banner/MoreUnreadsBanner.js +11 -10
  177. package/dist/components/more-unreads-banner/MoreUnreadsBanner.js.map +1 -1
  178. package/dist/components/new-message-banner/NewMessageBanner.cjs +1 -1
  179. package/dist/components/new-message-banner/NewMessageBanner.cjs.map +1 -1
  180. package/dist/components/new-message-banner/NewMessageBanner.d.ts +15 -3
  181. package/dist/components/new-message-banner/NewMessageBanner.d.ts.map +1 -1
  182. package/dist/components/new-message-banner/NewMessageBanner.js +30 -22
  183. package/dist/components/new-message-banner/NewMessageBanner.js.map +1 -1
  184. package/dist/components/pagination-dots/PaginationDots.cjs +1 -1
  185. package/dist/components/pagination-dots/PaginationDots.cjs.map +1 -1
  186. package/dist/components/pagination-dots/PaginationDots.css +1 -1
  187. package/dist/components/pagination-dots/PaginationDots.d.ts +5 -1
  188. package/dist/components/pagination-dots/PaginationDots.d.ts.map +1 -1
  189. package/dist/components/pagination-dots/PaginationDots.js +22 -19
  190. package/dist/components/pagination-dots/PaginationDots.js.map +1 -1
  191. package/dist/components/pagination-dots/PaginationDots.module.scss.cjs +1 -1
  192. package/dist/components/pagination-dots/PaginationDots.module.scss.js +10 -10
  193. package/dist/components/permalink-preview/PermalinkPreview.cjs +1 -1
  194. package/dist/components/permalink-preview/PermalinkPreview.cjs.map +1 -1
  195. package/dist/components/permalink-preview/PermalinkPreview.d.ts +16 -5
  196. package/dist/components/permalink-preview/PermalinkPreview.d.ts.map +1 -1
  197. package/dist/components/permalink-preview/PermalinkPreview.js +39 -35
  198. package/dist/components/permalink-preview/PermalinkPreview.js.map +1 -1
  199. package/dist/components/pinned-saved-indicators/PinnedSavedIndicators.cjs +1 -1
  200. package/dist/components/pinned-saved-indicators/PinnedSavedIndicators.cjs.map +1 -1
  201. package/dist/components/pinned-saved-indicators/PinnedSavedIndicators.d.ts +8 -1
  202. package/dist/components/pinned-saved-indicators/PinnedSavedIndicators.d.ts.map +1 -1
  203. package/dist/components/pinned-saved-indicators/PinnedSavedIndicators.js +20 -17
  204. package/dist/components/pinned-saved-indicators/PinnedSavedIndicators.js.map +1 -1
  205. package/dist/components/popover-notice/PopoverNotice.cjs +1 -1
  206. package/dist/components/popover-notice/PopoverNotice.cjs.map +1 -1
  207. package/dist/components/popover-notice/PopoverNotice.d.ts +13 -5
  208. package/dist/components/popover-notice/PopoverNotice.d.ts.map +1 -1
  209. package/dist/components/popover-notice/PopoverNotice.js +58 -48
  210. package/dist/components/popover-notice/PopoverNotice.js.map +1 -1
  211. package/dist/components/profile-popover/ProfilePopover.cjs +1 -1
  212. package/dist/components/profile-popover/ProfilePopover.cjs.map +1 -1
  213. package/dist/components/profile-popover/ProfilePopover.d.ts +34 -12
  214. package/dist/components/profile-popover/ProfilePopover.d.ts.map +1 -1
  215. package/dist/components/profile-popover/ProfilePopover.js +122 -106
  216. package/dist/components/profile-popover/ProfilePopover.js.map +1 -1
  217. package/dist/components/progress-bar/ProgressBar.cjs +1 -1
  218. package/dist/components/progress-bar/ProgressBar.cjs.map +1 -1
  219. package/dist/components/progress-bar/ProgressBar.d.ts +4 -3
  220. package/dist/components/progress-bar/ProgressBar.d.ts.map +1 -1
  221. package/dist/components/progress-bar/ProgressBar.js +9 -7
  222. package/dist/components/progress-bar/ProgressBar.js.map +1 -1
  223. package/dist/components/radio/Radio.css +1 -1
  224. package/dist/components/radio/Radio.module.scss.cjs +1 -1
  225. package/dist/components/radio/Radio.module.scss.js +12 -12
  226. package/dist/components/reaction-button/ReactionButton.cjs +1 -1
  227. package/dist/components/reaction-button/ReactionButton.cjs.map +1 -1
  228. package/dist/components/reaction-button/ReactionButton.d.ts +3 -1
  229. package/dist/components/reaction-button/ReactionButton.d.ts.map +1 -1
  230. package/dist/components/reaction-button/ReactionButton.js +20 -18
  231. package/dist/components/reaction-button/ReactionButton.js.map +1 -1
  232. package/dist/components/reactions-row/ReactionsRow.cjs +1 -1
  233. package/dist/components/reactions-row/ReactionsRow.cjs.map +1 -1
  234. package/dist/components/reactions-row/ReactionsRow.d.ts +10 -2
  235. package/dist/components/reactions-row/ReactionsRow.d.ts.map +1 -1
  236. package/dist/components/reactions-row/ReactionsRow.js +33 -28
  237. package/dist/components/reactions-row/ReactionsRow.js.map +1 -1
  238. package/dist/components/right-sidebar-header/RightSidebarHeader.cjs +1 -1
  239. package/dist/components/right-sidebar-header/RightSidebarHeader.cjs.map +1 -1
  240. package/dist/components/right-sidebar-header/RightSidebarHeader.d.ts +15 -7
  241. package/dist/components/right-sidebar-header/RightSidebarHeader.d.ts.map +1 -1
  242. package/dist/components/right-sidebar-header/RightSidebarHeader.js +23 -19
  243. package/dist/components/right-sidebar-header/RightSidebarHeader.js.map +1 -1
  244. package/dist/components/scrollbar/Scrollbar.cjs +1 -1
  245. package/dist/components/scrollbar/Scrollbar.cjs.map +1 -1
  246. package/dist/components/scrollbar/Scrollbar.css +1 -1
  247. package/dist/components/scrollbar/Scrollbar.d.ts +2 -2
  248. package/dist/components/scrollbar/Scrollbar.d.ts.map +1 -1
  249. package/dist/components/scrollbar/Scrollbar.js +24 -15
  250. package/dist/components/scrollbar/Scrollbar.js.map +1 -1
  251. package/dist/components/scrollbar/Scrollbar.module.scss.cjs +1 -1
  252. package/dist/components/scrollbar/Scrollbar.module.scss.js +4 -4
  253. package/dist/components/scrollbar/simplebar-vendor.css +1 -0
  254. package/dist/components/search-input/SearchInput.cjs +1 -1
  255. package/dist/components/search-input/SearchInput.cjs.map +1 -1
  256. package/dist/components/search-input/SearchInput.d.ts +5 -0
  257. package/dist/components/search-input/SearchInput.d.ts.map +1 -1
  258. package/dist/components/search-input/SearchInput.js +92 -85
  259. package/dist/components/search-input/SearchInput.js.map +1 -1
  260. package/dist/components/search-tip-banner/SearchTipBanner.cjs +1 -1
  261. package/dist/components/search-tip-banner/SearchTipBanner.cjs.map +1 -1
  262. package/dist/components/search-tip-banner/SearchTipBanner.d.ts +8 -5
  263. package/dist/components/search-tip-banner/SearchTipBanner.d.ts.map +1 -1
  264. package/dist/components/search-tip-banner/SearchTipBanner.js +17 -16
  265. package/dist/components/search-tip-banner/SearchTipBanner.js.map +1 -1
  266. package/dist/components/section-notice/SectionNotice.cjs +1 -1
  267. package/dist/components/section-notice/SectionNotice.cjs.map +1 -1
  268. package/dist/components/section-notice/SectionNotice.d.ts +16 -3
  269. package/dist/components/section-notice/SectionNotice.d.ts.map +1 -1
  270. package/dist/components/section-notice/SectionNotice.js +64 -48
  271. package/dist/components/section-notice/SectionNotice.js.map +1 -1
  272. package/dist/components/select/Select.cjs +1 -1
  273. package/dist/components/select/Select.cjs.map +1 -1
  274. package/dist/components/select/Select.d.ts +8 -1
  275. package/dist/components/select/Select.d.ts.map +1 -1
  276. package/dist/components/select/Select.js +81 -79
  277. package/dist/components/select/Select.js.map +1 -1
  278. package/dist/components/spinner/Spinner.cjs.map +1 -1
  279. package/dist/components/spinner/Spinner.css +1 -1
  280. package/dist/components/spinner/Spinner.d.ts +1 -0
  281. package/dist/components/spinner/Spinner.d.ts.map +1 -1
  282. package/dist/components/spinner/Spinner.js.map +1 -1
  283. package/dist/components/spinner/Spinner.module.scss.cjs +1 -1
  284. package/dist/components/spinner/Spinner.module.scss.js +5 -5
  285. package/dist/components/status-badge/StatusBadge.css +1 -1
  286. package/dist/components/status-badge/StatusBadge.module.scss.cjs +1 -1
  287. package/dist/components/status-badge/StatusBadge.module.scss.js +11 -11
  288. package/dist/components/switch/Switch.css +1 -1
  289. package/dist/components/switch/Switch.module.scss.cjs +1 -1
  290. package/dist/components/switch/Switch.module.scss.js +14 -14
  291. package/dist/components/tabs/Tabs.cjs +1 -1
  292. package/dist/components/tabs/Tabs.cjs.map +1 -1
  293. package/dist/components/tabs/Tabs.css +1 -1
  294. package/dist/components/tabs/Tabs.d.ts +11 -3
  295. package/dist/components/tabs/Tabs.d.ts.map +1 -1
  296. package/dist/components/tabs/Tabs.js +56 -53
  297. package/dist/components/tabs/Tabs.js.map +1 -1
  298. package/dist/components/tabs/Tabs.module.scss.cjs +1 -1
  299. package/dist/components/tabs/Tabs.module.scss.js +9 -9
  300. package/dist/components/tag/Tag.cjs +1 -1
  301. package/dist/components/tag/Tag.cjs.map +1 -1
  302. package/dist/components/tag/Tag.d.ts +3 -3
  303. package/dist/components/tag/Tag.d.ts.map +1 -1
  304. package/dist/components/tag/Tag.js +12 -11
  305. package/dist/components/tag/Tag.js.map +1 -1
  306. package/dist/components/thread-footer/ThreadFooter.cjs +1 -1
  307. package/dist/components/thread-footer/ThreadFooter.cjs.map +1 -1
  308. package/dist/components/thread-footer/ThreadFooter.css +1 -1
  309. package/dist/components/thread-footer/ThreadFooter.d.ts +19 -3
  310. package/dist/components/thread-footer/ThreadFooter.d.ts.map +1 -1
  311. package/dist/components/thread-footer/ThreadFooter.js +53 -48
  312. package/dist/components/thread-footer/ThreadFooter.js.map +1 -1
  313. package/dist/components/thread-footer/ThreadFooter.module.scss.cjs +1 -1
  314. package/dist/components/thread-footer/ThreadFooter.module.scss.js +18 -18
  315. package/dist/components/thread-list-item/ThreadListItem.cjs +1 -1
  316. package/dist/components/thread-list-item/ThreadListItem.cjs.map +1 -1
  317. package/dist/components/thread-list-item/ThreadListItem.d.ts +15 -7
  318. package/dist/components/thread-list-item/ThreadListItem.d.ts.map +1 -1
  319. package/dist/components/thread-list-item/ThreadListItem.js +66 -62
  320. package/dist/components/thread-list-item/ThreadListItem.js.map +1 -1
  321. package/dist/components/toast/Toast.cjs +1 -1
  322. package/dist/components/toast/Toast.cjs.map +1 -1
  323. package/dist/components/toast/Toast.d.ts +8 -3
  324. package/dist/components/toast/Toast.d.ts.map +1 -1
  325. package/dist/components/toast/Toast.js +47 -39
  326. package/dist/components/toast/Toast.js.map +1 -1
  327. package/dist/components/tour-point/TourPoint.cjs +1 -1
  328. package/dist/components/tour-point/TourPoint.cjs.map +1 -1
  329. package/dist/components/tour-point/TourPoint.css +1 -1
  330. package/dist/components/tour-point/TourPoint.d.ts +19 -5
  331. package/dist/components/tour-point/TourPoint.d.ts.map +1 -1
  332. package/dist/components/tour-point/TourPoint.js +66 -54
  333. package/dist/components/tour-point/TourPoint.js.map +1 -1
  334. package/dist/components/tour-point/TourPoint.module.scss.cjs +1 -1
  335. package/dist/components/tour-point/TourPoint.module.scss.js +28 -28
  336. package/dist/components/unread-badge/UnreadBadge.css +1 -1
  337. package/dist/components/unread-badge/UnreadBadge.module.scss.cjs +1 -1
  338. package/dist/components/unread-badge/UnreadBadge.module.scss.js +5 -5
  339. package/dist/components/user-avatar/UserAvatar.css +1 -1
  340. package/dist/components/user-avatar/UserAvatar.module.scss.cjs +1 -1
  341. package/dist/components/user-avatar/UserAvatar.module.scss.js +26 -26
  342. package/dist/components/user-avatar-group/UserAvatarGroup.cjs +1 -1
  343. package/dist/components/user-avatar-group/UserAvatarGroup.cjs.map +1 -1
  344. package/dist/components/user-avatar-group/UserAvatarGroup.css +1 -1
  345. package/dist/components/user-avatar-group/UserAvatarGroup.d.ts +8 -1
  346. package/dist/components/user-avatar-group/UserAvatarGroup.d.ts.map +1 -1
  347. package/dist/components/user-avatar-group/UserAvatarGroup.js +22 -18
  348. package/dist/components/user-avatar-group/UserAvatarGroup.js.map +1 -1
  349. package/dist/components/user-avatar-group/UserAvatarGroup.module.scss.cjs +1 -1
  350. package/dist/components/user-avatar-group/UserAvatarGroup.module.scss.js +14 -14
  351. package/dist/index.cjs +1 -1
  352. package/dist/index.d.ts +1 -1
  353. package/dist/index.d.ts.map +1 -1
  354. package/dist/index.js +44 -46
  355. package/dist/index.js.map +1 -1
  356. package/dist/utils/props.cjs +2 -0
  357. package/dist/utils/props.cjs.map +1 -0
  358. package/dist/utils/props.d.ts +13 -0
  359. package/dist/utils/props.d.ts.map +1 -0
  360. package/dist/utils/props.js +7 -0
  361. package/dist/utils/props.js.map +1 -0
  362. package/package.json +1 -9
  363. package/dist/components/team-sidebar/TeamSidebar.cjs +0 -2
  364. package/dist/components/team-sidebar/TeamSidebar.cjs.map +0 -1
  365. package/dist/components/team-sidebar/TeamSidebar.css +0 -1
  366. package/dist/components/team-sidebar/TeamSidebar.d.ts +0 -21
  367. package/dist/components/team-sidebar/TeamSidebar.d.ts.map +0 -1
  368. package/dist/components/team-sidebar/TeamSidebar.js +0 -85
  369. package/dist/components/team-sidebar/TeamSidebar.js.map +0 -1
  370. package/dist/components/team-sidebar/TeamSidebar.module.scss.cjs +0 -2
  371. package/dist/components/team-sidebar/TeamSidebar.module.scss.cjs.map +0 -1
  372. package/dist/components/team-sidebar/TeamSidebar.module.scss.js +0 -13
  373. package/dist/components/team-sidebar/TeamSidebar.module.scss.js.map +0 -1
  374. package/dist/components/team-sidebar/index.cjs +0 -2
  375. package/dist/components/team-sidebar/index.cjs.map +0 -1
  376. package/dist/components/team-sidebar/index.d.ts +0 -3
  377. package/dist/components/team-sidebar/index.d.ts.map +0 -1
  378. package/dist/components/team-sidebar/index.js +0 -5
  379. package/dist/components/team-sidebar/index.js.map +0 -1
  380. package/dist/node_modules/simplebar-react/dist/simplebar.min.css +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("react/jsx-runtime"),f=require("react"),l=require("./Tabs.module.scss.cjs");function g({tabs:r,activeKey:d,onChange:b,className:y="",controls:_}){const k=[l.default.tabs,y].filter(Boolean).join(" "),m=f.useRef([]),[p,c]=f.useState(d);f.useEffect(()=>{c(d)},[d]);const x=r.map(e=>e.key),t=r.filter(e=>!e.disabled).map(e=>e.key),j=t.includes(p)?p:t.includes(d)?d:t[0],i=e=>{var s;c(e);const o=x.indexOf(e);(s=m.current[o])==null||s.focus()},h=(e,o)=>{const s=t.length;if(s===0)return;const a=t.indexOf(o);e.key==="ArrowRight"?(e.preventDefault(),i(t[(a+1)%s])):e.key==="ArrowLeft"?(e.preventDefault(),i(t[a<0?s-1:(a-1+s)%s])):e.key==="Home"?(e.preventDefault(),i(t[0])):e.key==="End"?(e.preventDefault(),i(t[s-1])):(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),a>=0&&b(o))};return n.jsxs("div",{className:k,children:[n.jsx("div",{className:l.default["tabs__tab-list"],role:"tablist",children:r.map((e,o)=>{const s=e.key===d,a=e.disabled===!0,D=[l.default.tabs__tab,s?l.default["tabs__tab--active"]:"",a?l.default["tabs__tab--disabled"]:""].filter(Boolean).join(" ");return n.jsxs("button",{ref:u=>{m.current[o]=u},id:e.id,role:"tab",type:"button",tabIndex:j===e.key?0:-1,"aria-selected":s,"aria-controls":e.panelId,"aria-disabled":a||void 0,title:e.title,className:D,onMouseDown:a?u=>u.preventDefault():void 0,onClick:()=>{a||(c(e.key),b(e.key))},onKeyDown:u=>h(u,e.key),children:[n.jsx("span",{className:l.default["tabs__tab-label"],children:e.label}),e.countBadge!=null&&n.jsx("span",{className:[l.default["tabs__count-badge"],s?l.default["tabs__count-badge--active"]:""].filter(Boolean).join(" "),children:e.countBadge}),e.unreadBadge&&!s&&n.jsx("span",{className:l.default["tabs__unread-badge"],children:n.jsx("span",{className:l.default["tabs__unread-label"],children:"Unread"})})]},e.key)})}),_!=null&&n.jsx("div",{className:l.default.tabs__controls,children:_})]})}exports.default=g;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("react/jsx-runtime"),i=require("react"),t=require("./Tabs.module.scss.cjs");function R({tabs:c,activeKey:o,onChange:b,className:j="",controls:_,unreadLabel:D="Unread",...g}){const h=[t.default.tabs,j].filter(Boolean).join(" "),p=i.useRef([]),[m,f]=i.useState(o);i.useEffect(()=>{f(o)},[o]);const N=c.map(e=>e.key),l=c.filter(e=>!e.disabled).map(e=>e.key),B=l.includes(m)?m:l.includes(o)?o:l[0],r=e=>{var s;f(e);const d=N.indexOf(e);(s=p.current[d])==null||s.focus()},w=(e,d)=>{const s=l.length;if(s===0)return;const a=l.indexOf(d);e.key==="ArrowRight"?(e.preventDefault(),r(l[(a+1)%s])):e.key==="ArrowLeft"?(e.preventDefault(),r(l[a<0?s-1:(a-1+s)%s])):e.key==="Home"?(e.preventDefault(),r(l[0])):e.key==="End"?(e.preventDefault(),r(l[s-1])):(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),a>=0&&b(d))};return n.jsxs("div",{...g,className:h,children:[n.jsx("div",{className:t.default["tabs__tab-list"],role:"tablist",children:c.map((e,d)=>{var y,k,x;const s=e.key===o,a=e.disabled===!0,P=[t.default.tabs__tab,s?t.default["tabs__tab--active"]:"",a?t.default["tabs__tab--disabled"]:"",(y=e.buttonProps)==null?void 0:y.className].filter(Boolean).join(" ");return i.createElement("button",{...e.buttonProps,key:e.key,ref:u=>{p.current[d]=u},id:e.id??((k=e.buttonProps)==null?void 0:k.id),role:"tab",type:"button",tabIndex:B===e.key?0:-1,"aria-selected":s,"aria-controls":e.panelId,"aria-disabled":a||void 0,title:e.title??((x=e.buttonProps)==null?void 0:x.title),className:P,onMouseDown:a?u=>u.preventDefault():void 0,onClick:()=>{a||(f(e.key),b(e.key))},onKeyDown:u=>w(u,e.key)},n.jsx("span",{className:t.default["tabs__tab-label"],children:e.label}),e.countBadge!=null&&n.jsx("span",{className:[t.default["tabs__count-badge"],s?t.default["tabs__count-badge--active"]:""].filter(Boolean).join(" "),children:e.countBadge}),e.unreadBadge&&!s&&n.jsx("span",{className:t.default["tabs__unread-badge"],children:n.jsx("span",{className:t.default["tabs__unread-label"],children:D})}))})}),_!=null&&n.jsx("div",{className:t.default.tabs__controls,children:_})]})}exports.default=R;
2
2
  //# sourceMappingURL=Tabs.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.cjs","sources":["../../../src/components/tabs/Tabs.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport styles from './Tabs.module.scss';\n\nexport interface TabItem {\n /** Unique key for this tab. */\n key: string;\n /** Tab label. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n label: ReactNode;\n /** Optional count badge number. */\n countBadge?: number;\n /** When true, shows an unread dot badge. */\n unreadBadge?: boolean;\n /** Optional id for this tab (pair with `panelId` for `aria-controls`). */\n id?: string;\n /** Optional id of the host tabpanel this tab controls. */\n panelId?: string;\n /** When true, the tab can't be selected and arrow-key navigation skips it. */\n disabled?: boolean;\n /** Native tooltip text, e.g. to explain why the tab is disabled. */\n title?: string;\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 let people switch between sibling views inside the same surface — Mentions in the\n * right sidebar, sections of a settings panel, or filters on a list. The content area\n * changes; the surrounding chrome doesn't.\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 const tabRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const [focusedKey, setFocusedKey] = useState(activeKey);\n\n useEffect(() => {\n setFocusedKey(activeKey);\n }, [activeKey]);\n\n const keys = tabs.map((tab) => tab.key);\n const enabledKeys = tabs.filter((tab) => !tab.disabled).map((tab) => tab.key);\n const focusKey = enabledKeys.includes(focusedKey)\n ? focusedKey\n : enabledKeys.includes(activeKey)\n ? activeKey\n : enabledKeys[0];\n\n const moveFocus = (key: string) => {\n setFocusedKey(key);\n const index = keys.indexOf(key);\n tabRefs.current[index]?.focus();\n };\n\n const handleKeyDown = (\n event: KeyboardEvent<HTMLButtonElement>,\n key: string,\n ) => {\n const count = enabledKeys.length;\n if (count === 0) return;\n const index = enabledKeys.indexOf(key);\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n moveFocus(enabledKeys[(index + 1) % count]);\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault();\n moveFocus(\n enabledKeys[index < 0 ? count - 1 : (index - 1 + count) % count],\n );\n } else if (event.key === 'Home') {\n event.preventDefault();\n moveFocus(enabledKeys[0]);\n } else if (event.key === 'End') {\n event.preventDefault();\n moveFocus(enabledKeys[count - 1]);\n } else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (index >= 0) onChange(key);\n }\n };\n\n return (\n <div className={rootClass}>\n <div className={styles['tabs__tab-list']} role=\"tablist\">\n {tabs.map((tab, index) => {\n const isActive = tab.key === activeKey;\n const isDisabled = tab.disabled === true;\n const tabClass = [\n styles['tabs__tab'],\n isActive ? styles['tabs__tab--active'] : '',\n isDisabled ? styles['tabs__tab--disabled'] : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n key={tab.key}\n ref={(node) => {\n tabRefs.current[index] = node;\n }}\n id={tab.id}\n role=\"tab\"\n type=\"button\"\n tabIndex={focusKey === tab.key ? 0 : -1}\n aria-selected={isActive}\n aria-controls={tab.panelId}\n aria-disabled={isDisabled || undefined}\n title={tab.title}\n className={tabClass}\n onMouseDown={\n isDisabled ? (event) => event.preventDefault() : undefined\n }\n onClick={() => {\n if (isDisabled) return;\n setFocusedKey(tab.key);\n onChange(tab.key);\n }}\n onKeyDown={(event) => handleKeyDown(event, 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 className={styles['tabs__unread-badge']}>\n <span className={styles['tabs__unread-label']}>\n {'Unread'}\n </span>\n </span>\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"],"names":["Tabs","tabs","activeKey","onChange","className","controls","rootClass","styles","tabRefs","useRef","focusedKey","setFocusedKey","useState","useEffect","keys","tab","enabledKeys","focusKey","moveFocus","key","index","_a","handleKeyDown","event","count","jsxs","jsx","isActive","isDisabled","tabClass","node"],"mappings":"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"}
1
+ {"version":3,"file":"Tabs.cjs","sources":["../../../src/components/tabs/Tabs.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport type { BuiltInButtonProps } from '@/utils/props';\nimport styles from './Tabs.module.scss';\n\nexport interface TabItem {\n /** Unique key for this tab. */\n key: string;\n /** Tab label. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n label: ReactNode;\n /** Optional count badge number. */\n countBadge?: number;\n /** When true, shows an unread dot badge. */\n unreadBadge?: boolean;\n /** Optional id for this tab (pair with `panelId` for `aria-controls`). */\n id?: string;\n /** Optional id of the host tabpanel this tab controls. */\n panelId?: string;\n /** When true, the tab can't be selected and arrow-key navigation skips it. */\n disabled?: boolean;\n /** Native tooltip text, e.g. to explain why the tab is disabled. */\n title?: string;\n /**\n * Extra attributes for this tab's `<button>` (e.g. `data-testid`). Tab\n * semantics (`role`, `aria-selected`, `tabIndex`, handlers) take precedence.\n */\n buttonProps?: BuiltInButtonProps;\n}\n\nexport interface TabsProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> {\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 /** Visually hidden text announced with a tab's unread dot. Default: \"Unread\". */\n unreadLabel?: ReactNode;\n}\n\n/**\n * Tabs let people switch between sibling views inside the same surface — Mentions in the\n * right sidebar, sections of a settings panel, or filters on a list. The content area\n * changes; the surrounding chrome doesn't.\n */\nexport default function Tabs({\n tabs,\n activeKey,\n onChange,\n className = '',\n controls,\n unreadLabel = 'Unread',\n ...rest\n}: TabsProps) {\n const rootClass = [styles.tabs, className].filter(Boolean).join(' ');\n const tabRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const [focusedKey, setFocusedKey] = useState(activeKey);\n\n useEffect(() => {\n setFocusedKey(activeKey);\n }, [activeKey]);\n\n const keys = tabs.map((tab) => tab.key);\n const enabledKeys = tabs.filter((tab) => !tab.disabled).map((tab) => tab.key);\n const focusKey = enabledKeys.includes(focusedKey)\n ? focusedKey\n : enabledKeys.includes(activeKey)\n ? activeKey\n : enabledKeys[0];\n\n const moveFocus = (key: string) => {\n setFocusedKey(key);\n const index = keys.indexOf(key);\n tabRefs.current[index]?.focus();\n };\n\n const handleKeyDown = (\n event: KeyboardEvent<HTMLButtonElement>,\n key: string,\n ) => {\n const count = enabledKeys.length;\n if (count === 0) return;\n const index = enabledKeys.indexOf(key);\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n moveFocus(enabledKeys[(index + 1) % count]);\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault();\n moveFocus(\n enabledKeys[index < 0 ? count - 1 : (index - 1 + count) % count],\n );\n } else if (event.key === 'Home') {\n event.preventDefault();\n moveFocus(enabledKeys[0]);\n } else if (event.key === 'End') {\n event.preventDefault();\n moveFocus(enabledKeys[count - 1]);\n } else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (index >= 0) onChange(key);\n }\n };\n\n return (\n <div {...rest} className={rootClass}>\n <div className={styles['tabs__tab-list']} role=\"tablist\">\n {tabs.map((tab, index) => {\n const isActive = tab.key === activeKey;\n const isDisabled = tab.disabled === true;\n const tabClass = [\n styles['tabs__tab'],\n isActive ? styles['tabs__tab--active'] : '',\n isDisabled ? styles['tabs__tab--disabled'] : '',\n tab.buttonProps?.className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n {...tab.buttonProps}\n key={tab.key}\n ref={(node) => {\n tabRefs.current[index] = node;\n }}\n id={tab.id ?? tab.buttonProps?.id}\n role=\"tab\"\n type=\"button\"\n tabIndex={focusKey === tab.key ? 0 : -1}\n aria-selected={isActive}\n aria-controls={tab.panelId}\n aria-disabled={isDisabled || undefined}\n title={tab.title ?? tab.buttonProps?.title}\n className={tabClass}\n onMouseDown={\n isDisabled ? (event) => event.preventDefault() : undefined\n }\n onClick={() => {\n if (isDisabled) return;\n setFocusedKey(tab.key);\n onChange(tab.key);\n }}\n onKeyDown={(event) => handleKeyDown(event, 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 className={styles['tabs__unread-badge']}>\n <span className={styles['tabs__unread-label']}>\n {unreadLabel}\n </span>\n </span>\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"],"names":["Tabs","tabs","activeKey","onChange","className","controls","unreadLabel","rest","rootClass","styles","tabRefs","useRef","focusedKey","setFocusedKey","useState","useEffect","keys","tab","enabledKeys","focusKey","moveFocus","key","index","_a","handleKeyDown","event","count","jsxs","jsx","isActive","isDisabled","tabClass","createElement","node","_b","_c"],"mappings":"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"}
@@ -1 +1 @@
1
- ._tabs_1xaix_2{display:flex;align-items:center;justify-content:space-between}._tabs__tab-list_1xaix_7{display:flex;align-items:flex-start;gap:var(--spacing-xxs)}._tabs__tab_1xaix_7{position:relative;display:flex;flex-direction:row;align-items:center;gap:var(--spacing-xs);border-radius:var(--radius-s);background:transparent;border:none;cursor:pointer;padding:var(--spacing-xxs) var(--spacing-s);outline:2px solid color-mix(in srgb,var(--focus-ring-color) 0%,transparent);outline-offset:0;transition:background-color var(--duration-quick) var(--ease-transition),outline-color var(--duration-quick) var(--ease-transition),outline-offset var(--duration-quick) var(--ease-transition)}._tabs__tab_1xaix_7:focus-visible{outline-color:var(--focus-ring-color);outline-offset:3px}._tabs__tab_1xaix_7:hover:not(._tabs__tab--active_1xaix_31):not(._tabs__tab--disabled_1xaix_31){background-color:rgba(var(--center-channel-color-rgb),.08)}._tabs__tab--active_1xaix_31{background-color:rgba(var(--link-color-rgb),.08)}._tabs__tab--active_1xaix_31 ._tabs__tab-label_1xaix_37{color:var(--link-color)}._tabs__tab--active_1xaix_31 ._tabs__count-badge_1xaix_40{background-color:rgba(var(--link-color-rgb),.12);color:var(--link-color)}._tabs__tab--disabled_1xaix_31{cursor:not-allowed}._tabs__tab--disabled_1xaix_31 ._tabs__tab-label_1xaix_37,._tabs__tab--disabled_1xaix_31 ._tabs__count-badge_1xaix_40{color:rgba(var(--center-channel-color-rgb),.4)}._tabs__tab-label_1xaix_37{display:flex;align-items:center;font-size:var(--font-size-100);font-weight:var(--font-weight-semibold);line-height:var(--line-height-100);color:rgba(var(--center-channel-color-rgb),.64);white-space:nowrap;transition:color var(--duration-quick) var(--ease-transition)}._tabs__count-badge_1xaix_40{display:inline-flex;align-items:center;justify-content:center;padding:2.5px var(--spacing-xxs);border-radius:var(--radius-m);background-color:rgba(var(--center-channel-color-rgb),.08);font-size:var(--font-size-25);font-weight:var(--font-weight-semibold);line-height:11px;color:rgba(var(--center-channel-color-rgb),.64);flex-shrink:0;transition:background-color var(--duration-quick) var(--ease-transition),color var(--duration-quick) var(--ease-transition)}._tabs__count-badge--active_1xaix_75{background-color:rgba(var(--link-color-rgb),.12);color:var(--link-color)}._tabs__unread-badge_1xaix_79{position:absolute;top:var(--spacing-xxs);right:var(--spacing-xxs);width:4px;height:4px;border-radius:var(--radius-full);background-color:var(--mention-bg)}._tabs__unread-label_1xaix_88{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._tabs__controls_1xaix_99{display:flex;align-items:center;gap:var(--spacing-xxs);flex-shrink:0}
1
+ ._tabs_j8wfj_2{display:flex;align-items:center;justify-content:space-between}._tabs__tab-list_j8wfj_7{display:flex;align-items:flex-start;gap:var(--spacing-xxs)}._tabs__tab_j8wfj_7{position:relative;display:flex;flex-direction:row;align-items:center;gap:var(--spacing-xs);border-radius:var(--radius-s);background:transparent;border:none;cursor:pointer;padding:var(--spacing-xxs) var(--spacing-s);outline:2px solid color-mix(in srgb,var(--focus-ring-color) 0%,transparent);outline-offset:0;transition:background-color var(--duration-quick) var(--ease-transition),outline-color var(--duration-quick) var(--ease-transition),outline-offset var(--duration-quick) var(--ease-transition)}._tabs__tab_j8wfj_7:focus-visible{outline-color:var(--focus-ring-color);outline-offset:3px}._tabs__tab_j8wfj_7:hover:not(._tabs__tab--active_j8wfj_31):not(._tabs__tab--disabled_j8wfj_31){background-color:rgba(var(--center-channel-color-rgb),.08)}._tabs__tab--active_j8wfj_31{background-color:rgba(var(--link-color-rgb),.08)}._tabs__tab--active_j8wfj_31 ._tabs__tab-label_j8wfj_37{color:var(--link-color)}._tabs__tab--active_j8wfj_31 ._tabs__count-badge_j8wfj_40{background-color:rgba(var(--link-color-rgb),.12);color:var(--link-color)}._tabs__tab--disabled_j8wfj_31{cursor:not-allowed}._tabs__tab--disabled_j8wfj_31 ._tabs__tab-label_j8wfj_37,._tabs__tab--disabled_j8wfj_31 ._tabs__count-badge_j8wfj_40{color:rgba(var(--center-channel-color-rgb),.4)}._tabs__tab-label_j8wfj_37{display:flex;align-items:center;font-size:var(--font-size-100);font-weight:var(--font-weight-semibold);line-height:var(--line-height-100);color:rgba(var(--center-channel-color-rgb),.64);white-space:nowrap;transition:color var(--duration-quick) var(--ease-transition)}._tabs__count-badge_j8wfj_40{display:inline-flex;align-items:center;justify-content:center;padding:2.5px var(--spacing-xxs);border-radius:var(--radius-m);background-color:rgba(var(--center-channel-color-rgb),.08);font-size:var(--font-size-25);font-weight:var(--font-weight-semibold);line-height:11px;color:rgba(var(--center-channel-color-rgb),.64);flex-shrink:0;transition:background-color var(--duration-quick) var(--ease-transition),color var(--duration-quick) var(--ease-transition)}._tabs__count-badge--active_j8wfj_75{background-color:rgba(var(--link-color-rgb),.12);color:var(--link-color)}._tabs__unread-badge_j8wfj_79{position:absolute;top:var(--spacing-xxs);right:var(--spacing-xxs);width:4px;height:4px;border-radius:var(--radius-pill);background-color:var(--mention-bg)}._tabs__unread-label_j8wfj_88{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._tabs__controls_j8wfj_99{display:flex;align-items:center;gap:var(--spacing-xxs);flex-shrink:0}
@@ -1,4 +1,5 @@
1
- import { ReactNode } from 'react';
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
+ import { BuiltInButtonProps } from '../../utils/props';
2
3
  export interface TabItem {
3
4
  /** Unique key for this tab. */
4
5
  key: string;
@@ -16,8 +17,13 @@ export interface TabItem {
16
17
  disabled?: boolean;
17
18
  /** Native tooltip text, e.g. to explain why the tab is disabled. */
18
19
  title?: string;
20
+ /**
21
+ * Extra attributes for this tab's `<button>` (e.g. `data-testid`). Tab
22
+ * semantics (`role`, `aria-selected`, `tabIndex`, handlers) take precedence.
23
+ */
24
+ buttonProps?: BuiltInButtonProps;
19
25
  }
20
- export interface TabsProps {
26
+ export interface TabsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {
21
27
  /** Array of tab items to display. */
22
28
  tabs: TabItem[];
23
29
  /** Key of the currently active tab. */
@@ -28,11 +34,13 @@ export interface TabsProps {
28
34
  className?: string;
29
35
  /** Optional trailing controls rendered to the right of the tabs. */
30
36
  controls?: ReactNode;
37
+ /** Visually hidden text announced with a tab's unread dot. Default: "Unread". */
38
+ unreadLabel?: ReactNode;
31
39
  }
32
40
  /**
33
41
  * Tabs let people switch between sibling views inside the same surface — Mentions in the
34
42
  * right sidebar, sections of a settings panel, or filters on a list. The content area
35
43
  * changes; the surrounding chrome doesn't.
36
44
  */
37
- export default function Tabs({ tabs, activeKey, onChange, className, controls, }: TabsProps): import("react/jsx-runtime").JSX.Element;
45
+ export default function Tabs({ tabs, activeKey, onChange, className, controls, unreadLabel, ...rest }: TabsProps): import("react/jsx-runtime").JSX.Element;
38
46
  //# sourceMappingURL=Tabs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,OAAO;IACtB,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,KAAK,EAAE,SAAS,CAAC;IACjB,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,qCAAqC;IACrC,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAC3B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,SAAc,EACd,QAAQ,GACT,EAAE,SAAS,2CA0HX"}
1
+ {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,MAAM,WAAW,OAAO;IACtB,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,KAAK,EAAE,SAAS,CAAC;IACjB,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,MAAM,WAAW,SAAU,SAAQ,IAAI,CACrC,cAAc,CAAC,cAAc,CAAC,EAC9B,UAAU,CACX;IACC,qCAAqC;IACrC,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,iFAAiF;IACjF,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAC3B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,SAAc,EACd,QAAQ,EACR,WAAsB,EACtB,GAAG,IAAI,EACR,EAAE,SAAS,2CA4HX"}
@@ -1,79 +1,82 @@
1
- import { jsxs as p, jsx as r } from "react/jsx-runtime";
2
- import { useRef as g, useState as B, useEffect as j } from "react";
3
- import a from "./Tabs.module.scss.js";
4
- function R({
1
+ import { jsxs as E, jsx as r } from "react/jsx-runtime";
2
+ import { useRef as P, useState as A, useEffect as R, createElement as C } from "react";
3
+ import t from "./Tabs.module.scss.js";
4
+ function H({
5
5
  tabs: c,
6
- activeKey: t,
6
+ activeKey: o,
7
7
  onChange: f,
8
- className: y = "",
9
- controls: b
8
+ className: D = "",
9
+ controls: p,
10
+ unreadLabel: h = "Unread",
11
+ ...N
10
12
  }) {
11
- const k = [a.tabs, y].filter(Boolean).join(" "), _ = g([]), [m, u] = B(t);
12
- j(() => {
13
- u(t);
14
- }, [t]);
15
- const h = c.map((e) => e.key), l = c.filter((e) => !e.disabled).map((e) => e.key), D = l.includes(m) ? m : l.includes(t) ? t : l[0], d = (e) => {
13
+ const x = [t.tabs, D].filter(Boolean).join(" "), b = P([]), [m, u] = A(o);
14
+ R(() => {
15
+ u(o);
16
+ }, [o]);
17
+ const g = c.map((e) => e.key), n = c.filter((e) => !e.disabled).map((e) => e.key), B = n.includes(m) ? m : n.includes(o) ? o : n[0], d = (e) => {
16
18
  var s;
17
19
  u(e);
18
- const o = h.indexOf(e);
19
- (s = _.current[o]) == null || s.focus();
20
- }, x = (e, o) => {
21
- const s = l.length;
20
+ const a = g.indexOf(e);
21
+ (s = b.current[a]) == null || s.focus();
22
+ }, j = (e, a) => {
23
+ const s = n.length;
22
24
  if (s === 0) return;
23
- const n = l.indexOf(o);
24
- e.key === "ArrowRight" ? (e.preventDefault(), d(l[(n + 1) % s])) : e.key === "ArrowLeft" ? (e.preventDefault(), d(
25
- l[n < 0 ? s - 1 : (n - 1 + s) % s]
26
- )) : e.key === "Home" ? (e.preventDefault(), d(l[0])) : e.key === "End" ? (e.preventDefault(), d(l[s - 1])) : (e.key === "Enter" || e.key === " ") && (e.preventDefault(), n >= 0 && f(o));
25
+ const l = n.indexOf(a);
26
+ e.key === "ArrowRight" ? (e.preventDefault(), d(n[(l + 1) % s])) : e.key === "ArrowLeft" ? (e.preventDefault(), d(
27
+ n[l < 0 ? s - 1 : (l - 1 + s) % s]
28
+ )) : e.key === "Home" ? (e.preventDefault(), d(n[0])) : e.key === "End" ? (e.preventDefault(), d(n[s - 1])) : (e.key === "Enter" || e.key === " ") && (e.preventDefault(), l >= 0 && f(a));
27
29
  };
28
- return /* @__PURE__ */ p("div", { className: k, children: [
29
- /* @__PURE__ */ r("div", { className: a["tabs__tab-list"], role: "tablist", children: c.map((e, o) => {
30
- const s = e.key === t, n = e.disabled === !0, N = [
31
- a.tabs__tab,
32
- s ? a["tabs__tab--active"] : "",
33
- n ? a["tabs__tab--disabled"] : ""
30
+ return /* @__PURE__ */ E("div", { ...N, className: x, children: [
31
+ /* @__PURE__ */ r("div", { className: t["tabs__tab-list"], role: "tablist", children: c.map((e, a) => {
32
+ var _, y, k;
33
+ const s = e.key === o, l = e.disabled === !0, w = [
34
+ t.tabs__tab,
35
+ s ? t["tabs__tab--active"] : "",
36
+ l ? t["tabs__tab--disabled"] : "",
37
+ (_ = e.buttonProps) == null ? void 0 : _.className
34
38
  ].filter(Boolean).join(" ");
35
- return /* @__PURE__ */ p(
39
+ return /* @__PURE__ */ C(
36
40
  "button",
37
41
  {
42
+ ...e.buttonProps,
43
+ key: e.key,
38
44
  ref: (i) => {
39
- _.current[o] = i;
45
+ b.current[a] = i;
40
46
  },
41
- id: e.id,
47
+ id: e.id ?? ((y = e.buttonProps) == null ? void 0 : y.id),
42
48
  role: "tab",
43
49
  type: "button",
44
- tabIndex: D === e.key ? 0 : -1,
50
+ tabIndex: B === e.key ? 0 : -1,
45
51
  "aria-selected": s,
46
52
  "aria-controls": e.panelId,
47
- "aria-disabled": n || void 0,
48
- title: e.title,
49
- className: N,
50
- onMouseDown: n ? (i) => i.preventDefault() : void 0,
53
+ "aria-disabled": l || void 0,
54
+ title: e.title ?? ((k = e.buttonProps) == null ? void 0 : k.title),
55
+ className: w,
56
+ onMouseDown: l ? (i) => i.preventDefault() : void 0,
51
57
  onClick: () => {
52
- n || (u(e.key), f(e.key));
58
+ l || (u(e.key), f(e.key));
53
59
  },
54
- onKeyDown: (i) => x(i, e.key),
55
- children: [
56
- /* @__PURE__ */ r("span", { className: a["tabs__tab-label"], children: e.label }),
57
- e.countBadge != null && /* @__PURE__ */ r(
58
- "span",
59
- {
60
- className: [
61
- a["tabs__count-badge"],
62
- s ? a["tabs__count-badge--active"] : ""
63
- ].filter(Boolean).join(" "),
64
- children: e.countBadge
65
- }
66
- ),
67
- e.unreadBadge && !s && /* @__PURE__ */ r("span", { className: a["tabs__unread-badge"], children: /* @__PURE__ */ r("span", { className: a["tabs__unread-label"], children: "Unread" }) })
68
- ]
60
+ onKeyDown: (i) => j(i, e.key)
69
61
  },
70
- e.key
62
+ /* @__PURE__ */ r("span", { className: t["tabs__tab-label"], children: e.label }),
63
+ e.countBadge != null && /* @__PURE__ */ r(
64
+ "span",
65
+ {
66
+ className: [
67
+ t["tabs__count-badge"],
68
+ s ? t["tabs__count-badge--active"] : ""
69
+ ].filter(Boolean).join(" "),
70
+ children: e.countBadge
71
+ }
72
+ ),
73
+ e.unreadBadge && !s && /* @__PURE__ */ r("span", { className: t["tabs__unread-badge"], children: /* @__PURE__ */ r("span", { className: t["tabs__unread-label"], children: h }) })
71
74
  );
72
75
  }) }),
73
- b != null && /* @__PURE__ */ r("div", { className: a.tabs__controls, children: b })
76
+ p != null && /* @__PURE__ */ r("div", { className: t.tabs__controls, children: p })
74
77
  ] });
75
78
  }
76
79
  export {
77
- R as default
80
+ H as default
78
81
  };
79
82
  //# sourceMappingURL=Tabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.js","sources":["../../../src/components/tabs/Tabs.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport styles from './Tabs.module.scss';\n\nexport interface TabItem {\n /** Unique key for this tab. */\n key: string;\n /** Tab label. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n label: ReactNode;\n /** Optional count badge number. */\n countBadge?: number;\n /** When true, shows an unread dot badge. */\n unreadBadge?: boolean;\n /** Optional id for this tab (pair with `panelId` for `aria-controls`). */\n id?: string;\n /** Optional id of the host tabpanel this tab controls. */\n panelId?: string;\n /** When true, the tab can't be selected and arrow-key navigation skips it. */\n disabled?: boolean;\n /** Native tooltip text, e.g. to explain why the tab is disabled. */\n title?: string;\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 let people switch between sibling views inside the same surface — Mentions in the\n * right sidebar, sections of a settings panel, or filters on a list. The content area\n * changes; the surrounding chrome doesn't.\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 const tabRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const [focusedKey, setFocusedKey] = useState(activeKey);\n\n useEffect(() => {\n setFocusedKey(activeKey);\n }, [activeKey]);\n\n const keys = tabs.map((tab) => tab.key);\n const enabledKeys = tabs.filter((tab) => !tab.disabled).map((tab) => tab.key);\n const focusKey = enabledKeys.includes(focusedKey)\n ? focusedKey\n : enabledKeys.includes(activeKey)\n ? activeKey\n : enabledKeys[0];\n\n const moveFocus = (key: string) => {\n setFocusedKey(key);\n const index = keys.indexOf(key);\n tabRefs.current[index]?.focus();\n };\n\n const handleKeyDown = (\n event: KeyboardEvent<HTMLButtonElement>,\n key: string,\n ) => {\n const count = enabledKeys.length;\n if (count === 0) return;\n const index = enabledKeys.indexOf(key);\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n moveFocus(enabledKeys[(index + 1) % count]);\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault();\n moveFocus(\n enabledKeys[index < 0 ? count - 1 : (index - 1 + count) % count],\n );\n } else if (event.key === 'Home') {\n event.preventDefault();\n moveFocus(enabledKeys[0]);\n } else if (event.key === 'End') {\n event.preventDefault();\n moveFocus(enabledKeys[count - 1]);\n } else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (index >= 0) onChange(key);\n }\n };\n\n return (\n <div className={rootClass}>\n <div className={styles['tabs__tab-list']} role=\"tablist\">\n {tabs.map((tab, index) => {\n const isActive = tab.key === activeKey;\n const isDisabled = tab.disabled === true;\n const tabClass = [\n styles['tabs__tab'],\n isActive ? styles['tabs__tab--active'] : '',\n isDisabled ? styles['tabs__tab--disabled'] : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n key={tab.key}\n ref={(node) => {\n tabRefs.current[index] = node;\n }}\n id={tab.id}\n role=\"tab\"\n type=\"button\"\n tabIndex={focusKey === tab.key ? 0 : -1}\n aria-selected={isActive}\n aria-controls={tab.panelId}\n aria-disabled={isDisabled || undefined}\n title={tab.title}\n className={tabClass}\n onMouseDown={\n isDisabled ? (event) => event.preventDefault() : undefined\n }\n onClick={() => {\n if (isDisabled) return;\n setFocusedKey(tab.key);\n onChange(tab.key);\n }}\n onKeyDown={(event) => handleKeyDown(event, 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 className={styles['tabs__unread-badge']}>\n <span className={styles['tabs__unread-label']}>\n {'Unread'}\n </span>\n </span>\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"],"names":["Tabs","tabs","activeKey","onChange","className","controls","rootClass","styles","tabRefs","useRef","focusedKey","setFocusedKey","useState","useEffect","keys","tab","enabledKeys","focusKey","moveFocus","key","index","_a","handleKeyDown","event","count","jsxs","jsx","isActive","isDisabled","tabClass","node"],"mappings":"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"}
1
+ {"version":3,"file":"Tabs.js","sources":["../../../src/components/tabs/Tabs.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport type { BuiltInButtonProps } from '@/utils/props';\nimport styles from './Tabs.module.scss';\n\nexport interface TabItem {\n /** Unique key for this tab. */\n key: string;\n /** Tab label. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n label: ReactNode;\n /** Optional count badge number. */\n countBadge?: number;\n /** When true, shows an unread dot badge. */\n unreadBadge?: boolean;\n /** Optional id for this tab (pair with `panelId` for `aria-controls`). */\n id?: string;\n /** Optional id of the host tabpanel this tab controls. */\n panelId?: string;\n /** When true, the tab can't be selected and arrow-key navigation skips it. */\n disabled?: boolean;\n /** Native tooltip text, e.g. to explain why the tab is disabled. */\n title?: string;\n /**\n * Extra attributes for this tab's `<button>` (e.g. `data-testid`). Tab\n * semantics (`role`, `aria-selected`, `tabIndex`, handlers) take precedence.\n */\n buttonProps?: BuiltInButtonProps;\n}\n\nexport interface TabsProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> {\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 /** Visually hidden text announced with a tab's unread dot. Default: \"Unread\". */\n unreadLabel?: ReactNode;\n}\n\n/**\n * Tabs let people switch between sibling views inside the same surface — Mentions in the\n * right sidebar, sections of a settings panel, or filters on a list. The content area\n * changes; the surrounding chrome doesn't.\n */\nexport default function Tabs({\n tabs,\n activeKey,\n onChange,\n className = '',\n controls,\n unreadLabel = 'Unread',\n ...rest\n}: TabsProps) {\n const rootClass = [styles.tabs, className].filter(Boolean).join(' ');\n const tabRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const [focusedKey, setFocusedKey] = useState(activeKey);\n\n useEffect(() => {\n setFocusedKey(activeKey);\n }, [activeKey]);\n\n const keys = tabs.map((tab) => tab.key);\n const enabledKeys = tabs.filter((tab) => !tab.disabled).map((tab) => tab.key);\n const focusKey = enabledKeys.includes(focusedKey)\n ? focusedKey\n : enabledKeys.includes(activeKey)\n ? activeKey\n : enabledKeys[0];\n\n const moveFocus = (key: string) => {\n setFocusedKey(key);\n const index = keys.indexOf(key);\n tabRefs.current[index]?.focus();\n };\n\n const handleKeyDown = (\n event: KeyboardEvent<HTMLButtonElement>,\n key: string,\n ) => {\n const count = enabledKeys.length;\n if (count === 0) return;\n const index = enabledKeys.indexOf(key);\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n moveFocus(enabledKeys[(index + 1) % count]);\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault();\n moveFocus(\n enabledKeys[index < 0 ? count - 1 : (index - 1 + count) % count],\n );\n } else if (event.key === 'Home') {\n event.preventDefault();\n moveFocus(enabledKeys[0]);\n } else if (event.key === 'End') {\n event.preventDefault();\n moveFocus(enabledKeys[count - 1]);\n } else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (index >= 0) onChange(key);\n }\n };\n\n return (\n <div {...rest} className={rootClass}>\n <div className={styles['tabs__tab-list']} role=\"tablist\">\n {tabs.map((tab, index) => {\n const isActive = tab.key === activeKey;\n const isDisabled = tab.disabled === true;\n const tabClass = [\n styles['tabs__tab'],\n isActive ? styles['tabs__tab--active'] : '',\n isDisabled ? styles['tabs__tab--disabled'] : '',\n tab.buttonProps?.className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n {...tab.buttonProps}\n key={tab.key}\n ref={(node) => {\n tabRefs.current[index] = node;\n }}\n id={tab.id ?? tab.buttonProps?.id}\n role=\"tab\"\n type=\"button\"\n tabIndex={focusKey === tab.key ? 0 : -1}\n aria-selected={isActive}\n aria-controls={tab.panelId}\n aria-disabled={isDisabled || undefined}\n title={tab.title ?? tab.buttonProps?.title}\n className={tabClass}\n onMouseDown={\n isDisabled ? (event) => event.preventDefault() : undefined\n }\n onClick={() => {\n if (isDisabled) return;\n setFocusedKey(tab.key);\n onChange(tab.key);\n }}\n onKeyDown={(event) => handleKeyDown(event, 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 className={styles['tabs__unread-badge']}>\n <span className={styles['tabs__unread-label']}>\n {unreadLabel}\n </span>\n </span>\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"],"names":["Tabs","tabs","activeKey","onChange","className","controls","unreadLabel","rest","rootClass","styles","tabRefs","useRef","focusedKey","setFocusedKey","useState","useEffect","keys","tab","enabledKeys","focusKey","moveFocus","key","index","_a","handleKeyDown","event","count","jsxs","jsx","isActive","isDisabled","tabClass","createElement","node","_b","_c"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require('./Tabs.css');const _="_tabs_1xaix_2",a="_tabs__tab_1xaix_7",t="_tabs__controls_1xaix_99",b={tabs:_,"tabs__tab-list":"_tabs__tab-list_1xaix_7",tabs__tab:a,"tabs__tab--active":"_tabs__tab--active_1xaix_31","tabs__tab--disabled":"_tabs__tab--disabled_1xaix_31","tabs__tab-label":"_tabs__tab-label_1xaix_37","tabs__count-badge":"_tabs__count-badge_1xaix_40","tabs__count-badge--active":"_tabs__count-badge--active_1xaix_75","tabs__unread-badge":"_tabs__unread-badge_1xaix_79","tabs__unread-label":"_tabs__unread-label_1xaix_88",tabs__controls:t};exports.default=b;exports.tabs=_;exports.tabs__controls=t;exports.tabs__tab=a;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require('./Tabs.css');const _="_tabs_j8wfj_2",t="_tabs__tab_j8wfj_7",a="_tabs__controls_j8wfj_99",b={tabs:_,"tabs__tab-list":"_tabs__tab-list_j8wfj_7",tabs__tab:t,"tabs__tab--active":"_tabs__tab--active_j8wfj_31","tabs__tab--disabled":"_tabs__tab--disabled_j8wfj_31","tabs__tab-label":"_tabs__tab-label_j8wfj_37","tabs__count-badge":"_tabs__count-badge_j8wfj_40","tabs__count-badge--active":"_tabs__count-badge--active_j8wfj_75","tabs__unread-badge":"_tabs__unread-badge_j8wfj_79","tabs__unread-label":"_tabs__unread-label_j8wfj_88",tabs__controls:a};exports.default=b;exports.tabs=_;exports.tabs__controls=a;exports.tabs__tab=t;
2
2
  //# sourceMappingURL=Tabs.module.scss.cjs.map
@@ -1,14 +1,14 @@
1
- import './Tabs.css';const _ = "_tabs_1xaix_2", a = "_tabs__tab_1xaix_7", t = "_tabs__controls_1xaix_99", b = {
1
+ import './Tabs.css';const _ = "_tabs_j8wfj_2", a = "_tabs__tab_j8wfj_7", t = "_tabs__controls_j8wfj_99", b = {
2
2
  tabs: _,
3
- "tabs__tab-list": "_tabs__tab-list_1xaix_7",
3
+ "tabs__tab-list": "_tabs__tab-list_j8wfj_7",
4
4
  tabs__tab: a,
5
- "tabs__tab--active": "_tabs__tab--active_1xaix_31",
6
- "tabs__tab--disabled": "_tabs__tab--disabled_1xaix_31",
7
- "tabs__tab-label": "_tabs__tab-label_1xaix_37",
8
- "tabs__count-badge": "_tabs__count-badge_1xaix_40",
9
- "tabs__count-badge--active": "_tabs__count-badge--active_1xaix_75",
10
- "tabs__unread-badge": "_tabs__unread-badge_1xaix_79",
11
- "tabs__unread-label": "_tabs__unread-label_1xaix_88",
5
+ "tabs__tab--active": "_tabs__tab--active_j8wfj_31",
6
+ "tabs__tab--disabled": "_tabs__tab--disabled_j8wfj_31",
7
+ "tabs__tab-label": "_tabs__tab-label_j8wfj_37",
8
+ "tabs__count-badge": "_tabs__count-badge_j8wfj_40",
9
+ "tabs__count-badge--active": "_tabs__count-badge--active_j8wfj_75",
10
+ "tabs__unread-badge": "_tabs__unread-badge_j8wfj_79",
11
+ "tabs__unread-label": "_tabs__unread-label_j8wfj_88",
12
12
  tabs__controls: t
13
13
  };
14
14
  export {
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const a=require("react/jsx-runtime"),c=require("../icon/Icon.cjs"),e=require("./Tag.module.scss.cjs"),r={"x-small":"10",small:"12"},o={default:e.default["tag--type-default"],info:e.default["tag--type-info"],"info-dim":e.default["tag--type-info-dim"],danger:e.default["tag--type-danger"],success:e.default["tag--type-success"],warning:e.default["tag--type-warning"]};function f({label:s,type:n="default",size:t="x-small",casing:u="title-case",leadingIcon:l,className:d=""}){const i=[e.default.tag,o[n],t==="small"?e.default["tag--size-small"]:e.default["tag--size-x-small"],u==="all-caps"?e.default["tag--casing-all-caps"]:"",d].filter(Boolean).join(" ");return a.jsxs("span",{className:i,children:[l&&a.jsx("span",{className:e.default.tag__icon,"aria-hidden":!0,children:a.jsx(c.IconSlotContext.Provider,{value:{size:r[t]},children:l})}),a.jsx("span",{className:e.default.tag__label,children:s})]})}exports.default=f;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const a=require("react/jsx-runtime"),r=require("../icon/Icon.cjs"),e=require("./Tag.module.scss.cjs"),o={"x-small":"10",small:"12"},f={default:e.default["tag--type-default"],info:e.default["tag--type-info"],"info-dim":e.default["tag--type-info-dim"],danger:e.default["tag--type-danger"],success:e.default["tag--type-success"],warning:e.default["tag--type-warning"]};function g({label:s,type:n="default",size:t="x-small",casing:u="title-case",leadingIcon:l,className:d="",...i}){const c=[e.default.tag,f[n],t==="small"?e.default["tag--size-small"]:e.default["tag--size-x-small"],u==="all-caps"?e.default["tag--casing-all-caps"]:"",d].filter(Boolean).join(" ");return a.jsxs("span",{...i,className:c,children:[l&&a.jsx("span",{className:e.default.tag__icon,"aria-hidden":!0,children:a.jsx(r.IconSlotContext.Provider,{value:{size:o[t]},children:l})}),a.jsx("span",{className:e.default.tag__label,children:s})]})}exports.default=g;
2
2
  //# sourceMappingURL=Tag.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tag.cjs","sources":["../../../src/components/tag/Tag.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { IconSize } from '@/components/icon/Icon';\nimport { IconSlotContext } from '@/components/icon/Icon';\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. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n label: ReactNode;\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 /** Leading icon — pass `<Icon glyph={<SomeIcon />} />`; Tag provides the correct size via context (`\"10\"` for x-small, `\"12\"` for small). */\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 TAG_ICON_SIZE: Record<TagSize, IconSize> = {\n 'x-small': '10',\n small: '12',\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 * Tags are compact pills that mark something — a role (_BOT_, _GUEST_), a tier\n * (_PROFESSIONAL_), a status (_NEW_, _BETA_), or a category. They're scannable signal: a way\n * to surface a small piece of metadata without spending a sentence on it.\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' ? styles['tag--size-small'] : 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 <IconSlotContext.Provider value={{ size: TAG_ICON_SIZE[size] }}>\n {leadingIcon}\n </IconSlotContext.Provider>\n </span>\n )}\n <span className={styles['tag__label']}>{label}</span>\n </span>\n );\n}\n"],"names":["TAG_ICON_SIZE","TYPE_CLASS","styles","Tag","label","type","size","casing","leadingIcon","className","classes","jsxs","jsx","IconSlotContext"],"mappings":"kNA+BMA,EAA2C,CAC/C,UAAW,KACX,MAAO,IACT,EAEMC,EAAsC,CAC1C,QAASC,EAAAA,QAAO,mBAAmB,EACnC,KAAMA,EAAAA,QAAO,gBAAgB,EAC7B,WAAYA,EAAAA,QAAO,oBAAoB,EACvC,OAAQA,EAAAA,QAAO,kBAAkB,EACjC,QAASA,EAAAA,QAAO,mBAAmB,EACnC,QAASA,EAAAA,QAAO,mBAAmB,CACrC,EAOA,SAAwBC,EAAI,CAC1B,MAAAC,EACA,KAAAC,EAAO,UACP,KAAAC,EAAO,UACP,OAAAC,EAAS,aACT,YAAAC,EACA,UAAAC,EAAY,EACd,EAAa,CACX,MAAMC,EAAU,CACdR,EAAAA,QAAO,IACPD,EAAWI,CAAI,EACfC,IAAS,QAAUJ,EAAAA,QAAO,iBAAiB,EAAIA,EAAAA,QAAO,mBAAmB,EACzEK,IAAW,WAAaL,UAAO,sBAAsB,EAAI,GACzDO,CAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,EAEX,OACEE,EAAAA,KAAC,OAAA,CAAK,UAAWD,EACd,SAAA,CAAAF,GACCI,EAAAA,IAAC,QAAK,UAAWV,EAAAA,QAAO,UAAc,cAAW,GAC/C,SAAAU,EAAAA,IAACC,kBAAgB,SAAhB,CAAyB,MAAO,CAAE,KAAMb,EAAcM,CAAI,CAAA,EACxD,WACH,EACF,QAED,OAAA,CAAK,UAAWJ,EAAAA,QAAO,WAAgB,SAAAE,CAAA,CAAM,CAAA,EAChD,CAEJ"}
1
+ {"version":3,"file":"Tag.cjs","sources":["../../../src/components/tag/Tag.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport type { IconSize } from '@/components/icon/Icon';\nimport { IconSlotContext } from '@/components/icon/Icon';\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 = Omit<HTMLAttributes<HTMLSpanElement>, 'type'> & {\n /** Tag label. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n label: ReactNode;\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 /** Leading icon — pass `<Icon glyph={<SomeIcon />} />`; Tag provides the correct size via context (`\"10\"` for x-small, `\"12\"` for small). */\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 TAG_ICON_SIZE: Record<TagSize, IconSize> = {\n 'x-small': '10',\n small: '12',\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 * Tags are compact pills that mark something — a role (_BOT_, _GUEST_), a tier\n * (_PROFESSIONAL_), a status (_NEW_, _BETA_), or a category. They're scannable signal: a way\n * to surface a small piece of metadata without spending a sentence on it.\n */\nexport default function Tag({\n label,\n type = 'default',\n size = 'x-small',\n casing = 'title-case',\n leadingIcon,\n className = '',\n ...rest\n}: TagProps) {\n const classes = [\n styles.tag,\n TYPE_CLASS[type],\n size === 'small' ? styles['tag--size-small'] : 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 {...rest} className={classes}>\n {leadingIcon && (\n <span className={styles['tag__icon']} aria-hidden>\n <IconSlotContext.Provider value={{ size: TAG_ICON_SIZE[size] }}>\n {leadingIcon}\n </IconSlotContext.Provider>\n </span>\n )}\n <span className={styles['tag__label']}>{label}</span>\n </span>\n );\n}\n"],"names":["TAG_ICON_SIZE","TYPE_CLASS","styles","Tag","label","type","size","casing","leadingIcon","className","rest","classes","jsxs","jsx","IconSlotContext"],"mappings":"kNA+BMA,EAA2C,CAC/C,UAAW,KACX,MAAO,IACT,EAEMC,EAAsC,CAC1C,QAASC,EAAAA,QAAO,mBAAmB,EACnC,KAAMA,EAAAA,QAAO,gBAAgB,EAC7B,WAAYA,EAAAA,QAAO,oBAAoB,EACvC,OAAQA,EAAAA,QAAO,kBAAkB,EACjC,QAASA,EAAAA,QAAO,mBAAmB,EACnC,QAASA,EAAAA,QAAO,mBAAmB,CACrC,EAOA,SAAwBC,EAAI,CAC1B,MAAAC,EACA,KAAAC,EAAO,UACP,KAAAC,EAAO,UACP,OAAAC,EAAS,aACT,YAAAC,EACA,UAAAC,EAAY,GACZ,GAAGC,CACL,EAAa,CACX,MAAMC,EAAU,CACdT,EAAAA,QAAO,IACPD,EAAWI,CAAI,EACfC,IAAS,QAAUJ,EAAAA,QAAO,iBAAiB,EAAIA,EAAAA,QAAO,mBAAmB,EACzEK,IAAW,WAAaL,UAAO,sBAAsB,EAAI,GACzDO,CAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,EAEX,OACEG,EAAAA,KAAC,OAAA,CAAM,GAAGF,EAAM,UAAWC,EACxB,SAAA,CAAAH,GACCK,EAAAA,IAAC,QAAK,UAAWX,EAAAA,QAAO,UAAc,cAAW,GAC/C,SAAAW,EAAAA,IAACC,kBAAgB,SAAhB,CAAyB,MAAO,CAAE,KAAMd,EAAcM,CAAI,CAAA,EACxD,WACH,EACF,QAED,OAAA,CAAK,UAAWJ,EAAAA,QAAO,WAAgB,SAAAE,CAAA,CAAM,CAAA,EAChD,CAEJ"}
@@ -1,8 +1,8 @@
1
- import { ReactNode } from 'react';
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
2
  export type TagType = 'default' | 'info' | 'info-dim' | 'danger' | 'success' | 'warning';
3
3
  export type TagSize = 'small' | 'x-small';
4
4
  export type TagCasing = 'title-case' | 'all-caps';
5
- export type TagProps = {
5
+ export type TagProps = Omit<HTMLAttributes<HTMLSpanElement>, 'type'> & {
6
6
  /** Tag label. Accepts translated nodes (e.g. `<FormattedMessage/>`). */
7
7
  label: ReactNode;
8
8
  /** Semantic colour type. Default: Default. */
@@ -21,5 +21,5 @@ export type TagProps = {
21
21
  * (_PROFESSIONAL_), a status (_NEW_, _BETA_), or a category. They're scannable signal: a way
22
22
  * to surface a small piece of metadata without spending a sentence on it.
23
23
  */
24
- export default function Tag({ label, type, size, casing, leadingIcon, className, }: TagProps): import("react/jsx-runtime").JSX.Element;
24
+ export default function Tag({ label, type, size, casing, leadingIcon, className, ...rest }: TagProps): import("react/jsx-runtime").JSX.Element;
25
25
  //# sourceMappingURL=Tag.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tag.d.ts","sourceRoot":"","sources":["../../../src/components/tag/Tag.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,MAAM,MAAM,OAAO,GACf,SAAS,GACT,MAAM,GACN,UAAU,GACV,QAAQ,GACR,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAC1C,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;AAElD,MAAM,MAAM,QAAQ,GAAG;IACrB,wEAAwE;IACxE,KAAK,EAAE,SAAS,CAAC;IACjB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sCAAsC;IACtC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,wCAAwC;IACxC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6IAA6I;IAC7I,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAgBF;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,EAC1B,KAAK,EACL,IAAgB,EAChB,IAAgB,EAChB,MAAqB,EACrB,WAAW,EACX,SAAc,GACf,EAAE,QAAQ,2CAuBV"}
1
+ {"version":3,"file":"Tag.d.ts","sourceRoot":"","sources":["../../../src/components/tag/Tag.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvD,MAAM,MAAM,OAAO,GACf,SAAS,GACT,MAAM,GACN,UAAU,GACV,QAAQ,GACR,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAC1C,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;AAElD,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,GAAG;IACrE,wEAAwE;IACxE,KAAK,EAAE,SAAS,CAAC;IACjB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sCAAsC;IACtC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,wCAAwC;IACxC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6IAA6I;IAC7I,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAgBF;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,EAC1B,KAAK,EACL,IAAgB,EAChB,IAAgB,EAChB,MAAqB,EACrB,WAAW,EACX,SAAc,EACd,GAAG,IAAI,EACR,EAAE,QAAQ,2CAuBV"}
@@ -1,10 +1,10 @@
1
- import { jsxs as c, jsx as s } from "react/jsx-runtime";
2
- import { IconSlotContext as g } from "../icon/Icon.js";
1
+ import { jsxs as g, jsx as s } from "react/jsx-runtime";
2
+ import { IconSlotContext as m } from "../icon/Icon.js";
3
3
  import a from "./Tag.module.scss.js";
4
- const m = {
4
+ const p = {
5
5
  "x-small": "10",
6
6
  small: "12"
7
- }, p = {
7
+ }, d = {
8
8
  default: a["tag--type-default"],
9
9
  info: a["tag--type-info"],
10
10
  "info-dim": a["tag--type-info-dim"],
@@ -12,27 +12,28 @@ const m = {
12
12
  success: a["tag--type-success"],
13
13
  warning: a["tag--type-warning"]
14
14
  };
15
- function x({
15
+ function y({
16
16
  label: l,
17
17
  type: n = "default",
18
18
  size: t = "x-small",
19
19
  casing: i = "title-case",
20
20
  leadingIcon: e,
21
- className: o = ""
21
+ className: o = "",
22
+ ...r
22
23
  }) {
23
- const r = [
24
+ const c = [
24
25
  a.tag,
25
- p[n],
26
+ d[n],
26
27
  t === "small" ? a["tag--size-small"] : a["tag--size-x-small"],
27
28
  i === "all-caps" ? a["tag--casing-all-caps"] : "",
28
29
  o
29
30
  ].filter(Boolean).join(" ");
30
- return /* @__PURE__ */ c("span", { className: r, children: [
31
- e && /* @__PURE__ */ s("span", { className: a.tag__icon, "aria-hidden": !0, children: /* @__PURE__ */ s(g.Provider, { value: { size: m[t] }, children: e }) }),
31
+ return /* @__PURE__ */ g("span", { ...r, className: c, children: [
32
+ e && /* @__PURE__ */ s("span", { className: a.tag__icon, "aria-hidden": !0, children: /* @__PURE__ */ s(m.Provider, { value: { size: p[t] }, children: e }) }),
32
33
  /* @__PURE__ */ s("span", { className: a.tag__label, children: l })
33
34
  ] });
34
35
  }
35
36
  export {
36
- x as default
37
+ y as default
37
38
  };
38
39
  //# sourceMappingURL=Tag.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tag.js","sources":["../../../src/components/tag/Tag.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { IconSize } from '@/components/icon/Icon';\nimport { IconSlotContext } from '@/components/icon/Icon';\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. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n label: ReactNode;\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 /** Leading icon — pass `<Icon glyph={<SomeIcon />} />`; Tag provides the correct size via context (`\"10\"` for x-small, `\"12\"` for small). */\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 TAG_ICON_SIZE: Record<TagSize, IconSize> = {\n 'x-small': '10',\n small: '12',\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 * Tags are compact pills that mark something — a role (_BOT_, _GUEST_), a tier\n * (_PROFESSIONAL_), a status (_NEW_, _BETA_), or a category. They're scannable signal: a way\n * to surface a small piece of metadata without spending a sentence on it.\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' ? styles['tag--size-small'] : 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 <IconSlotContext.Provider value={{ size: TAG_ICON_SIZE[size] }}>\n {leadingIcon}\n </IconSlotContext.Provider>\n </span>\n )}\n <span className={styles['tag__label']}>{label}</span>\n </span>\n );\n}\n"],"names":["TAG_ICON_SIZE","TYPE_CLASS","styles","Tag","label","type","size","casing","leadingIcon","className","classes","jsxs","jsx","IconSlotContext"],"mappings":";;;AA+BA,MAAMA,IAA2C;AAAA,EAC/C,WAAW;AAAA,EACX,OAAO;AACT,GAEMC,IAAsC;AAAA,EAC1C,SAASC,EAAO,mBAAmB;AAAA,EACnC,MAAMA,EAAO,gBAAgB;AAAA,EAC7B,YAAYA,EAAO,oBAAoB;AAAA,EACvC,QAAQA,EAAO,kBAAkB;AAAA,EACjC,SAASA,EAAO,mBAAmB;AAAA,EACnC,SAASA,EAAO,mBAAmB;AACrC;AAOA,SAAwBC,EAAI;AAAA,EAC1B,OAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,aAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAAa;AACX,QAAMC,IAAU;AAAA,IACdR,EAAO;AAAA,IACPD,EAAWI,CAAI;AAAA,IACfC,MAAS,UAAUJ,EAAO,iBAAiB,IAAIA,EAAO,mBAAmB;AAAA,IACzEK,MAAW,aAAaL,EAAO,sBAAsB,IAAI;AAAA,IACzDO;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAE,EAAC,QAAA,EAAK,WAAWD,GACd,UAAA;AAAA,IAAAF,KACC,gBAAAI,EAAC,UAAK,WAAWV,EAAO,WAAc,eAAW,IAC/C,UAAA,gBAAAU,EAACC,EAAgB,UAAhB,EAAyB,OAAO,EAAE,MAAMb,EAAcM,CAAI,EAAA,GACxD,aACH,GACF;AAAA,sBAED,QAAA,EAAK,WAAWJ,EAAO,YAAgB,UAAAE,EAAA,CAAM;AAAA,EAAA,GAChD;AAEJ;"}
1
+ {"version":3,"file":"Tag.js","sources":["../../../src/components/tag/Tag.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport type { IconSize } from '@/components/icon/Icon';\nimport { IconSlotContext } from '@/components/icon/Icon';\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 = Omit<HTMLAttributes<HTMLSpanElement>, 'type'> & {\n /** Tag label. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n label: ReactNode;\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 /** Leading icon — pass `<Icon glyph={<SomeIcon />} />`; Tag provides the correct size via context (`\"10\"` for x-small, `\"12\"` for small). */\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 TAG_ICON_SIZE: Record<TagSize, IconSize> = {\n 'x-small': '10',\n small: '12',\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 * Tags are compact pills that mark something — a role (_BOT_, _GUEST_), a tier\n * (_PROFESSIONAL_), a status (_NEW_, _BETA_), or a category. They're scannable signal: a way\n * to surface a small piece of metadata without spending a sentence on it.\n */\nexport default function Tag({\n label,\n type = 'default',\n size = 'x-small',\n casing = 'title-case',\n leadingIcon,\n className = '',\n ...rest\n}: TagProps) {\n const classes = [\n styles.tag,\n TYPE_CLASS[type],\n size === 'small' ? styles['tag--size-small'] : 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 {...rest} className={classes}>\n {leadingIcon && (\n <span className={styles['tag__icon']} aria-hidden>\n <IconSlotContext.Provider value={{ size: TAG_ICON_SIZE[size] }}>\n {leadingIcon}\n </IconSlotContext.Provider>\n </span>\n )}\n <span className={styles['tag__label']}>{label}</span>\n </span>\n );\n}\n"],"names":["TAG_ICON_SIZE","TYPE_CLASS","styles","Tag","label","type","size","casing","leadingIcon","className","rest","classes","jsxs","jsx","IconSlotContext"],"mappings":";;;AA+BA,MAAMA,IAA2C;AAAA,EAC/C,WAAW;AAAA,EACX,OAAO;AACT,GAEMC,IAAsC;AAAA,EAC1C,SAASC,EAAO,mBAAmB;AAAA,EACnC,MAAMA,EAAO,gBAAgB;AAAA,EAC7B,YAAYA,EAAO,oBAAoB;AAAA,EACvC,QAAQA,EAAO,kBAAkB;AAAA,EACjC,SAASA,EAAO,mBAAmB;AAAA,EACnC,SAASA,EAAO,mBAAmB;AACrC;AAOA,SAAwBC,EAAI;AAAA,EAC1B,OAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,aAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,GAAa;AACX,QAAMC,IAAU;AAAA,IACdT,EAAO;AAAA,IACPD,EAAWI,CAAI;AAAA,IACfC,MAAS,UAAUJ,EAAO,iBAAiB,IAAIA,EAAO,mBAAmB;AAAA,IACzEK,MAAW,aAAaL,EAAO,sBAAsB,IAAI;AAAA,IACzDO;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAG,EAAC,QAAA,EAAM,GAAGF,GAAM,WAAWC,GACxB,UAAA;AAAA,IAAAH,KACC,gBAAAK,EAAC,UAAK,WAAWX,EAAO,WAAc,eAAW,IAC/C,UAAA,gBAAAW,EAACC,EAAgB,UAAhB,EAAyB,OAAO,EAAE,MAAMd,EAAcM,CAAI,EAAA,GACxD,aACH,GACF;AAAA,sBAED,QAAA,EAAK,WAAWJ,EAAO,YAAgB,UAAAE,EAAA,CAAM;AAAA,EAAA,GAChD;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),u=require("../button/Button.cjs"),j=require("../icon/Icon.cjs"),__x=require("@mattermost/compass-icons/components/reply-outline.js"),x=__x?.default??__x,p=require("../mention-badge/MentionBadge.cjs"),v=require("../user-avatar-group/UserAvatarGroup.cjs"),a=require("./ThreadFooter.module.scss.cjs");function N({replyCount:s=3,avatars:d=[],badge:t="none",mentionCount:l=1,following:r=!1,lastReplyTime:o,onReply:f,onFollowToggle:c,hovered:n=!1,className:h="",..._}){const m=[a.default["thread-footer"],r?a.default["thread-footer--following"]:"",n?a.default["thread-footer--hovered"]:"",h].filter(Boolean).join(" "),i=t==="mention"?`${l} mention${l===1?"":"s"}`:t==="unread"?"Unread replies":void 0;return e.jsx("div",{className:m,..._,children:e.jsxs("div",{className:a.default["thread-footer__inner"],children:[e.jsxs("div",{className:a.default["thread-footer__avatars-group"],children:[i&&e.jsx("span",{className:a.default["thread-footer__status-hint"],children:i}),(t==="unread"||t==="mention")&&e.jsxs("div",{className:a.default["thread-footer__badge-container"],"aria-hidden":!0,children:[t==="unread"&&e.jsx("span",{className:a.default["thread-footer__unread-dot"]}),t==="mention"&&e.jsx("span",{className:a.default["thread-footer__mention-badge"],children:e.jsx(p.default,{count:l,location:"channel",size:"medium"})})]}),d.length>0&&e.jsx(v.default,{avatars:d,max:3,size:"20"})]}),e.jsxs("div",{className:a.default["thread-footer__buttons"],children:[e.jsx(u.default,{emphasis:"quaternary",size:"x-small",className:[a.default["thread-footer__reply-btn"],n?a.default["thread-footer__reply-btn--hovered"]:""].filter(Boolean).join(" "),onClick:f,"aria-label":`${s} repl${s===1?"y":"ies"}`,leadingIcon:e.jsx(j.default,{size:"12",glyph:e.jsx(x,{})}),children:e.jsxs("span",{className:a.default["thread-footer__btn-label"],children:[s," ",s===1?"reply":"replies"]})}),e.jsx("div",{className:a.default["thread-footer__divider"],"aria-hidden":!0}),e.jsx(u.default,{emphasis:"quaternary",size:"x-small",className:[a.default["thread-footer__follow-btn"],r?a.default["thread-footer__follow-btn--following"]:""].filter(Boolean).join(" "),onClick:c,"aria-pressed":r,"aria-label":r?"Unfollow thread":"Follow thread",children:r?"Following":"Follow"}),r&&o&&e.jsxs("div",{className:a.default["thread-footer__last-reply-group"],children:[e.jsx("div",{className:a.default["thread-footer__divider"],"aria-hidden":!0}),e.jsx("span",{className:a.default["thread-footer__last-reply"],children:o})]})]})]})})}exports.default=N;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),u=require("../button/Button.cjs"),z=require("../icon/Icon.cjs"),__B=require("@mattermost/compass-icons/components/reply-outline.js"),B=__B?.default??__B,g=require("../mention-badge/MentionBadge.cjs"),M=require("../user-avatar-group/UserAvatarGroup.cjs"),a=require("./ThreadFooter.module.scss.cjs"),f=t=>`${t} ${t===1?"reply":"replies"}`,$=t=>`${t} mention${t===1?"":"s"}`;function w({replyCount:t=3,avatars:l=[],badge:r="none",mentionCount:o=1,following:s=!1,lastReplyTime:d,onReply:c,onFollowToggle:h,hovered:n=!1,className:_="",formatReplyCount:m=f,formatReplyLabel:j=f,formatMentionLabel:x=$,unreadLabel:p="Unread replies",followLabel:v="Follow",followingLabel:N="Following",followAriaLabel:b="Follow thread",unfollowAriaLabel:q="Unfollow thread",...y}){const F=[a.default["thread-footer"],s?a.default["thread-footer--following"]:"",n?a.default["thread-footer--hovered"]:"",_].filter(Boolean).join(" "),i=r==="mention"?x(o):r==="unread"?p:void 0;return e.jsx("div",{className:F,...y,children:e.jsxs("div",{className:a.default["thread-footer__inner"],children:[e.jsxs("div",{className:a.default["thread-footer__avatars-group"],children:[i&&e.jsx("span",{className:a.default["thread-footer__status-hint"],children:i}),(r==="unread"||r==="mention")&&e.jsxs("div",{className:a.default["thread-footer__badge-container"],"aria-hidden":!0,children:[r==="unread"&&e.jsx("span",{className:a.default["thread-footer__unread-dot"]}),r==="mention"&&e.jsx("span",{className:a.default["thread-footer__mention-badge"],children:e.jsx(g.default,{count:o,location:"channel",size:"medium"})})]}),l.length>0&&e.jsx(M.default,{avatars:l,max:3,size:"20"})]}),e.jsxs("div",{className:a.default["thread-footer__buttons"],children:[e.jsx(u.default,{emphasis:"quaternary",size:"x-small",className:[a.default["thread-footer__reply-btn"],n?a.default["thread-footer__reply-btn--hovered"]:""].filter(Boolean).join(" "),onClick:c,"aria-label":j(t),leadingIcon:e.jsx(z.default,{size:"12",glyph:e.jsx(B,{})}),children:e.jsx("span",{className:a.default["thread-footer__btn-label"],children:m(t)})}),e.jsx("div",{className:a.default["thread-footer__divider"],"aria-hidden":!0}),e.jsx(u.default,{emphasis:"quaternary",size:"x-small",className:[a.default["thread-footer__follow-btn"],s?a.default["thread-footer__follow-btn--following"]:""].filter(Boolean).join(" "),onClick:h,"aria-pressed":s,"aria-label":s?q:b,children:s?N:v}),s&&d&&e.jsxs("div",{className:a.default["thread-footer__last-reply-group"],children:[e.jsx("div",{className:a.default["thread-footer__divider"],"aria-hidden":!0}),e.jsx("span",{className:a.default["thread-footer__last-reply"],children:d})]})]})]})})}exports.default=w;
2
2
  //# sourceMappingURL=ThreadFooter.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadFooter.cjs","sources":["../../../src/components/thread-footer/ThreadFooter.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react';\nimport Button from '@/components/button/Button';\nimport Icon from '@/components/icon/Icon';\nimport ReplyOutlineIcon from '@mattermost/compass-icons/components/reply-outline';\nimport MentionBadge from '@/components/mention-badge/MentionBadge';\nimport UserAvatarGroup, {\n type UserAvatarGroupItem,\n} from '@/components/user-avatar-group/UserAvatarGroup';\nimport styles from './ThreadFooter.module.scss';\n\nexport type ThreadFooterBadge = 'none' | 'unread' | 'mention';\n\nexport interface ThreadFooterProps extends HTMLAttributes<HTMLDivElement> {\n /** Reply count. Default: 3. */\n replyCount?: number;\n /** Participant avatars. Rendered with User Avatar Group (first 3 shown, overflow as +N). */\n avatars?: UserAvatarGroupItem[];\n /** Badge variant. Default: None. */\n badge?: ThreadFooterBadge;\n /** Shown when `badge` is Mention. Default: 1. */\n mentionCount?: number;\n /** Whether the current user is following the thread. Default: false. */\n following?: boolean;\n /** Last reply timestamp label. Shown on row hover 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 * The Thread Footer is the reply summary bar at the bottom of a message. It shows\n * participants, reply count, follow state, and last-reply time — the information someone\n * needs to decide whether to dive in.\n */\nexport default function ThreadFooter({\n replyCount = 3,\n avatars = [],\n badge = 'none',\n mentionCount = 1,\n following = false,\n lastReplyTime,\n onReply,\n onFollowToggle,\n hovered = false,\n className = '',\n ...rest\n}: ThreadFooterProps) {\n const rootClass = [\n styles['thread-footer'],\n following ? styles['thread-footer--following'] : '',\n hovered ? styles['thread-footer--hovered'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const badgeStatusHint =\n badge === 'mention'\n ? `${mentionCount} mention${mentionCount === 1 ? '' : 's'}`\n : badge === 'unread'\n ? 'Unread replies'\n : undefined;\n\n return (\n <div className={rootClass} {...rest}>\n <div className={styles['thread-footer__inner']}>\n <div className={styles['thread-footer__avatars-group']}>\n {badgeStatusHint && (\n <span className={styles['thread-footer__status-hint']}>\n {badgeStatusHint}\n </span>\n )}\n {(badge === 'unread' || badge === 'mention') && (\n <div\n className={styles['thread-footer__badge-container']}\n aria-hidden\n >\n {badge === 'unread' && (\n <span className={styles['thread-footer__unread-dot']} />\n )}\n {badge === 'mention' && (\n <span className={styles['thread-footer__mention-badge']}>\n <MentionBadge\n count={mentionCount}\n location=\"channel\"\n size=\"medium\"\n />\n </span>\n )}\n </div>\n )}\n\n {avatars.length > 0 && (\n <UserAvatarGroup avatars={avatars} max={3} size=\"20\" />\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 — revealed on row hover when following */}\n {following && lastReplyTime && (\n <div className={styles['thread-footer__last-reply-group']}>\n <div className={styles['thread-footer__divider']} aria-hidden />\n <span className={styles['thread-footer__last-reply']}>\n {lastReplyTime}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"names":["ThreadFooter","replyCount","avatars","badge","mentionCount","following","lastReplyTime","onReply","onFollowToggle","hovered","className","rest","rootClass","styles","badgeStatusHint","jsx","jsxs","MentionBadge","UserAvatarGroup","Button","Icon","ReplyOutlineIcon"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadFooter.cjs","sources":["../../../src/components/thread-footer/ThreadFooter.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport Button from '@/components/button/Button';\nimport Icon from '@/components/icon/Icon';\nimport ReplyOutlineIcon from '@mattermost/compass-icons/components/reply-outline';\nimport MentionBadge from '@/components/mention-badge/MentionBadge';\nimport UserAvatarGroup, {\n type UserAvatarGroupItem,\n} from '@/components/user-avatar-group/UserAvatarGroup';\nimport styles from './ThreadFooter.module.scss';\n\nexport type ThreadFooterBadge = 'none' | 'unread' | 'mention';\n\nexport interface ThreadFooterProps extends HTMLAttributes<HTMLDivElement> {\n /** Reply count. Default: 3. */\n replyCount?: number;\n /** Participant avatars. Rendered with User Avatar Group (first 3 shown, overflow as +N). */\n avatars?: UserAvatarGroupItem[];\n /** Badge variant. Default: None. */\n badge?: ThreadFooterBadge;\n /** Shown when `badge` is Mention. Default: 1. */\n mentionCount?: number;\n /** Whether the current user is following the thread. Default: false. */\n following?: boolean;\n /** Last reply timestamp label. Shown on row hover when following. */\n lastReplyTime?: ReactNode;\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 /** Visible reply count. Default: `{count} reply` / `{count} replies`. */\n formatReplyCount?: (count: number) => ReactNode;\n /** Accessible name for the reply button. Default: `{count} reply` / `{count} replies`. */\n formatReplyLabel?: (count: number) => string;\n /** Visually hidden mention hint. Default: `{count} mention(s)`. */\n formatMentionLabel?: (count: number) => ReactNode;\n /** Visually hidden unread hint. Default: \"Unread replies\". */\n unreadLabel?: ReactNode;\n /** Visible follow button text when not following. Default: \"Follow\". */\n followLabel?: ReactNode;\n /** Visible follow button text when following. Default: \"Following\". */\n followingLabel?: ReactNode;\n /** Accessible name for the follow button when not following. Default: \"Follow thread\". */\n followAriaLabel?: string;\n /** Accessible name for the follow button when following. Default: \"Unfollow thread\". */\n unfollowAriaLabel?: string;\n}\n\nconst defaultFormatReplies = (count: number) =>\n `${count} ${count === 1 ? 'reply' : 'replies'}`;\nconst defaultFormatMentions = (count: number) =>\n `${count} mention${count === 1 ? '' : 's'}`;\n\n/**\n * The Thread Footer is the reply summary bar at the bottom of a message. It shows\n * participants, reply count, follow state, and last-reply time — the information someone\n * needs to decide whether to dive in.\n */\nexport default function ThreadFooter({\n replyCount = 3,\n avatars = [],\n badge = 'none',\n mentionCount = 1,\n following = false,\n lastReplyTime,\n onReply,\n onFollowToggle,\n hovered = false,\n className = '',\n formatReplyCount = defaultFormatReplies,\n formatReplyLabel = defaultFormatReplies,\n formatMentionLabel = defaultFormatMentions,\n unreadLabel = 'Unread replies',\n followLabel = 'Follow',\n followingLabel = 'Following',\n followAriaLabel = 'Follow thread',\n unfollowAriaLabel = 'Unfollow thread',\n ...rest\n}: ThreadFooterProps) {\n const rootClass = [\n styles['thread-footer'],\n following ? styles['thread-footer--following'] : '',\n hovered ? styles['thread-footer--hovered'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const badgeStatusHint =\n badge === 'mention'\n ? formatMentionLabel(mentionCount)\n : badge === 'unread'\n ? unreadLabel\n : undefined;\n\n return (\n <div className={rootClass} {...rest}>\n <div className={styles['thread-footer__inner']}>\n <div className={styles['thread-footer__avatars-group']}>\n {badgeStatusHint && (\n <span className={styles['thread-footer__status-hint']}>\n {badgeStatusHint}\n </span>\n )}\n {(badge === 'unread' || badge === 'mention') && (\n <div\n className={styles['thread-footer__badge-container']}\n aria-hidden\n >\n {badge === 'unread' && (\n <span className={styles['thread-footer__unread-dot']} />\n )}\n {badge === 'mention' && (\n <span className={styles['thread-footer__mention-badge']}>\n <MentionBadge\n count={mentionCount}\n location=\"channel\"\n size=\"medium\"\n />\n </span>\n )}\n </div>\n )}\n\n {avatars.length > 0 && (\n <UserAvatarGroup avatars={avatars} max={3} size=\"20\" />\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={formatReplyLabel(replyCount)}\n leadingIcon={<Icon size=\"12\" glyph={<ReplyOutlineIcon />} />}\n >\n <span className={styles['thread-footer__btn-label']}>\n {formatReplyCount(replyCount)}\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 ? unfollowAriaLabel : followAriaLabel}\n >\n {following ? followingLabel : followLabel}\n </Button>\n\n {/* Last reply time — revealed on row hover when following */}\n {following && lastReplyTime && (\n <div className={styles['thread-footer__last-reply-group']}>\n <div className={styles['thread-footer__divider']} aria-hidden />\n <span className={styles['thread-footer__last-reply']}>\n {lastReplyTime}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"names":["defaultFormatReplies","count","defaultFormatMentions","ThreadFooter","replyCount","avatars","badge","mentionCount","following","lastReplyTime","onReply","onFollowToggle","hovered","className","formatReplyCount","formatReplyLabel","formatMentionLabel","unreadLabel","followLabel","followingLabel","followAriaLabel","unfollowAriaLabel","rest","rootClass","styles","badgeStatusHint","jsx","jsxs","MentionBadge","UserAvatarGroup","Button","Icon","ReplyOutlineIcon"],"mappings":"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"}
@@ -1 +1 @@
1
- ._thread-footer_b5kji_2{--thread-footer-focus-ring-color: var(--focus-ring-color);display:flex;flex-direction:column;align-items:flex-start}._thread-footer__inner_b5kji_8{position:relative;display:inline-flex;align-items:center;border-radius:var(--radius-s)}._thread-footer__avatars-group_b5kji_14{display:inline-flex;align-items:center;padding-right:var(--spacing-xxxs)}._thread-footer__status-hint_b5kji_19{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._thread-footer__badge-container_b5kji_30{position:absolute;left:calc(var(--spacing-xxs) * -1);top:50%;transform:translate(-100%,-50%);display:flex;align-items:center;justify-content:flex-end}._thread-footer__unread-dot_b5kji_39{display:block;width:8px;height:8px;border-radius:var(--radius-full);background-color:var(--link-color)}._thread-footer__mention-badge_b5kji_46{display:inline-flex}._thread-footer__buttons_b5kji_49{display:inline-flex;align-items:center;gap:0}._thread-footer__reply-btn_b5kji_54,._thread-footer__follow-btn_b5kji_54{--focus-ring-color: var(--thread-footer-focus-ring-color)}._thread-footer_b5kji_2 ._thread-footer__reply-btn_b5kji_54[class*=button--emphasis-quaternary],._thread-footer_b5kji_2 ._thread-footer__follow-btn_b5kji_54:not(._thread-footer__follow-btn--following_b5kji_57)[class*=button--emphasis-quaternary]{color:rgba(var(--center-channel-color-rgb),.75)}._thread-footer_b5kji_2 ._thread-footer__reply-btn_b5kji_54[class*=button--emphasis-quaternary]:hover:not(:disabled),._thread-footer_b5kji_2 ._thread-footer__follow-btn_b5kji_54:not(._thread-footer__follow-btn--following_b5kji_57)[class*=button--emphasis-quaternary]:hover:not(:disabled){background-color:rgba(var(--center-channel-color-rgb),.08)}._thread-footer_b5kji_2 ._thread-footer__reply-btn--hovered_b5kji_63[class*=button--emphasis-quaternary]{background-color:rgba(var(--center-channel-color-rgb),.08)}._thread-footer_b5kji_2 ._thread-footer__follow-btn--following_b5kji_57[class*=button--emphasis-quaternary]{color:var(--link-color);background-color:rgba(var(--link-color-rgb),.08)}._thread-footer_b5kji_2 ._thread-footer__follow-btn--following_b5kji_57[class*=button--emphasis-quaternary]:hover:not(:disabled){background-color:rgba(var(--link-color-rgb),.12)}._thread-footer__btn-label_b5kji_73{font-family:var(--font-family-body);font-size:var(--font-size-75);font-weight:var(--font-weight-semibold);line-height:15px;white-space:nowrap}._thread-footer__divider_b5kji_80{box-sizing:border-box;width:1px;min-width:1px;max-width:1px;height:16px;padding:0;margin:0;border:0;background-color:rgba(var(--center-channel-color-rgb),.16);flex-shrink:0;transition:opacity var(--duration-quick) var(--ease-transition)}._thread-footer__buttons_b5kji_49:has(._thread-footer__follow-btn--following_b5kji_57)>._thread-footer__divider_b5kji_80:first-of-type,._thread-footer__buttons_b5kji_49:has(._thread-footer__follow-btn--following_b5kji_57)>._thread-footer__last-reply-group_b5kji_93>._thread-footer__divider_b5kji_80{opacity:0}._thread-footer__buttons_b5kji_49:not(:has(._thread-footer__follow-btn--following_b5kji_57)):has(._thread-footer__reply-btn_b5kji_54:hover,._thread-footer__reply-btn--hovered_b5kji_63,._thread-footer__reply-btn_b5kji_54:focus-visible,._thread-footer__follow-btn_b5kji_54:hover,._thread-footer__follow-btn_b5kji_54:focus-visible)>._thread-footer__divider_b5kji_80:first-of-type{opacity:0}._thread-footer__last-reply-group_b5kji_93{display:inline-flex;align-items:center;gap:0;overflow:hidden;max-width:0;opacity:0;transition:max-width var(--duration-quick) var(--ease-transition),opacity var(--duration-quick) var(--ease-transition)}._thread-footer--following_b5kji_112:hover ._thread-footer__last-reply-group_b5kji_93,._thread-footer--following_b5kji_112:focus-within ._thread-footer__last-reply-group_b5kji_93,._thread-footer--following_b5kji_112._thread-footer--hovered_b5kji_112 ._thread-footer__last-reply-group_b5kji_93{max-width:10rem;opacity:1}._thread-footer__last-reply_b5kji_93{padding:4.5px var(--spacing-s);color:rgba(var(--center-channel-color-rgb),.64);font-family:var(--font-family-body);font-size:var(--font-size-75);font-weight:var(--font-weight-regular);line-height:15px;white-space:nowrap}
1
+ ._thread-footer_1sd7m_2{--thread-footer-focus-ring-color: var(--focus-ring-color);display:flex;flex-direction:column;align-items:flex-start}._thread-footer__inner_1sd7m_8{position:relative;display:inline-flex;align-items:center;border-radius:var(--radius-s)}._thread-footer__avatars-group_1sd7m_14{display:inline-flex;align-items:center;padding-right:var(--spacing-xxxs)}._thread-footer__status-hint_1sd7m_19{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._thread-footer__badge-container_1sd7m_30{position:absolute;left:calc(var(--spacing-xxs) * -1);top:50%;transform:translate(-100%,-50%);display:flex;align-items:center;justify-content:flex-end}._thread-footer__unread-dot_1sd7m_39{display:block;width:8px;height:8px;border-radius:var(--radius-pill);background-color:var(--link-color)}._thread-footer__mention-badge_1sd7m_46{display:inline-flex}._thread-footer__buttons_1sd7m_49{display:inline-flex;align-items:center;gap:0}._thread-footer__reply-btn_1sd7m_54,._thread-footer__follow-btn_1sd7m_54{--focus-ring-color: var(--thread-footer-focus-ring-color)}._thread-footer_1sd7m_2 ._thread-footer__reply-btn_1sd7m_54[class*=button--emphasis-quaternary],._thread-footer_1sd7m_2 ._thread-footer__follow-btn_1sd7m_54:not(._thread-footer__follow-btn--following_1sd7m_57)[class*=button--emphasis-quaternary]{color:rgba(var(--center-channel-color-rgb),.75)}._thread-footer_1sd7m_2 ._thread-footer__reply-btn_1sd7m_54[class*=button--emphasis-quaternary]:hover:not(:disabled),._thread-footer_1sd7m_2 ._thread-footer__follow-btn_1sd7m_54:not(._thread-footer__follow-btn--following_1sd7m_57)[class*=button--emphasis-quaternary]:hover:not(:disabled){background-color:rgba(var(--center-channel-color-rgb),.08)}._thread-footer_1sd7m_2 ._thread-footer__reply-btn--hovered_1sd7m_63[class*=button--emphasis-quaternary]{background-color:rgba(var(--center-channel-color-rgb),.08)}._thread-footer_1sd7m_2 ._thread-footer__follow-btn--following_1sd7m_57[class*=button--emphasis-quaternary]{color:var(--link-color);background-color:rgba(var(--link-color-rgb),.08)}._thread-footer_1sd7m_2 ._thread-footer__follow-btn--following_1sd7m_57[class*=button--emphasis-quaternary]:hover:not(:disabled){background-color:rgba(var(--link-color-rgb),.12)}._thread-footer__btn-label_1sd7m_73{font-family:var(--font-family-body);font-size:var(--font-size-75);font-weight:var(--font-weight-semibold);line-height:15px;white-space:nowrap}._thread-footer__divider_1sd7m_80{box-sizing:border-box;width:1px;min-width:1px;max-width:1px;height:16px;padding:0;margin:0;border:0;background-color:rgba(var(--center-channel-color-rgb),.16);flex-shrink:0;transition:opacity var(--duration-quick) var(--ease-transition)}._thread-footer__buttons_1sd7m_49:has(._thread-footer__follow-btn--following_1sd7m_57)>._thread-footer__divider_1sd7m_80:first-of-type,._thread-footer__buttons_1sd7m_49:has(._thread-footer__follow-btn--following_1sd7m_57)>._thread-footer__last-reply-group_1sd7m_93>._thread-footer__divider_1sd7m_80{opacity:0}._thread-footer__buttons_1sd7m_49:not(:has(._thread-footer__follow-btn--following_1sd7m_57)):has(._thread-footer__reply-btn_1sd7m_54:hover,._thread-footer__reply-btn--hovered_1sd7m_63,._thread-footer__reply-btn_1sd7m_54:focus-visible,._thread-footer__follow-btn_1sd7m_54:hover,._thread-footer__follow-btn_1sd7m_54:focus-visible)>._thread-footer__divider_1sd7m_80:first-of-type{opacity:0}._thread-footer__last-reply-group_1sd7m_93{display:inline-flex;align-items:center;gap:0;overflow:hidden;max-width:0;opacity:0;transition:max-width var(--duration-quick) var(--ease-transition),opacity var(--duration-quick) var(--ease-transition)}._thread-footer--following_1sd7m_112:hover ._thread-footer__last-reply-group_1sd7m_93,._thread-footer--following_1sd7m_112:focus-within ._thread-footer__last-reply-group_1sd7m_93,._thread-footer--following_1sd7m_112._thread-footer--hovered_1sd7m_112 ._thread-footer__last-reply-group_1sd7m_93{max-width:10rem;opacity:1}._thread-footer__last-reply_1sd7m_93{padding:4.5px var(--spacing-s);color:rgba(var(--center-channel-color-rgb),.64);font-family:var(--font-family-body);font-size:var(--font-size-75);font-weight:var(--font-weight-regular);line-height:15px;white-space:nowrap}