@oxy.so/bloom 5.1.0 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/docs/adoption-matrix.mdx +9 -9
  2. package/docs/app-shell.mdx +3 -1
  3. package/docs/button.mdx +2 -0
  4. package/docs/card-form.mdx +2 -0
  5. package/docs/chat-composer.mdx +1 -1
  6. package/docs/chat-people.mdx +8 -0
  7. package/docs/earnings.mdx +2 -0
  8. package/docs/field.mdx +2 -0
  9. package/docs/label.mdx +2 -0
  10. package/docs/payment-method.mdx +2 -0
  11. package/docs/place-details.mdx +2 -2
  12. package/docs/proof-of-delivery.mdx +4 -0
  13. package/docs/select.mdx +2 -0
  14. package/docs/settings-modal.mdx +15 -0
  15. package/lib/commonjs/ai-chat/AiChatResizeHandle.js +166 -0
  16. package/lib/commonjs/ai-chat/AiChatResizeHandle.js.map +1 -0
  17. package/lib/commonjs/ai-chat/AiChatShell.js +6 -154
  18. package/lib/commonjs/ai-chat/AiChatShell.js.map +1 -1
  19. package/lib/commonjs/ai-chat/index.js +2 -1
  20. package/lib/commonjs/ai-chat/index.js.map +1 -1
  21. package/lib/commonjs/ai-chat/index.web.js +2 -1
  22. package/lib/commonjs/ai-chat/index.web.js.map +1 -1
  23. package/lib/commonjs/ai-chat/messages.js +15 -30
  24. package/lib/commonjs/ai-chat/messages.js.map +1 -1
  25. package/lib/commonjs/app-shell/AppShellSplit.js +2 -2
  26. package/lib/commonjs/app-shell/AppShellSplit.js.map +1 -1
  27. package/lib/commonjs/button/Button.js +36 -3
  28. package/lib/commonjs/button/Button.js.map +1 -1
  29. package/lib/commonjs/button/GlyphButton.js +7 -3
  30. package/lib/commonjs/button/GlyphButton.js.map +1 -1
  31. package/lib/commonjs/card-form/shared.js +3 -2
  32. package/lib/commonjs/card-form/shared.js.map +1 -1
  33. package/lib/commonjs/chat-composer/AttachmentMenu.js +8 -227
  34. package/lib/commonjs/chat-composer/AttachmentMenu.js.map +1 -1
  35. package/lib/commonjs/chat-composer/AttachmentMenu.web.js +16 -0
  36. package/lib/commonjs/chat-composer/AttachmentMenu.web.js.map +1 -0
  37. package/lib/commonjs/chat-composer/ChatComposer.js +9 -388
  38. package/lib/commonjs/chat-composer/ChatComposer.js.map +1 -1
  39. package/lib/commonjs/chat-composer/ChatComposer.web.js +16 -0
  40. package/lib/commonjs/chat-composer/ChatComposer.web.js.map +1 -0
  41. package/lib/commonjs/chat-composer/ComposerAttachmentStrip.js +5 -200
  42. package/lib/commonjs/chat-composer/ComposerAttachmentStrip.js.map +1 -1
  43. package/lib/commonjs/chat-composer/ComposerAttachmentStrip.web.js +12 -0
  44. package/lib/commonjs/chat-composer/ComposerAttachmentStrip.web.js.map +1 -0
  45. package/lib/commonjs/chat-composer/ComposerBanner.js +5 -163
  46. package/lib/commonjs/chat-composer/ComposerBanner.js.map +1 -1
  47. package/lib/commonjs/chat-composer/ComposerBanner.web.js +12 -0
  48. package/lib/commonjs/chat-composer/ComposerBanner.web.js.map +1 -0
  49. package/lib/commonjs/chat-composer/EmojiPicker.js +6 -443
  50. package/lib/commonjs/chat-composer/EmojiPicker.js.map +1 -1
  51. package/lib/commonjs/chat-composer/EmojiPicker.web.js +14 -0
  52. package/lib/commonjs/chat-composer/EmojiPicker.web.js.map +1 -0
  53. package/lib/commonjs/chat-composer/MessageContextMenu.js +12 -102
  54. package/lib/commonjs/chat-composer/MessageContextMenu.js.map +1 -1
  55. package/lib/commonjs/chat-composer/MessageContextMenu.web.js +19 -0
  56. package/lib/commonjs/chat-composer/MessageContextMenu.web.js.map +1 -0
  57. package/lib/commonjs/chat-composer/ReactionPicker.js +6 -107
  58. package/lib/commonjs/chat-composer/ReactionPicker.js.map +1 -1
  59. package/lib/commonjs/chat-composer/ReactionPicker.web.js +14 -0
  60. package/lib/commonjs/chat-composer/ReactionPicker.web.js.map +1 -0
  61. package/lib/commonjs/chat-composer/SuggestionList.js +5 -222
  62. package/lib/commonjs/chat-composer/SuggestionList.js.map +1 -1
  63. package/lib/commonjs/chat-composer/SuggestionList.web.js +12 -0
  64. package/lib/commonjs/chat-composer/SuggestionList.web.js.map +1 -0
  65. package/lib/commonjs/chat-composer/VoiceRecorder.js +7 -263
  66. package/lib/commonjs/chat-composer/VoiceRecorder.js.map +1 -1
  67. package/lib/commonjs/chat-composer/VoiceRecorder.web.js +16 -0
  68. package/lib/commonjs/chat-composer/VoiceRecorder.web.js.map +1 -0
  69. package/lib/commonjs/chat-composer/create-attachment-menu.js +243 -0
  70. package/lib/commonjs/chat-composer/create-attachment-menu.js.map +1 -0
  71. package/lib/commonjs/chat-composer/create-chat-composer.js +400 -0
  72. package/lib/commonjs/chat-composer/create-chat-composer.js.map +1 -0
  73. package/lib/commonjs/chat-composer/create-composer-attachment-strip.js +212 -0
  74. package/lib/commonjs/chat-composer/create-composer-attachment-strip.js.map +1 -0
  75. package/lib/commonjs/chat-composer/create-composer-banner.js +176 -0
  76. package/lib/commonjs/chat-composer/create-composer-banner.js.map +1 -0
  77. package/lib/commonjs/chat-composer/create-emoji-picker.js +456 -0
  78. package/lib/commonjs/chat-composer/create-emoji-picker.js.map +1 -0
  79. package/lib/commonjs/chat-composer/create-message-context-menu.js +119 -0
  80. package/lib/commonjs/chat-composer/create-message-context-menu.js.map +1 -0
  81. package/lib/commonjs/chat-composer/create-reaction-picker.js +120 -0
  82. package/lib/commonjs/chat-composer/create-reaction-picker.js.map +1 -0
  83. package/lib/commonjs/chat-composer/create-suggestion-list.js +234 -0
  84. package/lib/commonjs/chat-composer/create-suggestion-list.js.map +1 -0
  85. package/lib/commonjs/chat-composer/create-voice-recorder.js +277 -0
  86. package/lib/commonjs/chat-composer/create-voice-recorder.js.map +1 -0
  87. package/lib/commonjs/chat-composer/index.js +9 -9
  88. package/lib/commonjs/chat-composer/index.web.js +18 -18
  89. package/lib/commonjs/chat-composer/index.web.js.map +1 -1
  90. package/lib/commonjs/chat-people/contact-row.js +13 -0
  91. package/lib/commonjs/chat-people/contact-row.js.map +1 -0
  92. package/lib/commonjs/chat-screen/ChatSplitLayout.js +2 -2
  93. package/lib/commonjs/chat-screen/ChatSplitLayout.js.map +1 -1
  94. package/lib/commonjs/earnings/EarningsSummary.js +12 -2
  95. package/lib/commonjs/earnings/EarningsSummary.js.map +1 -1
  96. package/lib/commonjs/field/Field.js +2 -0
  97. package/lib/commonjs/field/Field.js.map +1 -1
  98. package/lib/commonjs/item/Item.js +16 -8
  99. package/lib/commonjs/item/Item.js.map +1 -1
  100. package/lib/commonjs/job-board/JobCard.js +6 -2
  101. package/lib/commonjs/job-board/JobCard.js.map +1 -1
  102. package/lib/commonjs/label/Label.js +2 -1
  103. package/lib/commonjs/label/Label.js.map +1 -1
  104. package/lib/commonjs/listing-details/AmenityList.js +4 -3
  105. package/lib/commonjs/listing-details/AmenityList.js.map +1 -1
  106. package/lib/commonjs/locale/common-messages.js +30 -15
  107. package/lib/commonjs/locale/common-messages.js.map +1 -1
  108. package/lib/commonjs/mail-compose/MailComposeSurface.js +1 -1
  109. package/lib/commonjs/overlay/InteractionBoundary.js +28 -0
  110. package/lib/commonjs/overlay/InteractionBoundary.js.map +1 -0
  111. package/lib/commonjs/payment-method/PaymentMethodList.js +3 -2
  112. package/lib/commonjs/payment-method/PaymentMethodList.js.map +1 -1
  113. package/lib/commonjs/place-details/PlaceAmenities.js +17 -6
  114. package/lib/commonjs/place-details/PlaceAmenities.js.map +1 -1
  115. package/lib/commonjs/place-details/PlacePopularTimes.js +7 -1
  116. package/lib/commonjs/place-details/PlacePopularTimes.js.map +1 -1
  117. package/lib/commonjs/proof-of-delivery/ProofOfDelivery.js +10 -1
  118. package/lib/commonjs/proof-of-delivery/ProofOfDelivery.js.map +1 -1
  119. package/lib/commonjs/proof-of-delivery/shared.js +1 -1
  120. package/lib/commonjs/proof-of-delivery/shared.js.map +1 -1
  121. package/lib/commonjs/select/Select.js +7 -4
  122. package/lib/commonjs/select/Select.js.map +1 -1
  123. package/lib/commonjs/select/Select.web.js +7 -4
  124. package/lib/commonjs/select/Select.web.js.map +1 -1
  125. package/lib/commonjs/select/use-required-description.js +37 -0
  126. package/lib/commonjs/select/use-required-description.js.map +1 -0
  127. package/lib/commonjs/settings-modal/rows.js +37 -0
  128. package/lib/commonjs/settings-modal/rows.js.map +1 -0
  129. package/lib/module/ai-chat/AiChatResizeHandle.js +160 -0
  130. package/lib/module/ai-chat/AiChatResizeHandle.js.map +1 -0
  131. package/lib/module/ai-chat/AiChatShell.js +5 -152
  132. package/lib/module/ai-chat/AiChatShell.js.map +1 -1
  133. package/lib/module/ai-chat/index.js +2 -1
  134. package/lib/module/ai-chat/index.js.map +1 -1
  135. package/lib/module/ai-chat/index.web.js +2 -1
  136. package/lib/module/ai-chat/index.web.js.map +1 -1
  137. package/lib/module/ai-chat/messages.js +15 -30
  138. package/lib/module/ai-chat/messages.js.map +1 -1
  139. package/lib/module/app-shell/AppShellSplit.js +1 -1
  140. package/lib/module/app-shell/AppShellSplit.js.map +1 -1
  141. package/lib/module/button/Button.js +36 -3
  142. package/lib/module/button/Button.js.map +1 -1
  143. package/lib/module/button/GlyphButton.js +7 -3
  144. package/lib/module/button/GlyphButton.js.map +1 -1
  145. package/lib/module/card-form/shared.js +3 -2
  146. package/lib/module/card-form/shared.js.map +1 -1
  147. package/lib/module/chat-composer/AttachmentMenu.js +7 -226
  148. package/lib/module/chat-composer/AttachmentMenu.js.map +1 -1
  149. package/lib/module/chat-composer/AttachmentMenu.web.js +12 -0
  150. package/lib/module/chat-composer/AttachmentMenu.web.js.map +1 -0
  151. package/lib/module/chat-composer/ChatComposer.js +8 -385
  152. package/lib/module/chat-composer/ChatComposer.js.map +1 -1
  153. package/lib/module/chat-composer/ChatComposer.web.js +12 -0
  154. package/lib/module/chat-composer/ChatComposer.web.js.map +1 -0
  155. package/lib/module/chat-composer/ComposerAttachmentStrip.js +4 -196
  156. package/lib/module/chat-composer/ComposerAttachmentStrip.js.map +1 -1
  157. package/lib/module/chat-composer/ComposerAttachmentStrip.web.js +8 -0
  158. package/lib/module/chat-composer/ComposerAttachmentStrip.web.js.map +1 -0
  159. package/lib/module/chat-composer/ComposerBanner.js +4 -162
  160. package/lib/module/chat-composer/ComposerBanner.js.map +1 -1
  161. package/lib/module/chat-composer/ComposerBanner.web.js +8 -0
  162. package/lib/module/chat-composer/ComposerBanner.web.js.map +1 -0
  163. package/lib/module/chat-composer/EmojiPicker.js +5 -440
  164. package/lib/module/chat-composer/EmojiPicker.js.map +1 -1
  165. package/lib/module/chat-composer/EmojiPicker.web.js +10 -0
  166. package/lib/module/chat-composer/EmojiPicker.web.js.map +1 -0
  167. package/lib/module/chat-composer/MessageContextMenu.js +11 -99
  168. package/lib/module/chat-composer/MessageContextMenu.js.map +1 -1
  169. package/lib/module/chat-composer/MessageContextMenu.web.js +15 -0
  170. package/lib/module/chat-composer/MessageContextMenu.web.js.map +1 -0
  171. package/lib/module/chat-composer/ReactionPicker.js +5 -104
  172. package/lib/module/chat-composer/ReactionPicker.js.map +1 -1
  173. package/lib/module/chat-composer/ReactionPicker.web.js +10 -0
  174. package/lib/module/chat-composer/ReactionPicker.web.js.map +1 -0
  175. package/lib/module/chat-composer/SuggestionList.js +4 -219
  176. package/lib/module/chat-composer/SuggestionList.js.map +1 -1
  177. package/lib/module/chat-composer/SuggestionList.web.js +8 -0
  178. package/lib/module/chat-composer/SuggestionList.web.js.map +1 -0
  179. package/lib/module/chat-composer/VoiceRecorder.js +6 -260
  180. package/lib/module/chat-composer/VoiceRecorder.js.map +1 -1
  181. package/lib/module/chat-composer/VoiceRecorder.web.js +12 -0
  182. package/lib/module/chat-composer/VoiceRecorder.web.js.map +1 -0
  183. package/lib/module/chat-composer/create-attachment-menu.js +238 -0
  184. package/lib/module/chat-composer/create-attachment-menu.js.map +1 -0
  185. package/lib/module/chat-composer/create-chat-composer.js +395 -0
  186. package/lib/module/chat-composer/create-chat-composer.js.map +1 -0
  187. package/lib/module/chat-composer/create-composer-attachment-strip.js +206 -0
  188. package/lib/module/chat-composer/create-composer-attachment-strip.js.map +1 -0
  189. package/lib/module/chat-composer/create-composer-banner.js +171 -0
  190. package/lib/module/chat-composer/create-composer-banner.js.map +1 -0
  191. package/lib/module/chat-composer/create-emoji-picker.js +451 -0
  192. package/lib/module/chat-composer/create-emoji-picker.js.map +1 -0
  193. package/lib/module/chat-composer/create-message-context-menu.js +114 -0
  194. package/lib/module/chat-composer/create-message-context-menu.js.map +1 -0
  195. package/lib/module/chat-composer/create-reaction-picker.js +115 -0
  196. package/lib/module/chat-composer/create-reaction-picker.js.map +1 -0
  197. package/lib/module/chat-composer/create-suggestion-list.js +229 -0
  198. package/lib/module/chat-composer/create-suggestion-list.js.map +1 -0
  199. package/lib/module/chat-composer/create-voice-recorder.js +272 -0
  200. package/lib/module/chat-composer/create-voice-recorder.js.map +1 -0
  201. package/lib/module/chat-composer/index.js +9 -9
  202. package/lib/module/chat-composer/index.js.map +1 -1
  203. package/lib/module/chat-composer/index.web.js +9 -9
  204. package/lib/module/chat-composer/index.web.js.map +1 -1
  205. package/lib/module/chat-people/contact-row.js +10 -0
  206. package/lib/module/chat-people/contact-row.js.map +1 -0
  207. package/lib/module/chat-screen/ChatSplitLayout.js +1 -1
  208. package/lib/module/chat-screen/ChatSplitLayout.js.map +1 -1
  209. package/lib/module/earnings/EarningsSummary.js +12 -2
  210. package/lib/module/earnings/EarningsSummary.js.map +1 -1
  211. package/lib/module/field/Field.js +2 -0
  212. package/lib/module/field/Field.js.map +1 -1
  213. package/lib/module/item/Item.js +16 -8
  214. package/lib/module/item/Item.js.map +1 -1
  215. package/lib/module/job-board/JobCard.js +6 -2
  216. package/lib/module/job-board/JobCard.js.map +1 -1
  217. package/lib/module/label/Label.js +2 -1
  218. package/lib/module/label/Label.js.map +1 -1
  219. package/lib/module/listing-details/AmenityList.js +4 -3
  220. package/lib/module/listing-details/AmenityList.js.map +1 -1
  221. package/lib/module/locale/common-messages.js +30 -15
  222. package/lib/module/locale/common-messages.js.map +1 -1
  223. package/lib/module/mail-compose/MailComposeSurface.js +1 -1
  224. package/lib/module/mail-compose/MailComposeSurface.js.map +1 -1
  225. package/lib/module/overlay/InteractionBoundary.js +25 -0
  226. package/lib/module/overlay/InteractionBoundary.js.map +1 -0
  227. package/lib/module/payment-method/PaymentMethodList.js +3 -2
  228. package/lib/module/payment-method/PaymentMethodList.js.map +1 -1
  229. package/lib/module/place-details/PlaceAmenities.js +15 -4
  230. package/lib/module/place-details/PlaceAmenities.js.map +1 -1
  231. package/lib/module/place-details/PlacePopularTimes.js +7 -1
  232. package/lib/module/place-details/PlacePopularTimes.js.map +1 -1
  233. package/lib/module/proof-of-delivery/ProofOfDelivery.js +10 -1
  234. package/lib/module/proof-of-delivery/ProofOfDelivery.js.map +1 -1
  235. package/lib/module/proof-of-delivery/shared.js +1 -1
  236. package/lib/module/proof-of-delivery/shared.js.map +1 -1
  237. package/lib/module/select/Select.js +7 -4
  238. package/lib/module/select/Select.js.map +1 -1
  239. package/lib/module/select/Select.web.js +7 -4
  240. package/lib/module/select/Select.web.js.map +1 -1
  241. package/lib/module/select/use-required-description.js +33 -0
  242. package/lib/module/select/use-required-description.js.map +1 -0
  243. package/lib/module/settings-modal/rows.js +10 -0
  244. package/lib/module/settings-modal/rows.js.map +1 -0
  245. package/lib/typescript/commonjs/ai-chat/AiChatResizeHandle.d.ts +11 -0
  246. package/lib/typescript/commonjs/ai-chat/AiChatResizeHandle.d.ts.map +1 -0
  247. package/lib/typescript/commonjs/ai-chat/AiChatShell.d.ts +1 -10
  248. package/lib/typescript/commonjs/ai-chat/AiChatShell.d.ts.map +1 -1
  249. package/lib/typescript/commonjs/ai-chat/index.d.ts +2 -1
  250. package/lib/typescript/commonjs/ai-chat/index.d.ts.map +1 -1
  251. package/lib/typescript/commonjs/ai-chat/index.web.d.ts +2 -1
  252. package/lib/typescript/commonjs/ai-chat/index.web.d.ts.map +1 -1
  253. package/lib/typescript/commonjs/ai-chat/messages.d.ts +0 -1
  254. package/lib/typescript/commonjs/ai-chat/messages.d.ts.map +1 -1
  255. package/lib/typescript/commonjs/button/Button.d.ts.map +1 -1
  256. package/lib/typescript/commonjs/card-form/shared.d.ts +2 -1
  257. package/lib/typescript/commonjs/card-form/shared.d.ts.map +1 -1
  258. package/lib/typescript/commonjs/chat-composer/AttachmentMenu.d.ts +1 -2
  259. package/lib/typescript/commonjs/chat-composer/AttachmentMenu.d.ts.map +1 -1
  260. package/lib/typescript/commonjs/chat-composer/AttachmentMenu.web.d.ts +2 -0
  261. package/lib/typescript/commonjs/chat-composer/AttachmentMenu.web.d.ts.map +1 -0
  262. package/lib/typescript/commonjs/chat-composer/ChatComposer.d.ts +1 -2
  263. package/lib/typescript/commonjs/chat-composer/ChatComposer.d.ts.map +1 -1
  264. package/lib/typescript/commonjs/chat-composer/ChatComposer.web.d.ts +2 -0
  265. package/lib/typescript/commonjs/chat-composer/ChatComposer.web.d.ts.map +1 -0
  266. package/lib/typescript/commonjs/chat-composer/ComposerAttachmentStrip.d.ts +1 -2
  267. package/lib/typescript/commonjs/chat-composer/ComposerAttachmentStrip.d.ts.map +1 -1
  268. package/lib/typescript/commonjs/chat-composer/ComposerAttachmentStrip.web.d.ts +2 -0
  269. package/lib/typescript/commonjs/chat-composer/ComposerAttachmentStrip.web.d.ts.map +1 -0
  270. package/lib/typescript/commonjs/chat-composer/ComposerBanner.d.ts +1 -2
  271. package/lib/typescript/commonjs/chat-composer/ComposerBanner.d.ts.map +1 -1
  272. package/lib/typescript/commonjs/chat-composer/ComposerBanner.web.d.ts +2 -0
  273. package/lib/typescript/commonjs/chat-composer/ComposerBanner.web.d.ts.map +1 -0
  274. package/lib/typescript/commonjs/chat-composer/EmojiPicker.d.ts +1 -2
  275. package/lib/typescript/commonjs/chat-composer/EmojiPicker.d.ts.map +1 -1
  276. package/lib/typescript/commonjs/chat-composer/EmojiPicker.web.d.ts +2 -0
  277. package/lib/typescript/commonjs/chat-composer/EmojiPicker.web.d.ts.map +1 -0
  278. package/lib/typescript/commonjs/chat-composer/MessageContextMenu.d.ts +1 -2
  279. package/lib/typescript/commonjs/chat-composer/MessageContextMenu.d.ts.map +1 -1
  280. package/lib/typescript/commonjs/chat-composer/MessageContextMenu.web.d.ts +2 -0
  281. package/lib/typescript/commonjs/chat-composer/MessageContextMenu.web.d.ts.map +1 -0
  282. package/lib/typescript/commonjs/chat-composer/ReactionPicker.d.ts +1 -2
  283. package/lib/typescript/commonjs/chat-composer/ReactionPicker.d.ts.map +1 -1
  284. package/lib/typescript/commonjs/chat-composer/ReactionPicker.web.d.ts +2 -0
  285. package/lib/typescript/commonjs/chat-composer/ReactionPicker.web.d.ts.map +1 -0
  286. package/lib/typescript/commonjs/chat-composer/SuggestionList.d.ts +1 -2
  287. package/lib/typescript/commonjs/chat-composer/SuggestionList.d.ts.map +1 -1
  288. package/lib/typescript/commonjs/chat-composer/SuggestionList.web.d.ts +2 -0
  289. package/lib/typescript/commonjs/chat-composer/SuggestionList.web.d.ts.map +1 -0
  290. package/lib/typescript/commonjs/chat-composer/VoiceRecorder.d.ts +1 -2
  291. package/lib/typescript/commonjs/chat-composer/VoiceRecorder.d.ts.map +1 -1
  292. package/lib/typescript/commonjs/chat-composer/VoiceRecorder.web.d.ts +2 -0
  293. package/lib/typescript/commonjs/chat-composer/VoiceRecorder.web.d.ts.map +1 -0
  294. package/lib/typescript/commonjs/chat-composer/create-attachment-menu.d.ts +11 -0
  295. package/lib/typescript/commonjs/chat-composer/create-attachment-menu.d.ts.map +1 -0
  296. package/lib/typescript/commonjs/chat-composer/create-chat-composer.d.ts +11 -0
  297. package/lib/typescript/commonjs/chat-composer/create-chat-composer.d.ts.map +1 -0
  298. package/lib/typescript/commonjs/chat-composer/create-composer-attachment-strip.d.ts +7 -0
  299. package/lib/typescript/commonjs/chat-composer/create-composer-attachment-strip.d.ts.map +1 -0
  300. package/lib/typescript/commonjs/chat-composer/create-composer-banner.d.ts +7 -0
  301. package/lib/typescript/commonjs/chat-composer/create-composer-banner.d.ts.map +1 -0
  302. package/lib/typescript/commonjs/chat-composer/create-emoji-picker.d.ts +9 -0
  303. package/lib/typescript/commonjs/chat-composer/create-emoji-picker.d.ts.map +1 -0
  304. package/lib/typescript/commonjs/chat-composer/create-message-context-menu.d.ts +14 -0
  305. package/lib/typescript/commonjs/chat-composer/create-message-context-menu.d.ts.map +1 -0
  306. package/lib/typescript/commonjs/chat-composer/create-reaction-picker.d.ts +9 -0
  307. package/lib/typescript/commonjs/chat-composer/create-reaction-picker.d.ts.map +1 -0
  308. package/lib/typescript/commonjs/chat-composer/create-suggestion-list.d.ts +7 -0
  309. package/lib/typescript/commonjs/chat-composer/create-suggestion-list.d.ts.map +1 -0
  310. package/lib/typescript/commonjs/chat-composer/create-voice-recorder.d.ts +11 -0
  311. package/lib/typescript/commonjs/chat-composer/create-voice-recorder.d.ts.map +1 -0
  312. package/lib/typescript/commonjs/chat-composer/index.web.d.ts +9 -9
  313. package/lib/typescript/commonjs/chat-composer/index.web.d.ts.map +1 -1
  314. package/lib/typescript/commonjs/chat-people/contact-row.d.ts +9 -0
  315. package/lib/typescript/commonjs/chat-people/contact-row.d.ts.map +1 -0
  316. package/lib/typescript/commonjs/earnings/EarningsSummary.d.ts.map +1 -1
  317. package/lib/typescript/commonjs/field/Field.d.ts +1 -1
  318. package/lib/typescript/commonjs/field/Field.d.ts.map +1 -1
  319. package/lib/typescript/commonjs/field/types.d.ts +2 -0
  320. package/lib/typescript/commonjs/field/types.d.ts.map +1 -1
  321. package/lib/typescript/commonjs/floating/types.d.ts +1 -0
  322. package/lib/typescript/commonjs/floating/types.d.ts.map +1 -1
  323. package/lib/typescript/commonjs/item/Item.d.ts.map +1 -1
  324. package/lib/typescript/commonjs/job-board/JobCard.d.ts.map +1 -1
  325. package/lib/typescript/commonjs/label/Label.d.ts +1 -1
  326. package/lib/typescript/commonjs/label/Label.d.ts.map +1 -1
  327. package/lib/typescript/commonjs/label/types.d.ts +2 -0
  328. package/lib/typescript/commonjs/label/types.d.ts.map +1 -1
  329. package/lib/typescript/commonjs/listing-details/AmenityList.d.ts.map +1 -1
  330. package/lib/typescript/commonjs/locale/common-messages.d.ts +2 -0
  331. package/lib/typescript/commonjs/locale/common-messages.d.ts.map +1 -1
  332. package/lib/typescript/commonjs/overlay/InteractionBoundary.d.ts +7 -0
  333. package/lib/typescript/commonjs/overlay/InteractionBoundary.d.ts.map +1 -0
  334. package/lib/typescript/commonjs/payment-method/PaymentMethodList.d.ts.map +1 -1
  335. package/lib/typescript/commonjs/place-details/PlaceAmenities.d.ts.map +1 -1
  336. package/lib/typescript/commonjs/place-details/PlacePopularTimes.d.ts.map +1 -1
  337. package/lib/typescript/commonjs/proof-of-delivery/ProofOfDelivery.d.ts.map +1 -1
  338. package/lib/typescript/commonjs/select/Select.d.ts.map +1 -1
  339. package/lib/typescript/commonjs/select/Select.web.d.ts.map +1 -1
  340. package/lib/typescript/commonjs/select/use-required-description.d.ts +7 -0
  341. package/lib/typescript/commonjs/select/use-required-description.d.ts.map +1 -0
  342. package/lib/typescript/commonjs/settings-modal/rows.d.ts +9 -0
  343. package/lib/typescript/commonjs/settings-modal/rows.d.ts.map +1 -0
  344. package/lib/typescript/module/ai-chat/AiChatResizeHandle.d.ts +11 -0
  345. package/lib/typescript/module/ai-chat/AiChatResizeHandle.d.ts.map +1 -0
  346. package/lib/typescript/module/ai-chat/AiChatShell.d.ts +1 -10
  347. package/lib/typescript/module/ai-chat/AiChatShell.d.ts.map +1 -1
  348. package/lib/typescript/module/ai-chat/index.d.ts +2 -1
  349. package/lib/typescript/module/ai-chat/index.d.ts.map +1 -1
  350. package/lib/typescript/module/ai-chat/index.web.d.ts +2 -1
  351. package/lib/typescript/module/ai-chat/index.web.d.ts.map +1 -1
  352. package/lib/typescript/module/ai-chat/messages.d.ts +0 -1
  353. package/lib/typescript/module/ai-chat/messages.d.ts.map +1 -1
  354. package/lib/typescript/module/button/Button.d.ts.map +1 -1
  355. package/lib/typescript/module/card-form/shared.d.ts +2 -1
  356. package/lib/typescript/module/card-form/shared.d.ts.map +1 -1
  357. package/lib/typescript/module/chat-composer/AttachmentMenu.d.ts +1 -2
  358. package/lib/typescript/module/chat-composer/AttachmentMenu.d.ts.map +1 -1
  359. package/lib/typescript/module/chat-composer/AttachmentMenu.web.d.ts +2 -0
  360. package/lib/typescript/module/chat-composer/AttachmentMenu.web.d.ts.map +1 -0
  361. package/lib/typescript/module/chat-composer/ChatComposer.d.ts +1 -2
  362. package/lib/typescript/module/chat-composer/ChatComposer.d.ts.map +1 -1
  363. package/lib/typescript/module/chat-composer/ChatComposer.web.d.ts +2 -0
  364. package/lib/typescript/module/chat-composer/ChatComposer.web.d.ts.map +1 -0
  365. package/lib/typescript/module/chat-composer/ComposerAttachmentStrip.d.ts +1 -2
  366. package/lib/typescript/module/chat-composer/ComposerAttachmentStrip.d.ts.map +1 -1
  367. package/lib/typescript/module/chat-composer/ComposerAttachmentStrip.web.d.ts +2 -0
  368. package/lib/typescript/module/chat-composer/ComposerAttachmentStrip.web.d.ts.map +1 -0
  369. package/lib/typescript/module/chat-composer/ComposerBanner.d.ts +1 -2
  370. package/lib/typescript/module/chat-composer/ComposerBanner.d.ts.map +1 -1
  371. package/lib/typescript/module/chat-composer/ComposerBanner.web.d.ts +2 -0
  372. package/lib/typescript/module/chat-composer/ComposerBanner.web.d.ts.map +1 -0
  373. package/lib/typescript/module/chat-composer/EmojiPicker.d.ts +1 -2
  374. package/lib/typescript/module/chat-composer/EmojiPicker.d.ts.map +1 -1
  375. package/lib/typescript/module/chat-composer/EmojiPicker.web.d.ts +2 -0
  376. package/lib/typescript/module/chat-composer/EmojiPicker.web.d.ts.map +1 -0
  377. package/lib/typescript/module/chat-composer/MessageContextMenu.d.ts +1 -2
  378. package/lib/typescript/module/chat-composer/MessageContextMenu.d.ts.map +1 -1
  379. package/lib/typescript/module/chat-composer/MessageContextMenu.web.d.ts +2 -0
  380. package/lib/typescript/module/chat-composer/MessageContextMenu.web.d.ts.map +1 -0
  381. package/lib/typescript/module/chat-composer/ReactionPicker.d.ts +1 -2
  382. package/lib/typescript/module/chat-composer/ReactionPicker.d.ts.map +1 -1
  383. package/lib/typescript/module/chat-composer/ReactionPicker.web.d.ts +2 -0
  384. package/lib/typescript/module/chat-composer/ReactionPicker.web.d.ts.map +1 -0
  385. package/lib/typescript/module/chat-composer/SuggestionList.d.ts +1 -2
  386. package/lib/typescript/module/chat-composer/SuggestionList.d.ts.map +1 -1
  387. package/lib/typescript/module/chat-composer/SuggestionList.web.d.ts +2 -0
  388. package/lib/typescript/module/chat-composer/SuggestionList.web.d.ts.map +1 -0
  389. package/lib/typescript/module/chat-composer/VoiceRecorder.d.ts +1 -2
  390. package/lib/typescript/module/chat-composer/VoiceRecorder.d.ts.map +1 -1
  391. package/lib/typescript/module/chat-composer/VoiceRecorder.web.d.ts +2 -0
  392. package/lib/typescript/module/chat-composer/VoiceRecorder.web.d.ts.map +1 -0
  393. package/lib/typescript/module/chat-composer/create-attachment-menu.d.ts +11 -0
  394. package/lib/typescript/module/chat-composer/create-attachment-menu.d.ts.map +1 -0
  395. package/lib/typescript/module/chat-composer/create-chat-composer.d.ts +11 -0
  396. package/lib/typescript/module/chat-composer/create-chat-composer.d.ts.map +1 -0
  397. package/lib/typescript/module/chat-composer/create-composer-attachment-strip.d.ts +7 -0
  398. package/lib/typescript/module/chat-composer/create-composer-attachment-strip.d.ts.map +1 -0
  399. package/lib/typescript/module/chat-composer/create-composer-banner.d.ts +7 -0
  400. package/lib/typescript/module/chat-composer/create-composer-banner.d.ts.map +1 -0
  401. package/lib/typescript/module/chat-composer/create-emoji-picker.d.ts +9 -0
  402. package/lib/typescript/module/chat-composer/create-emoji-picker.d.ts.map +1 -0
  403. package/lib/typescript/module/chat-composer/create-message-context-menu.d.ts +14 -0
  404. package/lib/typescript/module/chat-composer/create-message-context-menu.d.ts.map +1 -0
  405. package/lib/typescript/module/chat-composer/create-reaction-picker.d.ts +9 -0
  406. package/lib/typescript/module/chat-composer/create-reaction-picker.d.ts.map +1 -0
  407. package/lib/typescript/module/chat-composer/create-suggestion-list.d.ts +7 -0
  408. package/lib/typescript/module/chat-composer/create-suggestion-list.d.ts.map +1 -0
  409. package/lib/typescript/module/chat-composer/create-voice-recorder.d.ts +11 -0
  410. package/lib/typescript/module/chat-composer/create-voice-recorder.d.ts.map +1 -0
  411. package/lib/typescript/module/chat-composer/index.web.d.ts +9 -9
  412. package/lib/typescript/module/chat-composer/index.web.d.ts.map +1 -1
  413. package/lib/typescript/module/chat-people/contact-row.d.ts +9 -0
  414. package/lib/typescript/module/chat-people/contact-row.d.ts.map +1 -0
  415. package/lib/typescript/module/earnings/EarningsSummary.d.ts.map +1 -1
  416. package/lib/typescript/module/field/Field.d.ts +1 -1
  417. package/lib/typescript/module/field/Field.d.ts.map +1 -1
  418. package/lib/typescript/module/field/types.d.ts +2 -0
  419. package/lib/typescript/module/field/types.d.ts.map +1 -1
  420. package/lib/typescript/module/floating/types.d.ts +1 -0
  421. package/lib/typescript/module/floating/types.d.ts.map +1 -1
  422. package/lib/typescript/module/item/Item.d.ts.map +1 -1
  423. package/lib/typescript/module/job-board/JobCard.d.ts.map +1 -1
  424. package/lib/typescript/module/label/Label.d.ts +1 -1
  425. package/lib/typescript/module/label/Label.d.ts.map +1 -1
  426. package/lib/typescript/module/label/types.d.ts +2 -0
  427. package/lib/typescript/module/label/types.d.ts.map +1 -1
  428. package/lib/typescript/module/listing-details/AmenityList.d.ts.map +1 -1
  429. package/lib/typescript/module/locale/common-messages.d.ts +2 -0
  430. package/lib/typescript/module/locale/common-messages.d.ts.map +1 -1
  431. package/lib/typescript/module/overlay/InteractionBoundary.d.ts +7 -0
  432. package/lib/typescript/module/overlay/InteractionBoundary.d.ts.map +1 -0
  433. package/lib/typescript/module/payment-method/PaymentMethodList.d.ts.map +1 -1
  434. package/lib/typescript/module/place-details/PlaceAmenities.d.ts.map +1 -1
  435. package/lib/typescript/module/place-details/PlacePopularTimes.d.ts.map +1 -1
  436. package/lib/typescript/module/proof-of-delivery/ProofOfDelivery.d.ts.map +1 -1
  437. package/lib/typescript/module/select/Select.d.ts.map +1 -1
  438. package/lib/typescript/module/select/Select.web.d.ts.map +1 -1
  439. package/lib/typescript/module/select/use-required-description.d.ts +7 -0
  440. package/lib/typescript/module/select/use-required-description.d.ts.map +1 -0
  441. package/lib/typescript/module/settings-modal/rows.d.ts +9 -0
  442. package/lib/typescript/module/settings-modal/rows.d.ts.map +1 -0
  443. package/package.json +35 -1
  444. package/src/ai-chat/AiChatResizeHandle.tsx +151 -0
  445. package/src/ai-chat/AiChatShell.tsx +8 -143
  446. package/src/ai-chat/index.ts +2 -1
  447. package/src/ai-chat/index.web.ts +2 -1
  448. package/src/ai-chat/messages.ts +0 -16
  449. package/src/app-shell/AppShellSplit.tsx +1 -1
  450. package/src/button/Button.tsx +35 -10
  451. package/src/button/GlyphButton.tsx +3 -3
  452. package/src/card-form/shared.ts +3 -2
  453. package/src/chat-composer/AttachmentMenu.tsx +2 -214
  454. package/src/chat-composer/AttachmentMenu.web.tsx +5 -0
  455. package/src/chat-composer/ChatComposer.tsx +2 -459
  456. package/src/chat-composer/ChatComposer.web.tsx +6 -0
  457. package/src/chat-composer/ComposerAttachmentStrip.tsx +2 -202
  458. package/src/chat-composer/ComposerAttachmentStrip.web.tsx +4 -0
  459. package/src/chat-composer/ComposerBanner.tsx +2 -157
  460. package/src/chat-composer/ComposerBanner.web.tsx +4 -0
  461. package/src/chat-composer/EmojiPicker.tsx +2 -402
  462. package/src/chat-composer/EmojiPicker.web.tsx +5 -0
  463. package/src/chat-composer/MessageContextMenu.tsx +2 -88
  464. package/src/chat-composer/MessageContextMenu.web.tsx +12 -0
  465. package/src/chat-composer/ReactionPicker.tsx +2 -100
  466. package/src/chat-composer/ReactionPicker.web.tsx +5 -0
  467. package/src/chat-composer/SuggestionList.tsx +2 -209
  468. package/src/chat-composer/SuggestionList.web.tsx +4 -0
  469. package/src/chat-composer/VoiceRecorder.tsx +2 -287
  470. package/src/chat-composer/VoiceRecorder.web.tsx +6 -0
  471. package/src/chat-composer/create-attachment-menu.tsx +228 -0
  472. package/src/chat-composer/create-chat-composer.tsx +473 -0
  473. package/src/chat-composer/create-composer-attachment-strip.tsx +212 -0
  474. package/src/chat-composer/create-composer-banner.tsx +167 -0
  475. package/src/chat-composer/create-emoji-picker.tsx +414 -0
  476. package/src/chat-composer/create-message-context-menu.tsx +112 -0
  477. package/src/chat-composer/create-reaction-picker.tsx +112 -0
  478. package/src/chat-composer/create-suggestion-list.tsx +219 -0
  479. package/src/chat-composer/create-voice-recorder.tsx +301 -0
  480. package/src/chat-composer/index.web.ts +9 -9
  481. package/src/chat-people/contact-row.ts +8 -0
  482. package/src/chat-screen/ChatSplitLayout.tsx +1 -1
  483. package/src/earnings/EarningsSummary.tsx +9 -2
  484. package/src/field/Field.tsx +2 -1
  485. package/src/field/types.ts +2 -0
  486. package/src/floating/types.ts +1 -0
  487. package/src/item/Item.tsx +16 -11
  488. package/src/job-board/JobCard.tsx +4 -1
  489. package/src/label/Label.tsx +2 -1
  490. package/src/label/types.ts +2 -0
  491. package/src/listing-details/AmenityList.tsx +4 -3
  492. package/src/locale/common-messages.ts +17 -0
  493. package/src/overlay/InteractionBoundary.tsx +24 -0
  494. package/src/payment-method/PaymentMethodList.tsx +2 -1
  495. package/src/place-details/PlaceAmenities.tsx +9 -0
  496. package/src/place-details/PlacePopularTimes.tsx +7 -1
  497. package/src/proof-of-delivery/ProofOfDelivery.tsx +9 -1
  498. package/src/proof-of-delivery/shared.ts +1 -1
  499. package/src/select/Select.tsx +5 -1
  500. package/src/select/Select.web.tsx +5 -1
  501. package/src/select/use-required-description.tsx +20 -0
  502. package/src/settings-modal/rows.ts +21 -0
