@k2b/ui 0.27.0 → 0.29.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 (323) hide show
  1. package/README.md +1 -1
  2. package/dist/base.css +147 -2
  3. package/dist/browser/actions/ContextMenu.js +35 -4
  4. package/dist/browser/actions/ContextMenu.js.map +1 -1
  5. package/dist/browser/actions/DragAndDrop.js +89 -0
  6. package/dist/browser/actions/DragAndDrop.js.map +1 -0
  7. package/dist/browser/actions/Dropdown.js +184 -158
  8. package/dist/browser/actions/Dropdown.js.map +1 -1
  9. package/dist/browser/actions/GestureMenu.js +95 -139
  10. package/dist/browser/actions/GestureMenu.js.map +1 -1
  11. package/dist/browser/actions/Toolbar.js +379 -48
  12. package/dist/browser/actions/Toolbar.js.map +1 -1
  13. package/dist/browser/actions/drag-and-drop-messages.js +75 -0
  14. package/dist/browser/actions/drag-and-drop-messages.js.map +1 -0
  15. package/dist/browser/actions/drag-and-drop.js +692 -0
  16. package/dist/browser/actions/drag-and-drop.js.map +1 -0
  17. package/dist/browser/actions/index.js +1 -0
  18. package/dist/browser/actions/index.js.map +1 -1
  19. package/dist/browser/actions/menu-rows.js +15 -0
  20. package/dist/browser/actions/menu-rows.js.map +1 -0
  21. package/dist/browser/actions/menu-sheet.js +154 -0
  22. package/dist/browser/actions/menu-sheet.js.map +1 -0
  23. package/dist/browser/actions/toolbar-messages.js +20 -0
  24. package/dist/browser/actions/toolbar-messages.js.map +1 -0
  25. package/dist/browser/chart-inspection.js +3 -0
  26. package/dist/browser/chart-inspection.js.map +1 -0
  27. package/dist/browser/chat/ChatComposer.js +714 -410
  28. package/dist/browser/chat/ChatComposer.js.map +1 -1
  29. package/dist/browser/chat/ChatDecision.js +778 -0
  30. package/dist/browser/chat/ChatDecision.js.map +1 -0
  31. package/dist/browser/chat/ChatPrimitives.js +34 -28
  32. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  33. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  34. package/dist/browser/chat/chat-messages.js +25 -1
  35. package/dist/browser/chat/chat-messages.js.map +1 -1
  36. package/dist/browser/chat/command-search.js +13 -3
  37. package/dist/browser/chat/command-search.js.map +1 -1
  38. package/dist/browser/chat/index.js +8 -1
  39. package/dist/browser/chat/index.js.map +1 -1
  40. package/dist/browser/chat/reaction-people.js +15 -0
  41. package/dist/browser/chat/reaction-people.js.map +1 -0
  42. package/dist/browser/chat/types.js.map +1 -1
  43. package/dist/browser/content/Calendar.js +3 -3
  44. package/dist/browser/content/Calendar.js.map +1 -1
  45. package/dist/browser/content/Chart.js +60 -86
  46. package/dist/browser/content/Chart.js.map +1 -1
  47. package/dist/browser/content/ChartSnapshotView.js +7 -10
  48. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  49. package/dist/browser/content/FileBrowser.js +2 -2
  50. package/dist/browser/content/FileBrowser.js.map +1 -1
  51. package/dist/browser/content/FileTree.js +42 -36
  52. package/dist/browser/content/FileTree.js.map +1 -1
  53. package/dist/browser/content/FileTypeIcon.js +72 -0
  54. package/dist/browser/content/FileTypeIcon.js.map +1 -0
  55. package/dist/browser/content/FileView.js +2 -2
  56. package/dist/browser/content/FileView.js.map +1 -1
  57. package/dist/browser/content/MessageRow.js +330 -448
  58. package/dist/browser/content/MessageRow.js.map +1 -1
  59. package/dist/browser/content/ReactionBar.js +419 -0
  60. package/dist/browser/content/ReactionBar.js.map +1 -0
  61. package/dist/browser/content/ReferenceChip.js +162 -0
  62. package/dist/browser/content/ReferenceChip.js.map +1 -0
  63. package/dist/browser/content/calendar-pointer.js +9 -0
  64. package/dist/browser/content/calendar-pointer.js.map +1 -1
  65. package/dist/browser/content/calendar-time-view.js +6 -3
  66. package/dist/browser/content/calendar-time-view.js.map +1 -1
  67. package/dist/browser/content/chart-inspection-core.js +557 -0
  68. package/dist/browser/content/chart-inspection-core.js.map +1 -0
  69. package/dist/browser/content/chart-inspection.js +10 -445
  70. package/dist/browser/content/chart-inspection.js.map +1 -1
  71. package/dist/browser/content/chart-line-gaps.js +1 -1
  72. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  73. package/dist/browser/content/chart-snapshot.js +1 -1
  74. package/dist/browser/content/chart-snapshot.js.map +1 -1
  75. package/dist/browser/content/index.js +3 -0
  76. package/dist/browser/content/index.js.map +1 -1
  77. package/dist/browser/feedback/dialog-core.js +135 -23
  78. package/dist/browser/feedback/dialog-core.js.map +1 -1
  79. package/dist/browser/index.js +1 -0
  80. package/dist/browser/index.js.map +1 -1
  81. package/dist/browser/input-mode.js +40 -0
  82. package/dist/browser/input-mode.js.map +1 -0
  83. package/dist/browser/inputs/FileDropTarget.js +24 -9
  84. package/dist/browser/inputs/FileDropTarget.js.map +1 -1
  85. package/dist/browser/inputs/FileInputs.js +2 -2
  86. package/dist/browser/inputs/FileInputs.js.map +1 -1
  87. package/dist/browser/inputs/SelectChip.js +9 -0
  88. package/dist/browser/inputs/SelectChip.js.map +1 -1
  89. package/dist/browser/inputs/emoji/EmojiPicker.js +13 -0
  90. package/dist/browser/inputs/emoji/EmojiPicker.js.map +1 -1
  91. package/dist/browser/inputs/file-drop.js.map +1 -1
  92. package/dist/browser/layout/AppOverview.js +1 -1
  93. package/dist/browser/layout/AppOverview.js.map +1 -1
  94. package/dist/browser/layout/AppWorkspace.js +644 -445
  95. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  96. package/dist/browser/layout/DetailPanel.js +283 -197
  97. package/dist/browser/layout/DetailPanel.js.map +1 -1
  98. package/dist/browser/layout/Discussion.js +233 -185
  99. package/dist/browser/layout/Discussion.js.map +1 -1
  100. package/dist/browser/layout/PanelDialog.js +88 -86
  101. package/dist/browser/layout/PanelDialog.js.map +1 -1
  102. package/dist/browser/layout/ResizeSeparator.js +81 -0
  103. package/dist/browser/layout/ResizeSeparator.js.map +1 -0
  104. package/dist/browser/layout/SidebarSwitcher.js +9 -2
  105. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  106. package/dist/browser/layout/TabBar.js +15 -12
  107. package/dist/browser/layout/TabBar.js.map +1 -1
  108. package/dist/browser/layout/TableOfContents.js +10 -2
  109. package/dist/browser/layout/TableOfContents.js.map +1 -1
  110. package/dist/browser/layout/app-workspace-controller.js +130 -17
  111. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  112. package/dist/browser/layout/detail-panel-messages.js +35 -0
  113. package/dist/browser/layout/detail-panel-messages.js.map +1 -0
  114. package/dist/browser/layout/index.js +3 -1
  115. package/dist/browser/layout/index.js.map +1 -1
  116. package/dist/browser/layout/resize-separator.js +90 -0
  117. package/dist/browser/layout/resize-separator.js.map +1 -0
  118. package/dist/browser/layout/workspace-messages.js +12 -2
  119. package/dist/browser/layout/workspace-messages.js.map +1 -1
  120. package/dist/browser/surfaces/Avatar.js +50 -20
  121. package/dist/browser/surfaces/Avatar.js.map +1 -1
  122. package/dist/browser/surfaces/AvatarStack.js +406 -0
  123. package/dist/browser/surfaces/AvatarStack.js.map +1 -0
  124. package/dist/browser/surfaces/LinkCard.js +1 -1
  125. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  126. package/dist/browser/surfaces/Placeholder.js +14 -3
  127. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  128. package/dist/browser/surfaces/StatCell.js +23 -0
  129. package/dist/browser/surfaces/StatCell.js.map +1 -1
  130. package/dist/browser/surfaces/avatar-messages.js +8 -2
  131. package/dist/browser/surfaces/avatar-messages.js.map +1 -1
  132. package/dist/browser/surfaces/index.js +1 -0
  133. package/dist/browser/surfaces/index.js.map +1 -1
  134. package/dist/browser/widgets/Widget.js +1 -1
  135. package/dist/browser/widgets/Widget.js.map +1 -1
  136. package/dist/ssr/actions/ContextMenu.js +26 -3
  137. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  138. package/dist/ssr/actions/DragAndDrop.js +63 -0
  139. package/dist/ssr/actions/DragAndDrop.js.map +1 -0
  140. package/dist/ssr/actions/Dropdown.js +140 -72
  141. package/dist/ssr/actions/Dropdown.js.map +1 -1
  142. package/dist/ssr/actions/GestureMenu.js +76 -107
  143. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  144. package/dist/ssr/actions/Toolbar.js +294 -14
  145. package/dist/ssr/actions/Toolbar.js.map +1 -1
  146. package/dist/ssr/actions/drag-and-drop-messages.js +75 -0
  147. package/dist/ssr/actions/drag-and-drop-messages.js.map +1 -0
  148. package/dist/ssr/actions/drag-and-drop.js +692 -0
  149. package/dist/ssr/actions/drag-and-drop.js.map +1 -0
  150. package/dist/ssr/actions/index.js +1 -0
  151. package/dist/ssr/actions/index.js.map +1 -1
  152. package/dist/ssr/actions/menu-rows.js +15 -0
  153. package/dist/ssr/actions/menu-rows.js.map +1 -0
  154. package/dist/ssr/actions/menu-sheet.js +138 -0
  155. package/dist/ssr/actions/menu-sheet.js.map +1 -0
  156. package/dist/ssr/actions/toolbar-messages.js +20 -0
  157. package/dist/ssr/actions/toolbar-messages.js.map +1 -0
  158. package/dist/ssr/chart-inspection.js +3 -0
  159. package/dist/ssr/chart-inspection.js.map +1 -0
  160. package/dist/ssr/chat/ChatComposer.js +393 -102
  161. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  162. package/dist/ssr/chat/ChatDecision.js +465 -0
  163. package/dist/ssr/chat/ChatDecision.js.map +1 -0
  164. package/dist/ssr/chat/ChatPrimitives.js +2 -2
  165. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  166. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  167. package/dist/ssr/chat/chat-messages.js +25 -1
  168. package/dist/ssr/chat/chat-messages.js.map +1 -1
  169. package/dist/ssr/chat/command-search.js +13 -3
  170. package/dist/ssr/chat/command-search.js.map +1 -1
  171. package/dist/ssr/chat/index.js +8 -1
  172. package/dist/ssr/chat/index.js.map +1 -1
  173. package/dist/ssr/chat/reaction-people.js +15 -0
  174. package/dist/ssr/chat/reaction-people.js.map +1 -0
  175. package/dist/ssr/chat/types.js.map +1 -1
  176. package/dist/ssr/content/Calendar.js +3 -3
  177. package/dist/ssr/content/Calendar.js.map +1 -1
  178. package/dist/ssr/content/Chart.js +25 -38
  179. package/dist/ssr/content/Chart.js.map +1 -1
  180. package/dist/ssr/content/ChartSnapshotView.js +7 -10
  181. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  182. package/dist/ssr/content/FileBrowser.js +2 -2
  183. package/dist/ssr/content/FileBrowser.js.map +1 -1
  184. package/dist/ssr/content/FileTree.js +21 -14
  185. package/dist/ssr/content/FileTree.js.map +1 -1
  186. package/dist/ssr/content/FileTypeIcon.js +50 -0
  187. package/dist/ssr/content/FileTypeIcon.js.map +1 -0
  188. package/dist/ssr/content/FileView.js +2 -2
  189. package/dist/ssr/content/FileView.js.map +1 -1
  190. package/dist/ssr/content/MessageRow.js +98 -152
  191. package/dist/ssr/content/MessageRow.js.map +1 -1
  192. package/dist/ssr/content/ReactionBar.js +304 -0
  193. package/dist/ssr/content/ReactionBar.js.map +1 -0
  194. package/dist/ssr/content/ReferenceChip.js +121 -0
  195. package/dist/ssr/content/ReferenceChip.js.map +1 -0
  196. package/dist/ssr/content/calendar-pointer.js +9 -0
  197. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  198. package/dist/ssr/content/calendar-time-view.js +6 -3
  199. package/dist/ssr/content/calendar-time-view.js.map +1 -1
  200. package/dist/ssr/content/chart-inspection-core.js +557 -0
  201. package/dist/ssr/content/chart-inspection-core.js.map +1 -0
  202. package/dist/ssr/content/chart-inspection.js +10 -445
  203. package/dist/ssr/content/chart-inspection.js.map +1 -1
  204. package/dist/ssr/content/chart-line-gaps.js +1 -1
  205. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  206. package/dist/ssr/content/chart-snapshot.js +1 -1
  207. package/dist/ssr/content/chart-snapshot.js.map +1 -1
  208. package/dist/ssr/content/index.js +3 -0
  209. package/dist/ssr/content/index.js.map +1 -1
  210. package/dist/ssr/feedback/dialog-core.js +135 -23
  211. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  212. package/dist/ssr/index.js +1 -0
  213. package/dist/ssr/index.js.map +1 -1
  214. package/dist/ssr/input-mode.js +40 -0
  215. package/dist/ssr/input-mode.js.map +1 -0
  216. package/dist/ssr/inputs/FileDropTarget.js +17 -5
  217. package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
  218. package/dist/ssr/inputs/FileInputs.js +2 -2
  219. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  220. package/dist/ssr/inputs/SelectChip.js +9 -0
  221. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  222. package/dist/ssr/inputs/emoji/EmojiPicker.js +12 -0
  223. package/dist/ssr/inputs/emoji/EmojiPicker.js.map +1 -1
  224. package/dist/ssr/inputs/file-drop.js.map +1 -1
  225. package/dist/ssr/layout/AppOverview.js +1 -1
  226. package/dist/ssr/layout/AppOverview.js.map +1 -1
  227. package/dist/ssr/layout/AppWorkspace.js +272 -95
  228. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  229. package/dist/ssr/layout/DetailPanel.js +112 -58
  230. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  231. package/dist/ssr/layout/Discussion.js +63 -36
  232. package/dist/ssr/layout/Discussion.js.map +1 -1
  233. package/dist/ssr/layout/PanelDialog.js +7 -6
  234. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  235. package/dist/ssr/layout/ResizeSeparator.js +45 -0
  236. package/dist/ssr/layout/ResizeSeparator.js.map +1 -0
  237. package/dist/ssr/layout/SidebarSwitcher.js +9 -2
  238. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  239. package/dist/ssr/layout/TabBar.js +1 -1
  240. package/dist/ssr/layout/TabBar.js.map +1 -1
  241. package/dist/ssr/layout/TableOfContents.js +10 -2
  242. package/dist/ssr/layout/TableOfContents.js.map +1 -1
  243. package/dist/ssr/layout/app-workspace-controller.js +130 -17
  244. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  245. package/dist/ssr/layout/detail-panel-messages.js +35 -0
  246. package/dist/ssr/layout/detail-panel-messages.js.map +1 -0
  247. package/dist/ssr/layout/index.js +3 -1
  248. package/dist/ssr/layout/index.js.map +1 -1
  249. package/dist/ssr/layout/resize-separator.js +90 -0
  250. package/dist/ssr/layout/resize-separator.js.map +1 -0
  251. package/dist/ssr/layout/workspace-messages.js +12 -2
  252. package/dist/ssr/layout/workspace-messages.js.map +1 -1
  253. package/dist/ssr/surfaces/Avatar.js +20 -2
  254. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  255. package/dist/ssr/surfaces/AvatarStack.js +286 -0
  256. package/dist/ssr/surfaces/AvatarStack.js.map +1 -0
  257. package/dist/ssr/surfaces/LinkCard.js +1 -1
  258. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  259. package/dist/ssr/surfaces/Placeholder.js +4 -2
  260. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  261. package/dist/ssr/surfaces/StatCell.js +23 -0
  262. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  263. package/dist/ssr/surfaces/avatar-messages.js +8 -2
  264. package/dist/ssr/surfaces/avatar-messages.js.map +1 -1
  265. package/dist/ssr/surfaces/index.js +1 -0
  266. package/dist/ssr/surfaces/index.js.map +1 -1
  267. package/dist/ssr/widgets/Widget.js +1 -1
  268. package/dist/ssr/widgets/Widget.js.map +1 -1
  269. package/dist/styles.css +1 -1
  270. package/dist/types/actions/ContextMenu.d.ts +9 -0
  271. package/dist/types/actions/DragAndDrop.d.ts +29 -0
  272. package/dist/types/actions/Dropdown.d.ts +12 -5
  273. package/dist/types/actions/GestureMenu.d.ts +6 -4
  274. package/dist/types/actions/Toolbar.d.ts +20 -0
  275. package/dist/types/actions/drag-and-drop-messages.d.ts +35 -0
  276. package/dist/types/actions/drag-and-drop.d.ts +36 -0
  277. package/dist/types/actions/index.d.ts +3 -1
  278. package/dist/types/actions/menu-rows.d.ts +5 -0
  279. package/dist/types/actions/menu-sheet.d.ts +22 -0
  280. package/dist/types/actions/toolbar-messages.d.ts +8 -0
  281. package/dist/types/chart-inspection.d.ts +2 -0
  282. package/dist/types/chat/ChatComposer.d.ts +26 -1
  283. package/dist/types/chat/ChatDecision.d.ts +133 -0
  284. package/dist/types/chat/ChatPrimitives.d.ts +4 -1
  285. package/dist/types/chat/ChatTimeline.d.ts +2 -1
  286. package/dist/types/chat/chat-messages.d.ts +13 -2
  287. package/dist/types/chat/command-search.d.ts +5 -0
  288. package/dist/types/chat/index.d.ts +25 -1
  289. package/dist/types/chat/reaction-people.d.ts +9 -0
  290. package/dist/types/chat/types.d.ts +54 -1
  291. package/dist/types/content/Chart.d.ts +11 -5
  292. package/dist/types/content/FileTypeIcon.d.ts +27 -0
  293. package/dist/types/content/MessageRow.d.ts +3 -10
  294. package/dist/types/content/ReactionBar.d.ts +32 -0
  295. package/dist/types/content/ReferenceChip.d.ts +49 -0
  296. package/dist/types/content/calendar-pointer.d.ts +6 -0
  297. package/dist/types/content/chart-inspection-core.d.ts +61 -0
  298. package/dist/types/content/chart-inspection.d.ts +4 -20
  299. package/dist/types/content/chart-snapshot.d.ts +1 -1
  300. package/dist/types/content/index.d.ts +5 -1
  301. package/dist/types/feedback/dialog-core.d.ts +16 -1
  302. package/dist/types/index.d.ts +1 -0
  303. package/dist/types/input-mode.d.ts +7 -0
  304. package/dist/types/inputs/FileDropTarget.d.ts +6 -3
  305. package/dist/types/inputs/SelectChip.d.ts +2 -0
  306. package/dist/types/inputs/file-drop.d.ts +2 -0
  307. package/dist/types/layout/AppWorkspace.d.ts +5 -3
  308. package/dist/types/layout/DetailPanel.d.ts +11 -0
  309. package/dist/types/layout/Discussion.d.ts +8 -0
  310. package/dist/types/layout/ResizeSeparator.d.ts +9 -0
  311. package/dist/types/layout/TabBar.d.ts +7 -0
  312. package/dist/types/layout/TableOfContents.d.ts +2 -0
  313. package/dist/types/layout/app-workspace-controller.d.ts +2 -0
  314. package/dist/types/layout/detail-panel-messages.d.ts +15 -0
  315. package/dist/types/layout/index.d.ts +3 -1
  316. package/dist/types/layout/resize-separator.d.ts +18 -0
  317. package/dist/types/layout/workspace-messages.d.ts +5 -0
  318. package/dist/types/surfaces/Avatar.d.ts +12 -0
  319. package/dist/types/surfaces/AvatarStack.d.ts +41 -0
  320. package/dist/types/surfaces/StatCell.d.ts +6 -0
  321. package/dist/types/surfaces/avatar-messages.d.ts +3 -0
  322. package/dist/types/surfaces/index.d.ts +3 -1
  323. package/package.json +7 -2
