@k2b/ui 0.32.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/dist/base.css +14 -1
  2. package/dist/browser/actions/ContextMenu.js +13 -0
  3. package/dist/browser/actions/ContextMenu.js.map +1 -1
  4. package/dist/browser/actions/Dropdown.js +173 -102
  5. package/dist/browser/actions/Dropdown.js.map +1 -1
  6. package/dist/browser/actions/FilterChip.js +113 -56
  7. package/dist/browser/actions/FilterChip.js.map +1 -1
  8. package/dist/browser/actions/SelectionToolbar.js +129 -0
  9. package/dist/browser/actions/SelectionToolbar.js.map +1 -0
  10. package/dist/browser/actions/filter-messages.js +26 -2
  11. package/dist/browser/actions/filter-messages.js.map +1 -1
  12. package/dist/browser/actions/index.js +1 -0
  13. package/dist/browser/actions/index.js.map +1 -1
  14. package/dist/browser/actions/menu-rows.js +23 -3
  15. package/dist/browser/actions/menu-rows.js.map +1 -1
  16. package/dist/browser/actions/menu-sheet.js +2 -7
  17. package/dist/browser/actions/menu-sheet.js.map +1 -1
  18. package/dist/browser/charts.js +6 -0
  19. package/dist/browser/charts.js.map +1 -0
  20. package/dist/browser/chat/ChatComposer.js +616 -421
  21. package/dist/browser/chat/ChatComposer.js.map +1 -1
  22. package/dist/browser/chat/chat-messages.js +18 -0
  23. package/dist/browser/chat/chat-messages.js.map +1 -1
  24. package/dist/browser/chat/composer-document.js +19 -0
  25. package/dist/browser/chat/composer-document.js.map +1 -1
  26. package/dist/browser/chat/index.js.map +1 -1
  27. package/dist/browser/content/Calendar.js +39 -29
  28. package/dist/browser/content/Calendar.js.map +1 -1
  29. package/dist/browser/content/CalendarDayView.js +159 -165
  30. package/dist/browser/content/CalendarDayView.js.map +1 -1
  31. package/dist/browser/content/Chart.js +8 -0
  32. package/dist/browser/content/Chart.js.map +1 -1
  33. package/dist/browser/content/FileGrid.js +231 -9
  34. package/dist/browser/content/FileGrid.js.map +1 -1
  35. package/dist/browser/content/FileTypeIcon.js +15 -0
  36. package/dist/browser/content/FileTypeIcon.js.map +1 -1
  37. package/dist/browser/content/FileView.js +11 -4
  38. package/dist/browser/content/FileView.js.map +1 -1
  39. package/dist/browser/content/MessageRow.js +627 -343
  40. package/dist/browser/content/MessageRow.js.map +1 -1
  41. package/dist/browser/content/ReactionBar.js +20 -1
  42. package/dist/browser/content/ReactionBar.js.map +1 -1
  43. package/dist/browser/content/calendar-day-scroll.js +4 -3
  44. package/dist/browser/content/calendar-day-scroll.js.map +1 -1
  45. package/dist/browser/content/chart-bar.js +476 -0
  46. package/dist/browser/content/chart-bar.js.map +1 -0
  47. package/dist/browser/content/file-list-messages.js +52 -0
  48. package/dist/browser/content/file-list-messages.js.map +1 -0
  49. package/dist/browser/content/index.js +2 -2
  50. package/dist/browser/content/index.js.map +1 -1
  51. package/dist/browser/feedback/Tooltip.js +31 -14
  52. package/dist/browser/feedback/Tooltip.js.map +1 -1
  53. package/dist/browser/feedback/dialog-core.js +6 -0
  54. package/dist/browser/feedback/dialog-core.js.map +1 -1
  55. package/dist/browser/inputs/ChoiceList.js +178 -0
  56. package/dist/browser/inputs/ChoiceList.js.map +1 -0
  57. package/dist/browser/inputs/ChoiceSlider.js +314 -0
  58. package/dist/browser/inputs/ChoiceSlider.js.map +1 -0
  59. package/dist/browser/inputs/ChoiceTiles.js +135 -0
  60. package/dist/browser/inputs/ChoiceTiles.js.map +1 -0
  61. package/dist/browser/inputs/ColorChoices.js +120 -0
  62. package/dist/browser/inputs/ColorChoices.js.map +1 -0
  63. package/dist/browser/inputs/QrScanner.js +95 -13
  64. package/dist/browser/inputs/QrScanner.js.map +1 -1
  65. package/dist/browser/inputs/TextInput.js +19 -14
  66. package/dist/browser/inputs/TextInput.js.map +1 -1
  67. package/dist/browser/inputs/index.js +4 -0
  68. package/dist/browser/inputs/index.js.map +1 -1
  69. package/dist/browser/inputs/qr-messages.js +2 -0
  70. package/dist/browser/inputs/qr-messages.js.map +1 -1
  71. package/dist/browser/internal/radio-keys.js +13 -0
  72. package/dist/browser/internal/radio-keys.js.map +1 -0
  73. package/dist/browser/intl/shortcut-messages.js +4 -0
  74. package/dist/browser/intl/shortcut-messages.js.map +1 -1
  75. package/dist/browser/intl/shortcut.js +4 -0
  76. package/dist/browser/intl/shortcut.js.map +1 -1
  77. package/dist/browser/layout/AnchoredPopover.js +180 -0
  78. package/dist/browser/layout/AnchoredPopover.js.map +1 -0
  79. package/dist/browser/layout/AppWorkspace.js +684 -532
  80. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  81. package/dist/browser/layout/DetailPanel.js +443 -333
  82. package/dist/browser/layout/DetailPanel.js.map +1 -1
  83. package/dist/browser/layout/MobileShell.js +231 -42
  84. package/dist/browser/layout/MobileShell.js.map +1 -1
  85. package/dist/browser/layout/Settings.js +283 -175
  86. package/dist/browser/layout/Settings.js.map +1 -1
  87. package/dist/browser/layout/SidebarRailHint.js +79 -0
  88. package/dist/browser/layout/SidebarRailHint.js.map +1 -0
  89. package/dist/browser/layout/SidebarSwitcher.js +79 -66
  90. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  91. package/dist/browser/layout/TabBar.js +18 -4
  92. package/dist/browser/layout/TabBar.js.map +1 -1
  93. package/dist/browser/layout/app-workspace-controller.js +11 -4
  94. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  95. package/dist/browser/layout/detail-panel-messages.js +4 -2
  96. package/dist/browser/layout/detail-panel-messages.js.map +1 -1
  97. package/dist/browser/layout/index.js +3 -1
  98. package/dist/browser/layout/index.js.map +1 -1
  99. package/dist/browser/layout/scroll-fade.js +32 -5
  100. package/dist/browser/layout/scroll-fade.js.map +1 -1
  101. package/dist/browser/layout/settings-messages.js +26 -2
  102. package/dist/browser/layout/settings-messages.js.map +1 -1
  103. package/dist/browser/surfaces/Avatar.js +2 -14
  104. package/dist/browser/surfaces/Avatar.js.map +1 -1
  105. package/dist/browser/surfaces/DotStrip.js +70 -0
  106. package/dist/browser/surfaces/DotStrip.js.map +1 -0
  107. package/dist/browser/surfaces/NoticeCard.js +46 -30
  108. package/dist/browser/surfaces/NoticeCard.js.map +1 -1
  109. package/dist/browser/surfaces/ProgressRing.js +3 -0
  110. package/dist/browser/surfaces/ProgressRing.js.map +1 -1
  111. package/dist/browser/surfaces/ResourceCard.js +125 -68
  112. package/dist/browser/surfaces/ResourceCard.js.map +1 -1
  113. package/dist/browser/surfaces/index.js +2 -0
  114. package/dist/browser/surfaces/index.js.map +1 -1
  115. package/dist/browser/surfaces/person-color.js +18 -0
  116. package/dist/browser/surfaces/person-color.js.map +1 -0
  117. package/dist/browser/surfaces/resource-messages.js +8 -4
  118. package/dist/browser/surfaces/resource-messages.js.map +1 -1
  119. package/dist/browser/widgets/Widget.js +3 -2
  120. package/dist/browser/widgets/Widget.js.map +1 -1
  121. package/dist/ssr/actions/ContextMenu.js +9 -0
  122. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  123. package/dist/ssr/actions/Dropdown.js +65 -31
  124. package/dist/ssr/actions/Dropdown.js.map +1 -1
  125. package/dist/ssr/actions/FilterChip.js +67 -16
  126. package/dist/ssr/actions/FilterChip.js.map +1 -1
  127. package/dist/ssr/actions/SelectionToolbar.js +104 -0
  128. package/dist/ssr/actions/SelectionToolbar.js.map +1 -0
  129. package/dist/ssr/actions/filter-messages.js +26 -2
  130. package/dist/ssr/actions/filter-messages.js.map +1 -1
  131. package/dist/ssr/actions/index.js +1 -0
  132. package/dist/ssr/actions/index.js.map +1 -1
  133. package/dist/ssr/actions/menu-rows.js +23 -3
  134. package/dist/ssr/actions/menu-rows.js.map +1 -1
  135. package/dist/ssr/actions/menu-sheet.js +2 -7
  136. package/dist/ssr/actions/menu-sheet.js.map +1 -1
  137. package/dist/ssr/charts.js +6 -0
  138. package/dist/ssr/charts.js.map +1 -0
  139. package/dist/ssr/chat/ChatComposer.js +184 -76
  140. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  141. package/dist/ssr/chat/chat-messages.js +18 -0
  142. package/dist/ssr/chat/chat-messages.js.map +1 -1
  143. package/dist/ssr/chat/composer-document.js +19 -0
  144. package/dist/ssr/chat/composer-document.js.map +1 -1
  145. package/dist/ssr/chat/index.js.map +1 -1
  146. package/dist/ssr/content/Calendar.js +40 -31
  147. package/dist/ssr/content/Calendar.js.map +1 -1
  148. package/dist/ssr/content/CalendarDayView.js +40 -48
  149. package/dist/ssr/content/CalendarDayView.js.map +1 -1
  150. package/dist/ssr/content/Chart.js +8 -0
  151. package/dist/ssr/content/Chart.js.map +1 -1
  152. package/dist/ssr/content/FileGrid.js +132 -5
  153. package/dist/ssr/content/FileGrid.js.map +1 -1
  154. package/dist/ssr/content/FileTypeIcon.js +15 -0
  155. package/dist/ssr/content/FileTypeIcon.js.map +1 -1
  156. package/dist/ssr/content/FileView.js +11 -4
  157. package/dist/ssr/content/FileView.js.map +1 -1
  158. package/dist/ssr/content/MessageRow.js +274 -91
  159. package/dist/ssr/content/MessageRow.js.map +1 -1
  160. package/dist/ssr/content/ReactionBar.js +20 -1
  161. package/dist/ssr/content/ReactionBar.js.map +1 -1
  162. package/dist/ssr/content/calendar-day-scroll.js +4 -3
  163. package/dist/ssr/content/calendar-day-scroll.js.map +1 -1
  164. package/dist/ssr/content/chart-bar.js +476 -0
  165. package/dist/ssr/content/chart-bar.js.map +1 -0
  166. package/dist/ssr/content/file-list-messages.js +52 -0
  167. package/dist/ssr/content/file-list-messages.js.map +1 -0
  168. package/dist/ssr/content/index.js +2 -2
  169. package/dist/ssr/content/index.js.map +1 -1
  170. package/dist/ssr/feedback/Tooltip.js +31 -14
  171. package/dist/ssr/feedback/Tooltip.js.map +1 -1
  172. package/dist/ssr/feedback/dialog-core.js +6 -0
  173. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  174. package/dist/ssr/inputs/ChoiceList.js +95 -0
  175. package/dist/ssr/inputs/ChoiceList.js.map +1 -0
  176. package/dist/ssr/inputs/ChoiceSlider.js +191 -0
  177. package/dist/ssr/inputs/ChoiceSlider.js.map +1 -0
  178. package/dist/ssr/inputs/ChoiceTiles.js +61 -0
  179. package/dist/ssr/inputs/ChoiceTiles.js.map +1 -0
  180. package/dist/ssr/inputs/ColorChoices.js +60 -0
  181. package/dist/ssr/inputs/ColorChoices.js.map +1 -0
  182. package/dist/ssr/inputs/QrScanner.js +89 -10
  183. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  184. package/dist/ssr/inputs/TextInput.js +17 -2
  185. package/dist/ssr/inputs/TextInput.js.map +1 -1
  186. package/dist/ssr/inputs/index.js +4 -0
  187. package/dist/ssr/inputs/index.js.map +1 -1
  188. package/dist/ssr/inputs/qr-messages.js +2 -0
  189. package/dist/ssr/inputs/qr-messages.js.map +1 -1
  190. package/dist/ssr/internal/radio-keys.js +13 -0
  191. package/dist/ssr/internal/radio-keys.js.map +1 -0
  192. package/dist/ssr/intl/shortcut-messages.js +4 -0
  193. package/dist/ssr/intl/shortcut-messages.js.map +1 -1
  194. package/dist/ssr/intl/shortcut.js +4 -0
  195. package/dist/ssr/intl/shortcut.js.map +1 -1
  196. package/dist/ssr/layout/AnchoredPopover.js +142 -0
  197. package/dist/ssr/layout/AnchoredPopover.js.map +1 -0
  198. package/dist/ssr/layout/AppWorkspace.js +287 -141
  199. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  200. package/dist/ssr/layout/DetailPanel.js +181 -108
  201. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  202. package/dist/ssr/layout/MobileShell.js +118 -24
  203. package/dist/ssr/layout/MobileShell.js.map +1 -1
  204. package/dist/ssr/layout/Settings.js +122 -45
  205. package/dist/ssr/layout/Settings.js.map +1 -1
  206. package/dist/ssr/layout/SidebarRailHint.js +79 -0
  207. package/dist/ssr/layout/SidebarRailHint.js.map +1 -0
  208. package/dist/ssr/layout/SidebarSwitcher.js +13 -3
  209. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  210. package/dist/ssr/layout/TabBar.js +11 -3
  211. package/dist/ssr/layout/TabBar.js.map +1 -1
  212. package/dist/ssr/layout/app-workspace-controller.js +11 -4
  213. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  214. package/dist/ssr/layout/detail-panel-messages.js +4 -2
  215. package/dist/ssr/layout/detail-panel-messages.js.map +1 -1
  216. package/dist/ssr/layout/index.js +3 -1
  217. package/dist/ssr/layout/index.js.map +1 -1
  218. package/dist/ssr/layout/scroll-fade.js +32 -5
  219. package/dist/ssr/layout/scroll-fade.js.map +1 -1
  220. package/dist/ssr/layout/settings-messages.js +26 -2
  221. package/dist/ssr/layout/settings-messages.js.map +1 -1
  222. package/dist/ssr/surfaces/Avatar.js +2 -14
  223. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  224. package/dist/ssr/surfaces/DotStrip.js +31 -0
  225. package/dist/ssr/surfaces/DotStrip.js.map +1 -0
  226. package/dist/ssr/surfaces/NoticeCard.js +21 -12
  227. package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
  228. package/dist/ssr/surfaces/ProgressRing.js +3 -0
  229. package/dist/ssr/surfaces/ProgressRing.js.map +1 -1
  230. package/dist/ssr/surfaces/ResourceCard.js +40 -15
  231. package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
  232. package/dist/ssr/surfaces/index.js +2 -0
  233. package/dist/ssr/surfaces/index.js.map +1 -1
  234. package/dist/ssr/surfaces/person-color.js +18 -0
  235. package/dist/ssr/surfaces/person-color.js.map +1 -0
  236. package/dist/ssr/surfaces/resource-messages.js +8 -4
  237. package/dist/ssr/surfaces/resource-messages.js.map +1 -1
  238. package/dist/ssr/widgets/Widget.js +3 -2
  239. package/dist/ssr/widgets/Widget.js.map +1 -1
  240. package/dist/styles.css +1 -1
  241. package/dist/types/actions/ContextMenu.d.ts +5 -0
  242. package/dist/types/actions/Dropdown.d.ts +19 -0
  243. package/dist/types/actions/FilterChip.d.ts +11 -0
  244. package/dist/types/actions/SelectionToolbar.d.ts +38 -0
  245. package/dist/types/actions/filter-messages.d.ts +12 -0
  246. package/dist/types/actions/index.d.ts +2 -0
  247. package/dist/types/actions/menu-rows.d.ts +7 -2
  248. package/dist/types/charts.d.ts +5 -0
  249. package/dist/types/chat/ChatComposer.d.ts +28 -0
  250. package/dist/types/chat/chat-messages.d.ts +9 -0
  251. package/dist/types/chat/composer-document.d.ts +5 -0
  252. package/dist/types/chat/index.d.ts +1 -1
  253. package/dist/types/content/Calendar.d.ts +7 -0
  254. package/dist/types/content/Chart.d.ts +2 -1
  255. package/dist/types/content/FileGrid.d.ts +43 -3
  256. package/dist/types/content/FileTypeIcon.d.ts +10 -0
  257. package/dist/types/content/FileView.d.ts +5 -1
  258. package/dist/types/content/MessageRow.d.ts +66 -2
  259. package/dist/types/content/calendar-day-scroll.d.ts +2 -1
  260. package/dist/types/content/chart-bar.d.ts +60 -0
  261. package/dist/types/content/file-list-messages.d.ts +24 -0
  262. package/dist/types/content/index.d.ts +4 -4
  263. package/dist/types/feedback/Tooltip.d.ts +8 -2
  264. package/dist/types/feedback/dialog-core.d.ts +3 -0
  265. package/dist/types/inputs/ChoiceList.d.ts +28 -0
  266. package/dist/types/inputs/ChoiceSlider.d.ts +36 -0
  267. package/dist/types/inputs/ChoiceTiles.d.ts +25 -0
  268. package/dist/types/inputs/ColorChoices.d.ts +19 -0
  269. package/dist/types/inputs/index.d.ts +8 -0
  270. package/dist/types/inputs/qr-messages.d.ts +1 -0
  271. package/dist/types/internal/radio-keys.d.ts +5 -0
  272. package/dist/types/intl/shortcut-messages.d.ts +2 -0
  273. package/dist/types/layout/AnchoredPopover.d.ts +31 -0
  274. package/dist/types/layout/AppWorkspace.d.ts +12 -0
  275. package/dist/types/layout/DetailPanel.d.ts +17 -0
  276. package/dist/types/layout/MobileShell.d.ts +55 -5
  277. package/dist/types/layout/Settings.d.ts +22 -0
  278. package/dist/types/layout/SidebarRailHint.d.ts +26 -0
  279. package/dist/types/layout/TabBar.d.ts +5 -0
  280. package/dist/types/layout/detail-panel-messages.d.ts +1 -0
  281. package/dist/types/layout/index.d.ts +5 -3
  282. package/dist/types/layout/scroll-fade.d.ts +5 -0
  283. package/dist/types/layout/settings-messages.d.ts +12 -0
  284. package/dist/types/surfaces/DotStrip.d.ts +22 -0
  285. package/dist/types/surfaces/NoticeCard.d.ts +3 -0
  286. package/dist/types/surfaces/ProgressRing.d.ts +2 -1
  287. package/dist/types/surfaces/ResourceCard.d.ts +9 -0
  288. package/dist/types/surfaces/index.d.ts +4 -1
  289. package/dist/types/surfaces/person-color.d.ts +10 -0
  290. package/dist/types/surfaces/resource-messages.d.ts +2 -0
  291. package/dist/types/widgets/Widget.d.ts +3 -2
  292. package/package.json +7 -2