@@ -1,211 +1,4 @@
1
- import { useSurfaceFill } from '../styles/surface-levels';
2
- import { useCardFill } from '../card/use-card-fill';
3
1
  import { Surface } from '../surface';
4
- /**
5
- * The anchored list above the composer: `@mention`, `/command` and `:shortcode`
6
- * are ONE part with a `kind`, because the row geometry, the keyboard model and
7
- * the announced role are identical — only the leading slot differs.
8
- *
9
- * It is a listbox the composer's field OWNS: `activeIndex` arrives as a prop and
10
- * the arrow keys are handled on the input, never here. A list that kept its own
11
- * highlight would fight the field for it the first time a pointer moved.
12
- */
13
- import React from 'react';
14
- import { Image, Pressable, ScrollView, View } from 'react-native';
2
+ import { createSuggestionList } from './create-suggestion-list';
15
3
 
16
- import { RiHashtag } from '../icons/remix/RiHashtag';
17
- import { useImageResolver } from '../image-resolver/context';
18
- import { useMessages } from '../locale/messages';
19
- import { useTheme } from '../theme/use-theme';
20
- import type { WebCssStyle } from '../styles/web-view-style';
21
- import { Text } from '../typography';
22
- import {
23
- PANEL_RADIUS,
24
- SUGGESTION_MAX_HEIGHT,
25
- SUGGESTION_ROW_HEIGHT,
26
- resolveChatComposerPalette,
27
- } from './shared';
28
- import { CHAT_COMPOSER_MESSAGES } from './messages';
29
- import type { ChatComposerSuggestion, SuggestionKind, SuggestionListProps } from './types';
30
- import { dataHook, IS_WEB } from './web-hooks';
31
-
32
- function isUrl(value: string): boolean {
33
- return /^(https?:)?\/\//.test(value) || value.startsWith('data:') || value.startsWith('file:');
34
- }
35
-
36
- function Leading({
37
- kind,
38
- suggestion,
39
- }: {
40
- kind: SuggestionKind;
41
- suggestion: ChatComposerSuggestion;
42
- }) {
43
- const theme = useTheme();
44
- const palette = resolveChatComposerPalette(theme, useSurfaceFill());
45
- const resolveImage = useImageResolver();
46
-
47
- if (kind === 'emoji') {
48
- return (
49
- <Text variant="title-2-regular" style={{ width: 28, textAlign: 'center' }}>
50
- {suggestion.emoji ?? suggestion.label}
51
- </Text>
52
- );
53
- }
54
- if (kind === 'mention') {
55
- const uri =
56
- suggestion.avatar === undefined
57
- ? undefined
58
- : isUrl(suggestion.avatar)
59
- ? suggestion.avatar
60
- : resolveImage?.(suggestion.avatar, 'thumb');
61
- return uri ? (
62
- <Image
63
- source={{ uri }}
64
- accessibilityIgnoresInvertColors
65
- style={{ width: 28, height: 28, borderRadius: 14, backgroundColor: palette.inset }}
66
- />
67
- ) : (
68
- <View
69
- style={{
70
- width: 28,
71
- height: 28,
72
- borderRadius: 14,
73
- backgroundColor: palette.inset,
74
- alignItems: 'center',
75
- justifyContent: 'center',
76
- }}>
77
- <Text variant="body-2-medium" style={{ color: palette.textSecondary }}>
78
- {suggestion.label.slice(0, 1).toUpperCase()}
79
- </Text>
80
- </View>
81
- );
82
- }
83
- return (
84
- <View
85
- style={{
86
- width: 28,
87
- height: 28,
88
- borderRadius: 8,
89
- backgroundColor: palette.inset,
90
- alignItems: 'center',
91
- justifyContent: 'center',
92
- }}>
93
- <RiHashtag width={16} height={16} fill={palette.iconSecondary} />
94
- </View>
95
- );
96
- }
97
-
98
- export function SuggestionList({
99
- kind,
100
- suggestions,
101
- activeIndex = -1,
102
- onSelectSuggestion,
103
- onActiveIndexChange,
104
- header,
105
- maxHeight = SUGGESTION_MAX_HEIGHT,
106
- style,
107
- testID,
108
- accessibilityLabel,
109
- }: SuggestionListProps) {
110
- const theme = useTheme();
111
- const palette = resolveChatComposerPalette(theme, useCardFill(style));
112
- const { messages } = useMessages(CHAT_COMPOSER_MESSAGES);
113
- if (suggestions.length === 0) return null;
114
-
115
- // React Native's `Role` union has no `listbox`; react-native-web passes the
116
- // DOM `role` straight through, so it travels as a web-only prop.
117
- const listRole: Record<string, unknown> = IS_WEB ? { role: 'listbox' } : { accessibilityRole: 'list' };
118
-
119
- const panel: WebCssStyle = {
120
- borderRadius: PANEL_RADIUS,
121
- paddingTop: 6,
122
- paddingBottom: 6,
123
- paddingLeft: 6,
124
- paddingRight: 6,
125
- };
126
-
127
- return (
128
- <Surface style={[panel, style]} testID={testID}>
129
- {header ? (
130
- <Text
131
- variant="caption-1-medium"
132
- style={{
133
- color: palette.textSecondary,
134
- paddingLeft: 8,
135
- paddingRight: 8,
136
- paddingTop: 2,
137
- paddingBottom: 6,
138
- }}>
139
- {header}
140
- </Text>
141
- ) : null}
142
- <ScrollView
143
- {...dataHook('bloomChatComposerScroll')}
144
- {...listRole}
145
- accessibilityLabel={accessibilityLabel ?? messages.suggestions[kind]}
146
- style={{ maxHeight }}
147
- showsVerticalScrollIndicator={false}>
148
- {suggestions.map((suggestion, index) => {
149
- const active = index === activeIndex;
150
- const row: WebCssStyle = {
151
- flexDirection: 'row',
152
- alignItems: 'center',
153
- gap: 10,
154
- minHeight: SUGGESTION_ROW_HEIGHT,
155
- borderRadius: 10,
156
- paddingLeft: 8,
157
- paddingRight: 8,
158
- paddingTop: 6,
159
- paddingBottom: 6,
160
- opacity: suggestion.disabled ? 0.5 : 1,
161
- backgroundColor: active ? palette.hover : 'transparent',
162
- cursor: suggestion.disabled ? 'auto' : 'pointer',
163
- '--bloom-chat-composer-ring': palette.focusRing,
164
- };
165
- const name = suggestion.handle
166
- ? `${suggestion.label} ${suggestion.handle}`
167
- : suggestion.label;
168
- return (
169
- <Pressable
170
- key={suggestion.id}
171
- {...dataHook('bloomChatComposerRow')}
172
- role="option"
173
- accessibilityLabel={name}
174
- aria-selected={active}
175
- accessibilityState={{ selected: active, disabled: suggestion.disabled }}
176
- disabled={suggestion.disabled}
177
- onPress={() => onSelectSuggestion?.(suggestion, index)}
178
- onHoverIn={() => onActiveIndexChange?.(index)}
179
- style={row}
180
- testID={testID ? `${testID}-row-${suggestion.id}` : undefined}>
181
- <Leading kind={kind} suggestion={suggestion} />
182
- <View style={{ flexShrink: 1, flexGrow: 1 }}>
183
- <View style={{ flexDirection: 'row', alignItems: 'baseline', gap: 6 }}>
184
- <Text variant="body-medium" numberOfLines={1} style={{ color: palette.text }}>
185
- {suggestion.label}
186
- </Text>
187
- {suggestion.handle ? (
188
- <Text
189
- variant="body-2-regular"
190
- numberOfLines={1}
191
- style={{ color: palette.textSecondary, flexShrink: 1 }}>
192
- {suggestion.handle}
193
- </Text>
194
- ) : null}
195
- </View>
196
- {suggestion.description ? (
197
- <Text
198
- variant="caption-1-regular"
199
- numberOfLines={1}
200
- style={{ color: palette.textPlaceholder }}>
201
- {suggestion.description}
202
- </Text>
203
- ) : null}
204
- </View>
205
- </Pressable>
206
- );
207
- })}
208
- </ScrollView>
209
- </Surface>
210
- );
211
- }
4
+ export const SuggestionList = createSuggestionList({ Surface });
@@ -0,0 +1,4 @@
1
+ import { Surface } from '../surface/index.web';
2
+ import { createSuggestionList } from './create-suggestion-list';
3
+
4
+ export const SuggestionList = createSuggestionList({ Surface });
@@ -1,291 +1,6 @@
1
- import { useCardFill } from '../card/use-card-fill';
2
1
  import { Surface } from '../surface';
