@elizaos/ui 2.0.0-alpha.13 → 2.0.0-alpha.140

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 +89 -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 +50 -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
package/package.json CHANGED
@@ -1,51 +1,95 @@
1
1
  {
2
2
  "name": "@elizaos/ui",
3
- "version": "2.0.0-alpha.13",
4
- "description": "Reusable UI primitives and components for elizaOS applications.",
3
+ "version": "2.0.0-alpha.140",
4
+ "description": "Shared UI primitives, composites, and layout utilities for elizaOS apps.",
5
5
  "type": "module",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
6
  "license": "MIT",
9
- "homepage": "https://elizaos.ai",
7
+ "homepage": "https://github.com/elizaOS/eliza",
10
8
  "repository": {
11
9
  "type": "git",
12
- "url": "https://github.com/elizaos/eliza.git",
10
+ "url": "https://github.com/elizaOS/eliza.git",
13
11
  "directory": "packages/ui"
14
12
  },
15
13
  "keywords": [
16
14
  "elizaos",
17
15
  "ui",
18
16
  "react",
19
- "components"
17
+ "design-system"
20
18
  ],
21
- "scripts": {
22
- "clean": "rm -rf dist && find src -type f \\( -name '*.js' -o -name '*.d.ts' -o -name '*.d.ts.map' -o -name '*.js.map' \\) -delete",
23
- "build": "bun run build:dist",
24
- "build:dist": "find src -type f \\( -name '*.js' -o -name '*.d.ts' -o -name '*.d.ts.map' -o -name '*.js.map' \\) -delete && rm -rf dist && tsc -p tsconfig.build.json && find src -type f \\( -name '*.js' -o -name '*.d.ts' -o -name '*.d.ts.map' -o -name '*.js.map' \\) -delete && node ../../scripts/copy-package-assets.mjs packages/ui src/styles && node ../../scripts/prepare-package-dist.mjs packages/ui",
25
- "typecheck": "tsc --noEmit -p tsconfig.json",
26
- "lint": "bunx @biomejs/biome check --write ./src/index.ts ./src/lib ./src/components ./src/stories",
27
- "lint:check": "bunx @biomejs/biome check ./src/index.ts ./src/lib ./src/components ./src/stories",
28
- "pack:dry-run": "cd dist && npm pack --dry-run",
29
- "storybook": "storybook dev -p 6006",
30
- "build-storybook": "storybook build"
31
- },
19
+ "main": "./packages/ui/src/index.js",
32
20
  "exports": {
33
21
  ".": {
34
- "types": "./dist/index.d.ts",
35
- "import": "./dist/index.js"
22
+ "types": "./packages/ui/src/index.d.ts",
23
+ "import": "./packages/ui/src/index.js",
24
+ "default": "./packages/ui/src/index.js"
25
+ },
26
+ "./components/*": {
27
+ "types": "./packages/ui/src/components/*.d.ts",
28
+ "import": "./packages/ui/src/components/*.js",
29
+ "default": "./packages/ui/src/components/*.js"
30
+ },
31
+ "./components/*/*": {
32
+ "types": "./packages/ui/src/components/*/*.d.ts",
33
+ "import": "./packages/ui/src/components/*/*.js",
34
+ "default": "./packages/ui/src/components/*/*.js"
35
+ },
36
+ "./components/*/*/*": {
37
+ "types": "./packages/ui/src/components/*/*/*.d.ts",
38
+ "import": "./packages/ui/src/components/*/*/*.js",
39
+ "default": "./packages/ui/src/components/*/*/*.js"
40
+ },
41
+ "./components/ui/*": {
42
+ "types": "./packages/ui/src/components/ui/*.tsx.d.ts",
43
+ "import": "./packages/ui/src/components/ui/*.tsx.js",
44
+ "default": "./packages/ui/src/components/ui/*.tsx.js"
45
+ },
46
+ "./components/composites/page-panel": {
47
+ "types": "./packages/ui/src/components/composites/page-panel/index.d.ts",
48
+ "import": "./packages/ui/src/components/composites/page-panel/index.js",
49
+ "default": "./packages/ui/src/components/composites/page-panel/index.js"
50
+ },
51
+ "./components/composites/*": {
52
+ "types": "./packages/ui/src/components/composites/*.d.ts",
53
+ "import": "./packages/ui/src/components/composites/*.js",
54
+ "default": "./packages/ui/src/components/composites/*.js"
55
+ },
56
+ "./components/composites/*/*": {
57
+ "types": "./packages/ui/src/components/composites/*/*.tsx.d.ts",
58
+ "import": "./packages/ui/src/components/composites/*/*.tsx.js",
59
+ "default": "./packages/ui/src/components/composites/*/*.tsx.js"
36
60
  },
37
- "./utils": {
38
- "types": "./dist/lib/utils.d.ts",
39
- "import": "./dist/lib/utils.js"
61
+ "./hooks": {
62
+ "types": "./packages/ui/src/hooks/index.d.ts",
63
+ "import": "./packages/ui/src/hooks/index.js",
64
+ "default": "./packages/ui/src/hooks/index.js"
65
+ },
66
+ "./hooks/*": {
67
+ "types": "./packages/ui/src/hooks/*.d.ts",
68
+ "import": "./packages/ui/src/hooks/*.js",
69
+ "default": "./packages/ui/src/hooks/*.js"
70
+ },
71
+ "./layouts": {
72
+ "types": "./packages/ui/src/layouts/index.d.ts",
73
+ "import": "./packages/ui/src/layouts/index.js",
74
+ "default": "./packages/ui/src/layouts/index.js"
75
+ },
76
+ "./layouts/*": {
77
+ "types": "./packages/ui/src/layouts/*.d.ts",
78
+ "import": "./packages/ui/src/layouts/*.js",
79
+ "default": "./packages/ui/src/layouts/*.js"
80
+ },
81
+ "./lib/*": {
82
+ "types": "./packages/ui/src/lib/*.d.ts",
83
+ "import": "./packages/ui/src/lib/*.js",
84
+ "default": "./packages/ui/src/lib/*.js"
85
+ },
86
+ "./styles/*": {
87
+ "types": "./packages/ui/src/styles/*.d.ts",
88
+ "import": "./packages/ui/src/styles/*.js",
89
+ "default": "./packages/ui/src/styles/*.js"
40
90
  },
41
- "./styles/theme.css": "./src/styles/theme.css",
42
91
  "./package.json": "./package.json"
43
92
  },
44
- "files": [
45
- "dist",
46
- "src/styles/theme.css",
47
- "README.md"
48
- ],
49
93
  "peerDependencies": {
50
94
  "react": "^19.0.0",
51
95
  "react-dom": "^19.0.0"
@@ -66,29 +110,12 @@
66
110
  "class-variance-authority": "^0.7.1",
67
111
  "clsx": "^2.1.1",
68
112
  "lucide-react": "^0.575.0",
69
- "next-themes": "^0.4.6",
70
113
  "sonner": "^2.0.7",
71
114
  "tailwind-merge": "^2.6.0"
72
115
  },
73
116
  "publishConfig": {
74
- "access": "public"
75
- },
76
- "devDependencies": {
77
- "@storybook/addon-essentials": "8.6.14",
78
- "@storybook/blocks": "8.6.14",
79
- "@storybook/react": "8.6.14",
80
- "@storybook/react-vite": "8.6.14",
81
- "@storybook/test": "8.6.14",
82
- "@tailwindcss/vite": "^4.2.1",
83
- "@types/react": "^19.0.0",
84
- "@types/react-dom": "^19.0.0",
85
- "storybook": "8.6.17",
86
- "tailwindcss": "^4.1.18",
87
- "typescript": "^5.9.3"
88
- },
89
- "author": "elizaOS Team",
90
- "engines": {
91
- "node": ">=18.0.0"
117
+ "access": "public",
118
+ "directory": "dist"
92
119
  },
93
- "gitHead": "9448dcfc32d38873e1e2596d4ff4eca444fadca0"
120
+ "types": "./packages/ui/src/index.d.ts"
94
121
  }
@@ -0,0 +1,9 @@
1
+ import type { ChatAttachmentItem, ChatVariant } from "./chat-types";
2
+ export interface ChatAttachmentStripProps {
3
+ items: ChatAttachmentItem[];
4
+ onRemove: (id: string, index: number) => void;
5
+ removeLabel?: (item: ChatAttachmentItem) => string;
6
+ variant?: ChatVariant;
7
+ }
8
+ export declare function ChatAttachmentStrip({ items, onRemove, removeLabel, variant, }: ChatAttachmentStripProps): import("react/jsx-runtime").JSX.Element | null;
9
+ //# sourceMappingURL=chat-attachment-strip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-attachment-strip.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-attachment-strip.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,MAAM,CAAC;IACnD,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,EACR,WAAmD,EACnD,OAAmB,GACpB,EAAE,wBAAwB,kDAoC1B"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from "../../ui/button";
3
+ export function ChatAttachmentStrip({ items, onRemove, removeLabel = (item) => `Remove image ${item.name}`, variant = "default", }) {
4
+ if (items.length === 0) {
5
+ return null;
6
+ }
7
+ return (_jsx("div", { className: `relative flex flex-wrap gap-2 py-1 ${variant === "game-modal" ? "pointer-events-auto" : ""}`, "data-no-camera-drag": variant === "game-modal" || undefined, style: { zIndex: 1 }, children: items.map((item, index) => (_jsxs("div", { className: "relative h-16 w-16 shrink-0 group", children: [_jsx("img", { src: item.src, alt: item.alt, className: "h-16 w-16 rounded border border-border object-cover" }), _jsx(Button, { variant: variant === "game-modal" ? "surfaceDestructive" : "destructive", size: "icon", title: removeLabel(item), "aria-label": removeLabel(item), onClick: () => onRemove(item.id, index), className: "absolute -right-1.5 -top-1.5 flex h-4 w-4 items-center justify-center rounded-full text-2xs opacity-100 transition-opacity focus-visible:opacity-100 sm:opacity-0 sm:group-hover:opacity-100", children: "\u00D7" })] }, item.id))) }));
8
+ }
@@ -0,0 +1,14 @@
1
+ import type * as React from "react";
2
+ export type ChatBubbleTone = "assistant" | "user";
3
+ export interface ChatBubbleProps extends React.HTMLAttributes<HTMLDivElement> {
4
+ tone?: ChatBubbleTone;
5
+ /**
6
+ * Source channel the message came from (e.g. "imessage", "telegram",
7
+ * "discord", "whatsapp"). When set, the bubble renders a connector-
8
+ * colored outline so cross-channel messages stay visually distinct
9
+ * without adding a repeated text badge above every message.
10
+ */
11
+ source?: string;
12
+ }
13
+ export declare function ChatBubble({ tone, source, className, ...props }: ChatBubbleProps): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=chat-bubble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-bubble.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-bubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAKpC,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,eAAgB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC3E,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAkB,EAClB,MAAM,EACN,SAAS,EACT,GAAG,KAAK,EACT,EAAE,eAAe,2CAsBjB"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../../lib/utils";
3
+ import { getChatSourceMeta } from "./chat-source";
4
+ export function ChatBubble({ tone = "assistant", source, className, ...props }) {
5
+ const normalizedSource = typeof source === "string" && source.trim().toLowerCase() !== "app"
6
+ ? source
7
+ : undefined;
8
+ const sourceBorderClass = normalizedSource
9
+ ? getChatSourceMeta(normalizedSource).borderClassName
10
+ : null;
11
+ return (_jsx("div", { className: cn("relative border whitespace-pre-wrap break-words", tone === "user"
12
+ ? "border border-accent/24 bg-[linear-gradient(180deg,rgba(var(--accent-rgb),0.14),rgba(var(--accent-rgb),0.05))] text-txt-strong shadow-[inset_0_1px_0_rgba(255,255,255,0.16),0_18px_26px_-24px_rgba(var(--accent-rgb),0.18)] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.06),0_20px_28px_-24px_rgba(0,0,0,0.22)]"
13
+ : "border border-border/32 bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_90%,transparent),color-mix(in_srgb,var(--bg)_96%,transparent))] text-txt shadow-[inset_0_1px_0_rgba(255,255,255,0.12),0_18px_26px_-24px_rgba(15,23,42,0.1)] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.04),0_20px_28px_-24px_rgba(0,0,0,0.22)]", sourceBorderClass ? `border-2 ${sourceBorderClass}` : null, className), "data-chat-source": normalizedSource ?? undefined, ...props }));
14
+ }
@@ -0,0 +1,10 @@
1
+ import type * as React from "react";
2
+ import type { ChatVariant } from "./chat-types";
3
+ export interface ChatComposerShellProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
4
+ before?: React.ReactNode;
5
+ children: React.ReactNode;
6
+ shellRef?: React.Ref<HTMLDivElement>;
7
+ variant?: ChatVariant;
8
+ }
9
+ export declare function ChatComposerShell({ before, children, className, shellRef, style, variant, ...props }: ChatComposerShellProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=chat-composer-shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-composer-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-composer-shell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAGpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,sBACf,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IAC9D,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,KAAK,EACL,OAAmB,EACnB,GAAG,KAAK,EACT,EAAE,sBAAsB,2CAkDxB"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../../lib/utils";
3
+ export function ChatComposerShell({ before, children, className, shellRef, style, variant = "default", ...props }) {
4
+ if (variant === "game-modal") {
5
+ return (_jsxs("div", { ref: shellRef, className: cn("mt-auto pointer-events-auto px-1 max-[380px]:px-0.5", className), "data-no-camera-drag": "true", style: {
6
+ zIndex: 1,
7
+ paddingBottom: "calc(max(env(safe-area-inset-bottom, 0px), 0px) + 0.25rem)",
8
+ ...style,
9
+ }, ...props, children: [before, _jsxs("div", { className: "relative flex items-center px-3 py-2 max-[380px]:min-h-[78px] max-[380px]:px-2.5 max-[380px]:py-1.5", children: [_jsx("div", { "aria-hidden": true, className: "pointer-events-none absolute inset-0 rounded-full border border-border/26 bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_84%,transparent),color-mix(in_srgb,var(--bg)_72%,transparent))] shadow-[inset_0_1px_0_rgba(255,255,255,0.16),0_20px_52px_rgba(15,23,42,0.18)] ring-1 ring-inset ring-white/8 backdrop-blur-[22px] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.04),0_24px_58px_rgba(0,0,0,0.36)]" }), _jsx("div", { className: "relative z-[1] flex w-full items-center", children: children })] })] }));
10
+ }
11
+ return (_jsxs("div", { ref: shellRef, className: cn("relative bg-transparent px-3 pb-3 pt-3 sm:px-4 sm:pb-4 xl:px-5", className), style: {
12
+ zIndex: 1,
13
+ paddingBottom: "calc(var(--safe-area-bottom, 0px) + 0.75rem)",
14
+ ...style,
15
+ }, ...props, children: [before, children] }));
16
+ }
@@ -0,0 +1,39 @@
1
+ import { type KeyboardEvent, type RefObject } from "react";
2
+ import type { ChatVariant } from "./chat-types";
3
+ export interface ChatComposerVoiceState {
4
+ assistantTtsQuality?: "enhanced" | "standard";
5
+ captureMode: "idle" | "compose" | "push-to-talk";
6
+ interimTranscript: string;
7
+ isListening: boolean;
8
+ isSpeaking: boolean;
9
+ startListening: (mode?: "compose" | "push-to-talk") => void | Promise<void>;
10
+ stopListening: (options?: {
11
+ submit?: boolean;
12
+ }) => void | Promise<void>;
13
+ supported: boolean;
14
+ toggleListening: () => void;
15
+ }
16
+ export interface ChatComposerProps {
17
+ agentVoiceEnabled: boolean;
18
+ chatInput: string;
19
+ chatPendingImagesCount: number;
20
+ chatSending: boolean;
21
+ isAgentStarting: boolean;
22
+ isComposerLocked: boolean;
23
+ onAttachImage: () => void;
24
+ onChatInputChange: (value: string) => void;
25
+ onKeyDown: (event: KeyboardEvent<HTMLTextAreaElement>) => void;
26
+ onSend: () => void;
27
+ onStop: () => void;
28
+ onStopSpeaking: () => void;
29
+ onToggleAgentVoice: () => void;
30
+ showAgentVoiceToggle?: boolean;
31
+ t: (key: string, options?: Record<string, unknown>) => string;
32
+ textareaRef: RefObject<HTMLTextAreaElement | null>;
33
+ variant: ChatVariant;
34
+ voice: ChatComposerVoiceState;
35
+ codingAgentsAvailable?: boolean;
36
+ onCreateTask?: (description: string, agentType: string) => void;
37
+ }
38
+ export declare function ChatComposer({ variant, textareaRef, chatInput, chatPendingImagesCount, isComposerLocked, isAgentStarting, chatSending, voice, agentVoiceEnabled, showAgentVoiceToggle, t, onAttachImage, onChatInputChange, onKeyDown, onSend, onStop, onStopSpeaking, onToggleAgentVoice, codingAgentsAvailable, onCreateTask, }: ChatComposerProps): import("react/jsx-runtime").JSX.Element;
39
+ //# sourceMappingURL=chat-composer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-composer.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-composer.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,sBAAsB;IACrC,mBAAmB,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IAC9C,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAAC;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,aAAa,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC;IAC/D,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC9D,WAAW,EAAE,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACnD,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,sBAAsB,CAAC;IAC9B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACjE;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,WAAW,EACX,SAAS,EACT,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,KAAK,EACL,iBAAiB,EACjB,oBAA2B,EAC3B,CAAC,EACD,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,MAAM,EACN,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,qBAA6B,EAC7B,YAAY,GACb,EAAE,iBAAiB,2CAwSnB"}
@@ -0,0 +1,148 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Mic, Paperclip, Send, Square, Volume2, VolumeX } from "lucide-react";
3
+ import { useEffect, useRef, useState, } from "react";
4
+ import { Button } from "../../ui/button";
5
+ import { Textarea } from "../../ui/textarea";
6
+ import { CreateTaskPopover } from "./create-task-popover";
7
+ export function ChatComposer({ variant, textareaRef, chatInput, chatPendingImagesCount, isComposerLocked, isAgentStarting, chatSending, voice, agentVoiceEnabled, showAgentVoiceToggle = true, t, onAttachImage, onChatInputChange, onKeyDown, onSend, onStop, onStopSpeaking, onToggleAgentVoice, codingAgentsAvailable = false, onCreateTask, }) {
8
+ const [isNarrow, setIsNarrow] = useState(() => typeof window !== "undefined" && window.innerWidth < 310);
9
+ useEffect(() => {
10
+ if (typeof window === "undefined" || !window.matchMedia)
11
+ return;
12
+ const mq = window.matchMedia("(max-width: 309px)");
13
+ const sync = () => setIsNarrow(mq.matches);
14
+ sync();
15
+ mq.addEventListener("change", sync);
16
+ return () => mq.removeEventListener("change", sync);
17
+ }, []);
18
+ const isGameModal = variant === "game-modal";
19
+ const showVoiceButton = isGameModal || voice.supported;
20
+ const defaultMicButtonVariant = voice.isListening
21
+ ? "surfaceAccent"
22
+ : "surface";
23
+ const holdTimerRef = useRef(null);
24
+ const pushToTalkActiveRef = useRef(false);
25
+ const suppressClickRef = useRef(false);
26
+ const hasDraft = chatInput.trim().length > 0 || chatPendingImagesCount > 0;
27
+ const shouldShowStopButton = chatSending && !hasDraft;
28
+ const actionButtonTitle = shouldShowStopButton
29
+ ? t("chat.stopGeneration")
30
+ : isGameModal || !voice.isSpeaking || hasDraft
31
+ ? isAgentStarting
32
+ ? t("chat.agentStarting")
33
+ : t("chat.send")
34
+ : t("chat.stopSpeaking");
35
+ const actionButtonLabel = isGameModal ? undefined : actionButtonTitle;
36
+ const inputPlaceholder = isNarrow
37
+ ? t("chat.inputPlaceholderNarrow")
38
+ : t("chat.inputPlaceholder");
39
+ const defaultTextareaPlaceholder = isAgentStarting
40
+ ? t("chat.agentStarting")
41
+ : voice.isListening
42
+ ? voice.captureMode === "push-to-talk"
43
+ ? t("chat.releaseToSend")
44
+ : !chatInput.trim()
45
+ ? t("chat.listening")
46
+ : inputPlaceholder
47
+ : inputPlaceholder;
48
+ useEffect(() => {
49
+ return () => {
50
+ if (holdTimerRef.current) {
51
+ clearTimeout(holdTimerRef.current);
52
+ holdTimerRef.current = null;
53
+ }
54
+ };
55
+ }, []);
56
+ const startPushToTalk = () => {
57
+ if (isComposerLocked || voice.isListening)
58
+ return;
59
+ pushToTalkActiveRef.current = true;
60
+ suppressClickRef.current = true;
61
+ void voice.startListening("push-to-talk");
62
+ };
63
+ const clearHoldTimer = () => {
64
+ if (holdTimerRef.current) {
65
+ clearTimeout(holdTimerRef.current);
66
+ holdTimerRef.current = null;
67
+ }
68
+ };
69
+ const handleMicPointerDown = (_event) => {
70
+ if (isComposerLocked || voice.isListening)
71
+ return;
72
+ clearHoldTimer();
73
+ holdTimerRef.current = setTimeout(() => {
74
+ holdTimerRef.current = null;
75
+ startPushToTalk();
76
+ }, 180);
77
+ };
78
+ const handleMicPointerUp = () => {
79
+ clearHoldTimer();
80
+ if (!pushToTalkActiveRef.current)
81
+ return;
82
+ pushToTalkActiveRef.current = false;
83
+ void voice.stopListening({ submit: true });
84
+ window.setTimeout(() => {
85
+ suppressClickRef.current = false;
86
+ }, 0);
87
+ };
88
+ const handleMicPointerCancel = () => {
89
+ clearHoldTimer();
90
+ if (!pushToTalkActiveRef.current)
91
+ return;
92
+ pushToTalkActiveRef.current = false;
93
+ void voice.stopListening();
94
+ window.setTimeout(() => {
95
+ suppressClickRef.current = false;
96
+ }, 0);
97
+ };
98
+ const handleMicClick = () => {
99
+ if (suppressClickRef.current) {
100
+ suppressClickRef.current = false;
101
+ return;
102
+ }
103
+ if (isComposerLocked)
104
+ return;
105
+ if (voice.isListening && voice.captureMode === "compose") {
106
+ void voice.stopListening();
107
+ return;
108
+ }
109
+ if (voice.isListening)
110
+ return;
111
+ void voice.startListening("compose");
112
+ };
113
+ return (_jsxs("div", { className: isGameModal
114
+ ? "relative flex w-full items-end gap-2 transition-all max-[380px]:gap-1.5"
115
+ : "flex items-end gap-1.5 sm:gap-2", children: [!isGameModal ? (_jsx(Button, { variant: chatPendingImagesCount > 0 ? "surfaceAccent" : "surface", size: "icon", className: `h-[46px] w-[46px] shrink-0 ${chatPendingImagesCount > 0 ? "ring-1 ring-inset ring-accent/25" : ""}`, onClick: onAttachImage, "aria-label": t("aria.attachImage"), title: t("chatview.AttachImage"), disabled: isComposerLocked, children: _jsx(Paperclip, { className: "h-4 w-4" }) })) : null, !isGameModal && codingAgentsAvailable && onCreateTask && (_jsx(CreateTaskPopover, { chatInput: chatInput, disabled: isComposerLocked, onCreateTask: onCreateTask, t: t })), showVoiceButton ? (_jsx(Button, { variant: isGameModal ? "ghost" : defaultMicButtonVariant, size: "icon", className: isGameModal
116
+ ? `flex items-center justify-center h-[46px] w-[46px] shrink-0 ${voice.isListening
117
+ ? "animate-pulse select-none rounded-full border border-border/28 bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_82%,transparent),color-mix(in_srgb,var(--bg)_66%,transparent))] text-txt shadow-[inset_0_1px_0_rgba(255,255,255,0.14),0_16px_26px_-24px_rgba(15,23,42,0.16)] ring-1 ring-inset ring-white/8 backdrop-blur-md transition-all duration-300 active:scale-95 dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.04),0_18px_28px_-24px_rgba(0,0,0,0.3)]"
118
+ : "select-none rounded-full border border-transparent bg-transparent text-muted-strong shadow-none ring-0 backdrop-blur-none transition-[border-color,background-color,color,transform,box-shadow] duration-300 hover:border-border/28 hover:bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_74%,transparent),color-mix(in_srgb,var(--bg)_58%,transparent))] hover:text-txt active:scale-95"} ${isComposerLocked ? "opacity-50" : ""}`
119
+ : "h-[46px] w-[46px] shrink-0", onClick: handleMicClick, onPointerDown: handleMicPointerDown, onPointerUp: handleMicPointerUp, onPointerCancel: handleMicPointerCancel, onPointerLeave: handleMicPointerCancel, "aria-label": isAgentStarting
120
+ ? t("chat.agentStarting")
121
+ : voice.isListening
122
+ ? voice.captureMode === "push-to-talk"
123
+ ? t("chat.releaseToSend")
124
+ : t("chat.stopListening")
125
+ : t("chat.voiceInput"), "aria-pressed": isGameModal ? undefined : voice.isListening, title: isAgentStarting
126
+ ? t("chat.agentStarting")
127
+ : voice.isListening
128
+ ? voice.captureMode === "push-to-talk"
129
+ ? t("chat.releaseToSend")
130
+ : t("chat.stopListening")
131
+ : voice.assistantTtsQuality === "enhanced"
132
+ ? t("chat.micTitleIdleEnhanced")
133
+ : t("chat.micTitleIdleStandard"), disabled: isComposerLocked, children: _jsx(Mic, { className: isGameModal ? "h-5 w-5" : "h-4 w-4" }) })) : null, _jsxs("div", { className: "relative min-w-0 flex-1", children: [_jsx(Textarea, { ref: textareaRef, value: chatInput, onChange: (event) => onChatInputChange(event.target.value), onKeyDown: onKeyDown, "data-testid": "chat-composer-textarea", className: isGameModal
134
+ ? "w-full min-w-0 min-h-0 h-[46px] resize-none overflow-y-hidden max-h-[200px] outline-none ring-0 shadow-none focus:outline-none focus:ring-0 focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 font-[var(--font-chat)] disabled:opacity-50 rounded-3xl border border-transparent bg-transparent px-4 pb-[13px] pt-[13px] text-[15px] leading-[1.55] text-txt-strong placeholder:text-muted"
135
+ : "w-full min-w-0 min-h-0 h-[46px] resize-none overflow-y-hidden max-h-[200px] outline-none ring-0 shadow-none focus:outline-none focus:ring-0 focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 font-[var(--font-chat)] disabled:opacity-50 rounded-3xl border border-border/28 bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_82%,transparent),color-mix(in_srgb,var(--bg)_96%,transparent))] px-4 py-[13px] text-[15px] leading-[1.55] text-txt shadow-[inset_0_1px_0_rgba(255,255,255,0.12),0_18px_24px_-22px_rgba(15,23,42,0.12)] placeholder:text-muted", placeholder: defaultTextareaPlaceholder, rows: 1, disabled: isComposerLocked }), voice.isListening && voice.interimTranscript ? (_jsx("div", { className: "pointer-events-none absolute inset-x-4 bottom-2.5 truncate text-xs-tight text-muted", children: voice.interimTranscript })) : null] }), showAgentVoiceToggle ? (_jsx(Button, { variant: isGameModal
136
+ ? "ghost"
137
+ : agentVoiceEnabled
138
+ ? "surfaceAccent"
139
+ : "surface", size: "icon", className: isGameModal
140
+ ? `flex items-center justify-center h-[46px] w-[46px] shrink-0 ${agentVoiceEnabled
141
+ ? "select-none rounded-full border border-border/28 bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_82%,transparent),color-mix(in_srgb,var(--bg)_66%,transparent))] text-txt shadow-[inset_0_1px_0_rgba(255,255,255,0.14),0_16px_26px_-24px_rgba(15,23,42,0.16)] ring-1 ring-inset ring-white/8 backdrop-blur-md transition-all duration-300 active:scale-95 dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.04),0_18px_28px_-24px_rgba(0,0,0,0.3)]"
142
+ : "select-none rounded-full border border-transparent bg-transparent text-muted-strong shadow-none ring-0 backdrop-blur-none transition-[border-color,background-color,color,transform,box-shadow] duration-300 hover:border-border/28 hover:bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_74%,transparent),color-mix(in_srgb,var(--bg)_58%,transparent))] hover:text-txt active:scale-95"}`
143
+ : "h-[46px] w-[46px] shrink-0", onClick: onToggleAgentVoice, "aria-label": agentVoiceEnabled ? t("aria.agentVoiceOn") : t("aria.agentVoiceOff"), title: agentVoiceEnabled ? t("chat.agentVoiceOn") : t("chat.agentVoiceOff"), disabled: isComposerLocked, children: agentVoiceEnabled ? (_jsx(Volume2, { className: isGameModal ? "h-5 w-5" : "h-4 w-4" })) : (_jsx(VolumeX, { className: isGameModal ? "h-5 w-5" : "h-4 w-4" })) })) : null, shouldShowStopButton ? (_jsx(Button, { variant: "surfaceDestructive", "data-testid": "chat-composer-action", className: "ml-1 flex items-center justify-center rounded-full transition-all duration-300 select-none active:scale-95 h-[46px] w-[46px] shrink-0", onClick: onStop, size: "icon", title: actionButtonLabel, "aria-label": actionButtonLabel, children: _jsx(Square, { className: isGameModal ? "h-4.5 w-4.5" : "h-4 w-4" }) })) : !isGameModal && voice.isSpeaking && !hasDraft ? (_jsx(Button, { variant: "surfaceDestructive", "data-testid": "chat-composer-action", className: "ml-1 flex items-center justify-center rounded-full transition-all duration-300 select-none active:scale-95 h-[46px] w-[46px] shrink-0", onClick: onStopSpeaking, size: "icon", title: actionButtonLabel, "aria-label": actionButtonLabel, children: _jsx(Square, { className: "h-4 w-4" }) })) : (_jsx(Button, { variant: isGameModal ? "default" : "surfaceAccent", "data-testid": "chat-composer-action", size: "icon", className: isGameModal
144
+ ? `ml-1 flex items-center justify-center rounded-full transition-all duration-300 select-none active:scale-95 h-[46px] w-[46px] shrink-0 ${hasDraft
145
+ ? "select-none rounded-full border border-border/28 bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_82%,transparent),color-mix(in_srgb,var(--bg)_66%,transparent))] text-txt shadow-[inset_0_1px_0_rgba(255,255,255,0.14),0_16px_26px_-24px_rgba(15,23,42,0.16)] ring-1 ring-inset ring-white/8 backdrop-blur-md transition-all duration-300 active:scale-95 dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.04),0_18px_28px_-24px_rgba(0,0,0,0.3)]"
146
+ : "select-none rounded-full border border-transparent bg-transparent text-muted-strong shadow-none ring-0 backdrop-blur-none transition-[border-color,background-color,color,transform,box-shadow] duration-300 hover:border-border/28 hover:bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_74%,transparent),color-mix(in_srgb,var(--bg)_58%,transparent))] hover:text-txt active:scale-95 opacity-80"}`
147
+ : "ml-1 flex items-center justify-center rounded-full transition-all duration-300 select-none active:scale-95 h-[46px] w-[46px] shrink-0 border-accent/26 disabled:ring-0", onClick: onSend, disabled: isComposerLocked || (!hasDraft && !chatSending), title: actionButtonLabel, "aria-label": actionButtonLabel, children: _jsx(Send, { className: isGameModal ? "h-4.5 w-4.5" : "h-4 w-4" }) }))] }));
148
+ }
@@ -0,0 +1,21 @@
1
+ import type React from "react";
2
+ import type { ChatConversationLabels, ChatConversationSummary, ChatVariant } from "./chat-types";
3
+ export interface ChatConversationItemProps {
4
+ conversation: ChatConversationSummary;
5
+ deleting?: boolean;
6
+ displayTitle?: string;
7
+ isActive: boolean;
8
+ isConfirmingDelete?: boolean;
9
+ isUnread?: boolean;
10
+ labels?: ChatConversationLabels;
11
+ mobile?: boolean;
12
+ onCancelDelete?: () => void;
13
+ onConfirmDelete?: () => void | Promise<void>;
14
+ onOpenActions?: (event: React.MouseEvent<HTMLButtonElement | HTMLDivElement> | React.TouchEvent<HTMLButtonElement | HTMLDivElement>, conversation: ChatConversationSummary) => void;
15
+ onRequestDeleteConfirm?: () => void;
16
+ onRequestRename?: () => void;
17
+ onSelect: () => void;
18
+ variant?: ChatVariant;
19
+ }
20
+ export declare function ChatConversationItem({ conversation, deleting, displayTitle, isActive, isConfirmingDelete, isUnread, labels, mobile, onCancelDelete, onConfirmDelete, onOpenActions, onRequestDeleteConfirm, onRequestRename, onSelect, variant, }: ChatConversationItemProps): import("react/jsx-runtime").JSX.Element;
21
+ //# sourceMappingURL=chat-conversation-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-conversation-item.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-conversation-item.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAc/B,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,WAAW,EACZ,MAAM,cAAc,CAAC;AAkFtB,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,uBAAuB,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,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,MAAM,IAAI,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,YAAY,EACZ,QAAgB,EAChB,YAAY,EACZ,QAAQ,EACR,kBAA0B,EAC1B,QAAgB,EAChB,MAAW,EACX,MAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACb,sBAAsB,EACtB,eAAe,EACf,QAAQ,EACR,OAAmB,GACpB,EAAE,yBAAyB,2CAqM3B"}
@@ -0,0 +1,120 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { PencilLine, X } from "lucide-react";
3
+ import { useCallback, useEffect, useLayoutEffect, useRef, useState, } from "react";
4
+ import { Z_OVERLAY } from "../../../lib/floating-layers";
5
+ import { cn } from "../../../lib/utils";
6
+ import { Button } from "../../ui/button";
7
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../../ui/tooltip";
8
+ import { PagePanel } from "../page-panel";
9
+ import { ChatSourceIcon } from "./chat-source";
10
+ function TruncatingConversationTitle({ displayTitle, isActive, variant, }) {
11
+ const titleRef = useRef(null);
12
+ const [isTruncated, setIsTruncated] = useState(false);
13
+ const measure = useCallback(() => {
14
+ const el = titleRef.current;
15
+ if (!el)
16
+ return;
17
+ setIsTruncated(el.scrollWidth > el.clientWidth + 1);
18
+ }, []);
19
+ useLayoutEffect(() => {
20
+ measure();
21
+ const el = titleRef.current;
22
+ if (!el)
23
+ return;
24
+ let ro;
25
+ if (typeof ResizeObserver !== "undefined") {
26
+ ro = new ResizeObserver(() => {
27
+ measure();
28
+ });
29
+ ro.observe(el);
30
+ }
31
+ window.addEventListener("resize", measure);
32
+ return () => {
33
+ ro?.disconnect();
34
+ window.removeEventListener("resize", measure);
35
+ };
36
+ }, [measure]);
37
+ const span = (_jsx("span", { ref: titleRef, className: variant === "game-modal"
38
+ ? `block w-full min-w-0 max-w-full truncate text-left text-sm font-medium leading-tight transition-colors ${isActive
39
+ ? "text-txt text-shadow-glow"
40
+ : "text-white/90 group-hover:text-white"}`
41
+ : `block min-w-0 max-w-full flex-1 truncate text-left text-sm font-semibold leading-[1.2] tracking-[-0.01em] transition-colors ${isActive
42
+ ? "text-txt"
43
+ : "text-[color:color-mix(in_srgb,var(--text-strong)_88%,var(--text)_12%)] group-hover:text-txt"}`, ...(isTruncated ? { title: displayTitle } : {}), children: displayTitle }));
44
+ if (!isTruncated) {
45
+ return span;
46
+ }
47
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: span }), _jsx(TooltipContent, { side: "right", align: "start", sideOffset: 10, collisionPadding: 12, className: `z-[${Z_OVERLAY}] max-w-[min(90vw,22rem)] whitespace-normal break-words px-3 py-2 text-sm leading-snug`, children: displayTitle })] }));
48
+ }
49
+ export function ChatConversationItem({ conversation, deleting = false, displayTitle, isActive, isConfirmingDelete = false, isUnread = false, labels = {}, mobile = false, onCancelDelete, onConfirmDelete, onOpenActions, onRequestDeleteConfirm, onRequestRename, onSelect, variant = "default", }) {
50
+ const longPressTimerRef = useRef(null);
51
+ const suppressClickRef = useRef(false);
52
+ const isGameModal = variant === "game-modal";
53
+ const clearLongPressTimer = useCallback(() => {
54
+ if (longPressTimerRef.current !== null) {
55
+ clearTimeout(longPressTimerRef.current);
56
+ longPressTimerRef.current = null;
57
+ }
58
+ }, []);
59
+ useEffect(() => {
60
+ return () => clearLongPressTimer();
61
+ }, [clearLongPressTimer]);
62
+ const handleTouchStart = (event) => {
63
+ if (!mobile || !onOpenActions)
64
+ return;
65
+ clearLongPressTimer();
66
+ longPressTimerRef.current = setTimeout(() => {
67
+ suppressClickRef.current = true;
68
+ onOpenActions(event, conversation);
69
+ clearLongPressTimer();
70
+ }, 450);
71
+ };
72
+ const handleTouchEnd = () => {
73
+ clearLongPressTimer();
74
+ };
75
+ const renderedTitle = displayTitle ?? conversation.title;
76
+ const conversationSource = typeof conversation.source === "string" && conversation.source.trim()
77
+ ? conversation.source
78
+ : null;
79
+ const showInlineActions = isGameModal;
80
+ const showSourceBadge = !isGameModal &&
81
+ conversationSource !== null &&
82
+ conversationSource.trim().toLowerCase() !== "app";
83
+ return (_jsxs("div", { "data-testid": "conv-item", "data-active": isActive || undefined, className: isGameModal
84
+ ? `group relative flex w-full items-start gap-2 rounded-xl border p-2.5 transition-all sm:gap-3 ${isActive
85
+ ? "border-[color:var(--onboarding-accent-border)] bg-[color:var(--onboarding-accent-bg)] shadow-[0_14px_28px_rgba(0,0,0,0.2)]"
86
+ : "border-transparent bg-transparent hover:border-white/10 hover:bg-white/5"}`
87
+ : `group relative flex w-full items-start justify-start gap-3 rounded-2xl border px-3.5 py-3.5 text-left transition-[border-color,background-color,color,box-shadow,transform] duration-150 focus-within:ring-2 focus-within:ring-accent/35 ${isActive
88
+ ? "border-accent/26 bg-[linear-gradient(180deg,rgba(var(--accent-rgb),0.18),rgba(var(--accent-rgb),0.08))] text-txt shadow-[inset_0_1px_0_rgba(255,255,255,0.16),0_18px_24px_-22px_rgba(var(--accent-rgb),0.22)] ring-1 ring-inset ring-accent/10 dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.05),0_18px_28px_-22px_rgba(0,0,0,0.26),0_0_0_1px_rgba(var(--accent-rgb),0.12)]"
89
+ : "border-border/10 bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_18%,transparent),transparent)] text-muted shadow-[inset_0_1px_0_rgba(255,255,255,0.04)] hover:border-border/28 hover:bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_28%,transparent),transparent)] hover:text-txt hover:shadow-[inset_0_1px_0_rgba(255,255,255,0.08),0_14px_20px_-22px_rgba(15,23,42,0.12)] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.02)] dark:hover:shadow-[inset_0_1px_0_rgba(255,255,255,0.04),0_14px_22px_-22px_rgba(0,0,0,0.22)]"}`, children: [_jsxs(Button, { variant: "ghost", size: "sm", "data-testid": "conv-select", className: isGameModal
90
+ ? "flex h-auto w-full min-w-0 flex-1 cursor-pointer flex-col !items-start !justify-start overflow-hidden rounded-none border-none bg-transparent p-0 !text-left"
91
+ : `m-0 flex h-auto w-full min-w-0 flex-1 cursor-pointer items-start gap-3 overflow-hidden rounded-none border-0 bg-transparent p-0 text-left hover:bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0 ${showSourceBadge ? "pr-8" : ""}`, onClick: () => {
92
+ if (suppressClickRef.current) {
93
+ suppressClickRef.current = false;
94
+ return;
95
+ }
96
+ onSelect();
97
+ }, onContextMenu: (event) => {
98
+ if (mobile || !onOpenActions)
99
+ return;
100
+ onOpenActions(event, conversation);
101
+ }, onTouchStart: handleTouchStart, onTouchEnd: handleTouchEnd, onTouchCancel: handleTouchEnd, onTouchMove: handleTouchEnd, children: [isUnread ? (_jsx("span", { className: isGameModal
102
+ ? "absolute left-3 top-3 z-[1] h-2 w-2 shrink-0 rounded-full bg-accent shadow-[0_0_10px_rgba(var(--accent-rgb),0.6)] animate-pulse"
103
+ : "mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full bg-accent shadow-[0_0_8px_rgba(var(--accent-rgb),0.35)]" })) : null, _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(TruncatingConversationTitle, { displayTitle: renderedTitle, isActive: isActive, variant: variant }), !isGameModal ? (_jsxs("div", { className: "mt-1.5 flex flex-wrap items-center gap-1.5 text-xs-tight font-medium leading-none text-muted/72 [font-variant-numeric:tabular-nums]", children: [conversation.updatedAtLabel ? (_jsx("span", { children: conversation.updatedAtLabel })) : null, isUnread ? (_jsx(PagePanel.Meta, { compact: true, tone: "accent", children: "New" })) : null] })) : null] })] }), showSourceBadge && conversationSource !== null ? (_jsx("div", { className: "pointer-events-none absolute right-3.5 top-3.5", children: _jsx(ChatSourceIcon, { source: conversationSource, className: "h-4 w-4" }) })) : null, showInlineActions && !isConfirmingDelete ? (_jsx(Button, { size: "icon", variant: isGameModal ? "ghost" : "surface", "data-testid": "conv-rename", "aria-label": labels.rename ?? "Rename conversation", className: cn(isGameModal
104
+ ? "h-8 w-8 shrink-0 self-center rounded-lg border border-white/10 bg-black/20 text-[color:var(--onboarding-text-muted)] shadow-sm transition-[border-color,background-color,color,opacity] hover:border-[color:var(--onboarding-accent-border)] hover:bg-[color:var(--onboarding-accent-bg)] hover:text-[color:var(--onboarding-text-strong)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent"
105
+ : "h-8 w-8 shrink-0 rounded-lg hover:text-accent", mobile
106
+ ? "opacity-100"
107
+ : "opacity-0 pointer-events-none group-hover:opacity-100 group-hover:pointer-events-auto focus-visible:opacity-100 focus-visible:pointer-events-auto"), onClick: (event) => {
108
+ event.preventDefault();
109
+ event.stopPropagation();
110
+ onRequestRename?.();
111
+ }, children: _jsx(PencilLine, { className: "h-3.5 w-3.5", strokeWidth: 2.25, "aria-hidden": true }) })) : null, showInlineActions && !isConfirmingDelete ? (_jsx(Button, { size: "icon", variant: isGameModal ? "ghost" : "surfaceDestructive", "data-testid": "conv-delete", "aria-label": labels.delete ?? "Delete conversation", className: cn(isGameModal
112
+ ? "h-8 w-8 shrink-0 self-center rounded-lg border border-white/10 bg-black/20 text-[color:var(--onboarding-text-muted)] shadow-sm transition-[border-color,background-color,color,opacity] hover:border-[color:var(--onboarding-accent-border)] hover:bg-[color:var(--onboarding-accent-bg)] hover:text-[color:var(--onboarding-text-strong)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent"
113
+ : "h-8 w-8 shrink-0 rounded-lg", mobile
114
+ ? "opacity-100"
115
+ : "opacity-0 pointer-events-none group-hover:opacity-100 group-hover:pointer-events-auto focus-visible:opacity-100 focus-visible:pointer-events-auto", "hover:text-danger"), onClick: (event) => {
116
+ event.preventDefault();
117
+ event.stopPropagation();
118
+ onRequestDeleteConfirm?.();
119
+ }, children: _jsx(X, { className: "h-3.5 w-3.5", strokeWidth: 2.25, "aria-hidden": true }) })) : null, isConfirmingDelete ? (_jsxs("div", { className: "flex flex-shrink-0 items-center gap-1.5 rounded-lg border border-danger/22 bg-[linear-gradient(180deg,rgba(239,68,68,0.1),rgba(239,68,68,0.04))] px-2 py-1 shadow-[inset_0_1px_0_rgba(255,255,255,0.08),0_10px_16px_-16px_rgba(127,29,29,0.18)]", children: [_jsx("span", { className: "text-2xs font-medium text-danger", children: labels.deleteConfirm ?? "Delete?" }), _jsx(Button, { variant: "destructive", size: "sm", className: "h-7 rounded-md px-2 py-0.5 text-2xs shadow-sm disabled:opacity-50", onClick: () => void onConfirmDelete?.(), disabled: deleting, children: deleting ? "..." : (labels.deleteYes ?? "Yes") }), _jsx(Button, { variant: "outline", size: "sm", className: "h-7 rounded-md px-2 py-0.5 text-2xs text-muted-strong shadow-sm hover:border-accent/40 hover:text-txt disabled:opacity-50", onClick: onCancelDelete, disabled: deleting, children: labels.deleteNo ?? "No" })] })) : null] }));
120
+ }