@@ -8,35 +8,35 @@ var _tmpl$ = ["<span", " style=\"", "\">", "</span>"],
8
8
  _tmpl$2 = ["<span", " style=\"", "\" role=\"img\"", ">", "</span>"],
9
9
  _tmpl$3 = ["<a", " style=\"", "\"", " target=\"_blank\" rel=\"noopener noreferrer\"", ">", "</a>"],
10
10
  _tmpl$4 = ["<button type=\"button\"", " style=\"", "\"", ">", "</button>"],
11
- _tmpl$5 = ["<span class=\"k2b-message-row__name\">", "</span>"],
12
- _tmpl$6 = ["<span class=\"k2b-message-row__badge\">", "</span>"],
13
- _tmpl$7 = ["<time class=\"k2b-message-row__time\"", ">", "</time>"],
14
- _tmpl$8 = "<i class=\"ti ti-arrow-back-up\" aria-hidden=\"true\"></i>",
15
- _tmpl$9 = ["<span class=\"k2b-message-row__quote-text\"><span class=\"k2b-sr-only\">", " </span><span class=\"k2b-message-row__quote-author\">", "</span> ", "</span>"],
16
- _tmpl$0 = ["<img", " alt", " loading=\"lazy\" decoding=\"async\">"],
17
- _tmpl$1 = "<span class=\"k2b-message-row__media-play\" aria-hidden=\"true\"><i class=\"ti ti-player-play\"></i></span>",
18
- _tmpl$10 = ["<span class=\"k2b-message-row__media-duration\" aria-hidden=\"true\">", "</span>"],
19
- _tmpl$11 = ["<span class=\"k2b-message-row__media-more\" aria-hidden=\"true\">+", "</span>"],
20
- _tmpl$12 = ["<span class=\"k2b-message-row__avatar\" aria-hidden=\"true\">", "</span>"],
21
- _tmpl$13 = ["<div class=\"k2b-message-row__gutter\">", "</div>"],
22
- _tmpl$14 = ["<div class=\"k2b-message-row__meta\">", "</div>"],
23
- _tmpl$15 = ["<div class=\"k2b-message-row__marker\"><i class=\"ti ti-arrow-forward-up\" aria-hidden=\"true\"></i><span>", "</span></div>"],
24
- _tmpl$16 = ["<div", " class=\"k2b-content-markdown k2b-message-row__text\" data-heading-scale=\"compact\"", ">", "</div>"],
25
- _tmpl$17 = ["<span class=\"k2b-message-row__edited\">", "</span>"],
26
- _tmpl$18 = ["<div class=\"k2b-message-row__more-line\">", "", "</div>"],
27
- _tmpl$19 = ["<div class=\"k2b-message-row__bubble\"", ">", "</div>"],
28
- _tmpl$20 = ["<div class=\"k2b-message-row__marker\"><i class=\"ti ti-pencil\" aria-hidden=\"true\"></i><span class=\"k2b-message-row__edited\">", "</span></div>"],
29
- _tmpl$21 = ["<div class=\"k2b-message-row__media\" role=\"group\"", " style=\"", "\">", "</div>"],
30
- _tmpl$22 = ["<div class=\"k2b-message-row__files\">", "</div>"],
31
- _tmpl$23 = ["<div class=\"k2b-message-row__slot\" data-gesture-ignore>", "</div>"],
32
- _tmpl$24 = ["<div class=\"k2b-message-row__line\">", "</div>"],
33
- _tmpl$25 = ["<div class=\"k2b-message-row__footer\">", "", "</div>"],
34
- _tmpl$26 = ["<div class=\"k2b-message-row__actions\" role=\"group\"", ">", "</div>"],
35
- _tmpl$27 = ["<div", ">", "<div class=\"k2b-message-row__body\">", "", "", "", "", "", "", "", "", "", "", "</div>", "</div>"],
36
- _tmpl$28 = ["<span class=\"k2b-sr-only\">", ", ", ": </span>"],
37
- _tmpl$29 = ["<div class=\"k2b-message-row__meta\"><span class=\"k2b-sr-only\">", ", </span><time class=\"k2b-message-row__time\"", ">", "</time></div>"],
38
- _tmpl$30 = ["<div class=\"k2b-message-row__quote\">", "</div>"],
39
- _tmpl$31 = ["<button type=\"button\" class=\"k2b-message-row__quote\">", "</button>"],
11
+ _tmpl$5 = "<i class=\"ti ti-dots\" aria-hidden=\"true\"></i>",
12
+ _tmpl$6 = ["<span class=\"k2b-message-row__name\">", "</span>"],
13
+ _tmpl$7 = ["<span class=\"k2b-message-row__badge\">", "</span>"],
14
+ _tmpl$8 = ["<time class=\"k2b-message-row__time\"", ">", "</time>"],
15
+ _tmpl$9 = ["<span class=\"k2b-message-row__quote-author\"><span class=\"k2b-sr-only\">", " </span>", "</span>"],
16
+ _tmpl$0 = ["<span class=\"k2b-message-row__quote-text\">", "</span>"],
17
+ _tmpl$1 = ["<div class=\"k2b-message-row__quote\">", "</div>"],
18
+ _tmpl$10 = ["<button type=\"button\" class=\"k2b-message-row__quote\">", "</button>"],
19
+ _tmpl$11 = ["<img", " alt", " loading=\"lazy\" decoding=\"async\">"],
20
+ _tmpl$12 = "<span class=\"k2b-message-row__media-play\" aria-hidden=\"true\"><i class=\"ti ti-player-play\"></i></span>",
21
+ _tmpl$13 = ["<span class=\"k2b-message-row__media-duration\" aria-hidden=\"true\">", "</span>"],
22
+ _tmpl$14 = ["<span class=\"k2b-message-row__media-more\" aria-hidden=\"true\">+", "</span>"],
23
+ _tmpl$15 = ["<span class=\"k2b-message-row__avatar\" aria-hidden=\"true\">", "</span>"],
24
+ _tmpl$16 = ["<div class=\"k2b-message-row__gutter\">", "</div>"],
25
+ _tmpl$17 = ["<div class=\"k2b-message-row__meta\">", "</div>"],
26
+ _tmpl$18 = ["<div class=\"k2b-message-row__marker\"><i class=\"ti ti-arrow-forward-up\" aria-hidden=\"true\"></i><span>", "</span></div>"],
27
+ _tmpl$19 = ["<div", " class=\"k2b-content-markdown k2b-message-row__text\" data-heading-scale=\"compact\"", ">", "</div>"],
28
+ _tmpl$20 = ["<span class=\"k2b-message-row__edited\">", "</span>"],
29
+ _tmpl$21 = ["<div class=\"k2b-message-row__more-line\">", "", "</div>"],
30
+ _tmpl$22 = ["<div class=\"k2b-message-row__bubble\"", ">", "", "", "</div>"],
31
+ _tmpl$23 = ["<div class=\"k2b-message-row__marker\"><i class=\"ti ti-pencil\" aria-hidden=\"true\"></i><span class=\"k2b-message-row__edited\">", "</span></div>"],
32
+ _tmpl$24 = ["<div class=\"k2b-message-row__media\" role=\"group\"", " style=\"", "\">", "</div>"],
33
+ _tmpl$25 = ["<div class=\"k2b-message-row__files\">", "</div>"],
34
+ _tmpl$26 = ["<div class=\"k2b-message-row__slot\" data-gesture-ignore>", "</div>"],
35
+ _tmpl$27 = ["<div class=\"k2b-message-row__line\">", "</div>"],
36
+ _tmpl$28 = ["<div class=\"k2b-message-row__footer\">", "", "</div>"],
37
+ _tmpl$29 = ["<div", ">", "<div class=\"k2b-message-row__body\">", "", "", "", "", "", "", "", "", "", "", "", "", "</div></div>"],
38
+ _tmpl$30 = ["<span class=\"k2b-sr-only\">", ", ", ": </span>"],
39
+ _tmpl$31 = ["<div class=\"k2b-message-row__meta\"><span class=\"k2b-sr-only\">", ", </span><time class=\"k2b-message-row__time\"", ">", "</time></div>"],
40
40
  _tmpl$32 = ["<span class=\"k2b-message-row__deleted\"><i class=\"ti ti-message-off\" aria-hidden=\"true\"></i>", "</span>"],