3
- /**
4
- * The bar while a voice message is being recorded, and after: a live meter
5
- * (`recording`), a hands-free one with explicit buttons (`locked`), and the
6
- * playable result (`preview`).
7
- *
8
- * Purely presentational, and deliberately so — the elapsed time, the levels and
9
- * the playback position all arrive as props. A recorder that owned a timer
10
- * would be reading the clock inside a component, which is the one thing every
11
- * relative time in this fleet is forbidden to do; it also makes the three
12
- * states impossible to screenshot.
13
- */
14
- import React, { useEffect, useState } from 'react';
15
- import { View, type LayoutChangeEvent } from 'react-native';
16
- import Animated, {
17
- Easing,
18
- cancelAnimation,
19
- useAnimatedStyle,
20
- useReducedMotion,
21
- useSharedValue,
22
- withRepeat,
23
- withSequence,
24
- withTiming,
25
- } from 'react-native-reanimated';
26
-
27
2
  import { Button } from '../button';
28
- import { RiArrowLeftSLine } from '../icons/remix/RiArrowLeftSLine';
29
- import { RiCloseLine } from '../icons/remix/RiCloseLine';
30
- import { RiDeleteBinLine } from '../icons/remix/RiDeleteBinLine';
31
- import { RiLockLine } from '../icons/remix/RiLockLine';
32
- import { RiPauseFill } from '../icons/remix/RiPauseFill';
33
- import { RiPlayFill } from '../icons/remix/RiPlayFill';
34
- import { RiSendPlaneLine } from '../icons/remix/RiSendPlaneLine';
35
- import type { WebCssStyle } from '../styles/web-view-style';
36
- import { useTheme } from '../theme/use-theme';
37
- import { Text } from '../typography';
38
3
  import { ComposerIconButton } from './ComposerIconButton';