@@ -0,0 +1,419 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { className as _$className } from "solid-js/web";
4
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
5
+ import { memo as _$memo } from "solid-js/web";
6
+ import { use as _$use } from "solid-js/web";
7
+ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
8
+ import { effect as _$effect } from "solid-js/web";
9
+ import { getNextElement as _$getNextElement } from "solid-js/web";
10
+ import { insert as _$insert } from "solid-js/web";
11
+ import { setAttribute as _$setAttribute } from "solid-js/web";
12
+ import { createComponent as _$createComponent } from "solid-js/web";
13
+ var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-reaction-bar__chip role=img data-gesture-ignore><span aria-hidden=true></span><span aria-hidden=true>`),
14
+ _tmpl$2 = /*#__PURE__*/_$template(`<button type=button class=k2b-reaction-bar__chip><span aria-hidden=true></span><span aria-hidden=true>`),
15
+ _tmpl$3 = /*#__PURE__*/_$template(`<span class=k2b-reaction-bar__more><span aria-hidden=true>+<!$><!/></span><span class=k2b-sr-only>`),
16
+ _tmpl$4 = /*#__PURE__*/_$template(`<div role=group><!$><!/><!$><!/><!$><!/><span class="k2b-tooltip k2b-reaction-bar__hint"popover=manual role=tooltip aria-hidden=true>`),
17
+ _tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-reaction-bar__list>`),
18
+ _tmpl$6 = /*#__PURE__*/_$template(`<i class="ti ti-mood-plus"aria-hidden=true>`),
19
+ _tmpl$7 = /*#__PURE__*/_$template(`<span>`);
20
+ import { createEffect, createMemo, createSignal, For, on, onCleanup, onMount, Show } from "solid-js";
21
+ import { IconButton } from "../actions/Button";
22
+ import { useChatMessages } from "../chat/chat-messages";
23
+ import { positionTooltipSurface } from "../feedback/tooltip-position";
24
+ import { ScrollArea } from "../layout/ScrollArea";
25
+ const HOVER_MS = 250;
26
+ const HOLD_MS = 500;
27
+ const MOVE_TOLERANCE = 8;
28
+ export function ReactionBar(props) {
29
+ const chatMessages = useChatMessages();
30
+ // A max uses the wrapping layout, so the shown chips, +n, and add button wrap together.
31
+ const overflow = () => props.max !== undefined ? "wrap" : props.overflow ?? "scroll";
32
+ const shown = createMemo(() => props.max === undefined ? props.reactions : props.reactions.slice(0, props.max));
33
+ const keys = createMemo(() => shown().map(reaction => reaction.key));
34
+ const byKey = createMemo(() => new Map(shown().map(reaction => [reaction.key, reaction])));
35
+ const more = () => props.reactions.length - shown().length;
36
+ /** The reaction whose names the hint shows; it follows that reaction while the caller updates it. */
37
+ const [hintKey, setHintKey] = createSignal();
38
+ const hinted = () => {
39
+ const key = hintKey();
40
+ const reaction = key === undefined ? undefined : byKey().get(key);
41
+ return reaction?.label?.trim() ? reaction : undefined;
42
+ };
43
+ const hint = () => {
44
+ const reaction = hinted();
45
+ return reaction ? `${reaction.emoji} ${reaction.label}` : "";
46
+ };
47
+ const [touch, setTouch] = createSignal(false);
48
+ let root;
49
+ let surface;
50
+ onMount(() => {
51
+ if (!root || !surface) return;
52
+ const bar = root;
53
+ const tooltip = surface;
54
+ let timer;
55
+ let openChip;
56
+ let swallowClick = false;
57
+ let press;
58
+ const chipOf = target => {
59
+ const chip = target instanceof Element ? target.closest("[data-reaction-key]") : null;
60
+ return chip && chip.closest(".k2b-reaction-bar") === bar ? chip : undefined;
61
+ };
62
+ const clearTimer = () => {
63
+ clearTimeout(timer);
64
+ timer = undefined;
65
+ };
66
+ const close = () => {
67
+ clearTimer();
68
+ openChip = undefined;
69
+ try {
70
+ tooltip.hidePopover();
71
+ } catch {
72
+ /* The surface may already be disconnected. */
73
+ }
74
+ document.removeEventListener("pointerdown", dismiss, true);
75
+ document.removeEventListener("keydown", escape);
76
+ window.removeEventListener("scroll", close, true);
77
+ window.removeEventListener("resize", close);
78
+ };
79
+ const dismiss = () => close();
80
+ const escape = event => {
81
+ if (event.key === "Escape") close();
82
+ };
83
+ /** Opens the names hint over a chip; false when the chip has no names to show. */
84
+ const open = (chip, fromTouch) => {
85
+ clearTimer();
86
+ const reaction = byKey().get(chip.dataset.reactionKey ?? "");
87
+ if (!reaction?.label?.trim() || !chip.isConnected) return false;
88
+ setHintKey(reaction.key);
89
+ setTouch(fromTouch);
90
+ if (!tooltip.matches(":popover-open")) {
91
+ try {
92
+ tooltip.showPopover();
93
+ } catch {
94
+ return false;
95
+ }
96
+ }
97
+ openChip = chip;
98
+ positionTooltipSurface(tooltip, chip, "top");
99
+ document.addEventListener("pointerdown", dismiss, true);
100
+ document.addEventListener("keydown", escape);
101
+ window.addEventListener("scroll", close, true);
102
+ window.addEventListener("resize", close);
103
+ return true;
104
+ };
105
+ // An open hint follows its reaction: new names show at once, and it closes when the reaction, its names, or its
106
+ // chip go away.
107
+ createEffect(on(hinted, reaction => {
108
+ if (!openChip) return;
109
+ if (!reaction || !openChip.isConnected) close();else positionTooltipSurface(tooltip, openChip, "top");
110
+ }));
111
+ const delayed = chip => {
112
+ if (touch() && openChip) return;
113
+ if (!byKey().get(chip.dataset.reactionKey ?? "")?.label?.trim()) {
114
+ close();
115
+ return;
116
+ }
117
+ clearTimer();
118
+ if (openChip) open(chip, false);else timer = setTimeout(() => open(chip, false), HOVER_MS);
119
+ };
120
+ const enter = event => {
121
+ const chip = chipOf(event.target);
122
+ if (chip && event.target === chip && event.pointerType !== "touch") delayed(chip);
123
+ };
124
+ const leave = event => {
125
+ if (event.target !== chipOf(event.target) || touch() && openChip) return;
126
+ // Moving directly to another chip keeps an open hint available for its immediate update.
127
+ const next = chipOf(event.relatedTarget);
128
+ if (!next || !byKey().get(next.dataset.reactionKey ?? "")?.label?.trim()) close();
129
+ };
130
+ const focusIn = event => {
131
+ const chip = chipOf(event.target);
132
+ if (chip?.matches(":focus-visible")) delayed(chip);
133
+ };
134
+ const focusOut = event => {
135
+ if (chipOf(event.target) && !chipOf(event.relatedTarget) && !(touch() && openChip)) close();
136
+ };
137
+ const resetSwallow = () => {
138
+ swallowClick = false;
139
+ document.removeEventListener("pointerdown", resetSwallow, true);
140
+ };
141
+ const endPress = () => {
142
+ clearTimer();
143
+ press = undefined;
144
+ document.removeEventListener("pointermove", move, true);
145
+ document.removeEventListener("pointerup", up, true);
146
+ document.removeEventListener("pointercancel", cancel, true);
147
+ };
148
+ const down = event => {
149
+ resetSwallow();
150
+ close();
151
+ endPress();
152
+ const chip = chipOf(event.target);
153
+ if (!chip || event.pointerType !== "touch" && event.pointerType !== "pen") return;
154
+ press = {
155
+ chip,
156
+ id: event.pointerId,
157
+ x: event.clientX,
158
+ y: event.clientY,
159
+ held: false,
160
+ moved: false
161
+ };
162
+ timer = setTimeout(() => {
163
+ timer = undefined;
164
+ if (!press || press.moved) return;
165
+ // Only a hold that shows names takes the press; on a chip without names it stays an ordinary press.
166
+ press.held = open(press.chip, true);
167
+ }, HOLD_MS);
168
+ document.addEventListener("pointermove", move, true);
169
+ document.addEventListener("pointerup", up, true);
170
+ document.addEventListener("pointercancel", cancel, true);
171
+ };
172
+ const move = event => {
173
+ if (!press || event.pointerId !== press.id) return;
174
+ if (Math.hypot(event.clientX - press.x, event.clientY - press.y) > MOVE_TOLERANCE) {
175
+ press.moved = true;
176
+ clearTimer();
177
+ }
178
+ };
179
+ const up = event => {
180
+ if (!press || event.pointerId !== press.id) return;
181
+ if (press.held) {
182
+ swallowClick = true;
183
+ // Some browsers send no click after a hold. Never consume the next real tap.
184
+ document.addEventListener("pointerdown", resetSwallow, true);
185
+ } else if (!press.moved && !props.onToggle) open(press.chip, true);
186
+ endPress();
187
+ };
188
+ const cancel = event => {
189
+ if (event.pointerId === press?.id) endPress();
190
+ };
191
+ const touchEnd = event => {
192
+ if (!swallowClick || !event.cancelable) return;
193
+ // A cancelled touchend sends no click, so nothing is left to swallow.
194
+ event.preventDefault();
195
+ resetSwallow();
196
+ };
197
+ // Only the click of the held finger or pen is swallowed; a keyboard's click has no detail and always goes through.
198
+ const click = event => {
199
+ if (!swallowClick || event.detail === 0) return;
200
+ event.preventDefault();
201
+ event.stopPropagation();
202
+ resetSwallow();
203
+ };
204
+ const contextMenu = event => {
205
+ if (chipOf(event.target) && (press || swallowClick || touch() && openChip)) event.preventDefault();
206
+ };
207
+ bar.addEventListener("pointerenter", enter, true);
208
+ bar.addEventListener("pointerleave", leave, true);
209
+ bar.addEventListener("focusin", focusIn);
210
+ bar.addEventListener("focusout", focusOut);
211
+ bar.addEventListener("pointerdown", down);
212
+ bar.addEventListener("touchend", touchEnd, {
213
+ passive: false
214
+ });
215
+ bar.addEventListener("click", click, true);
216
+ bar.addEventListener("contextmenu", contextMenu);
217
+ onCleanup(() => {
218
+ close();
219
+ endPress();
220
+ resetSwallow();
221
+ bar.removeEventListener("pointerenter", enter, true);
222
+ bar.removeEventListener("pointerleave", leave, true);
223
+ bar.removeEventListener("focusin", focusIn);
224
+ bar.removeEventListener("focusout", focusOut);
225
+ bar.removeEventListener("pointerdown", down);
226
+ bar.removeEventListener("touchend", touchEnd);
227
+ bar.removeEventListener("click", click, true);
228
+ bar.removeEventListener("contextmenu", contextMenu);
229
+ });
230
+ });
231
+ const chip = (key, reaction) => {
232
+ const label = own => chatMessages().messageReaction({
233
+ emoji: reaction().emoji,
234
+ count: reaction().count,
235
+ names: reaction().label,
236
+ own
237
+ });
238
+ return _$createComponent(Show, {
239
+ get when() {
240
+ return props.onToggle;
241
+ },
242
+ get fallback() {
243
+ return (() => {
244
+ var _el$ = _$getNextElement(_tmpl$),
245
+ _el$2 = _el$.firstChild,
246
+ _el$3 = _el$2.nextSibling;
247
+ _$setAttribute(_el$, "data-reaction-key", key);
248
+ _$insert(_el$2, () => reaction().emoji);
249
+ _$insert(_el$3, () => reaction().count);
250
+ _$effect(_p$ => {
251
+ var _v$ = label(Boolean(reaction().own)),
252
+ _v$2 = reaction().busy ? "true" : undefined,
253
+ _v$3 = reaction().own ? "" : undefined;
254
+ _v$ !== _p$.e && _$setAttribute(_el$, "aria-label", _p$.e = _v$);
255
+ _v$2 !== _p$.t && _$setAttribute(_el$, "aria-busy", _p$.t = _v$2);
256
+ _v$3 !== _p$.a && _$setAttribute(_el$, "data-own", _p$.a = _v$3);
257
+ return _p$;
258
+ }, {
259
+ e: undefined,
260
+ t: undefined,
261
+ a: undefined
262
+ });
263
+ return _el$;
264
+ })();
265
+ },
266
+ children: toggle => (() => {
267
+ var _el$4 = _$getNextElement(_tmpl$2),
268
+ _el$5 = _el$4.firstChild,
269
+ _el$6 = _el$5.nextSibling;
270
+ _el$4.$$click = () => toggle()(key);
271
+ _$setAttribute(_el$4, "data-reaction-key", key);
272
+ _$insert(_el$5, () => reaction().emoji);
273
+ _$insert(_el$6, () => reaction().count);
274
+ _$effect(_p$ => {
275
+ var _v$4 = reaction().own ? "true" : "false",
276
+ _v$5 = label(false),
277
+ _v$6 = reaction().busy ? "true" : undefined,
278
+ _v$7 = reaction().own ? "" : undefined;
279
+ _v$4 !== _p$.e && _$setAttribute(_el$4, "aria-pressed", _p$.e = _v$4);
280
+ _v$5 !== _p$.t && _$setAttribute(_el$4, "aria-label", _p$.t = _v$5);
281
+ _v$6 !== _p$.a && _$setAttribute(_el$4, "aria-busy", _p$.a = _v$6);
282
+ _v$7 !== _p$.o && _$setAttribute(_el$4, "data-own", _p$.o = _v$7);
283
+ return _p$;
284
+ }, {
285
+ e: undefined,
286
+ t: undefined,
287
+ a: undefined,
288
+ o: undefined
289
+ });
290
+ _$runHydrationEvents();
291
+ return _el$4;
292
+ })()
293
+ });
294
+ };
295
+ const chips = () => _$createComponent(For, {
296
+ get each() {
297
+ return keys();
298
+ },
299
+ children: key => _$createComponent(Show, {
300
+ get when() {
301
+ return byKey().get(key);
302
+ },
303
+ children: reaction => chip(key, reaction)
304
+ })
305
+ });
306
+ return (() => {
307
+ var _el$7 = _$getNextElement(_tmpl$4),
308
+ _el$13 = _el$7.firstChild,
309
+ [_el$14, _co$2] = _$getNextMarker(_el$13.nextSibling),
310
+ _el$15 = _el$14.nextSibling,
311
+ [_el$16, _co$3] = _$getNextMarker(_el$15.nextSibling),
312
+ _el$17 = _el$16.nextSibling,
313
+ [_el$18, _co$4] = _$getNextMarker(_el$17.nextSibling),
314
+ _el$12 = _el$18.nextSibling;
315
+ var _ref$ = root;
316
+ typeof _ref$ === "function" ? _$use(_ref$, _el$7) : root = _el$7;
317
+ _$insert(_el$7, _$createComponent(Show, {
318
+ get when() {
319
+ return overflow() === "scroll";
320
+ },
321
+ get fallback() {
322
+ return (() => {
323
+ var _el$19 = _$getNextElement(_tmpl$5);
324
+ _$insert(_el$19, chips);
325
+ return _el$19;
326
+ })();
327
+ },
328
+ get children() {
329
+ return _$createComponent(Show, {
330
+ get when() {
331
+ return shown().length > 0;
332
+ },
333
+ get children() {
334
+ return _$createComponent(ScrollArea, {
335
+ orientation: "horizontal",
336
+ "class": "k2b-reaction-bar__scroll",
337
+ get tabindex() {
338
+ return props.onToggle ? undefined : 0;
339
+ },
340
+ get children() {
341
+ return chips();
342
+ }
343
+ });
344
+ }
345
+ });
346
+ }
347
+ }), _el$14, _co$2);
348
+ _$insert(_el$7, _$createComponent(Show, {
349
+ get when() {
350
+ return more() > 0;
351
+ },
352
+ get children() {
353
+ var _el$8 = _$getNextElement(_tmpl$3),
354
+ _el$9 = _el$8.firstChild,
355
+ _el$0 = _el$9.firstChild,
356
+ _el$1 = _el$0.nextSibling,
357
+ [_el$10, _co$] = _$getNextMarker(_el$1.nextSibling),
358
+ _el$11 = _el$9.nextSibling;
359
+ _$insert(_el$9, more, _el$10, _co$);
360
+ _$insert(_el$11, () => props.moreLabel?.(more()) ?? chatMessages().moreReactions({
361
+ count: more()
362
+ }));
363
+ return _el$8;
364
+ }
365
+ }), _el$16, _co$3);
366
+ _$insert(_el$7, _$createComponent(Show, {
367
+ get when() {
368
+ return props.onAdd;
369
+ },
370
+ children: add => (() => {
371
+ var _el$20 = _$getNextElement(_tmpl$7);
372
+ _$insert(_el$20, _$createComponent(IconButton, {
373
+ get label() {
374
+ return chatMessages().messageAddReaction;
375
+ },
376
+ size: "xs",
377
+ "class": "k2b-reaction-bar__add-button",
378
+ onClick: event => add()(event.currentTarget),
379
+ get children() {
380
+ return _$getNextElement(_tmpl$6);
381
+ }
382
+ }));
383
+ _$effect(() => _$className(_el$20, `k2b-reaction-bar__add${props.add === "progressive" ? " k2b-progressive-action" : ""}`));
384
+ return _el$20;
385
+ })()
386
+ }), _el$18, _co$4);
387
+ var _ref$2 = surface;
388
+ typeof _ref$2 === "function" ? _$use(_ref$2, _el$12) : surface = _el$12;
389
+ _$insert(_el$12, hint);
390
+ _$effect(_p$ => {
391
+ var _v$8 = props.class ? `k2b-reaction-bar ${props.class}` : "k2b-reaction-bar",
392
+ _v$9 = chatMessages().messageReactions,
393
+ _v$0 = props.density ?? "default",
394
+ _v$1 = overflow(),
395
+ _v$10 = props.onAdd ? props.add ?? "always" : undefined,
396
+ _v$11 = props.reactions.length === 0 ? "" : undefined,
397
+ _v$12 = touch() ? "" : undefined;
398
+ _v$8 !== _p$.e && _$className(_el$7, _p$.e = _v$8);
399
+ _v$9 !== _p$.t && _$setAttribute(_el$7, "aria-label", _p$.t = _v$9);
400
+ _v$0 !== _p$.a && _$setAttribute(_el$7, "data-density", _p$.a = _v$0);
401
+ _v$1 !== _p$.o && _$setAttribute(_el$7, "data-overflow", _p$.o = _v$1);
402
+ _v$10 !== _p$.i && _$setAttribute(_el$7, "data-add", _p$.i = _v$10);
403
+ _v$11 !== _p$.n && _$setAttribute(_el$7, "data-empty", _p$.n = _v$11);
404
+ _v$12 !== _p$.s && _$setAttribute(_el$12, "data-touch", _p$.s = _v$12);
405
+ return _p$;
406
+ }, {
407
+ e: undefined,
408
+ t: undefined,
409
+ a: undefined,
410
+ o: undefined,
411
+ i: undefined,
412
+ n: undefined,
413
+ s: undefined
414
+ });
415
+ return _el$7;
416
+ })();
417
+ }
418
+ _$delegateEvents(["click"]);
419
+ //# sourceMappingURL=ReactionBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/ReactionBar.tsx"],"sourcesContent":["import { type Accessor, createEffect, createMemo, createSignal, For, type JSX, on, onCleanup, onMount, Show } from \"solid-js\";\nimport { IconButton } from \"../actions/Button\";\nimport { useChatMessages } from \"../chat/chat-messages\";\nimport { positionTooltipSurface } from \"../feedback/tooltip-position\";\nimport { ScrollArea } from \"../layout/ScrollArea\";\n\nexport type ReactionBarItem = {\n /** Stable identity of the reaction, passed to `onToggle`. */\n key: string;\n emoji: string;\n count: number;\n /** The reader reacted this way; the chip shows pressed. */\n own?: boolean;\n /** Who reacted, for example from `reactionPeople`. Read by screen readers and shown in the names hint. */\n label?: string;\n /** A change of the reader's own reaction is still being saved; the chip carries `aria-busy`. */\n busy?: boolean;\n};\nexport type ReactionBarProps = {\n reactions: readonly ReactionBarItem[];\n /** Called with a reaction's key when the reader presses its chip. Without it, the chips are not controls. */\n onToggle?: (key: string) => void;\n /** Called by \"Add reaction\" with the button to anchor a picker to, such as `EmojiPicker.Popover`. Without it there is no button. */\n onAdd?: (anchor: HTMLElement) => void;\n /** \"default\": 26 px chips (chat, item detail). \"compact\": 24 px chips (cards). */\n density?: \"default\" | \"compact\";\n /** \"scroll\" (default): one line of fixed height that scrolls sideways. \"wrap\": every chip shows, lines wrap. */\n overflow?: \"scroll\" | \"wrap\";\n /** Shows at most this many chips and then \"+n\", n being the number of further emoji. The shown chips do not scroll. */\n max?: number;\n /** Screen-reader text of \"+n\"; defaults to \"{n} more reactions\". */\n moreLabel?: (count: number) => string;\n /** \"always\" (default) or \"progressive\": shown on hover and focus with a mouse or trackpad (k2b-progressive-action, inside the caller's k2b-progressive-row), kept while its picker is open, hidden on touch. Its place stays reserved. */\n add?: \"always\" | \"progressive\";\n class?: string;\n};\n\nconst HOVER_MS = 250;\nconst HOLD_MS = 500;\nconst MOVE_TOLERANCE = 8;\n\nexport function ReactionBar(props: ReactionBarProps): JSX.Element {\n const chatMessages = useChatMessages();\n // A max uses the wrapping layout, so the shown chips, +n, and add button wrap together.\n const overflow = () => (props.max !== undefined ? \"wrap\" : (props.overflow ?? \"scroll\"));\n const shown = createMemo(() => (props.max === undefined ? props.reactions : props.reactions.slice(0, props.max)));\n const keys = createMemo(() => shown().map((reaction) => reaction.key));\n const byKey = createMemo(() => new Map(shown().map((reaction) => [reaction.key, reaction])));\n const more = () => props.reactions.length - shown().length;\n /** The reaction whose names the hint shows; it follows that reaction while the caller updates it. */\n const [hintKey, setHintKey] = createSignal<string>();\n const hinted = () => {\n const key = hintKey();\n const reaction = key === undefined ? undefined : byKey().get(key);\n return reaction?.label?.trim() ? reaction : undefined;\n };\n const hint = () => {\n const reaction = hinted();\n return reaction ? `${reaction.emoji} ${reaction.label}` : \"\";\n };\n const [touch, setTouch] = createSignal(false);\n let root: HTMLDivElement | undefined;\n let surface: HTMLSpanElement | undefined;\n\n onMount(() => {\n if (!root || !surface) return;\n const bar = root;\n const tooltip = surface;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let openChip: HTMLElement | undefined;\n let swallowClick = false;\n let press: { chip: HTMLElement; id: number; x: number; y: number; held: boolean; moved: boolean } | undefined;\n\n const chipOf = (target: EventTarget | null): HTMLElement | undefined => {\n const chip = target instanceof Element ? target.closest<HTMLElement>(\"[data-reaction-key]\") : null;\n return chip && chip.closest(\".k2b-reaction-bar\") === bar ? chip : undefined;\n };\n const clearTimer = () => {\n clearTimeout(timer);\n timer = undefined;\n };\n const close = () => {\n clearTimer();\n openChip = undefined;\n try {\n tooltip.hidePopover();\n } catch {\n /* The surface may already be disconnected. */\n }\n document.removeEventListener(\"pointerdown\", dismiss, true);\n document.removeEventListener(\"keydown\", escape);\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"resize\", close);\n };\n const dismiss = () => close();\n const escape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") close();\n };\n /** Opens the names hint over a chip; false when the chip has no names to show. */\n const open = (chip: HTMLElement, fromTouch: boolean): boolean => {\n clearTimer();\n const reaction = byKey().get(chip.dataset.reactionKey ?? \"\");\n if (!reaction?.label?.trim() || !chip.isConnected) return false;\n setHintKey(reaction.key);\n setTouch(fromTouch);\n if (!tooltip.matches(\":popover-open\")) {\n try {\n tooltip.showPopover();\n } catch {\n return false;\n }\n }\n openChip = chip;\n positionTooltipSurface(tooltip, chip, \"top\");\n document.addEventListener(\"pointerdown\", dismiss, true);\n document.addEventListener(\"keydown\", escape);\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"resize\", close);\n return true;\n };\n // An open hint follows its reaction: new names show at once, and it closes when the reaction, its names, or its\n // chip go away.\n createEffect(\n on(hinted, (reaction) => {\n if (!openChip) return;\n if (!reaction || !openChip.isConnected) close();\n else positionTooltipSurface(tooltip, openChip, \"top\");\n }),\n );\n const delayed = (chip: HTMLElement) => {\n if (touch() && openChip) return;\n if (\n !byKey()\n .get(chip.dataset.reactionKey ?? \"\")\n ?.label?.trim()\n ) {\n close();\n return;\n }\n clearTimer();\n if (openChip) open(chip, false);\n else timer = setTimeout(() => open(chip, false), HOVER_MS);\n };\n const enter = (event: PointerEvent) => {\n const chip = chipOf(event.target);\n if (chip && event.target === chip && event.pointerType !== \"touch\") delayed(chip);\n };\n const leave = (event: PointerEvent) => {\n if (event.target !== chipOf(event.target) || (touch() && openChip)) return;\n // Moving directly to another chip keeps an open hint available for its immediate update.\n const next = chipOf(event.relatedTarget);\n if (\n !next ||\n !byKey()\n .get(next.dataset.reactionKey ?? \"\")\n ?.label?.trim()\n )\n close();\n };\n const focusIn = (event: FocusEvent) => {\n const chip = chipOf(event.target);\n if (chip?.matches(\":focus-visible\")) delayed(chip);\n };\n const focusOut = (event: FocusEvent) => {\n if (chipOf(event.target) && !chipOf(event.relatedTarget) && !(touch() && openChip)) close();\n };\n const resetSwallow = () => {\n swallowClick = false;\n document.removeEventListener(\"pointerdown\", resetSwallow, true);\n };\n const endPress = () => {\n clearTimer();\n press = undefined;\n document.removeEventListener(\"pointermove\", move, true);\n document.removeEventListener(\"pointerup\", up, true);\n document.removeEventListener(\"pointercancel\", cancel, true);\n };\n const down = (event: PointerEvent) => {\n resetSwallow();\n close();\n endPress();\n const chip = chipOf(event.target);\n if (!chip || (event.pointerType !== \"touch\" && event.pointerType !== \"pen\")) return;\n press = { chip, id: event.pointerId, x: event.clientX, y: event.clientY, held: false, moved: false };\n timer = setTimeout(() => {\n timer = undefined;\n if (!press || press.moved) return;\n // Only a hold that shows names takes the press; on a chip without names it stays an ordinary press.\n press.held = open(press.chip, true);\n }, HOLD_MS);\n document.addEventListener(\"pointermove\", move, true);\n document.addEventListener(\"pointerup\", up, true);\n document.addEventListener(\"pointercancel\", cancel, true);\n };\n const move = (event: PointerEvent) => {\n if (!press || event.pointerId !== press.id) return;\n if (Math.hypot(event.clientX - press.x, event.clientY - press.y) > MOVE_TOLERANCE) {\n press.moved = true;\n clearTimer();\n }\n };\n const up = (event: PointerEvent) => {\n if (!press || event.pointerId !== press.id) return;\n if (press.held) {\n swallowClick = true;\n // Some browsers send no click after a hold. Never consume the next real tap.\n document.addEventListener(\"pointerdown\", resetSwallow, true);\n } else if (!press.moved && !props.onToggle) open(press.chip, true);\n endPress();\n };\n const cancel = (event: PointerEvent) => {\n if (event.pointerId === press?.id) endPress();\n };\n const touchEnd = (event: TouchEvent) => {\n if (!swallowClick || !event.cancelable) return;\n // A cancelled touchend sends no click, so nothing is left to swallow.\n event.preventDefault();\n resetSwallow();\n };\n // Only the click of the held finger or pen is swallowed; a keyboard's click has no detail and always goes through.\n const click = (event: MouseEvent) => {\n if (!swallowClick || event.detail === 0) return;\n event.preventDefault();\n event.stopPropagation();\n resetSwallow();\n };\n const contextMenu = (event: MouseEvent) => {\n if (chipOf(event.target) && (press || swallowClick || (touch() && openChip))) event.preventDefault();\n };\n\n bar.addEventListener(\"pointerenter\", enter, true);\n bar.addEventListener(\"pointerleave\", leave, true);\n bar.addEventListener(\"focusin\", focusIn);\n bar.addEventListener(\"focusout\", focusOut);\n bar.addEventListener(\"pointerdown\", down);\n bar.addEventListener(\"touchend\", touchEnd, { passive: false });\n bar.addEventListener(\"click\", click, true);\n bar.addEventListener(\"contextmenu\", contextMenu);\n onCleanup(() => {\n close();\n endPress();\n resetSwallow();\n bar.removeEventListener(\"pointerenter\", enter, true);\n bar.removeEventListener(\"pointerleave\", leave, true);\n bar.removeEventListener(\"focusin\", focusIn);\n bar.removeEventListener(\"focusout\", focusOut);\n bar.removeEventListener(\"pointerdown\", down);\n bar.removeEventListener(\"touchend\", touchEnd);\n bar.removeEventListener(\"click\", click, true);\n bar.removeEventListener(\"contextmenu\", contextMenu);\n });\n });\n\n const chip = (key: string, reaction: Accessor<ReactionBarItem>) => {\n const label = (own: boolean) =>\n chatMessages().messageReaction({ emoji: reaction().emoji, count: reaction().count, names: reaction().label, own });\n return (\n <Show\n when={props.onToggle}\n fallback={\n <span\n class=\"k2b-reaction-bar__chip\"\n role=\"img\"\n aria-label={label(Boolean(reaction().own))}\n aria-busy={reaction().busy ? \"true\" : undefined}\n data-own={reaction().own ? \"\" : undefined}\n data-reaction-key={key}\n data-gesture-ignore\n >\n <span aria-hidden=\"true\">{reaction().emoji}</span>\n <span aria-hidden=\"true\">{reaction().count}</span>\n </span>\n }\n >\n {(toggle) => (\n <button\n type=\"button\"\n class=\"k2b-reaction-bar__chip\"\n aria-pressed={reaction().own ? \"true\" : \"false\"}\n aria-label={label(false)}\n aria-busy={reaction().busy ? \"true\" : undefined}\n data-own={reaction().own ? \"\" : undefined}\n data-reaction-key={key}\n onClick={() => toggle()(key)}\n >\n <span aria-hidden=\"true\">{reaction().emoji}</span>\n <span aria-hidden=\"true\">{reaction().count}</span>\n </button>\n )}\n </Show>\n );\n };\n const chips = () => <For each={keys()}>{(key) => <Show when={byKey().get(key)}>{(reaction) => chip(key, reaction)}</Show>}</For>;\n\n return (\n <div\n ref={root}\n class={props.class ? `k2b-reaction-bar ${props.class}` : \"k2b-reaction-bar\"}\n role=\"group\"\n aria-label={chatMessages().messageReactions}\n data-density={props.density ?? \"default\"}\n data-overflow={overflow()}\n data-add={props.onAdd ? (props.add ?? \"always\") : undefined}\n data-empty={props.reactions.length === 0 ? \"\" : undefined}\n >\n <Show when={overflow() === \"scroll\"} fallback={<div class=\"k2b-reaction-bar__list\">{chips()}</div>}>\n <Show when={shown().length > 0}>\n <ScrollArea orientation=\"horizontal\" class=\"k2b-reaction-bar__scroll\" tabindex={props.onToggle ? undefined : 0}>\n {chips()}\n </ScrollArea>\n </Show>\n </Show>\n <Show when={more() > 0}>\n <span class=\"k2b-reaction-bar__more\">\n <span aria-hidden=\"true\">+{more()}</span>\n <span class=\"k2b-sr-only\">{props.moreLabel?.(more()) ?? chatMessages().moreReactions({ count: more() })}</span>\n </span>\n </Show>\n <Show when={props.onAdd}>\n {(add) => (\n <span class={`k2b-reaction-bar__add${props.add === \"progressive\" ? \" k2b-progressive-action\" : \"\"}`}>\n <IconButton\n label={chatMessages().messageAddReaction}\n size=\"xs\"\n class=\"k2b-reaction-bar__add-button\"\n onClick={(event) => add()(event.currentTarget)}\n >\n <i class=\"ti ti-mood-plus\" aria-hidden=\"true\" />\n </IconButton>\n </span>\n )}\n </Show>\n <span\n ref={surface}\n class=\"k2b-tooltip k2b-reaction-bar__hint\"\n popover=\"manual\"\n role=\"tooltip\"\n aria-hidden=\"true\"\n data-touch={touch() ? \"\" : undefined}\n >\n {hint()}\n </span>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,162 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
3
+ import { spread as _$spread } from "solid-js/web";
4
+ import { mergeProps as _$mergeProps } from "solid-js/web";
5
+ import { className as _$className } from "solid-js/web";
6
+ import { effect as _$effect } from "solid-js/web";
7
+ import { getNextElement as _$getNextElement } from "solid-js/web";
8
+ import { insert as _$insert } from "solid-js/web";
9
+ import { createComponent as _$createComponent } from "solid-js/web";
10
+ import { memo as _$memo } from "solid-js/web";
11
+ var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-sr-only>`),
12
+ _tmpl$2 = /*#__PURE__*/_$template(`<span aria-hidden=true>`),
13
+ _tmpl$3 = /*#__PURE__*/_$template(`<span class=k2b-reference__avatar aria-hidden=true>`),
14
+ _tmpl$4 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
15
+ _tmpl$5 = /*#__PURE__*/_$template(`<span>`),
16
+ _tmpl$6 = /*#__PURE__*/_$template(`<time>`),
17
+ _tmpl$7 = /*#__PURE__*/_$template(`<a>`);
18
+ import { Show } from "solid-js";
19
+ import { Avatar } from "../surfaces/Avatar";
20
+
21
+ /** The visible length of a chip; longer titles are cut in the middle. */
22
+ export const REFERENCE_CHIP_MAX_CHARACTERS = 40;
23
+ const graphemes = text => typeof Intl.Segmenter === "function" ? Array.from(new Intl.Segmenter(undefined, {
24
+ granularity: "grapheme"
25
+ }).segment(text), part => part.segment) : Array.from(text);
26
+
27
+ /**
28
+ * Shortens `text` to at most `max` visible characters by cutting its middle, so the start and an ending such as
29
+ * ".pdf" stay readable. Counts user-perceived characters, so an emoji is never split.
30
+ * @example truncateMiddle("Quarterly report for the operations team 2026.pdf", 24) // "Quarterly re…m 2026.pdf"
31
+ */
32
+ export const truncateMiddle = (text, max = REFERENCE_CHIP_MAX_CHARACTERS) => {
33
+ const characters = graphemes(text);
34
+ if (characters.length <= max) return text;
35
+ if (max < 2) return "…";
36
+ const tail = Math.floor((max - 1) / 2);
37
+ const head = max - 1 - tail;
38
+ return `${characters.slice(0, head).join("").trimEnd()}…${characters.slice(characters.length - tail).join("").trimStart()}`;
39
+ };
40
+
41
+ /** A thing or a place: an icon in its application colour and its title, a link while it exists. */
42
+
43
+ /** A person: avatar and display name. The address belongs in the preview, never in the chip. */
44
+
45
+ /** A date or time the host already formatted for the reader. */
46
+
47
+ const fullText = props => props.kind === "person" ? props.name : props.kind === "time" ? props.label : props.title;
48
+
49
+ /**
50
+ * A typed reference inside a sentence: a thing, a place, a person, or a time, in the calm `.k2b-reference` pill.
51
+ * A chip shows at most 40 characters and cuts longer titles in the middle; the full title stays its accessible name
52
+ * and tooltip.
53
+ * @example <ReferenceChip kind="object" title="Maintenance window" icon="ti ti-mail" accent="var(--app-mail)" href="/mail/…" />
54
+ */
55
+ export function ReferenceChip(props) {
56
+ const full = () => fullText(props);
57
+ const visible = () => truncateMiddle(full());
58
+ const cut = () => visible() !== full();
59
+ const gone = () => props.kind !== "person" && props.kind !== "time" && props.gone === true;
60
+ const href = () => gone() || props.kind === "time" ? undefined : props.href;
61
+ const accent = () => props.kind === "object" || props.kind === "place" ? props.accent : undefined;
62
+ const icon = () => props.kind === "time" ? "ti ti-clock" : props.kind === "object" || props.kind === "place" ? props.icon : undefined;
63
+ const content = () => [_$createComponent(Show, {
64
+ get when() {
65
+ return props.kind === "person" ? props : undefined;
66
+ },
67
+ children: person => (() => {
68
+ var _el$3 = _$getNextElement(_tmpl$3);
69
+ _$insert(_el$3, _$createComponent(Avatar, {
70
+ get name() {
71
+ return person().name;
72
+ },
73
+ get src() {
74
+ return person().src;
75
+ },
76
+ size: "xs"
77
+ }));
78
+ return _el$3;
79
+ })()
80
+ }), _$createComponent(Show, {
81
+ get when() {
82
+ return icon();
83
+ },
84
+ children: name => (() => {
85
+ var _el$4 = _$getNextElement(_tmpl$4);
86
+ _$effect(() => _$className(_el$4, `k2b-reference__icon ${name()}`));
87
+ return _el$4;
88
+ })()
89
+ }), _$createComponent(Show, {
90
+ get when() {
91
+ return cut();
92
+ },
93
+ get fallback() {
94
+ return full();
95
+ },
96
+ get children() {
97
+ return [(() => {
98
+ var _el$ = _$getNextElement(_tmpl$);
99
+ _$insert(_el$, full);
100
+ return _el$;
101
+ })(), (() => {
102
+ var _el$2 = _$getNextElement(_tmpl$2);
103
+ _$insert(_el$2, visible);
104
+ return _el$2;
105
+ })()];
106
+ }
107
+ })];
108
+ const shared = () => ({
109
+ class: `k2b-reference k2b-reference-chip${props.class ? ` ${props.class}` : ""}`,
110
+ "data-kind": props.kind,
111
+ "data-gone": gone() ? "true" : undefined,
112
+ title: cut() ? full() : undefined,
113
+ style: accent() ? {
114
+ "--k2b-reference-icon": accent()
115
+ } : undefined
116
+ });
117
+ return _$createComponent(Show, {
118
+ get when() {
119
+ return href();
120
+ },
121
+ get fallback() {
122
+ return _$createComponent(Show, {
123
+ get when() {
124
+ return props.kind === "time" ? props : undefined;
125
+ },
126
+ get fallback() {
127
+ return (() => {
128
+ var _el$5 = _$getNextElement(_tmpl$5);
129
+ _$spread(_el$5, _$mergeProps(shared), false, true);
130
+ _$insert(_el$5, content);
131
+ _$runHydrationEvents();
132
+ return _el$5;
133
+ })();
134
+ },
135
+ children: time => (() => {
136
+ var _el$6 = _$getNextElement(_tmpl$6);
137
+ _$spread(_el$6, _$mergeProps(shared, {
138
+ get dateTime() {
139
+ return time().dateTime;
140
+ }
141
+ }), false, true);
142
+ _$insert(_el$6, content);
143
+ _$runHydrationEvents();
144
+ return _el$6;
145
+ })()
146
+ });
147
+ },
148
+ children: link => (() => {
149
+ var _el$7 = _$getNextElement(_tmpl$7);
150
+ _$spread(_el$7, _$mergeProps(shared, {
151
+ get href() {
152
+ return link();
153
+ }
154
+ }), false, true);
155
+ _$insert(_el$7, content);
156
+ _$runHydrationEvents();
157
+ return _el$7;
158
+ })()
159
+ });
160
+ }
161
+ export default ReferenceChip;
162
+ //# sourceMappingURL=ReferenceChip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/ReferenceChip.tsx"],"sourcesContent":["import { type JSX, Show } from \"solid-js\";\nimport { Avatar } from \"../surfaces/Avatar\";\n\n/** The visible length of a chip; longer titles are cut in the middle. */\nexport const REFERENCE_CHIP_MAX_CHARACTERS = 40;\n\nconst graphemes = (text: string): string[] =>\n typeof Intl.Segmenter === \"function\"\n ? Array.from(new Intl.Segmenter(undefined, { granularity: \"grapheme\" }).segment(text), (part) => part.segment)\n : Array.from(text);\n\n/**\n * Shortens `text` to at most `max` visible characters by cutting its middle, so the start and an ending such as\n * \".pdf\" stay readable. Counts user-perceived characters, so an emoji is never split.\n * @example truncateMiddle(\"Quarterly report for the operations team 2026.pdf\", 24) // \"Quarterly re…m 2026.pdf\"\n */\nexport const truncateMiddle = (text: string, max: number = REFERENCE_CHIP_MAX_CHARACTERS): string => {\n const characters = graphemes(text);\n if (characters.length <= max) return text;\n if (max < 2) return \"…\";\n const tail = Math.floor((max - 1) / 2);\n const head = max - 1 - tail;\n return `${characters.slice(0, head).join(\"\").trimEnd()}…${characters\n .slice(characters.length - tail)\n .join(\"\")\n .trimStart()}`;\n};\n\ntype ReferenceChipCommon = {\n class?: string;\n};\n\n/** A thing or a place: an icon in its application colour and its title, a link while it exists. */\nexport type ReferenceChipObjectProps = ReferenceChipCommon & {\n kind: \"object\" | \"place\";\n title: string;\n /** Destination of the chip. Omit it, or set `gone`, when there is nothing to open. */\n href?: string;\n /** Icon class, for example `ti ti-mail`. */\n icon?: string;\n /** Icon colour, usually the owning application's accent. Sets `--k2b-reference-icon`. */\n accent?: string;\n /** The thing no longer exists: struck through and never a link. */\n gone?: boolean;\n};\n\n/** A person: avatar and display name. The address belongs in the preview, never in the chip. */\nexport type ReferenceChipPersonProps = ReferenceChipCommon & {\n kind: \"person\";\n name: string;\n /** Avatar image; initials on a tint from the name otherwise. */\n src?: string | null;\n href?: string;\n};\n\n/** A date or time the host already formatted for the reader. */\nexport type ReferenceChipTimeProps = ReferenceChipCommon & {\n kind: \"time\";\n label: string;\n /** Machine-readable value for `<time datetime>`. */\n dateTime?: string;\n};\n\nexport type ReferenceChipProps = ReferenceChipObjectProps | ReferenceChipPersonProps | ReferenceChipTimeProps;\n\nconst fullText = (props: ReferenceChipProps): string =>\n props.kind === \"person\" ? props.name : props.kind === \"time\" ? props.label : props.title;\n\n/**\n * A typed reference inside a sentence: a thing, a place, a person, or a time, in the calm `.k2b-reference` pill.\n * A chip shows at most 40 characters and cuts longer titles in the middle; the full title stays its accessible name\n * and tooltip.\n * @example <ReferenceChip kind=\"object\" title=\"Maintenance window\" icon=\"ti ti-mail\" accent=\"var(--app-mail)\" href=\"/mail/…\" />\n */\nexport function ReferenceChip(props: ReferenceChipProps): JSX.Element {\n const full = () => fullText(props);\n const visible = () => truncateMiddle(full());\n const cut = () => visible() !== full();\n const gone = () => props.kind !== \"person\" && props.kind !== \"time\" && props.gone === true;\n const href = () => (gone() || props.kind === \"time\" ? undefined : props.href);\n const accent = () => (props.kind === \"object\" || props.kind === \"place\" ? props.accent : undefined);\n const icon = () => (props.kind === \"time\" ? \"ti ti-clock\" : props.kind === \"object\" || props.kind === \"place\" ? props.icon : undefined);\n\n const content = () => (\n <>\n <Show when={props.kind === \"person\" ? props : undefined}>\n {(person) => (\n <span class=\"k2b-reference__avatar\" aria-hidden=\"true\">\n <Avatar name={person().name} src={person().src} size=\"xs\" />\n </span>\n )}\n </Show>\n <Show when={icon()}>{(name) => <i class={`k2b-reference__icon ${name()}`} aria-hidden=\"true\" />}</Show>\n <Show when={cut()} fallback={full()}>\n <span class=\"k2b-sr-only\">{full()}</span>\n <span aria-hidden=\"true\">{visible()}</span>\n </Show>\n </>\n );\n\n const shared = () => ({\n class: `k2b-reference k2b-reference-chip${props.class ? ` ${props.class}` : \"\"}`,\n \"data-kind\": props.kind,\n \"data-gone\": gone() ? \"true\" : undefined,\n title: cut() ? full() : undefined,\n style: accent() ? { \"--k2b-reference-icon\": accent() } : undefined,\n });\n\n return (\n <Show\n when={href()}\n fallback={\n <Show when={props.kind === \"time\" ? props : undefined} fallback={<span {...shared()}>{content()}</span>}>\n {(time) => (\n <time {...shared()} dateTime={time().dateTime}>\n {content()}\n </time>\n )}\n </Show>\n }\n >\n {(link) => (\n <a {...shared()} href={link()}>\n {content()}\n </a>\n )}\n </Show>\n );\n}\n\nexport default ReferenceChip;\n"],"mappings":"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","ignoreList":[]}