41
41
  _tmpl$33 = "<span class=\"k2b-message-row__writing\"><span class=\"k2b-chat-progress-dots\" aria-hidden=\"true\"><span></span><span></span><span></span></span></span>",
42
42
  _tmpl$34 = ["<span class=\"k2b-message-row__file-icon\" aria-hidden=\"true\"><i", "></i></span>"],
@@ -54,18 +54,27 @@ var _tmpl$ = ["<span", " style=\"", "\">", "</span>"],
54
54
  _tmpl$46 = ["<span class=\"k2b-message-row__receipt\">", "</span>"],
55
55
  _tmpl$47 = "<i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\"></i>",
56
56
  _tmpl$48 = ["<span class=\"k2b-message-row__line-text\">", "</span>"],
57
- _tmpl$49 = ["<i", " aria-hidden=\"true\"></i>"],
58
- _tmpl$50 = ["<time", ">", "</time>"],
59
- _tmpl$51 = ["<div", ">", "<span>", "</span>", "</div>"];
57
+ _tmpl$49 = ["<span class=\"k2b-message-row__origin\">", "", "</span>"],
58
+ _tmpl$50 = ["<i", " aria-hidden=\"true\"></i>"],
59
+ _tmpl$51 = ["<button type=\"button\" class=\"k2b-message-row__origin\"", ">", "", "</button>"],
60
+ _tmpl$52 = ["<time", ">", "</time>"],
61
+ _tmpl$53 = ["<div", "><i", " aria-hidden=\"true\"></i>", "", "", "</div>"],
62
+ _tmpl$54 = ["<span class=\"k2b-message-event-row__text\">", "</span>"],
63
+ _tmpl$55 = ["<a class=\"k2b-message-event-row__text k2b-message-event-row__link\"", ">", "</a>"],
64
+ _tmpl$56 = ["<button type=\"button\"", "><i class=\"ti ti-history\" aria-hidden=\"true\"></i><span class=\"k2b-message-event-row__text\">", "</span>", "<i", " aria-hidden=\"true\"></i></button>"],
65
+ _tmpl$57 = ["<div", ">", "<span>", "</span>", "</div>"];
60
66
  import { fileIcons } from "@k2b/stdlib";