39
- import {
40
- BAR_PADDING,
41
- BAR_RADIUS,
42
- CONTROL_SIZE,
43
- voiceRecorderLabels,
44
- WAVE_BAR_GAP,
45
- WAVE_BAR_WIDTH,
46
- WAVE_HEIGHT,
47
- formatRecordingTime,
48
- resolveChatComposerPalette,
49
- waveformBars,
50
- } from './shared';
51
- import type { VoiceRecorderProps } from './types';
52
- import { IS_WEB, useChatComposerWebCss } from './web-hooks';
53
- import { useMessages } from '../locale/messages';
54
- import { CHAT_COMPOSER_MESSAGES } from './messages';
55
-
56
- const EASE_IN_OUT = Easing.bezier(0.42, 0, 0.58, 1);
57
-
58
- /** The live "we are recording" dot. CSS keyframes on web, a reanimated loop on native. */
59
- function RecordDot({ color, active }: { color: string; active: boolean }) {
60
- const reducedMotion = useReducedMotion();
61
- const opacity = useSharedValue(1);
62
- useEffect(() => {
63
- if (IS_WEB || !active || reducedMotion) return;
64
- opacity.value = withRepeat(
65
- withSequence(
66
- withTiming(0.25, { duration: 500, easing: EASE_IN_OUT }),
67
- withTiming(1, { duration: 500, easing: EASE_IN_OUT }),
68
- ),
69
- -1,
70
- );
71
- return () => cancelAnimation(opacity);
72
- }, [active, reducedMotion, opacity]);
73
- const animated = useAnimatedStyle(() => ({ opacity: opacity.value }), [opacity]);
74
-
75
- const base = { width: 8, height: 8, borderRadius: 4, backgroundColor: color };
76
- if (IS_WEB) {
77
- const web: WebCssStyle =
78
- active && !reducedMotion
79
- ? { ...base, animation: 'bloom-chat-composer-pulse 1000ms ease-in-out infinite' }
80
- : base;
81
- return <View style={web} />;
82
- }
83
- return <Animated.View style={[base, animated]} />;
84
- }
85
-
86
- /**
87
- * The meter. Bars are laid out from a MEASURED width rather than a fixed count,
88
- * so the same recorder reads correctly in a 390px column and a 900px one; the
89
- * oldest samples fall off the left as the array grows.
90
- */
91
- function Waveform({
92
- amplitudes,
93
- color,
94
- dimColor,
95
- progress,
96
- testID,
97
- }: {
98
- amplitudes: ReadonlyArray<number>;
99
- color: string;
100
- dimColor: string;
101
- /** 0–1 playhead, for `preview`. Bars past it paint in `dimColor`. */
102
- progress?: number;
103
- testID?: string;
104
- }) {
105
- const [width, setWidth] = useState(0);
106
- const onLayout = (event: LayoutChangeEvent) => setWidth(event.nativeEvent.layout.width);
107
- const slot = WAVE_BAR_WIDTH + WAVE_BAR_GAP;
108
- const count = width > 0 ? Math.max(1, Math.floor(width / slot)) : 0;
109
- const bars = count > 0 ? waveformBars(amplitudes, count) : [];
110
- const played = progress === undefined ? bars.length : Math.round(bars.length * progress);
111
-
112
- return (
113
- <View
114
- onLayout={onLayout}
115
- style={{
116
- flexGrow: 1,
117
- flexShrink: 1,
118
- height: WAVE_HEIGHT,
119
- flexDirection: 'row',
120
- alignItems: 'center',
121
- gap: WAVE_BAR_GAP,
122
- }}
123
- testID={testID}>
124
- {bars.map((level, index) => (
125
- <View
126
- key={index}
127
- style={{
128
- width: WAVE_BAR_WIDTH,
129
- height: Math.max(2, Math.round(level * WAVE_HEIGHT)),
130
- borderRadius: WAVE_BAR_WIDTH,
131
- backgroundColor: index < played ? color : dimColor,
132
- }}
133
- />
134
- ))}
135
- </View>
136
- );
137
- }
138
-
139
- export function VoiceRecorder({
140
- state,
141
- seconds,
142
- duration,
143
- amplitudes = [],
144
- playing = false,
145
- onPlayToggle,
146
- onCancel,
147
- onDelete,
148
- onSend,
149
- onLock,
150
- slideToCancel = !IS_WEB,
151
- labels: labelOverrides,
152
- style,
153
- testID,
154
- accessibilityLabel,
155
- }: VoiceRecorderProps) {
156
- const theme = useTheme();
157
- const palette = resolveChatComposerPalette(theme, useCardFill(style));
158
- const { messages } = useMessages(CHAT_COMPOSER_MESSAGES);
159
- useChatComposerWebCss();
160
- const labels = { ...voiceRecorderLabels(messages), ...labelOverrides };
161
- const preview = state === 'preview';
162
- const total = duration ?? seconds;
163
-
164
- const bar: WebCssStyle = {
165
- flexDirection: 'row',
166
- alignItems: 'center',
167
- gap: 10,
168
- minHeight: CONTROL_SIZE + BAR_PADDING * 2,
169
- borderRadius: BAR_RADIUS,
170
- paddingLeft: 12,
171
- paddingRight: BAR_PADDING,
172
- paddingTop: BAR_PADDING,
173
- paddingBottom: BAR_PADDING,
174
- '--bloom-chat-composer-ring': palette.focusRing,
175
- };
176
-
177
- return (
178
- <Surface
179
- accessibilityLabel={accessibilityLabel ?? labels.recording}
180
- style={[bar, style]}
181
- testID={testID}>
182
- {preview ? (
183
- <>
184
- {onDelete ? (
185
- <ComposerIconButton
186
- icon={RiDeleteBinLine}
187
- accessibilityLabel={labels.delete}
188
- onPress={onDelete}
189
- size={32}
190
- iconSize={18}
191
- style={{ marginLeft: -6 }}
192
- testID={testID ? `${testID}-delete` : undefined}
193
- />
194
- ) : null}
195
- <ComposerIconButton
196
- icon={playing ? RiPauseFill : RiPlayFill}
197
- accessibilityLabel={playing ? labels.pause : labels.play}
198
- onPress={onPlayToggle}
199
- size={32}
200
- iconSize={18}
201
- style={{ backgroundColor: palette.inset }}
202
- testID={testID ? `${testID}-play` : undefined}
203
- />
204
- </>
205
- ) : (
206
- <RecordDot color={palette.destructive} active />
207
- )}
208
-
209
- <Text
210
- variant="body-2-medium"
211
- style={{ color: palette.text, minWidth: 40 }}
212
- testID={testID ? `${testID}-time` : undefined}>
213
- {formatRecordingTime(seconds)}
214
- </Text>
215
-
216
- <Waveform
217
- amplitudes={amplitudes}
218
- color={preview ? palette.accent : palette.destructive}
219
- dimColor={palette.border}
220
- progress={preview && total > 0 ? Math.min(1, seconds / total) : undefined}
221
- testID={testID ? `${testID}-wave` : undefined}
222
- />
223
-
224
- {preview ? (
225
- <Text variant="caption-1-regular" style={{ color: palette.textSecondary }}>
226
- {formatRecordingTime(total)}
227
- </Text>
228
- ) : null}
229
-
230
- {state === 'recording' && slideToCancel ? (
231
- <Button
232
- appearance="plain"
233
- tone="neutral"
234
- accessibilityLabel={labels.cancel}
235
- onPress={onCancel}
236
- style={{ flexDirection: 'row', alignItems: 'center', gap: 2, height: 'auto', minHeight: 0, padding: 0 }}
237
- testID={testID ? `${testID}-slide` : undefined}>
238
- <RiArrowLeftSLine width={16} height={16} fill={palette.textSecondary} />
239
- <Text variant="caption-1-regular" style={{ color: palette.textSecondary }}>
240
- {labels.slideToCancel}
241
- </Text>
242
- </Button>
243
- ) : null}
244
-
245
- {state === 'recording' && !slideToCancel && onCancel ? (
246
- <ComposerIconButton
247
- icon={RiCloseLine}
248
- accessibilityLabel={labels.cancel}
249
- onPress={onCancel}
250
- size={32}
251
- iconSize={18}
252
- testID={testID ? `${testID}-cancel` : undefined}
253
- />
254
- ) : null}
255
-
256
- {state === 'recording' && onLock ? (
257
- <ComposerIconButton
258
- icon={RiLockLine}
259
- accessibilityLabel={labels.lock}
260
- onPress={onLock}
261
- size={32}
262
- iconSize={16}
263
- style={{ backgroundColor: palette.inset }}
264
- testID={testID ? `${testID}-lock` : undefined}
265
- />
266
- ) : null}
267
-
268
- {state !== 'recording' && onCancel ? (
269
- <ComposerIconButton
270
- icon={RiCloseLine}
271
- accessibilityLabel={labels.cancel}
272
- onPress={onCancel}
273
- size={32}
274
- iconSize={18}
275
- testID={testID ? `${testID}-cancel` : undefined}
276
- />
277
- ) : null}
4
+ import { createVoiceRecorder } from './create-voice-recorder';
278
5
 
279
- {onSend && state !== 'recording' ? (
280
- <ComposerIconButton
281
- icon={RiSendPlaneLine}
282
- tone="accent"
283
- accessibilityLabel={labels.send}
284
- onPress={onSend}
285
- iconSize={18}
286
- testID={testID ? `${testID}-send` : undefined}
287
- />
288
- ) : null}
289
- </Surface>
290
- );
291
- }
6
+ export const VoiceRecorder = createVoiceRecorder({ Surface, Button, ComposerIconButton });
@@ -0,0 +1,6 @@
1
+ import { Surface } from '../surface/index.web';
2
+ import { Button } from '../button/index.web';
3
+ import { ComposerIconButton } from './ComposerIconButton.web';
4
+ import { createVoiceRecorder } from './create-voice-recorder';
5
+
6
+ export const VoiceRecorder = createVoiceRecorder({ Surface, Button, ComposerIconButton });