@elizaos/ui 2.0.0-alpha.17 → 2.0.0-alpha.170

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 (439) hide show
  1. package/package.json +76 -49
  2. package/packages/ui/src/components/composites/chat/chat-attachment-strip.d.ts +9 -0
  3. package/packages/ui/src/components/composites/chat/chat-attachment-strip.d.ts.map +1 -0
  4. package/packages/ui/src/components/composites/chat/chat-attachment-strip.js +8 -0
  5. package/packages/ui/src/components/composites/chat/chat-bubble.d.ts +14 -0
  6. package/packages/ui/src/components/composites/chat/chat-bubble.d.ts.map +1 -0
  7. package/packages/ui/src/components/composites/chat/chat-bubble.js +14 -0
  8. package/packages/ui/src/components/composites/chat/chat-composer-shell.d.ts +10 -0
  9. package/packages/ui/src/components/composites/chat/chat-composer-shell.d.ts.map +1 -0
  10. package/packages/ui/src/components/composites/chat/chat-composer-shell.js +16 -0
  11. package/packages/ui/src/components/composites/chat/chat-composer.d.ts +39 -0
  12. package/packages/ui/src/components/composites/chat/chat-composer.d.ts.map +1 -0
  13. package/packages/ui/src/components/composites/chat/chat-composer.js +148 -0
  14. package/packages/ui/src/components/composites/chat/chat-conversation-item.d.ts +21 -0
  15. package/packages/ui/src/components/composites/chat/chat-conversation-item.d.ts.map +1 -0
  16. package/packages/ui/src/components/composites/chat/chat-conversation-item.js +120 -0
  17. package/packages/ui/src/components/composites/chat/chat-conversation-rename-dialog.d.ts +22 -0
  18. package/packages/ui/src/components/composites/chat/chat-conversation-rename-dialog.d.ts.map +1 -0
  19. package/packages/ui/src/components/composites/chat/chat-conversation-rename-dialog.js +14 -0
  20. package/packages/ui/src/components/composites/chat/chat-empty-state.d.ts +19 -0
  21. package/packages/ui/src/components/composites/chat/chat-empty-state.d.ts.map +1 -0
  22. package/packages/ui/src/components/composites/chat/chat-empty-state.js +8 -0
  23. package/packages/ui/src/components/composites/chat/chat-message-actions.d.ts +14 -0
  24. package/packages/ui/src/components/composites/chat/chat-message-actions.d.ts.map +1 -0
  25. package/packages/ui/src/components/composites/chat/chat-message-actions.js +10 -0
  26. package/packages/ui/src/components/composites/chat/chat-message.d.ts +18 -0
  27. package/packages/ui/src/components/composites/chat/chat-message.d.ts.map +1 -0
  28. package/packages/ui/src/components/composites/chat/chat-message.js +275 -0
  29. package/packages/ui/src/components/composites/chat/chat-sidebar.d.ts +54 -0
  30. package/packages/ui/src/components/composites/chat/chat-sidebar.d.ts.map +1 -0
  31. package/packages/ui/src/components/composites/chat/chat-sidebar.js +64 -0
  32. package/packages/ui/src/components/composites/chat/chat-source.d.ts +19 -0
  33. package/packages/ui/src/components/composites/chat/chat-source.d.ts.map +1 -0
  34. package/packages/ui/src/components/composites/chat/chat-source.js +127 -0
  35. package/packages/ui/src/components/composites/chat/chat-thread-layout.d.ts +18 -0
  36. package/packages/ui/src/components/composites/chat/chat-thread-layout.d.ts.map +1 -0
  37. package/packages/ui/src/components/composites/chat/chat-thread-layout.js +28 -0
  38. package/packages/ui/src/components/composites/chat/chat-transcript.d.ts +19 -0
  39. package/packages/ui/src/components/composites/chat/chat-transcript.d.ts.map +1 -0
  40. package/packages/ui/src/components/composites/chat/chat-transcript.js +82 -0
  41. package/packages/ui/src/components/composites/chat/chat-types.d.ts +90 -0
  42. package/packages/ui/src/components/composites/chat/chat-types.d.ts.map +1 -0
  43. package/packages/ui/src/components/composites/chat/chat-types.js +1 -0
  44. package/packages/ui/src/components/composites/chat/chat-typing-indicator.d.ts +10 -0
  45. package/packages/ui/src/components/composites/chat/chat-typing-indicator.d.ts.map +1 -0
  46. package/packages/ui/src/components/composites/chat/chat-typing-indicator.js +11 -0
  47. package/packages/ui/src/components/composites/chat/create-task-popover.d.ts +8 -0
  48. package/packages/ui/src/components/composites/chat/create-task-popover.d.ts.map +1 -0
  49. package/packages/ui/src/components/composites/chat/create-task-popover.js +44 -0
  50. package/packages/ui/src/components/composites/chat/index.d.ts +17 -0
  51. package/packages/ui/src/components/composites/chat/index.d.ts.map +1 -0
  52. package/packages/ui/src/components/composites/chat/index.js +16 -0
  53. package/packages/ui/src/components/composites/form-field/form-field.d.ts +14 -0
  54. package/packages/ui/src/components/composites/form-field/form-field.d.ts.map +1 -0
  55. package/packages/ui/src/components/composites/form-field/form-field.js +8 -0
  56. package/packages/ui/src/components/composites/form-field/index.d.ts +2 -0
  57. package/packages/ui/src/components/composites/form-field/index.d.ts.map +1 -0
  58. package/packages/ui/src/components/composites/form-field/index.js +1 -0
  59. package/packages/ui/src/components/composites/index.d.ts +27 -0
  60. package/packages/ui/src/components/composites/index.d.ts.map +1 -0
  61. package/packages/ui/src/components/composites/index.js +26 -0
  62. package/packages/ui/src/components/composites/page-panel/index.d.ts +29 -0
  63. package/packages/ui/src/components/composites/page-panel/index.d.ts.map +1 -0
  64. package/packages/ui/src/components/composites/page-panel/index.js +28 -0
  65. package/packages/ui/src/components/composites/page-panel/page-panel-collapsible-section.d.ts +4 -0
  66. package/packages/ui/src/components/composites/page-panel/page-panel-collapsible-section.d.ts.map +1 -0
  67. package/packages/ui/src/components/composites/page-panel/page-panel-collapsible-section.js +60 -0
  68. package/packages/ui/src/components/composites/page-panel/page-panel-empty.d.ts +3 -0
  69. package/packages/ui/src/components/composites/page-panel/page-panel-empty.d.ts.map +1 -0
  70. package/packages/ui/src/components/composites/page-panel/page-panel-empty.js +15 -0
  71. package/packages/ui/src/components/composites/page-panel/page-panel-frame.d.ts +5 -0
  72. package/packages/ui/src/components/composites/page-panel/page-panel-frame.d.ts.map +1 -0
  73. package/packages/ui/src/components/composites/page-panel/page-panel-frame.js +9 -0
  74. package/packages/ui/src/components/composites/page-panel/page-panel-header.d.ts +7 -0
  75. package/packages/ui/src/components/composites/page-panel/page-panel-header.d.ts.map +1 -0
  76. package/packages/ui/src/components/composites/page-panel/page-panel-header.js +30 -0
  77. package/packages/ui/src/components/composites/page-panel/page-panel-loading.d.ts +3 -0
  78. package/packages/ui/src/components/composites/page-panel/page-panel-loading.d.ts.map +1 -0
  79. package/packages/ui/src/components/composites/page-panel/page-panel-loading.js +13 -0
  80. package/packages/ui/src/components/composites/page-panel/page-panel-root.d.ts +7 -0
  81. package/packages/ui/src/components/composites/page-panel/page-panel-root.d.ts.map +1 -0
  82. package/packages/ui/src/components/composites/page-panel/page-panel-root.js +17 -0
  83. package/packages/ui/src/components/composites/page-panel/page-panel-toolbar.d.ts +4 -0
  84. package/packages/ui/src/components/composites/page-panel/page-panel-toolbar.d.ts.map +1 -0
  85. package/packages/ui/src/components/composites/page-panel/page-panel-toolbar.js +6 -0
  86. package/packages/ui/src/components/composites/page-panel/page-panel-types.d.ts +66 -0
  87. package/packages/ui/src/components/composites/page-panel/page-panel-types.d.ts.map +1 -0
  88. package/packages/ui/src/components/composites/page-panel/page-panel-types.js +1 -0
  89. package/packages/ui/src/components/composites/search/index.d.ts +3 -0
  90. package/packages/ui/src/components/composites/search/index.d.ts.map +1 -0
  91. package/packages/ui/src/components/composites/search/index.js +2 -0
  92. package/packages/ui/src/components/composites/search/search-input.d.ts.map +1 -0
  93. package/{dist/components/ui → packages/ui/src/components/composites/search}/search-input.js +3 -2
  94. package/{dist/components/ui/search-bar.d.ts → packages/ui/src/components/composites/search/searchbar.d.ts} +8 -7
  95. package/packages/ui/src/components/composites/search/searchbar.d.ts.map +1 -0
  96. package/packages/ui/src/components/composites/search/searchbar.js +25 -0
  97. package/packages/ui/src/components/composites/sidebar/index.d.ts +11 -0
  98. package/packages/ui/src/components/composites/sidebar/index.d.ts.map +1 -0
  99. package/packages/ui/src/components/composites/sidebar/index.js +10 -0
  100. package/packages/ui/src/components/composites/sidebar/sidebar-auto-rail.d.ts +15 -0
  101. package/packages/ui/src/components/composites/sidebar/sidebar-auto-rail.d.ts.map +1 -0
  102. package/packages/ui/src/components/composites/sidebar/sidebar-auto-rail.js +292 -0
  103. package/packages/ui/src/components/composites/sidebar/sidebar-body.d.ts +4 -0
  104. package/packages/ui/src/components/composites/sidebar/sidebar-body.d.ts.map +1 -0
  105. package/packages/ui/src/components/composites/sidebar/sidebar-body.js +7 -0
  106. package/packages/ui/src/components/composites/sidebar/sidebar-collapsed-rail.d.ts +11 -0
  107. package/packages/ui/src/components/composites/sidebar/sidebar-collapsed-rail.d.ts.map +1 -0
  108. package/packages/ui/src/components/composites/sidebar/sidebar-collapsed-rail.js +13 -0
  109. package/packages/ui/src/components/composites/sidebar/sidebar-content.d.ts +78 -0
  110. package/packages/ui/src/components/composites/sidebar/sidebar-content.d.ts.map +1 -0
  111. package/packages/ui/src/components/composites/sidebar/sidebar-content.js +98 -0
  112. package/packages/ui/src/components/composites/sidebar/sidebar-filter-bar.d.ts +3 -0
  113. package/packages/ui/src/components/composites/sidebar/sidebar-filter-bar.d.ts.map +1 -0
  114. package/packages/ui/src/components/composites/sidebar/sidebar-filter-bar.js +14 -0
  115. package/packages/ui/src/components/composites/sidebar/sidebar-header-stack.d.ts +3 -0
  116. package/packages/ui/src/components/composites/sidebar/sidebar-header-stack.d.ts.map +1 -0
  117. package/packages/ui/src/components/composites/sidebar/sidebar-header-stack.js +6 -0
  118. package/packages/ui/src/components/composites/sidebar/sidebar-header.d.ts +9 -0
  119. package/packages/ui/src/components/composites/sidebar/sidebar-header.d.ts.map +1 -0
  120. package/packages/ui/src/components/composites/sidebar/sidebar-header.js +6 -0
  121. package/packages/ui/src/components/composites/sidebar/sidebar-panel.d.ts +3 -0
  122. package/packages/ui/src/components/composites/sidebar/sidebar-panel.d.ts.map +1 -0
  123. package/packages/ui/src/components/composites/sidebar/sidebar-panel.js +18 -0
  124. package/packages/ui/src/components/composites/sidebar/sidebar-root.d.ts +4 -0
  125. package/packages/ui/src/components/composites/sidebar/sidebar-root.d.ts.map +1 -0
  126. package/packages/ui/src/components/composites/sidebar/sidebar-root.js +448 -0
  127. package/packages/ui/src/components/composites/sidebar/sidebar-scroll-region.d.ts +3 -0
  128. package/packages/ui/src/components/composites/sidebar/sidebar-scroll-region.d.ts.map +1 -0
  129. package/packages/ui/src/components/composites/sidebar/sidebar-scroll-region.js +18 -0
  130. package/packages/ui/src/components/composites/sidebar/sidebar-types.d.ts +59 -0
  131. package/packages/ui/src/components/composites/sidebar/sidebar-types.d.ts.map +1 -0
  132. package/packages/ui/src/components/composites/sidebar/sidebar-types.js +1 -0
  133. package/packages/ui/src/components/composites/skills/index.d.ts +2 -0
  134. package/packages/ui/src/components/composites/skills/index.d.ts.map +1 -0
  135. package/packages/ui/src/components/composites/skills/index.js +1 -0
  136. package/packages/ui/src/components/composites/skills/skill-sidebar-item.d.ts +16 -0
  137. package/packages/ui/src/components/composites/skills/skill-sidebar-item.d.ts.map +1 -0
  138. package/packages/ui/src/components/composites/skills/skill-sidebar-item.js +7 -0
  139. package/packages/ui/src/components/composites/trajectories/index.d.ts +5 -0
  140. package/packages/ui/src/components/composites/trajectories/index.d.ts.map +1 -0
  141. package/packages/ui/src/components/composites/trajectories/index.js +4 -0
  142. package/packages/ui/src/components/composites/trajectories/trajectory-code-block.d.ts +13 -0
  143. package/packages/ui/src/components/composites/trajectories/trajectory-code-block.d.ts.map +1 -0
  144. package/packages/ui/src/components/composites/trajectories/trajectory-code-block.js +13 -0
  145. package/packages/ui/src/components/composites/trajectories/trajectory-llm-call-card.d.ts +34 -0
  146. package/packages/ui/src/components/composites/trajectories/trajectory-llm-call-card.d.ts.map +1 -0
  147. package/packages/ui/src/components/composites/trajectories/trajectory-llm-call-card.js +14 -0
  148. package/packages/ui/src/components/composites/trajectories/trajectory-pipeline-graph.d.ts +26 -0
  149. package/packages/ui/src/components/composites/trajectories/trajectory-pipeline-graph.d.ts.map +1 -0
  150. package/packages/ui/src/components/composites/trajectories/trajectory-pipeline-graph.js +46 -0
  151. package/packages/ui/src/components/composites/trajectories/trajectory-sidebar-item.d.ts +15 -0
  152. package/packages/ui/src/components/composites/trajectories/trajectory-sidebar-item.d.ts.map +1 -0
  153. package/packages/ui/src/components/composites/trajectories/trajectory-sidebar-item.js +8 -0
  154. package/packages/ui/src/components/primitives/index.d.ts +26 -0
  155. package/packages/ui/src/components/primitives/index.d.ts.map +1 -0
  156. package/packages/ui/src/components/primitives/index.js +25 -0
  157. package/packages/ui/src/components/ui/admin-dialog.d.ts +50 -0
  158. package/packages/ui/src/components/ui/admin-dialog.d.ts.map +1 -0
  159. package/packages/ui/src/components/ui/admin-dialog.js +48 -0
  160. package/{dist → packages/ui/src}/components/ui/badge.d.ts +1 -1
  161. package/packages/ui/src/components/ui/badge.d.ts.map +1 -0
  162. package/packages/ui/src/components/ui/banner.d.ts.map +1 -0
  163. package/{dist → packages/ui/src}/components/ui/banner.js +2 -1
  164. package/{dist → packages/ui/src}/components/ui/button.d.ts +1 -1
  165. package/packages/ui/src/components/ui/button.d.ts.map +1 -0
  166. package/packages/ui/src/components/ui/button.js +39 -0
  167. package/{dist → packages/ui/src}/components/ui/card.d.ts +8 -2
  168. package/packages/ui/src/components/ui/card.d.ts.map +1 -0
  169. package/{dist → packages/ui/src}/components/ui/card.js +17 -2
  170. package/packages/ui/src/components/ui/checkbox.d.ts.map +1 -0
  171. package/packages/ui/src/components/ui/confirm-delete.d.ts +20 -0
  172. package/packages/ui/src/components/ui/confirm-delete.d.ts.map +1 -0
  173. package/packages/ui/src/components/ui/confirm-delete.js +16 -0
  174. package/packages/ui/src/components/ui/confirm-dialog.d.ts +49 -0
  175. package/packages/ui/src/components/ui/confirm-dialog.d.ts.map +1 -0
  176. package/packages/ui/src/components/ui/confirm-dialog.js +90 -0
  177. package/{dist → packages/ui/src}/components/ui/connection-status.d.ts +6 -0
  178. package/packages/ui/src/components/ui/connection-status.d.ts.map +1 -0
  179. package/packages/ui/src/components/ui/connection-status.js +25 -0
  180. package/packages/ui/src/components/ui/copy-button.d.ts.map +1 -0
  181. package/{dist → packages/ui/src}/components/ui/dialog.d.ts +6 -1
  182. package/packages/ui/src/components/ui/dialog.d.ts.map +1 -0
  183. package/packages/ui/src/components/ui/dialog.js +23 -0
  184. package/packages/ui/src/components/ui/drawer-sheet.d.ts +19 -0
  185. package/packages/ui/src/components/ui/drawer-sheet.d.ts.map +1 -0
  186. package/packages/ui/src/components/ui/drawer-sheet.js +21 -0
  187. package/packages/ui/src/components/ui/dropdown-menu.d.ts.map +1 -0
  188. package/{dist → packages/ui/src}/components/ui/dropdown-menu.js +1 -1
  189. package/packages/ui/src/components/ui/empty-state.d.ts.map +1 -0
  190. package/{dist → packages/ui/src}/components/ui/error-boundary.d.ts +5 -1
  191. package/packages/ui/src/components/ui/error-boundary.d.ts.map +1 -0
  192. package/{dist → packages/ui/src}/components/ui/error-boundary.js +1 -1
  193. package/packages/ui/src/components/ui/field-switch.d.ts +8 -0
  194. package/packages/ui/src/components/ui/field-switch.d.ts.map +1 -0
  195. package/packages/ui/src/components/ui/field-switch.js +10 -0
  196. package/packages/ui/src/components/ui/field.d.ts +11 -0
  197. package/packages/ui/src/components/ui/field.d.ts.map +1 -0
  198. package/packages/ui/src/components/ui/field.js +21 -0
  199. package/packages/ui/src/components/ui/form-select.d.ts +13 -0
  200. package/packages/ui/src/components/ui/form-select.d.ts.map +1 -0
  201. package/packages/ui/src/components/ui/form-select.js +9 -0
  202. package/{dist → packages/ui/src}/components/ui/grid.d.ts +1 -1
  203. package/packages/ui/src/components/ui/grid.d.ts.map +1 -0
  204. package/packages/ui/src/components/ui/input.d.ts +12 -0
  205. package/packages/ui/src/components/ui/input.d.ts.map +1 -0
  206. package/packages/ui/src/components/ui/input.js +28 -0
  207. package/packages/ui/src/components/ui/label.d.ts.map +1 -0
  208. package/packages/ui/src/components/ui/new-action-button.d.ts +7 -0
  209. package/packages/ui/src/components/ui/new-action-button.d.ts.map +1 -0
  210. package/packages/ui/src/components/ui/new-action-button.js +13 -0
  211. package/packages/ui/src/components/ui/popover.d.ts.map +1 -0
  212. package/packages/ui/src/components/ui/save-footer.d.ts.map +1 -0
  213. package/packages/ui/src/components/ui/save-footer.js +10 -0
  214. package/packages/ui/src/components/ui/section-card.d.ts.map +1 -0
  215. package/{dist → packages/ui/src}/components/ui/section-card.js +3 -2
  216. package/packages/ui/src/components/ui/segmented-control.d.ts +18 -0
  217. package/packages/ui/src/components/ui/segmented-control.d.ts.map +1 -0
  218. package/packages/ui/src/components/ui/segmented-control.js +10 -0
  219. package/packages/ui/src/components/ui/select.d.ts.map +1 -0
  220. package/{dist → packages/ui/src}/components/ui/select.js +7 -6
  221. package/packages/ui/src/components/ui/separator.d.ts.map +1 -0
  222. package/packages/ui/src/components/ui/settings-controls.d.ts +41 -0
  223. package/packages/ui/src/components/ui/settings-controls.d.ts.map +1 -0
  224. package/packages/ui/src/components/ui/settings-controls.js +60 -0
  225. package/packages/ui/src/components/ui/skeleton.d.ts.map +1 -0
  226. package/{dist → packages/ui/src}/components/ui/skeleton.js +1 -2
  227. package/packages/ui/src/components/ui/slider.d.ts.map +1 -0
  228. package/{dist → packages/ui/src}/components/ui/slider.js +1 -1
  229. package/packages/ui/src/components/ui/sonner.d.ts +2 -0
  230. package/packages/ui/src/components/ui/sonner.d.ts.map +1 -0
  231. package/packages/ui/src/components/ui/sonner.js +1 -0
  232. package/packages/ui/src/components/ui/spinner.d.ts.map +1 -0
  233. package/{dist → packages/ui/src}/components/ui/stack.d.ts +1 -1
  234. package/packages/ui/src/components/ui/stack.d.ts.map +1 -0
  235. package/{dist → packages/ui/src}/components/ui/status-badge.d.ts +11 -4
  236. package/packages/ui/src/components/ui/status-badge.d.ts.map +1 -0
  237. package/packages/ui/src/components/ui/status-badge.js +70 -0
  238. package/packages/ui/src/components/ui/switch.d.ts.map +1 -0
  239. package/packages/ui/src/components/ui/switch.js +7 -0
  240. package/packages/ui/src/components/ui/tabs.d.ts.map +1 -0
  241. package/{dist → packages/ui/src}/components/ui/tabs.js +1 -1
  242. package/packages/ui/src/components/ui/tag-editor.d.ts +12 -0
  243. package/packages/ui/src/components/ui/tag-editor.d.ts.map +1 -0
  244. package/packages/ui/src/components/ui/tag-editor.js +34 -0
  245. package/packages/ui/src/components/ui/tag-input.d.ts +3 -0
  246. package/packages/ui/src/components/ui/tag-input.d.ts.map +1 -0
  247. package/packages/ui/src/components/ui/tag-input.js +1 -0
  248. package/packages/ui/src/components/ui/textarea.d.ts +12 -0
  249. package/packages/ui/src/components/ui/textarea.d.ts.map +1 -0
  250. package/packages/ui/src/components/ui/textarea.js +28 -0
  251. package/{dist → packages/ui/src}/components/ui/themed-select.d.ts +3 -8
  252. package/packages/ui/src/components/ui/themed-select.d.ts.map +1 -0
  253. package/packages/ui/src/components/ui/themed-select.js +137 -0
  254. package/{dist → packages/ui/src}/components/ui/tooltip-extended.d.ts +3 -25
  255. package/packages/ui/src/components/ui/tooltip-extended.d.ts.map +1 -0
  256. package/packages/ui/src/components/ui/tooltip-extended.js +116 -0
  257. package/{dist → packages/ui/src}/components/ui/tooltip.d.ts +10 -0
  258. package/packages/ui/src/components/ui/tooltip.d.ts.map +1 -0
  259. package/packages/ui/src/components/ui/tooltip.js +13 -0
  260. package/{dist → packages/ui/src}/components/ui/typography.d.ts +2 -2
  261. package/packages/ui/src/components/ui/typography.d.ts.map +1 -0
  262. package/{dist → packages/ui/src}/components/ui/typography.js +1 -1
  263. package/packages/ui/src/hooks/index.d.ts +6 -0
  264. package/packages/ui/src/hooks/index.d.ts.map +1 -0
  265. package/packages/ui/src/hooks/index.js +5 -0
  266. package/packages/ui/src/hooks/useClickOutside.d.ts +3 -0
  267. package/packages/ui/src/hooks/useClickOutside.d.ts.map +1 -0
  268. package/packages/ui/src/hooks/useClickOutside.js +22 -0
  269. package/packages/ui/src/hooks/useDocumentVisibility.d.ts +3 -0
  270. package/packages/ui/src/hooks/useDocumentVisibility.d.ts.map +1 -0
  271. package/packages/ui/src/hooks/useDocumentVisibility.js +28 -0
  272. package/packages/ui/src/hooks/useKeyboardShortcuts.d.ts +13 -0
  273. package/packages/ui/src/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  274. package/packages/ui/src/hooks/useKeyboardShortcuts.js +34 -0
  275. package/packages/ui/src/hooks/useLinkedSidebarSelection.d.ts +16 -0
  276. package/packages/ui/src/hooks/useLinkedSidebarSelection.d.ts.map +1 -0
  277. package/packages/ui/src/hooks/useLinkedSidebarSelection.js +117 -0
  278. package/packages/ui/src/hooks/useTimeout.d.ts +5 -0
  279. package/packages/ui/src/hooks/useTimeout.d.ts.map +1 -0
  280. package/packages/ui/src/hooks/useTimeout.js +26 -0
  281. package/packages/ui/src/index.d.ts +8 -0
  282. package/packages/ui/src/index.d.ts.map +1 -0
  283. package/packages/ui/src/index.js +7 -0
  284. package/packages/ui/src/layouts/chat-panel-layout/chat-panel-layout.d.ts +11 -0
  285. package/packages/ui/src/layouts/chat-panel-layout/chat-panel-layout.d.ts.map +1 -0
  286. package/packages/ui/src/layouts/chat-panel-layout/chat-panel-layout.js +37 -0
  287. package/packages/ui/src/layouts/chat-panel-layout/index.d.ts +2 -0
  288. package/packages/ui/src/layouts/chat-panel-layout/index.d.ts.map +1 -0
  289. package/packages/ui/src/layouts/chat-panel-layout/index.js +1 -0
  290. package/packages/ui/src/layouts/content-layout/content-layout.d.ts +21 -0
  291. package/packages/ui/src/layouts/content-layout/content-layout.d.ts.map +1 -0
  292. package/packages/ui/src/layouts/content-layout/content-layout.js +5 -0
  293. package/packages/ui/src/layouts/content-layout/index.d.ts +2 -0
  294. package/packages/ui/src/layouts/content-layout/index.d.ts.map +1 -0
  295. package/packages/ui/src/layouts/content-layout/index.js +1 -0
  296. package/packages/ui/src/layouts/index.d.ts +5 -0
  297. package/packages/ui/src/layouts/index.d.ts.map +1 -0
  298. package/packages/ui/src/layouts/index.js +4 -0
  299. package/packages/ui/src/layouts/layout-test-utils.d.ts +6 -0
  300. package/packages/ui/src/layouts/layout-test-utils.d.ts.map +1 -0
  301. package/packages/ui/src/layouts/layout-test-utils.js +36 -0
  302. package/packages/ui/src/layouts/page-layout/index.d.ts +5 -0
  303. package/packages/ui/src/layouts/page-layout/index.d.ts.map +1 -0
  304. package/packages/ui/src/layouts/page-layout/index.js +4 -0
  305. package/packages/ui/src/layouts/page-layout/page-layout-header.d.ts +5 -0
  306. package/packages/ui/src/layouts/page-layout/page-layout-header.d.ts.map +1 -0
  307. package/packages/ui/src/layouts/page-layout/page-layout-header.js +5 -0
  308. package/packages/ui/src/layouts/page-layout/page-layout-mobile-drawer.d.ts +3 -0
  309. package/packages/ui/src/layouts/page-layout/page-layout-mobile-drawer.d.ts.map +1 -0
  310. package/packages/ui/src/layouts/page-layout/page-layout-mobile-drawer.js +18 -0
  311. package/packages/ui/src/layouts/page-layout/page-layout-types.d.ts +15 -0
  312. package/packages/ui/src/layouts/page-layout/page-layout-types.d.ts.map +1 -0
  313. package/packages/ui/src/layouts/page-layout/page-layout-types.js +1 -0
  314. package/packages/ui/src/layouts/page-layout/page-layout.d.ts +3 -0
  315. package/packages/ui/src/layouts/page-layout/page-layout.d.ts.map +1 -0
  316. package/packages/ui/src/layouts/page-layout/page-layout.js +5 -0
  317. package/packages/ui/src/layouts/workspace-layout/index.d.ts +3 -0
  318. package/packages/ui/src/layouts/workspace-layout/index.d.ts.map +1 -0
  319. package/packages/ui/src/layouts/workspace-layout/index.js +2 -0
  320. package/packages/ui/src/layouts/workspace-layout/workspace-layout-types.d.ts +19 -0
  321. package/packages/ui/src/layouts/workspace-layout/workspace-layout-types.d.ts.map +1 -0
  322. package/packages/ui/src/layouts/workspace-layout/workspace-layout-types.js +1 -0
  323. package/packages/ui/src/layouts/workspace-layout/workspace-layout.d.ts +3 -0
  324. package/packages/ui/src/layouts/workspace-layout/workspace-layout.d.ts.map +1 -0
  325. package/packages/ui/src/layouts/workspace-layout/workspace-layout.js +59 -0
  326. package/packages/ui/src/lib/floating-layers.d.ts +17 -0
  327. package/packages/ui/src/lib/floating-layers.d.ts.map +1 -0
  328. package/packages/ui/src/lib/floating-layers.js +20 -0
  329. package/packages/ui/src/lib/utils.d.ts +3 -0
  330. package/packages/ui/src/lib/utils.d.ts.map +1 -0
  331. package/{dist → packages/ui/src}/lib/utils.js +0 -3
  332. package/packages/ui/src/stories/layout-story-fixtures.d.ts +14 -0
  333. package/packages/ui/src/stories/layout-story-fixtures.d.ts.map +1 -0
  334. package/packages/ui/src/stories/layout-story-fixtures.js +33 -0
  335. package/styles/theme.css +7 -0
  336. package/README.md +0 -6
  337. package/dist/components/ui/badge.d.ts.map +0 -1
  338. package/dist/components/ui/banner.d.ts.map +0 -1
  339. package/dist/components/ui/button.d.ts.map +0 -1
  340. package/dist/components/ui/button.js +0 -33
  341. package/dist/components/ui/card.d.ts.map +0 -1
  342. package/dist/components/ui/chat-atoms.d.ts +0 -26
  343. package/dist/components/ui/chat-atoms.d.ts.map +0 -1
  344. package/dist/components/ui/chat-atoms.js +0 -17
  345. package/dist/components/ui/checkbox.d.ts.map +0 -1
  346. package/dist/components/ui/confirm-delete.d.ts +0 -12
  347. package/dist/components/ui/confirm-delete.d.ts.map +0 -1
  348. package/dist/components/ui/confirm-delete.js +0 -13
  349. package/dist/components/ui/confirm-dialog.d.ts +0 -24
  350. package/dist/components/ui/confirm-dialog.d.ts.map +0 -1
  351. package/dist/components/ui/confirm-dialog.js +0 -55
  352. package/dist/components/ui/connection-status.d.ts.map +0 -1
  353. package/dist/components/ui/connection-status.js +0 -25
  354. package/dist/components/ui/copy-button.d.ts.map +0 -1
  355. package/dist/components/ui/dialog.d.ts.map +0 -1
  356. package/dist/components/ui/dialog.js +0 -22
  357. package/dist/components/ui/dropdown-menu.d.ts.map +0 -1
  358. package/dist/components/ui/empty-state.d.ts.map +0 -1
  359. package/dist/components/ui/error-boundary.d.ts.map +0 -1
  360. package/dist/components/ui/grid.d.ts.map +0 -1
  361. package/dist/components/ui/input.d.ts +0 -6
  362. package/dist/components/ui/input.d.ts.map +0 -1
  363. package/dist/components/ui/input.js +0 -8
  364. package/dist/components/ui/label.d.ts.map +0 -1
  365. package/dist/components/ui/popover.d.ts.map +0 -1
  366. package/dist/components/ui/save-footer.d.ts.map +0 -1
  367. package/dist/components/ui/save-footer.js +0 -9
  368. package/dist/components/ui/search-bar.d.ts.map +0 -1
  369. package/dist/components/ui/search-bar.js +0 -19
  370. package/dist/components/ui/search-input.d.ts.map +0 -1
  371. package/dist/components/ui/section-card.d.ts.map +0 -1
  372. package/dist/components/ui/select.d.ts.map +0 -1
  373. package/dist/components/ui/separator.d.ts.map +0 -1
  374. package/dist/components/ui/skeleton.d.ts.map +0 -1
  375. package/dist/components/ui/slider.d.ts.map +0 -1
  376. package/dist/components/ui/sonner.d.ts +0 -5
  377. package/dist/components/ui/sonner.d.ts.map +0 -1
  378. package/dist/components/ui/sonner.js +0 -15
  379. package/dist/components/ui/spinner.d.ts.map +0 -1
  380. package/dist/components/ui/stack.d.ts.map +0 -1
  381. package/dist/components/ui/status-badge.d.ts.map +0 -1
  382. package/dist/components/ui/status-badge.js +0 -41
  383. package/dist/components/ui/switch.d.ts.map +0 -1
  384. package/dist/components/ui/switch.js +0 -7
  385. package/dist/components/ui/tabs.d.ts.map +0 -1
  386. package/dist/components/ui/tag-editor.d.ts +0 -24
  387. package/dist/components/ui/tag-editor.d.ts.map +0 -1
  388. package/dist/components/ui/tag-editor.js +0 -32
  389. package/dist/components/ui/tag-input.d.ts +0 -19
  390. package/dist/components/ui/tag-input.d.ts.map +0 -1
  391. package/dist/components/ui/tag-input.js +0 -28
  392. package/dist/components/ui/textarea.d.ts +0 -6
  393. package/dist/components/ui/textarea.d.ts.map +0 -1
  394. package/dist/components/ui/textarea.js +0 -8
  395. package/dist/components/ui/themed-select.d.ts.map +0 -1
  396. package/dist/components/ui/themed-select.js +0 -57
  397. package/dist/components/ui/tooltip-extended.d.ts.map +0 -1
  398. package/dist/components/ui/tooltip-extended.js +0 -128
  399. package/dist/components/ui/tooltip.d.ts.map +0 -1
  400. package/dist/components/ui/tooltip.js +0 -10
  401. package/dist/components/ui/typography.d.ts.map +0 -1
  402. package/dist/index.d.ts +0 -42
  403. package/dist/index.d.ts.map +0 -1
  404. package/dist/index.js +0 -43
  405. package/dist/lib/button-styles.d.ts +0 -12
  406. package/dist/lib/button-styles.d.ts.map +0 -1
  407. package/dist/lib/button-styles.js +0 -11
  408. package/dist/lib/utils.d.ts +0 -6
  409. package/dist/lib/utils.d.ts.map +0 -1
  410. package/dist/package.json +0 -64
  411. package/dist/styles/theme.css +0 -193
  412. package/src/styles/theme.css +0 -193
  413. /package/{dist/components/ui → packages/ui/src/components/composites/search}/search-input.d.ts +0 -0
  414. /package/{dist → packages/ui/src}/components/ui/badge.js +0 -0
  415. /package/{dist → packages/ui/src}/components/ui/banner.d.ts +0 -0
  416. /package/{dist → packages/ui/src}/components/ui/checkbox.d.ts +0 -0
  417. /package/{dist → packages/ui/src}/components/ui/checkbox.js +0 -0
  418. /package/{dist → packages/ui/src}/components/ui/copy-button.d.ts +0 -0
  419. /package/{dist → packages/ui/src}/components/ui/copy-button.js +0 -0
  420. /package/{dist → packages/ui/src}/components/ui/dropdown-menu.d.ts +0 -0
  421. /package/{dist → packages/ui/src}/components/ui/empty-state.d.ts +0 -0
  422. /package/{dist → packages/ui/src}/components/ui/empty-state.js +0 -0
  423. /package/{dist → packages/ui/src}/components/ui/grid.js +0 -0
  424. /package/{dist → packages/ui/src}/components/ui/label.d.ts +0 -0
  425. /package/{dist → packages/ui/src}/components/ui/label.js +0 -0
  426. /package/{dist → packages/ui/src}/components/ui/popover.d.ts +0 -0
  427. /package/{dist → packages/ui/src}/components/ui/popover.js +0 -0
  428. /package/{dist → packages/ui/src}/components/ui/save-footer.d.ts +0 -0
  429. /package/{dist → packages/ui/src}/components/ui/section-card.d.ts +0 -0
  430. /package/{dist → packages/ui/src}/components/ui/select.d.ts +0 -0
  431. /package/{dist → packages/ui/src}/components/ui/separator.d.ts +0 -0
  432. /package/{dist → packages/ui/src}/components/ui/separator.js +0 -0
  433. /package/{dist → packages/ui/src}/components/ui/skeleton.d.ts +0 -0
  434. /package/{dist → packages/ui/src}/components/ui/slider.d.ts +0 -0
  435. /package/{dist → packages/ui/src}/components/ui/spinner.d.ts +0 -0
  436. /package/{dist → packages/ui/src}/components/ui/spinner.js +0 -0
  437. /package/{dist → packages/ui/src}/components/ui/stack.js +0 -0
  438. /package/{dist → packages/ui/src}/components/ui/switch.d.ts +0 -0
  439. /package/{dist → packages/ui/src}/components/ui/tabs.d.ts +0 -0