61
67
  import { createMemo, createSignal, createUniqueId, For, onCleanup, Show } from "solid-js";
62
- import { Button, IconButton } from "../actions/Button";
68
+ import { Button } from "../actions/Button";
63
69
  import { copyText } from "../actions/CopyButton";
70
+ import { Dropdown } from "../actions/Dropdown";
71
+ import { GestureMenu } from "../actions/GestureMenu";
64
72
  import { useChatMessages } from "../chat/chat-messages";
65
73
  import { announce } from "../feedback/announce";
66
74
  import { useLocale } from "../intl/locale";
67
75
  import { useUiMessages } from "../intl/messages";
68
76
  import { Avatar } from "../surfaces/Avatar";
77
+ import { Kbd } from "./Kbd";
69
78
  import { createSafeMarked, createSafeRenderer, escapeHtml } from "./MarkdownView";
70
79
  import { ReactionBar } from "./ReactionBar";
71
80
 
@@ -82,6 +91,8 @@ const LINE_CHARS = 100;
82
91
  /** Lines at the bottom of a collapsed message that fade out, as `.k2b-message-row__text[data-collapsed]` draws them. */
83
92
  const FADE_LINES = 2;
84
93
  const COPIED_MS = 2_000;
94
+ /** Alt+click on these keeps its own meaning, such as downloading a link. */
95
+ const ALT_CLICK_IGNORE = "a[href], button, input, textarea, select, summary, label, audio, video, [role='button'], [role='link']";
85
96
  /** Links in messages may only use these schemes; other links show as their text. */