@@ -0,0 +1,22 @@
1
+ export interface ChatConversationRenameDialogProps {
2
+ cancelLabel?: string;
3
+ description: string;
4
+ inputLabel: string;
5
+ onChange: (value: string) => void;
6
+ onClose: () => void;
7
+ onSave: () => void | Promise<void>;
8
+ onSuggest?: () => void | Promise<void>;
9
+ open: boolean;
10
+ saving?: boolean;
11
+ saveLabel: string;
12
+ saveDisabled?: boolean;
13
+ savePendingLabel?: string;
14
+ suggesting?: boolean;
15
+ suggestDisabled?: boolean;
16
+ suggestLabel?: string;
17
+ suggestPendingLabel?: string;
18
+ title: string;
19
+ value: string;
20
+ }
21
+ export declare function ChatConversationRenameDialog({ cancelLabel, description, inputLabel, onChange, onClose, onSave, onSuggest, open, saving, saveLabel, savePendingLabel, saveDisabled, suggesting, suggestDisabled, suggestLabel, suggestPendingLabel, title, value, }: ChatConversationRenameDialogProps): import("react/jsx-runtime").JSX.Element;
22
+ //# sourceMappingURL=chat-conversation-rename-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-conversation-rename-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-conversation-rename-dialog.tsx"],"names":[],"mappings":"AAcA,MAAM,WAAW,iCAAiC;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,4BAA4B,CAAC,EAC3C,WAAsB,EACtB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,OAAO,EACP,MAAM,EACN,SAAS,EACT,IAAI,EACJ,MAAc,EACd,SAAS,EACT,gBAA4B,EAC5B,YAAoB,EACpB,UAAkB,EAClB,eAAuB,EACvB,YAAwB,EACxB,mBAAkC,EAClC,KAAK,EACL,KAAK,GACN,EAAE,iCAAiC,2CAyEnC"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Sparkles } from "lucide-react";
3
+ import { Button } from "../../ui/button";
4
+ import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "../../ui/dialog";
5
+ import { Input } from "../../ui/input";
6
+ import { Label } from "../../ui/label";
7
+ export function ChatConversationRenameDialog({ cancelLabel = "Cancel", description, inputLabel, onChange, onClose, onSave, onSuggest, open, saving = false, saveLabel, savePendingLabel = saveLabel, saveDisabled = false, suggesting = false, suggestDisabled = false, suggestLabel = "Suggest", suggestPendingLabel = suggestLabel, title, value, }) {
8
+ return (_jsx(Dialog, { open: open, onOpenChange: (nextOpen) => !nextOpen && onClose(), children: _jsxs(DialogContent, { "data-testid": "conv-rename-dialog", className: "max-w-md", onPointerDownOutside: onClose, children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: title }), _jsx(DialogDescription, { children: description })] }), _jsxs("div", { className: "grid gap-2 py-1", children: [_jsx(Label, { htmlFor: "conv-rename-title-input", children: inputLabel }), _jsx(Input, { id: "conv-rename-title-input", "data-testid": "conv-rename-input", value: value, onChange: (event) => onChange(event.target.value), onKeyDown: (event) => {
9
+ if (event.key === "Enter") {
10
+ event.preventDefault();
11
+ void onSave();
12
+ }
13
+ }, disabled: saveDisabled || suggestDisabled, className: "text-txt" })] }), _jsxs(DialogFooter, { className: "flex w-full flex-col-reverse gap-2 sm:flex-row sm:justify-between", children: [onSuggest ? (_jsxs(Button, { type: "button", variant: "outline", size: "sm", "data-testid": "conv-rename-suggest", className: "gap-1.5 border-border", onClick: () => void onSuggest(), disabled: suggestDisabled || saveDisabled, children: [_jsx(Sparkles, { className: "h-3.5 w-3.5 shrink-0", "aria-hidden": true }), suggesting ? suggestPendingLabel : suggestLabel] })) : (_jsx("div", {})), _jsxs("div", { className: "flex w-full justify-end gap-2 sm:w-auto", children: [_jsx(Button, { type: "button", variant: "ghost", size: "sm", "data-testid": "conv-rename-cancel", onClick: onClose, children: cancelLabel }), _jsx(Button, { type: "button", variant: "default", size: "sm", "data-testid": "conv-rename-save", onClick: () => void onSave(), disabled: saveDisabled, children: saving ? savePendingLabel : saveLabel })] })] })] }) }));
14
+ }
@@ -0,0 +1,19 @@
1
+ import type * as React from "react";
2
+ import type { ChatVariant } from "./chat-types";
3
+ export interface ChatEmptyStateProps {
4
+ action?: React.ReactNode;
5
+ agentName: string;
6
+ className?: string;
7
+ hint?: React.ReactNode;
8
+ labels?: {
9
+ chatIconLabel?: string;
10
+ sendMessageTo?: string;
11
+ startConversation?: string;
12
+ toBeginChatting?: string;
13
+ };
14
+ onSuggestionClick?: (suggestion: string) => void;
15
+ suggestions?: string[];
16
+ variant?: ChatVariant;
17
+ }
18
+ export declare function ChatEmptyState({ action, agentName, className, hint, labels, onSuggestionClick, suggestions, variant, }: ChatEmptyStateProps): import("react/jsx-runtime").JSX.Element;
19
+ //# sourceMappingURL=chat-empty-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-empty-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-empty-state.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAGpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,MAAM,CAAC,EAAE;QACP,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,SAAS,EACT,IAAI,EACJ,MAAW,EACX,iBAAiB,EACjB,WAA6E,EAC7E,OAAmB,GACpB,EAAE,mBAAmB,2CAgErB"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { cn } from "../../../lib/utils";
3
+ import { Button } from "../../ui/button";
4
+ export function ChatEmptyState({ action, agentName, className, hint, labels = {}, onSuggestionClick, suggestions = ["Hello!", "How are you?", "Tell me a joke", "Help me with..."], variant = "default", }) {
5
+ return (_jsxs("div", { className: cn("flex flex-1 flex-col items-center justify-center p-6 text-center", variant === "game-modal" &&
6
+ "min-h-full justify-end gap-4 px-2 py-4 text-left", className), children: [variant === "default" ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "mb-4 flex h-16 w-16 items-center justify-center rounded-2xl bg-accent-subtle", children: _jsxs("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "text-accent", "aria-label": labels.chatIconLabel ?? "Chat icon", children: [_jsx("title", { children: labels.chatIconLabel ?? "Chat" }), _jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })] }) }), _jsx("h3", { className: "mb-2 text-lg font-semibold text-txt-strong", children: labels.startConversation ?? "Start a Conversation" }), _jsxs("p", { className: "mb-6 max-w-sm font-[var(--font-chat)] text-sm text-muted", children: [labels.sendMessageTo ?? "Send a message to", " ", agentName, " ", labels.toBeginChatting ?? "to begin chatting."] })] })) : null, action ? _jsx("div", { className: "mb-4 flex justify-center", children: action }) : null, _jsx("div", { className: "flex flex-wrap justify-center gap-2", children: suggestions.map((suggestion) => (_jsx(Button, { variant: variant === "game-modal" ? "surface" : "outline", size: "sm", className: cn("h-7 rounded-full px-3 py-1.5 text-xs transition-colors", variant === "default" &&
7
+ "border-border bg-bg text-muted hover:border-accent hover:text-accent"), onClick: () => onSuggestionClick?.(suggestion), children: suggestion }, suggestion))) }), hint ? (_jsx("div", { className: "mt-4 max-w-sm text-xs-tight uppercase tracking-[0.16em] text-muted/74", children: hint })) : null] }));
8
+ }
@@ -0,0 +1,14 @@
1
+ import type { ChatMessageLabels } from "./chat-types";
2
+ export interface ChatMessageActionsProps {
3
+ canDelete?: boolean;
4
+ canEdit?: boolean;
5
+ canPlay?: boolean;
6
+ copied?: boolean;
7
+ labels?: ChatMessageLabels;
8
+ onCopy?: () => void;
9
+ onDelete?: () => void;
10
+ onEdit?: () => void;
11
+ onPlay?: () => void;
12
+ }
13
+ export declare function ChatMessageActions({ canDelete, canEdit, canPlay, copied, labels, onCopy, onDelete, onEdit, onPlay, }: ChatMessageActionsProps): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=chat-message-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-message-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-message-actions.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,SAAiB,EACjB,OAAe,EACf,OAAe,EACf,MAAc,EACd,MAAW,EACX,MAAM,EACN,QAAQ,EACR,MAAM,EACN,MAAM,GACP,EAAE,uBAAuB,2CA8DzB"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Check, Copy, Pencil, Trash2, Volume2 } from "lucide-react";
3
+ import { Button } from "../../ui/button";
4
+ import { PagePanel } from "../page-panel";
5
+ export function ChatMessageActions({ canDelete = false, canEdit = false, canPlay = false, copied = false, labels = {}, onCopy, onDelete, onEdit, onPlay, }) {
6
+ const copyLabel = labels.copy ?? "Copy message";
7
+ const copiedLabel = labels.copied ?? "Copied!";
8
+ const copiedAriaLabel = labels.copiedAria ?? "Copied to clipboard";
9
+ return (_jsxs(PagePanel.ActionRail, { className: "top-1 rounded-lg p-1", children: [_jsx(Button, { variant: "surface", size: "icon", onClick: onCopy, className: "h-8 w-8 rounded-lg", title: copied ? copiedLabel : copyLabel, "aria-label": copied ? copiedAriaLabel : copyLabel, children: copied ? (_jsx(Check, { className: "h-3.5 w-3.5 text-ok" })) : (_jsx(Copy, { className: "h-3.5 w-3.5" })) }), canPlay ? (_jsx(Button, { variant: "surface", size: "icon", onClick: onPlay, className: "h-8 w-8 rounded-lg", title: labels.play ?? "Play message", "aria-label": labels.play ?? "Play message", children: _jsx(Volume2, { className: "h-3.5 w-3.5" }) })) : null, canEdit ? (_jsx(Button, { variant: "surface", size: "icon", onClick: onEdit, className: "h-8 w-8 rounded-lg", title: labels.edit ?? "Edit message", "aria-label": labels.edit ?? "Edit message", children: _jsx(Pencil, { className: "h-3.5 w-3.5" }) })) : null, canDelete ? (_jsx(Button, { variant: "surfaceDestructive", size: "icon", onClick: onDelete, className: "h-8 w-8 rounded-lg", title: labels.delete ?? "Delete message", "aria-label": labels.delete ?? "Delete message", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) })) : null] }));
10
+ }
@@ -0,0 +1,18 @@
1
+ import type * as React from "react";
2
+ import type { ChatMessageData, ChatMessageLabels } from "./chat-types";
3
+ export interface ChatMessageProps {
4
+ agentName?: string;
5
+ children?: React.ReactNode;
6
+ isGrouped?: boolean;
7
+ labels?: ChatMessageLabels;
8
+ message: ChatMessageData;
9
+ onCopy?: (text: string) => void;
10
+ onDelete?: (messageId: string) => void;
11
+ onEdit?: (messageId: string, text: string) => Promise<boolean> | boolean;
12
+ onSpeak?: (messageId: string, text: string) => void;
13
+ replyTarget?: ChatMessageData | null;
14
+ userMessagesOnRight?: boolean;
15
+ }
16
+ export declare function getChatMessageAnchorId(messageId: string): string;
17
+ export declare const ChatMessage: React.NamedExoticComponent<ChatMessageProps>;
18
+ //# sourceMappingURL=chat-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-message.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-message.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAkBpC,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EAElB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACzE,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,WAAW,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhE;AA4ID,eAAO,MAAM,WAAW,8CAuXtB,CAAC"}
@@ -0,0 +1,275 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useCallback, useEffect, useRef, useState, } from "react";
3
+ import { cn } from "../../../lib/utils";
4
+ import { Button } from "../../ui/button";
5
+ import { Textarea } from "../../ui/textarea";
6
+ import { ChatBubble } from "./chat-bubble";
7
+ import { ChatMessageActions } from "./chat-message-actions";
8
+ export function getChatMessageAnchorId(messageId) {
9
+ return `chat-message-${messageId}`;
10
+ }
11
+ const DISCORD_CUSTOM_EMOJI_RE = /^<(a?):([^:>]+):(\d+)>$/;
12
+ function normalizeSenderHandle(handle) {
13
+ if (typeof handle !== "string")
14
+ return null;
15
+ const trimmed = handle.trim();
16
+ if (!trimmed)
17
+ return null;
18
+ return trimmed.startsWith("@") ? trimmed : `@${trimmed}`;
19
+ }
20
+ function resolveSenderDisplayName(message) {
21
+ const from = typeof message.from === "string" ? message.from.trim() : "";
22
+ if (from)
23
+ return from;
24
+ return normalizeSenderHandle(message.fromUserName);
25
+ }
26
+ function resolveSenderHandle(message, displayName) {
27
+ const handle = normalizeSenderHandle(message.fromUserName);
28
+ if (!handle)
29
+ return null;
30
+ if (displayName?.replace(/^@/, "").toLowerCase() ===
31
+ handle.slice(1).toLowerCase()) {
32
+ return null;
33
+ }
34
+ return handle;
35
+ }
36
+ function resolveReplySenderDisplayName(message, replyTarget) {
37
+ if (replyTarget) {
38
+ const targetDisplayName = resolveSenderDisplayName(replyTarget);
39
+ if (targetDisplayName)
40
+ return targetDisplayName;
41
+ }
42
+ const replyToSenderName = typeof message.replyToSenderName === "string"
43
+ ? message.replyToSenderName.trim()
44
+ : "";
45
+ if (replyToSenderName)
46
+ return replyToSenderName;
47
+ return normalizeSenderHandle(message.replyToSenderUserName);
48
+ }
49
+ function formatPossessiveLabel(label) {
50
+ return /s$/i.test(label) ? `${label}'` : `${label}'s`;
51
+ }
52
+ function normalizeMessageReactions(reactions) {
53
+ if (!Array.isArray(reactions)) {
54
+ return [];
55
+ }
56
+ return reactions.filter((reaction) => typeof reaction?.emoji === "string" &&
57
+ reaction.emoji.trim().length > 0 &&
58
+ typeof reaction.count === "number" &&
59
+ Number.isFinite(reaction.count) &&
60
+ reaction.count > 0);
61
+ }
62
+ function parseDiscordCustomEmoji(emoji) {
63
+ const match = emoji.match(DISCORD_CUSTOM_EMOJI_RE);
64
+ if (!match)
65
+ return null;
66
+ return {
67
+ animated: match[1] === "a",
68
+ name: match[2],
69
+ id: match[3],
70
+ };
71
+ }
72
+ function ReactionEmoji({ emoji }) {
73
+ const customEmoji = parseDiscordCustomEmoji(emoji);
74
+ if (!customEmoji) {
75
+ return _jsx("span", { className: "text-[15px] leading-none", children: emoji });
76
+ }
77
+ const extension = customEmoji.animated ? "gif" : "png";
78
+ const src = `https://cdn.discordapp.com/emojis/${customEmoji.id}.${extension}?size=64&quality=lossless`;
79
+ return (_jsx("img", { src: src, alt: `:${customEmoji.name}:`, className: "h-4 w-4 object-contain" }));
80
+ }
81
+ function ReactionStrip({ alignRight, reactions, }) {
82
+ if (reactions.length === 0) {
83
+ return null;
84
+ }
85
+ return (_jsx("div", { className: cn("mt-2 flex flex-wrap gap-1.5", alignRight ? "justify-end" : "justify-start"), children: reactions.map((reaction) => {
86
+ const title = Array.isArray(reaction.users) && reaction.users.length > 0
87
+ ? reaction.users.join(", ")
88
+ : undefined;
89
+ return (_jsxs("span", { "data-testid": "chat-reaction-badge", title: title, className: "inline-flex items-center gap-1 rounded-full border border-border/28 bg-bg/70 px-2 py-1 text-xs-tight font-medium text-txt-strong shadow-[0_10px_18px_-16px_rgba(15,23,42,0.45)]", children: [_jsx(ReactionEmoji, { emoji: reaction.emoji }), reaction.count > 1 ? _jsx("span", { children: reaction.count }) : null] }, `${reaction.emoji}:${reaction.count}`));
90
+ }) }));
91
+ }
92
+ export const ChatMessage = memo(function ChatMessage({ message, isGrouped = false, agentName = "Agent", children, labels = {}, onCopy, onSpeak, onEdit, onDelete, replyTarget = null, userMessagesOnRight = true, }) {
93
+ const [copied, setCopied] = useState(false);
94
+ const copiedTimerRef = useRef(null);
95
+ const [showActions, setShowActions] = useState(false);
96
+ const [supportsHover, setSupportsHover] = useState(() => typeof window !== "undefined" && typeof window.matchMedia === "function"
97
+ ? window.matchMedia("(hover: hover) and (pointer: fine)").matches
98
+ : true);
99
+ const [isEditing, setIsEditing] = useState(false);
100
+ const [draftText, setDraftText] = useState(message.text);
101
+ const [savingEdit, setSavingEdit] = useState(false);
102
+ const articleRef = useRef(null);
103
+ const editTextareaRef = useRef(null);
104
+ const isUser = message.role === "user";
105
+ const isRightAligned = isUser ? userMessagesOnRight : !userMessagesOnRight;
106
+ const canEdit = isUser &&
107
+ typeof onEdit === "function" &&
108
+ message.source !== "local_command" &&
109
+ !message.id.startsWith("temp-");
110
+ const canPlay = Boolean(!isUser && typeof onSpeak === "function" && message.text.trim());
111
+ const normalizedSource = typeof message.source === "string" &&
112
+ message.source.trim().toLowerCase() !== "app"
113
+ ? message.source
114
+ : undefined;
115
+ const senderDisplayName = isUser ? resolveSenderDisplayName(message) : null;
116
+ const senderHandle = isUser
117
+ ? resolveSenderHandle(message, senderDisplayName)
118
+ : null;
119
+ const senderPrimaryLabel = senderDisplayName ?? senderHandle ?? "User";
120
+ const replyTargetId = typeof message.replyToMessageId === "string"
121
+ ? message.replyToMessageId.trim()
122
+ : "";
123
+ const replySenderLabel = resolveReplySenderDisplayName(message, replyTarget);
124
+ const replyReferenceLabel = replySenderLabel
125
+ ? `Reply to ${formatPossessiveLabel(replySenderLabel)} message`
126
+ : "Reply to an earlier message";
127
+ const showReplyReference = Boolean(!isEditing && replyTargetId && normalizedSource);
128
+ const showSenderHeader = isUser && !isGrouped && Boolean(senderDisplayName || senderHandle);
129
+ const visibleReactions = normalizeMessageReactions(message.reactions);
130
+ const handleCopy = useCallback(() => {
131
+ onCopy?.(message.text);
132
+ setCopied(true);
133
+ if (copiedTimerRef.current !== null) {
134
+ clearTimeout(copiedTimerRef.current);
135
+ }
136
+ copiedTimerRef.current = setTimeout(() => {
137
+ setCopied(false);
138
+ copiedTimerRef.current = null;
139
+ }, 2000);
140
+ }, [message.text, onCopy]);
141
+ useEffect(() => {
142
+ return () => {
143
+ if (copiedTimerRef.current !== null) {
144
+ clearTimeout(copiedTimerRef.current);
145
+ }
146
+ };
147
+ }, []);
148
+ const handleStartEditing = useCallback(() => {
149
+ if (!canEdit || savingEdit)
150
+ return;
151
+ setDraftText(message.text);
152
+ setIsEditing(true);
153
+ }, [canEdit, message.text, savingEdit]);
154
+ const handleCancelEditing = useCallback(() => {
155
+ if (savingEdit)
156
+ return;
157
+ setDraftText(message.text);
158
+ setIsEditing(false);
159
+ }, [message.text, savingEdit]);
160
+ const handleSaveEdit = useCallback(async () => {
161
+ if (!onEdit)
162
+ return;
163
+ const nextText = draftText.trim();
164
+ if (!nextText)
165
+ return;
166
+ if (nextText === message.text.trim()) {
167
+ setDraftText(message.text);
168
+ setIsEditing(false);
169
+ return;
170
+ }
171
+ setSavingEdit(true);
172
+ try {
173
+ const saved = await onEdit(message.id, nextText);
174
+ if (saved !== false) {
175
+ setIsEditing(false);
176
+ }
177
+ }
178
+ finally {
179
+ setSavingEdit(false);
180
+ }
181
+ }, [draftText, message.id, message.text, onEdit]);
182
+ const handleTapReveal = useCallback((event) => {
183
+ if (supportsHover || isEditing)
184
+ return;
185
+ const target = event.target;
186
+ if (target?.closest("button, a, textarea, input")) {
187
+ return;
188
+ }
189
+ setShowActions((prev) => !prev);
190
+ }, [isEditing, supportsHover]);
191
+ const handleEditKeyDown = useCallback((event) => {
192
+ if (event.key === "Escape") {
193
+ event.preventDefault();
194
+ handleCancelEditing();
195
+ return;
196
+ }
197
+ if ((event.metaKey || event.ctrlKey) && event.key === "Enter") {
198
+ event.preventDefault();
199
+ void handleSaveEdit();
200
+ }
201
+ }, [handleCancelEditing, handleSaveEdit]);
202
+ useEffect(() => {
203
+ if (!isEditing) {
204
+ setDraftText(message.text);
205
+ return;
206
+ }
207
+ const textarea = editTextareaRef.current;
208
+ if (!textarea)
209
+ return;
210
+ textarea.focus();
211
+ textarea.setSelectionRange(textarea.value.length, textarea.value.length);
212
+ }, [isEditing, message.text]);
213
+ useEffect(() => {
214
+ if (typeof window === "undefined" ||
215
+ typeof window.matchMedia !== "function") {
216
+ return;
217
+ }
218
+ const mediaQuery = window.matchMedia("(hover: hover) and (pointer: fine)");
219
+ const syncSupportsHover = () => {
220
+ setSupportsHover(mediaQuery.matches);
221
+ if (mediaQuery.matches) {
222
+ setShowActions(false);
223
+ }
224
+ };
225
+ syncSupportsHover();
226
+ if (typeof mediaQuery.addEventListener === "function") {
227
+ mediaQuery.addEventListener("change", syncSupportsHover);
228
+ return () => mediaQuery.removeEventListener("change", syncSupportsHover);
229
+ }
230
+ mediaQuery.addListener(syncSupportsHover);
231
+ return () => mediaQuery.removeListener(syncSupportsHover);
232
+ }, []);
233
+ useEffect(() => {
234
+ if (supportsHover || !showActions || typeof document === "undefined") {
235
+ return;
236
+ }
237
+ const handlePointerDown = (event) => {
238
+ const target = event.target;
239
+ if (!(target instanceof Node)) {
240
+ setShowActions(false);
241
+ return;
242
+ }
243
+ if (!articleRef.current?.contains(target)) {
244
+ setShowActions(false);
245
+ }
246
+ };
247
+ document.addEventListener("pointerdown", handlePointerDown);
248
+ return () => document.removeEventListener("pointerdown", handlePointerDown);
249
+ }, [showActions, supportsHover]);
250
+ const actionsVisible = showActions;
251
+ const handleReplyReferenceClick = useCallback((event) => {
252
+ if (!replyTargetId || typeof document === "undefined")
253
+ return;
254
+ const target = document.getElementById(getChatMessageAnchorId(replyTargetId));
255
+ if (!target)
256
+ return;
257
+ event.preventDefault();
258
+ target.scrollIntoView({ behavior: "smooth", block: "center" });
259
+ }, [replyTargetId]);
260
+ return (_jsx("article", { ref: articleRef, id: getChatMessageAnchorId(message.id), className: `flex items-start gap-2 sm:gap-3 ${isRightAligned ? "justify-end" : "justify-start"} ${isGrouped ? "mt-1" : "mt-4"}`, "data-testid": "chat-message", "data-role": message.role, onMouseEnter: supportsHover ? () => setShowActions(true) : undefined, onMouseLeave: supportsHover ? () => setShowActions(false) : undefined, onTouchEnd: handleTapReveal, "aria-label": `${isUser && showSenderHeader
261
+ ? senderPrimaryLabel
262
+ : isUser
263
+ ? userMessagesOnRight
264
+ ? "Your"
265
+ : senderPrimaryLabel
266
+ : agentName} message`, children: _jsxs("div", { className: `max-w-[88%] min-w-0 sm:max-w-[80%] ${isRightAligned ? "mr-1" : "ml-1"}`, children: [!isUser && !isGrouped ? (_jsx("div", { className: cn("mb-1 text-xs font-semibold text-accent", isRightAligned ? "text-right" : "text-left"), children: agentName })) : null, showSenderHeader ? (_jsx("div", { className: cn("mb-1 flex items-center gap-2", isRightAligned ? "justify-end" : "justify-start"), children: _jsxs("div", { className: cn("min-w-0", isRightAligned ? "text-right" : "text-left"), children: [_jsx("div", { className: "truncate text-xs font-semibold text-txt-strong", children: senderPrimaryLabel }), senderHandle ? (_jsx("div", { className: "truncate text-xs-tight text-muted", children: senderHandle })) : null] }) })) : null, _jsxs(ChatBubble, { tone: isUser ? "user" : "assistant", source: normalizedSource, className: `relative group rounded-2xl px-4 py-3 text-[15px] leading-[1.7] whitespace-pre-wrap break-words ${isRightAligned ? "rounded-br-sm" : "rounded-bl-sm"}`, style: { fontFamily: "var(--font-chat)" }, children: [showReplyReference ? (_jsx("a", { href: `#${getChatMessageAnchorId(replyTargetId)}`, onClick: handleReplyReferenceClick, className: "mb-2 block text-xs font-medium text-muted underline decoration-border/60 underline-offset-2 transition-colors hover:text-txt-strong", children: replyReferenceLabel })) : null, isEditing ? (_jsxs("div", { className: "space-y-3", children: [_jsx(Textarea, { ref: editTextareaRef, value: draftText, onChange: (event) => setDraftText(event.target.value), onKeyDown: handleEditKeyDown, className: "min-h-[110px] w-full rounded-xl border border-border/28 bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_86%,transparent),color-mix(in_srgb,var(--bg)_95%,transparent))] px-3 py-2.5 text-[15px] leading-[1.7] text-txt outline-none shadow-[inset_0_1px_0_rgba(255,255,255,0.12),0_14px_20px_-20px_rgba(15,23,42,0.1)] focus-visible:border-accent/28 focus-visible:ring-2 focus-visible:ring-accent/12", style: { fontFamily: "var(--font-chat)" }, "aria-label": labels.edit ?? "Edit message", disabled: savingEdit }), _jsxs("div", { className: "flex items-center justify-end gap-2", children: [_jsx(Button, { variant: "surface", size: "sm", onClick: handleCancelEditing, disabled: savingEdit, className: "h-8 rounded-lg px-3 text-xs", children: labels.cancel ?? "Cancel" }), _jsx(Button, { variant: "surfaceAccent", size: "sm", onClick: () => void handleSaveEdit(), disabled: savingEdit ||
267
+ !draftText.trim() ||
268
+ draftText.trim() === message.text.trim(), className: "h-8 rounded-lg px-3 text-xs disabled:border-border/20 disabled:bg-bg-accent disabled:text-muted-strong", children: savingEdit
269
+ ? (labels.saving ?? "Saving...")
270
+ : (labels.saveAndResend ?? "Save and resend") })] })] })) : ((children ?? message.text)), !isUser && message.interrupted ? (_jsx("div", { className: "mt-2 border-t border-danger/30 pt-2", children: _jsx("span", { className: "inline-flex rounded-full border border-danger/30 bg-danger/10 px-2 py-0.5 text-xs font-medium text-danger", children: labels.responseInterrupted ?? "Response interrupted" }) })) : null, !isEditing ? (_jsx("div", { className: cn("absolute top-0 flex items-center gap-1 transition-opacity duration-200", isRightAligned
271
+ ? "left-0 -translate-x-full"
272
+ : "right-0 translate-x-full", actionsVisible
273
+ ? "opacity-100"
274
+ : "pointer-events-none opacity-0"), children: _jsx(ChatMessageActions, { canDelete: Boolean(onDelete), canEdit: canEdit, canPlay: canPlay, copied: copied, labels: labels, onCopy: handleCopy, onDelete: () => onDelete?.(message.id), onEdit: handleStartEditing, onPlay: () => onSpeak?.(message.id, message.text) }) })) : null] }), _jsx(ReactionStrip, { alignRight: isRightAligned, reactions: visibleReactions })] }) }));
275
+ });
@@ -0,0 +1,54 @@
1
+ import type * as React from "react";
2
+ import { SidebarPanel, SidebarScrollRegion } from "../sidebar";
3
+ import { ChatConversationItem } from "./chat-conversation-item";
4
+ import { ChatConversationRenameDialog } from "./chat-conversation-rename-dialog";
5
+ import type { ChatConversationLabels, ChatConversationSummary, ChatVariant } from "./chat-types";
6
+ export interface ChatSidebarProps {
7
+ activeConversationId: string | null;
8
+ confirmDeleteId?: string | null;
9
+ conversations: ChatConversationSummary[];
10
+ deletingId?: string | null;
11
+ labels?: ChatConversationLabels;
12
+ mobile?: boolean;
13
+ onCancelDelete?: () => void;
14
+ onClose?: () => void;
15
+ onConfirmDelete?: (id: string) => void | Promise<void>;
16
+ onCreate: () => void;
17
+ onOpenActions?: (event: React.MouseEvent<HTMLButtonElement | HTMLDivElement> | React.TouchEvent<HTMLButtonElement | HTMLDivElement>, conversation: ChatConversationSummary) => void;
18
+ onRequestDeleteConfirm?: (id: string) => void;
19
+ onRequestRename?: (conversation: ChatConversationSummary) => void;
20
+ onSearchChange?: React.ChangeEventHandler<HTMLInputElement>;
21
+ onSearchClear?: () => void;
22
+ onSelect: (id: string) => void;
23
+ searchValue?: string;
24
+ testId?: string;
25
+ unreadConversations?: Set<string>;
26
+ variant?: ChatVariant;
27
+ }
28
+ declare function ChatSidebarRoot({ activeConversationId, confirmDeleteId, conversations, deletingId, labels, mobile, onCancelDelete, onClose, onConfirmDelete, onCreate, onOpenActions, onRequestDeleteConfirm, onRequestRename, onSearchChange, onSearchClear, onSelect, searchValue, testId, unreadConversations, variant, }: ChatSidebarProps): import("react/jsx-runtime").JSX.Element;
29
+ export declare const ChatSidebar: typeof ChatSidebarRoot & {
30
+ Content: {
31
+ EmptyState: typeof import("..").SidebarEmptyState;
32
+ ItemBody: typeof import("..").SidebarItemBody;
33
+ ItemDescription: typeof import("..").SidebarItemDescription;
34
+ ItemIcon: typeof import("..").SidebarItemIcon;
35
+ ItemAction: typeof import("..").SidebarItemAction;
36
+ ItemButton: React.ForwardRefExoticComponent<import("..").SidebarItemButtonProps & React.RefAttributes<HTMLButtonElement>>;
37
+ ItemTitle: typeof import("..").SidebarItemTitle;
38
+ Toolbar: typeof import("..").SidebarToolbar;
39
+ ToolbarPrimary: typeof import("..").SidebarToolbarPrimary;
40
+ ToolbarActions: typeof import("..").SidebarToolbarActions;
41
+ SectionLabel: typeof import("..").SidebarSectionLabel;
42
+ SectionHeader: typeof import("..").SidebarSectionHeader;
43
+ Notice: typeof import("..").SidebarNotice;
44
+ Item: React.ForwardRefExoticComponent<import("..").SidebarItemProps & React.RefAttributes<HTMLElement>>;
45
+ RailMedia: typeof import("..").SidebarRailMedia;
46
+ RailItem: React.ForwardRefExoticComponent<import("..").SidebarRailItemProps & React.RefAttributes<HTMLButtonElement>>;
47
+ };
48
+ Item: typeof ChatConversationItem;
49
+ Panel: typeof SidebarPanel;
50
+ RenameDialog: typeof ChatConversationRenameDialog;
51
+ ScrollRegion: typeof SidebarScrollRegion;
52
+ };
53
+ export {};
54
+ //# sourceMappingURL=chat-sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-sidebar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC,OAAO,EAKL,YAAY,EACZ,mBAAmB,EACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAEjF,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,WAAW,EACZ,MAAM,cAAc,CAAC;AAsBtB,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,uBAAuB,EAAE,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,CACd,KAAK,EACD,KAAK,CAAC,UAAU,CAAC,iBAAiB,GAAG,cAAc,CAAC,GACpD,KAAK,CAAC,UAAU,CAAC,iBAAiB,GAAG,cAAc,CAAC,EACxD,YAAY,EAAE,uBAAuB,KAClC,IAAI,CAAC;IACV,sBAAsB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAClE,cAAc,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAC5D,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,iBAAS,eAAe,CAAC,EACvB,oBAAoB,EACpB,eAAsB,EACtB,aAAa,EACb,UAAiB,EACjB,MAAW,EACX,MAAc,EACd,cAAc,EACd,OAAO,EACP,eAAe,EACf,QAAQ,EACR,aAAa,EACb,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,aAAa,EACb,QAAQ,EACR,WAAgB,EAChB,MAAgC,EAChC,mBAAuC,EACvC,OAAmB,GACpB,EAAE,gBAAgB,2CA0IlB;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;CAMtB,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Plus } from "lucide-react";
3
+ import { Button } from "../../ui/button";
4
+ import { NewActionButton } from "../../ui/new-action-button";
5
+ import { Sidebar, SidebarCollapsedActionButton, SidebarContent, SidebarHeader, SidebarPanel, SidebarScrollRegion, } from "../sidebar";
6
+ import { ChatConversationItem } from "./chat-conversation-item";
7
+ import { ChatConversationRenameDialog } from "./chat-conversation-rename-dialog";
8
+ import { ChatSourceIcon } from "./chat-source";
9
+ function railMonogram(label) {
10
+ const words = label.trim().split(/\s+/).filter(Boolean);
11
+ const initials = words
12
+ .slice(0, 2)
13
+ .map((word) => word[0]?.toUpperCase() ?? "")
14
+ .join("");
15
+ return (initials || label.slice(0, 1).toUpperCase() || "?").slice(0, 2);
16
+ }
17
+ function renderRailIdentity(conversation) {
18
+ if (typeof conversation.source === "string" &&
19
+ conversation.source.trim().length > 0) {
20
+ return _jsx(ChatSourceIcon, { source: conversation.source, className: "h-4 w-4" });
21
+ }
22
+ return railMonogram(conversation.title);
23
+ }
24
+ function ChatSidebarRoot({ activeConversationId, confirmDeleteId = null, conversations, deletingId = null, labels = {}, mobile = false, onCancelDelete, onClose, onConfirmDelete, onCreate, onOpenActions, onRequestDeleteConfirm, onRequestRename, onSearchChange, onSearchClear, onSelect, searchValue = "", testId = "conversations-sidebar", unreadConversations = new Set(), variant = "default", }) {
25
+ const isGameModal = variant === "game-modal";
26
+ const canCollapse = !mobile && !isGameModal;
27
+ const hasSearch = typeof onSearchChange === "function";
28
+ const searchLabel = labels.searchChats ?? "Search chats";
29
+ const newChatAction = isGameModal ? (_jsx(Button, { variant: "outline", className: "h-11 w-full rounded-xl border-[color:var(--onboarding-accent-border)] bg-[color:var(--onboarding-accent-bg)] px-3 py-2 text-sm font-medium text-[color:var(--onboarding-text-strong)] shadow-[0_12px_28px_rgba(0,0,0,0.18)] hover:border-[color:var(--onboarding-accent-border-hover)] hover:bg-[color:var(--onboarding-accent-bg-hover)] active:scale-[0.98]", onClick: () => {
30
+ onCreate();
31
+ onClose?.();
32
+ }, children: labels.newChat ?? "New chat" })) : (_jsx(NewActionButton, { onClick: () => {
33
+ onCreate();
34
+ onClose?.();
35
+ }, children: labels.newChat ?? "New chat" }));
36
+ return (_jsx(Sidebar, { testId: testId, variant: mobile ? "mobile" : isGameModal ? "game-modal" : "default", collapsible: canCollapse, contentIdentity: mobile ? "chat-mobile" : isGameModal ? "chat-modal" : "chat", collapseButtonTestId: "chat-sidebar-collapse-toggle", expandButtonTestId: "chat-sidebar-expand-toggle", collapseButtonAriaLabel: labels.closePanel ?? "Close panel", expandButtonAriaLabel: labels.expandChatsPanel ?? "Expand chats panel", header: hasSearch ? (_jsx(SidebarHeader, { search: {
37
+ value: searchValue,
38
+ onChange: onSearchChange,
39
+ onClear: onSearchClear,
40
+ placeholder: searchLabel,
41
+ "aria-label": searchLabel,
42
+ clearLabel: labels.clearSearch ?? "Clear search",
43
+ autoComplete: "off",
44
+ spellCheck: false,
45
+ } })) : undefined, collapsedRailAction: _jsx(SidebarCollapsedActionButton, { "aria-label": labels.newChat ?? "New chat", onClick: () => {
46
+ onCreate();
47
+ onClose?.();
48
+ }, children: _jsx(Plus, { className: "h-4 w-4" }) }), collapsedRailItems: conversations.map((conversation) => (_jsx(SidebarContent.RailItem, { "aria-label": conversation.title, title: conversation.title, active: conversation.id === activeConversationId, indicatorTone: unreadConversations.has(conversation.id) ? "accent" : undefined, onClick: () => {
49
+ onSelect(conversation.id);
50
+ onClose?.();
51
+ }, children: renderRailIdentity(conversation) }, conversation.id))), onMobileClose: mobile ? onClose : undefined, mobileCloseLabel: labels.closePanel ?? "Close panel", mobileTitle: mobile ? (_jsx(SidebarContent.SectionLabel, { children: labels.chats ?? "Chats" })) : undefined, mobileMeta: mobile ? String(conversations.length) : undefined, "data-no-window-drag": "", "aria-label": labels.chats ?? "Chats", children: _jsx(SidebarScrollRegion, { variant: isGameModal ? "game-modal" : "default", children: _jsxs(SidebarPanel, { variant: isGameModal ? "game-modal" : "default", children: [_jsx("div", { className: "mb-3", children: newChatAction }), conversations.length === 0 ? (_jsx(SidebarContent.EmptyState, { variant: isGameModal ? "game-modal" : "default", className: !isGameModal ? "border-border/50 bg-bg/35" : undefined, children: searchValue.trim()
52
+ ? (labels.noMatchingChats ?? "No matching chats")
53
+ : (labels.none ?? "No conversations yet") })) : (conversations.map((conversation) => (_jsx(ChatConversationItem, { conversation: conversation, deleting: deletingId === conversation.id, isActive: conversation.id === activeConversationId, isConfirmingDelete: confirmDeleteId === conversation.id, isUnread: unreadConversations.has(conversation.id), labels: labels, mobile: mobile, onCancelDelete: onCancelDelete, onConfirmDelete: () => onConfirmDelete?.(conversation.id), onOpenActions: onOpenActions, onRequestDeleteConfirm: () => onRequestDeleteConfirm?.(conversation.id), onRequestRename: () => onRequestRename?.(conversation), onSelect: () => {
54
+ onSelect(conversation.id);
55
+ onClose?.();
56
+ }, variant: variant }, conversation.id))))] }) }) }));
57
+ }
58
+ export const ChatSidebar = Object.assign(ChatSidebarRoot, {
59
+ Content: SidebarContent,
60
+ Item: ChatConversationItem,
61
+ Panel: SidebarPanel,
62
+ RenameDialog: ChatConversationRenameDialog,
63
+ ScrollRegion: SidebarScrollRegion,
64
+ });
@@ -0,0 +1,19 @@
1
+ import type * as React from "react";
2
+ type SourceIconProps = {
3
+ className?: string;
4
+ };
5
+ type ChatSourceMeta = {
6
+ badgeClassName: string;
7
+ borderClassName: string;
8
+ iconClassName: string;
9
+ Icon: React.ComponentType<SourceIconProps>;
10
+ label: string;
11
+ };
12
+ export declare function getChatSourceMeta(source: string): ChatSourceMeta;
13
+ export declare function ChatSourceIcon({ source, className, decorative, }: {
14
+ className?: string;
15
+ decorative?: boolean;
16
+ source: string;
17
+ }): import("react/jsx-runtime").JSX.Element;
18
+ export {};
19
+ //# sourceMappingURL=chat-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-source.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-source.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC,KAAK,eAAe,GAAG;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAsHF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAWhE;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,UAAkB,GACnB,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,2CAmBA"}