86
97
  const LINK_PROTOCOLS = ["https:", "http:", "mailto:"];
87
98
  /** Attachments open and load only from these schemes or from a relative URL. */
@@ -99,6 +110,8 @@ const MEDIA_RATIO_MAX = 3;
99
110
 
100
111
  /** Reaction labels are read by screen readers and shown in the names hint. */
101
112
 
113
+ /** Where a message belongs, shown as a small chip under it, for example its thread in a timeline of several. */
114
+
102
115
  const timestamp = value => value instanceof Date ? value.getTime() : new Date(value).getTime();
103
116
 
104
117
  /**
@@ -323,15 +336,91 @@ export function MessageRow(props) {
323
336
  const fade = text.getBoundingClientRect().bottom - FADE_LINES * Number.parseFloat(getComputedStyle(text).lineHeight);
324
337
  if (event.target.getBoundingClientRect().bottom > fade) setExpanded(true);
325
338
  };
326
- const header = () => [_$ssr(_tmpl$5, _$escape(props.author.name)), _$createComponent(Show, {
339
+
340
+ // The same entries serve "…", right-click, the keyboard, and a long press. Alt+click and keys show at the entry's end.
341
+ // Each menu gets its own entries: a rendered shortcut is a DOM node and can live in only one menu.
342
+ const entries = () => (props.actions ?? []).map(entry => ({
343
+ label: entry.label,
344
+ icon: entry.icon,
345
+ description: entry.description,
346
+ disabled: entry.disabled,
347
+ variant: entry.variant,
348
+ gesture: entry.gesture,
349
+ immediate: entry.immediate,
350
+ trailing: entry.altClick ? _$createComponent(Kbd, {
351
+ keys: "alt+click"
352
+ }) : entry.shortcut ? _$createComponent(Kbd, {
353
+ get keys() {
354
+ return entry.shortcut;
355
+ }
356
+ }) : undefined,
357
+ action: () => entry.onSelect()
358
+ }));
359
+ const menuItems = createMemo(entries);
360
+ const gestureItems = createMemo(entries);
361
+ const hasMenu = () => (props.actions?.length ?? 0) > 0;
362
+
363
+ // Alt+click (Option+click) on the message, not on a link or control inside it, runs the entry that asks for it.
364
+ const altClick = event => {
365
+ if (!event.altKey || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey) return;
366
+ const entry = props.actions?.find(action => action.altClick && !action.disabled);
367
+ const target = event.target instanceof Element ? event.target : null;
368
+ if (!entry || target?.closest(ALT_CLICK_IGNORE)) return;
369
+ event.preventDefault();
370
+ entry.onSelect();
371
+ };
372
+ const more = () => _$createComponent(Dropdown.Root, {
373
+ get items() {
374
+ return menuItems();
375
+ },
376
+ get label() {
377
+ return chatMessages().messageActions;
378
+ },
379
+ "class": "k2b-message-row__menu-root",
380
+ get position() {
381
+ return props.own ? "bottom-right" : "bottom-left";
382
+ },
383
+ phone: "sheet",
384
+ get children() {
385
+ return _$createComponent(Dropdown.Trigger, {
386
+ iconOnly: true,
387
+ variant: "ghost",
388
+ size: "sm",
389
+ get label() {
390
+ return chatMessages().messageActions;
391
+ },
392
+ "class": "k2b-message-row__menu",
393
+ get children() {
394
+ return _$ssr(_tmpl$5);
395
+ }
396
+ });
397
+ }
398
+ });
399
+ const header = () => [_$ssr(_tmpl$6, _$escape(props.author.name)), _$createComponent(Show, {
327
400
  get when() {
328
401
  return props.badge;
329
402
  },
330
403
  get children() {
331
- return _$ssr(_tmpl$6, _$escape(props.badge));
404
+ return _$ssr(_tmpl$7, _$escape(props.badge));
332
405
  }
333
- }), _$ssr(_tmpl$7, _$ssrAttribute("datetime", _$escape(dateTimeOf(props.dateTime), true), false), _$escape(props.time))];
334
- const quote = value => [_$ssr(_tmpl$8), _$ssr(_tmpl$9, _$escape(chatMessages().messageReplyTo), _$escape(value.author), _$escape(value.text))];
406
+ }), _$ssr(_tmpl$8, _$ssrAttribute("datetime", _$escape(dateTimeOf(props.dateTime), true), false), _$escape(props.time))];
407
+ const quote = value => [_$ssr(_tmpl$9, _$escape(chatMessages().messageReplyTo), _$escape(value.author)), _$ssr(_tmpl$0, _$escape(value.text))];
408
+
409
+ /** The answered message on a quiet tint at the top of the bubble, or in its place without one. */
410
+ const quoteBlock = () => _$createComponent(Show, {
411
+ get when() {
412
+ return _$memo(() => !!content())() && props.quote;
413
+ },
414
+ children: value => _$createComponent(Show, {
415
+ get when() {
416
+ return value().onSelect;
417
+ },
418
+ get fallback() {
419
+ return _$ssr(_tmpl$1, _$escape(quote(value())));
420
+ },
421
+ children: select => _$ssr(_tmpl$10, _$escape(quote(value())))
422
+ })
423
+ });
335
424
 
336
425
  /** The picture's description, then that it is a video and how long, then how many more the grid hides. */
337
426
  const mediaLabel = (item, more) => [item.alt, item.kind === "video" ? [chatMessages().messageVideo, item.duration].filter(Boolean).join(" ") : "", more > 0 ? chatMessages().messageMoreAttachments({
@@ -356,17 +445,17 @@ export function MessageRow(props) {
356
445
  return item.href;
357
446
  },
358
447
  get children() {
359
- return [_$ssr(_tmpl$0, _$ssrAttribute("src", _$escape(attachmentUrl(item.src, true), true), false), _$ssrAttribute("width", item.width > 0 ? _$escape(item.width, true) : _$escape(undefined, true), false) + _$ssrAttribute("height", item.height > 0 ? _$escape(item.height, true) : _$escape(undefined, true), false)), _$createComponent(Show, {
448
+ return [_$ssr(_tmpl$11, _$ssrAttribute("src", _$escape(attachmentUrl(item.src, true), true), false), _$ssrAttribute("width", item.width > 0 ? _$escape(item.width, true) : _$escape(undefined, true), false) + _$ssrAttribute("height", item.height > 0 ? _$escape(item.height, true) : _$escape(undefined, true), false)), _$createComponent(Show, {
360
449
  get when() {
361
450
  return item.kind === "video";
362
451
  },
363
452
  get children() {
364
- return [_$ssr(_tmpl$1), _$createComponent(Show, {
453
+ return [_$ssr(_tmpl$12), _$createComponent(Show, {
365
454
  get when() {
366
455
  return item.duration;
367
456
  },
368
457
  get children() {
369
- return _$ssr(_tmpl$10, _$escape(item.duration));
458
+ return _$ssr(_tmpl$13, _$escape(item.duration));
370
459
  }
371
460
  })];
372
461
  }
@@ -375,23 +464,24 @@ export function MessageRow(props) {
375
464
  return more() > 0;
376
465
  },
377
466
  get children() {
378
- return _$ssr(_tmpl$11, _$escape(more()));
467
+ return _$ssr(_tmpl$14, _$escape(more()));
379
468
  }
380
469
  })];
381
470
  }
382
471
  });
383
472
  };
384
- return _$ssr(_tmpl$27, _$ssrAttribute("class", props.class ? `k2b-message-row ${_$escape(props.class, true)}` : "k2b-message-row", false) + _$ssrAttribute("data-own", props.own ? "" : _$escape(undefined, true), false) + _$ssrAttribute("data-group-start", groupStart() ? "" : _$escape(undefined, true), false) + _$ssrAttribute("data-status", _$escape(props.status, true), false) + _$ssrAttribute("data-media", media().length > 0 ? "" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
473
+ const row = // biome-ignore lint/a11y/noStaticElementInteractions lint/a11y/useKeyWithClickEvents: Alt+click is a pointer shortcut for a menu entry that the keyboard reaches through "…".
474
+ _$ssr(_tmpl$29, _$ssrAttribute("class", props.class ? `k2b-message-row ${_$escape(props.class, true)}` : "k2b-message-row", false) + _$ssrAttribute("data-own", props.own ? "" : _$escape(undefined, true), false) + _$ssrAttribute("data-group-start", groupStart() ? "" : _$escape(undefined, true), false) + _$ssrAttribute("data-status", _$escape(props.status, true), false) + _$ssrAttribute("data-media", media().length > 0 ? "" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
385
475
  get when() {
386
476
  return !props.own;
387
477
  },
388
478
  get children() {
389
- return _$ssr(_tmpl$13, _$escape(_$createComponent(Show, {
479
+ return _$ssr(_tmpl$16, _$escape(_$createComponent(Show, {
390
480
  get when() {
391
481
  return groupStart();
392
482
  },
393
483
  get children() {
394
- return _$ssr(_tmpl$12, _$escape(_$createComponent(Avatar, {
484
+ return _$ssr(_tmpl$15, _$escape(_$createComponent(Avatar, {
395
485
  get name() {
396
486
  return props.author.name;
397
487
  },
@@ -411,7 +501,7 @@ export function MessageRow(props) {
411
501
  return groupStart();
412
502
  },
413
503
  get fallback() {
414
- return _$ssr(_tmpl$28, _$escape(props.author.name), _$escape(props.time));
504
+ return _$ssr(_tmpl$30, _$escape(props.author.name), _$escape(props.time));
415
505
  },
416
506
  get children() {
417
507
  return _$createComponent(Show, {
@@ -419,10 +509,10 @@ export function MessageRow(props) {
419
509
  return !props.own;
420
510
  },
421
511
  get fallback() {
422
- return _$ssr(_tmpl$29, _$escape(props.author.name), _$ssrAttribute("datetime", _$escape(dateTimeOf(props.dateTime), true), false), _$escape(props.time));
512
+ return _$ssr(_tmpl$31, _$escape(props.author.name), _$ssrAttribute("datetime", _$escape(dateTimeOf(props.dateTime), true), false), _$escape(props.time));
423
513
  },
424
514
  get children() {
425
- return _$ssr(_tmpl$14, _$escape(header()));
515
+ return _$ssr(_tmpl$17, _$escape(header()));
426
516
  }
427
517
  });
428
518
  }
@@ -431,27 +521,21 @@ export function MessageRow(props) {
431
521
  return _$memo(() => !!content())() && props.forwarded;
432
522
  },
433
523
  get children() {
434
- return _$ssr(_tmpl$15, _$escape(chatMessages().messageForwarded));
524
+ return _$ssr(_tmpl$18, _$escape(chatMessages().messageForwarded));
435
525
  }
436
526
  })), _$escape(_$createComponent(Show, {
437
527
  get when() {
438
- return _$memo(() => !!content())() && props.quote;
528
+ return !hasBubble();
439
529
  },
440
- children: value => _$createComponent(Show, {
441
- get when() {
442
- return value().onSelect;
443
- },
444
- get fallback() {
445
- return _$ssr(_tmpl$30, _$escape(quote(value())));
446
- },
447
- children: select => _$ssr(_tmpl$31, _$escape(quote(value())))
448
- })
530
+ get children() {
531
+ return quoteBlock();
532
+ }
449
533
  })), _$escape(_$createComponent(Show, {
450
534
  get when() {
451
535
  return hasBubble();
452
536
  },
453
537
  get children() {
454
- return _$ssr(_tmpl$19, _$ssrAttribute("data-deleted", props.deleted ? "" : _$escape(undefined, true), false) + _$ssrAttribute("aria-busy", props.progress && !props.deleted ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
538
+ return _$ssr(_tmpl$22, _$ssrAttribute("data-deleted", props.deleted ? "" : _$escape(undefined, true), false) + _$ssrAttribute("aria-busy", props.progress && !props.deleted ? "true" : _$escape(undefined, true), false), _$escape(quoteBlock()), _$escape(_$createComponent(Show, {
455
539
  get when() {
456
540
  return !props.deleted;
457
541
  },
@@ -467,12 +551,12 @@ export function MessageRow(props) {
467
551
  return _$ssr(_tmpl$33);
468
552
  },
469
553
  get children() {
470
- return [_$ssr(_tmpl$16, _$ssrAttribute("id", _$escape(textId, true), false), _$ssrAttribute("data-collapsed", collapsed() ? "" : _$escape(undefined, true), false), rendered().html), _$createComponent(Show, {
554
+ return [_$ssr(_tmpl$19, _$ssrAttribute("id", _$escape(textId, true), false), _$ssrAttribute("data-collapsed", collapsed() ? "" : _$escape(undefined, true), false), rendered().html), _$createComponent(Show, {
471
555
  get when() {
472
556
  return collapsible();
473
557
  },
474
558
  get children() {
475
- return _$ssr(_tmpl$18, _$escape(_$createComponent(Button, {
559
+ return _$ssr(_tmpl$21, _$escape(_$createComponent(Button, {
476
560
  variant: "text",
477
561
  size: "xs",
478
562
  "class": "k2b-message-row__more",
@@ -489,7 +573,7 @@ export function MessageRow(props) {
489
573
  return props.edited;
490
574
  },
491
575
  get children() {
492
- return _$ssr(_tmpl$17, _$escape(chatMessages().messageEdited));
576
+ return _$ssr(_tmpl$20, _$escape(chatMessages().messageEdited));
493
577
  }
494
578
  })));
495
579
  }
@@ -497,21 +581,35 @@ export function MessageRow(props) {
497
581
  }
498
582
  });
499
583
  }
584
+ })), _$escape(_$createComponent(Show, {
585
+ get when() {
586
+ return hasMenu();
587
+ },
588
+ get children() {
589
+ return more();
590
+ }
500
591
  })));
501
592
  }
593
+ })), _$escape(_$createComponent(Show, {
594
+ get when() {
595
+ return _$memo(() => !!hasMenu())() && !hasBubble();
596
+ },
597
+ get children() {
598
+ return more();
599
+ }
502
600
  })), _$escape(_$createComponent(Show, {
503
601
  get when() {
504
602
  return _$memo(() => !!(content() && props.edited))() && !hasBubble();
505
603
  },
506
604
  get children() {
507
- return _$ssr(_tmpl$20, _$escape(chatMessages().messageEdited));
605
+ return _$ssr(_tmpl$23, _$escape(chatMessages().messageEdited));
508
606
  }
509
607
  })), _$escape(_$createComponent(Show, {
510
608
  get when() {
511
609
  return media().length > 0;
512
610
  },
513
611
  get children() {
514
- return _$ssr(_tmpl$21, _$ssrAttribute("aria-label", _$escape(chatMessages().attachments, true), false) + _$ssrAttribute("data-count", _$escape(Math.min(media().length, MEDIA_SHOWN), true), false), _$ssrStyle(media().length === 1 ? {
612
+ return _$ssr(_tmpl$24, _$ssrAttribute("aria-label", _$escape(chatMessages().attachments, true), false) + _$ssrAttribute("data-count", _$escape(Math.min(media().length, MEDIA_SHOWN), true), false), _$ssrStyle(media().length === 1 ? {
515
613
  width: mediaWidth(media()[0])
516
614
  } : undefined), _$escape(_$createComponent(For, {
517
615
  get each() {
@@ -525,7 +623,7 @@ export function MessageRow(props) {
525
623
  return files().length > 0;
526
624
  },
527
625
  get children() {
528
- return _$ssr(_tmpl$22, _$escape(_$createComponent(For, {
626
+ return _$ssr(_tmpl$25, _$escape(_$createComponent(For, {
529
627
  get each() {
530
628
  return files();
531
629
  },
@@ -555,14 +653,14 @@ export function MessageRow(props) {
555
653
  return _$memo(() => !!content())() && props.linkPreview;
556
654
  },
557
655
  get children() {
558
- return _$ssr(_tmpl$23, _$escape(props.linkPreview));
656
+ return _$ssr(_tmpl$26, _$escape(props.linkPreview));
559
657
  }
560
658
  })), _$escape(_$createComponent(Show, {
561
659
  get when() {
562
660
  return _$memo(() => !!content())() && props.card;
563
661
  },
564
662
  get children() {
565
- return _$ssr(_tmpl$23, _$escape(props.card));
663
+ return _$ssr(_tmpl$26, _$escape(props.card));
566
664
  }
567
665
  })), _$escape(_$createComponent(Show, {
568
666
  get when() {
@@ -601,12 +699,21 @@ export function MessageRow(props) {
601
699
  time: time()
602
700
  })))
603
701
  })))
702
+ })), _$escape(_$createComponent(Show, {
703
+ get when() {
704
+ return props.origin;
705
+ },
706
+ children: origin => _$createComponent(OriginChip, {
707
+ get origin() {
708
+ return origin();
709
+ }
710
+ })
604
711
  })), _$escape(_$createComponent(Show, {
605
712
  get when() {
606
713
  return hasFooter();
607
714
  },
608
715
  get children() {
609
- return _$ssr(_tmpl$25, _$escape(_$createComponent(Show, {
716
+ return _$ssr(_tmpl$28, _$escape(_$createComponent(Show, {
610
717
  get when() {
611
718
  return reactions();
612
719
  },
@@ -626,7 +733,7 @@ export function MessageRow(props) {
626
733
  return hasLine();
627
734
  },
628
735
  get children() {
629
- return _$ssr(_tmpl$24, _$escape(_$createComponent(Show, {
736
+ return _$ssr(_tmpl$27, _$escape(_$createComponent(Show, {
630
737
  get when() {
631
738
  return props.progress;
632
739
  },
@@ -655,6 +762,18 @@ export function MessageRow(props) {
655
762
  return chatMessages().messageRetry;
656
763
  }
657
764
  })
765
+ }), _$createComponent(Show, {
766
+ get when() {
767
+ return props.onDiscard;
768
+ },
769
+ children: discard => _$createComponent(Button, {
770
+ variant: "text",
771
+ size: "xs",
772
+ onClick: () => discard()(),
773
+ get children() {
774
+ return chatMessages().messageDiscard;
775
+ }
776
+ })
658
777
  })];
659
778
  }
660
779
  }), _$createComponent(Show, {
@@ -698,46 +817,110 @@ export function MessageRow(props) {
698
817
  }
699
818
  })));
700
819
  }
701
- })), _$escape(_$createComponent(Show, {
820
+ })));
821
+ return _$createComponent(Show, {
702
822
  get when() {
703
- return (props.actions?.length ?? 0) > 0;
823
+ return hasMenu();
704
824
  },
825
+ fallback: row,
705
826
  get children() {
706
- return _$ssr(_tmpl$26, _$ssrAttribute("aria-label", _$escape(chatMessages().messageActions, true), false), _$escape(_$createComponent(For, {
707
- get each() {
708
- return props.actions;
827
+ return _$createComponent(GestureMenu, {
828
+ get items() {
829
+ return gestureItems();
709
830
  },
710
- children: action => _$createComponent(IconButton, {
711
- get label() {
712
- return action.label;
713
- },
714
- size: "sm",
715
- get disabled() {
716
- return action.disabled;
717
- },
718
- onClick: () => action.onSelect(),
719
- get children() {
720
- return _$ssr(_tmpl$49, _$ssrAttribute("class", _$escape(action.icon, true), false));
721
- }
722
- })
723
- })));
831
+ get label() {
832
+ return chatMessages().messageMenu({
833
+ author: props.author.name,
834
+ time: props.time
835
+ });
836
+ },
837
+ tabIndex: -1,
838
+ children: row
839
+ });
840
+ }
841
+ });
842
+ }
843
+
844
+ /** Where a row belongs, such as its thread; a control when it opens that place. */
845
+ function OriginChip(props) {
846
+ return _$createComponent(Show, {
847
+ get when() {
848
+ return props.origin.onSelect;
849
+ },
850
+ get fallback() {
851
+ return _$ssr(_tmpl$49, _$escape(_$createComponent(Show, {
852
+ get when() {
853
+ return props.origin.icon;
854
+ },
855
+ children: icon => _$ssr(_tmpl$50, _$ssrAttribute("class", _$escape(icon(), true), false))
856
+ })), _$escape(props.origin.label));
857
+ },
858
+ children: select => _$ssr(_tmpl$51, _$ssrAttribute("aria-label", _$escape(props.origin.selectLabel, true), false), _$escape(_$createComponent(Show, {
859
+ get when() {
860
+ return props.origin.icon;
861
+ },
862
+ children: icon => _$ssr(_tmpl$50, _$ssrAttribute("class", _$escape(icon(), true), false))
863
+ })), _$escape(props.origin.label))
864
+ });
865
+ }
866
+
867
+ /**
868
+ * A quiet line for a change to something the conversation is about, such as a task's new status: no bubble, aligned
869
+ * with the messages' text, with its time at the end. It is no message: it never counts as unread.
870
+ */
871
+ export function MessageEventRow(props) {
872
+ return _$ssr(_tmpl$53, _$ssrAttribute("class", props.class ? `k2b-message-event-row ${_$escape(props.class, true)}` : "k2b-message-event-row", false), _$ssrAttribute("class", _$escape(props.icon ?? "ti ti-point", true), false), _$escape(_$createComponent(Show, {
873
+ get when() {
874
+ return props.href;
875
+ },
876
+ get fallback() {
877
+ return _$ssr(_tmpl$54, _$escape(props.children));
878
+ },
879
+ children: href => _$ssr(_tmpl$55, _$ssrAttribute("href", _$escape(href(), true), false), _$escape(props.children))
880
+ })), _$escape(_$createComponent(Show, {
881
+ get when() {
882
+ return props.origin;
883
+ },
884
+ children: origin => _$createComponent(OriginChip, {
885
+ get origin() {
886
+ return origin();
887
+ }
888
+ })
889
+ })), _$escape(_$createComponent(Show, {
890
+ get when() {
891
+ return props.time;
892
+ },
893
+ get children() {
894
+ return _$ssr(_tmpl$52, _$ssrAttribute("datetime", _$escape(dateTimeOf(props.dateTime), true), false), _$escape(props.time));
724
895
  }
725
896
  })));
726
897
  }
727
898
 
899
+ /** Several event lines in a row as one line that opens them, such as "4 changes to Invitation and Light test". */
900
+ export function MessageEventGroup(props) {
901
+ return _$ssr(_tmpl$56, _$ssrAttribute("class", props.class ? `k2b-message-event-row k2b-message-event-group ${_$escape(props.class, true)}` : "k2b-message-event-row k2b-message-event-group", false) + _$ssrAttribute("aria-expanded", _$escape(props.expanded, true), false), _$escape(props.label), _$escape(_$createComponent(Show, {
902
+ get when() {
903
+ return props.time;
904
+ },
905
+ get children() {
906
+ return _$ssr(_tmpl$52, _$ssrAttribute("datetime", _$escape(dateTimeOf(props.dateTime), true), false), _$escape(props.time));
907
+ }
908
+ })), _$ssrAttribute("class", props.expanded ? "ti ti-chevron-up" : "ti ti-chevron-down", false));
909
+ }
910
+
728
911
  /** A quiet, centered line for something that happened in the conversation, such as a person joining. */
729
912
  export function MessageSystemRow(props) {
730
- return _$ssr(_tmpl$51, _$ssrAttribute("class", props.class ? `k2b-message-system-row ${_$escape(props.class, true)}` : "k2b-message-system-row", false), _$escape(_$createComponent(Show, {
913
+ return _$ssr(_tmpl$57, _$ssrAttribute("class", props.class ? `k2b-message-system-row ${_$escape(props.class, true)}` : "k2b-message-system-row", false), _$escape(_$createComponent(Show, {
731
914
  get when() {
732
915
  return props.icon;
733
916
  },
734
- children: icon => _$ssr(_tmpl$49, _$ssrAttribute("class", _$escape(icon(), true), false))
917
+ children: icon => _$ssr(_tmpl$50, _$ssrAttribute("class", _$escape(icon(), true), false))
735
918
  })), _$escape(props.children), _$escape(_$createComponent(Show, {
736
919
  get when() {
737
920
  return props.time;
738
921
  },
739
922
  get children() {
740
- return _$ssr(_tmpl$50, _$ssrAttribute("datetime", _$escape(dateTimeOf(props.dateTime), true), false), _$escape(props.time));
923
+ return _$ssr(_tmpl$52, _$ssrAttribute("datetime", _$escape(dateTimeOf(props.dateTime), true), false), _$escape(props.time));
741
924
  }
742
925
  })));
743
926
  }