@oxy.so/bloom 5.1.0 → 5.1.1

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 (430) hide show
  1. package/docs/adoption-matrix.mdx +9 -9
  2. package/docs/button.mdx +2 -0
  3. package/docs/card-form.mdx +2 -0
  4. package/docs/chat-composer.mdx +1 -1
  5. package/docs/earnings.mdx +2 -0
  6. package/docs/field.mdx +2 -0
  7. package/docs/label.mdx +2 -0
  8. package/docs/payment-method.mdx +2 -0
  9. package/docs/place-details.mdx +2 -2
  10. package/docs/proof-of-delivery.mdx +4 -0
  11. package/docs/select.mdx +2 -0
  12. package/lib/commonjs/button/Button.js +36 -3
  13. package/lib/commonjs/button/Button.js.map +1 -1
  14. package/lib/commonjs/button/GlyphButton.js +7 -3
  15. package/lib/commonjs/button/GlyphButton.js.map +1 -1
  16. package/lib/commonjs/card-form/shared.js +3 -2
  17. package/lib/commonjs/card-form/shared.js.map +1 -1
  18. package/lib/commonjs/chat-composer/AttachmentMenu.js +8 -227
  19. package/lib/commonjs/chat-composer/AttachmentMenu.js.map +1 -1
  20. package/lib/commonjs/chat-composer/AttachmentMenu.web.js +16 -0
  21. package/lib/commonjs/chat-composer/AttachmentMenu.web.js.map +1 -0
  22. package/lib/commonjs/chat-composer/ChatComposer.js +9 -388
  23. package/lib/commonjs/chat-composer/ChatComposer.js.map +1 -1
  24. package/lib/commonjs/chat-composer/ChatComposer.web.js +16 -0
  25. package/lib/commonjs/chat-composer/ChatComposer.web.js.map +1 -0
  26. package/lib/commonjs/chat-composer/ComposerAttachmentStrip.js +5 -200
  27. package/lib/commonjs/chat-composer/ComposerAttachmentStrip.js.map +1 -1
  28. package/lib/commonjs/chat-composer/ComposerAttachmentStrip.web.js +12 -0
  29. package/lib/commonjs/chat-composer/ComposerAttachmentStrip.web.js.map +1 -0
  30. package/lib/commonjs/chat-composer/ComposerBanner.js +5 -163
  31. package/lib/commonjs/chat-composer/ComposerBanner.js.map +1 -1
  32. package/lib/commonjs/chat-composer/ComposerBanner.web.js +12 -0
  33. package/lib/commonjs/chat-composer/ComposerBanner.web.js.map +1 -0
  34. package/lib/commonjs/chat-composer/EmojiPicker.js +6 -443
  35. package/lib/commonjs/chat-composer/EmojiPicker.js.map +1 -1
  36. package/lib/commonjs/chat-composer/EmojiPicker.web.js +14 -0
  37. package/lib/commonjs/chat-composer/EmojiPicker.web.js.map +1 -0
  38. package/lib/commonjs/chat-composer/MessageContextMenu.js +12 -102
  39. package/lib/commonjs/chat-composer/MessageContextMenu.js.map +1 -1
  40. package/lib/commonjs/chat-composer/MessageContextMenu.web.js +19 -0
  41. package/lib/commonjs/chat-composer/MessageContextMenu.web.js.map +1 -0
  42. package/lib/commonjs/chat-composer/ReactionPicker.js +6 -107
  43. package/lib/commonjs/chat-composer/ReactionPicker.js.map +1 -1
  44. package/lib/commonjs/chat-composer/ReactionPicker.web.js +14 -0
  45. package/lib/commonjs/chat-composer/ReactionPicker.web.js.map +1 -0
  46. package/lib/commonjs/chat-composer/SuggestionList.js +5 -222
  47. package/lib/commonjs/chat-composer/SuggestionList.js.map +1 -1
  48. package/lib/commonjs/chat-composer/SuggestionList.web.js +12 -0
  49. package/lib/commonjs/chat-composer/SuggestionList.web.js.map +1 -0
  50. package/lib/commonjs/chat-composer/VoiceRecorder.js +7 -263
  51. package/lib/commonjs/chat-composer/VoiceRecorder.js.map +1 -1
  52. package/lib/commonjs/chat-composer/VoiceRecorder.web.js +16 -0
  53. package/lib/commonjs/chat-composer/VoiceRecorder.web.js.map +1 -0
  54. package/lib/commonjs/chat-composer/create-attachment-menu.js +243 -0
  55. package/lib/commonjs/chat-composer/create-attachment-menu.js.map +1 -0
  56. package/lib/commonjs/chat-composer/create-chat-composer.js +400 -0
  57. package/lib/commonjs/chat-composer/create-chat-composer.js.map +1 -0
  58. package/lib/commonjs/chat-composer/create-composer-attachment-strip.js +212 -0
  59. package/lib/commonjs/chat-composer/create-composer-attachment-strip.js.map +1 -0
  60. package/lib/commonjs/chat-composer/create-composer-banner.js +176 -0
  61. package/lib/commonjs/chat-composer/create-composer-banner.js.map +1 -0
  62. package/lib/commonjs/chat-composer/create-emoji-picker.js +456 -0
  63. package/lib/commonjs/chat-composer/create-emoji-picker.js.map +1 -0
  64. package/lib/commonjs/chat-composer/create-message-context-menu.js +119 -0
  65. package/lib/commonjs/chat-composer/create-message-context-menu.js.map +1 -0
  66. package/lib/commonjs/chat-composer/create-reaction-picker.js +120 -0
  67. package/lib/commonjs/chat-composer/create-reaction-picker.js.map +1 -0
  68. package/lib/commonjs/chat-composer/create-suggestion-list.js +234 -0
  69. package/lib/commonjs/chat-composer/create-suggestion-list.js.map +1 -0
  70. package/lib/commonjs/chat-composer/create-voice-recorder.js +277 -0
  71. package/lib/commonjs/chat-composer/create-voice-recorder.js.map +1 -0
  72. package/lib/commonjs/chat-composer/index.js +9 -9
  73. package/lib/commonjs/chat-composer/index.web.js +18 -18
  74. package/lib/commonjs/chat-composer/index.web.js.map +1 -1
  75. package/lib/commonjs/earnings/EarningsSummary.js +12 -2
  76. package/lib/commonjs/earnings/EarningsSummary.js.map +1 -1
  77. package/lib/commonjs/field/Field.js +2 -0
  78. package/lib/commonjs/field/Field.js.map +1 -1
  79. package/lib/commonjs/item/Item.js +16 -8
  80. package/lib/commonjs/item/Item.js.map +1 -1
  81. package/lib/commonjs/job-board/JobCard.js +6 -2
  82. package/lib/commonjs/job-board/JobCard.js.map +1 -1
  83. package/lib/commonjs/label/Label.js +2 -1
  84. package/lib/commonjs/label/Label.js.map +1 -1
  85. package/lib/commonjs/listing-details/AmenityList.js +4 -3
  86. package/lib/commonjs/listing-details/AmenityList.js.map +1 -1
  87. package/lib/commonjs/mail-compose/MailComposeSurface.js +1 -1
  88. package/lib/commonjs/overlay/InteractionBoundary.js +28 -0
  89. package/lib/commonjs/overlay/InteractionBoundary.js.map +1 -0
  90. package/lib/commonjs/payment-method/PaymentMethodList.js +3 -2
  91. package/lib/commonjs/payment-method/PaymentMethodList.js.map +1 -1
  92. package/lib/commonjs/place-details/PlaceAmenities.js +17 -6
  93. package/lib/commonjs/place-details/PlaceAmenities.js.map +1 -1
  94. package/lib/commonjs/place-details/PlacePopularTimes.js +7 -1
  95. package/lib/commonjs/place-details/PlacePopularTimes.js.map +1 -1
  96. package/lib/commonjs/proof-of-delivery/ProofOfDelivery.js +10 -1
  97. package/lib/commonjs/proof-of-delivery/ProofOfDelivery.js.map +1 -1
  98. package/lib/commonjs/proof-of-delivery/shared.js +1 -1
  99. package/lib/commonjs/proof-of-delivery/shared.js.map +1 -1
  100. package/lib/commonjs/select/Select.js +7 -4
  101. package/lib/commonjs/select/Select.js.map +1 -1
  102. package/lib/commonjs/select/Select.web.js +7 -4
  103. package/lib/commonjs/select/Select.web.js.map +1 -1
  104. package/lib/commonjs/select/use-required-description.js +37 -0
  105. package/lib/commonjs/select/use-required-description.js.map +1 -0
  106. package/lib/module/button/Button.js +36 -3
  107. package/lib/module/button/Button.js.map +1 -1
  108. package/lib/module/button/GlyphButton.js +7 -3
  109. package/lib/module/button/GlyphButton.js.map +1 -1
  110. package/lib/module/card-form/shared.js +3 -2
  111. package/lib/module/card-form/shared.js.map +1 -1
  112. package/lib/module/chat-composer/AttachmentMenu.js +7 -226
  113. package/lib/module/chat-composer/AttachmentMenu.js.map +1 -1
  114. package/lib/module/chat-composer/AttachmentMenu.web.js +12 -0
  115. package/lib/module/chat-composer/AttachmentMenu.web.js.map +1 -0
  116. package/lib/module/chat-composer/ChatComposer.js +8 -385
  117. package/lib/module/chat-composer/ChatComposer.js.map +1 -1
  118. package/lib/module/chat-composer/ChatComposer.web.js +12 -0
  119. package/lib/module/chat-composer/ChatComposer.web.js.map +1 -0
  120. package/lib/module/chat-composer/ComposerAttachmentStrip.js +4 -196
  121. package/lib/module/chat-composer/ComposerAttachmentStrip.js.map +1 -1
  122. package/lib/module/chat-composer/ComposerAttachmentStrip.web.js +8 -0
  123. package/lib/module/chat-composer/ComposerAttachmentStrip.web.js.map +1 -0
  124. package/lib/module/chat-composer/ComposerBanner.js +4 -162
  125. package/lib/module/chat-composer/ComposerBanner.js.map +1 -1
  126. package/lib/module/chat-composer/ComposerBanner.web.js +8 -0
  127. package/lib/module/chat-composer/ComposerBanner.web.js.map +1 -0
  128. package/lib/module/chat-composer/EmojiPicker.js +5 -440
  129. package/lib/module/chat-composer/EmojiPicker.js.map +1 -1
  130. package/lib/module/chat-composer/EmojiPicker.web.js +10 -0
  131. package/lib/module/chat-composer/EmojiPicker.web.js.map +1 -0
  132. package/lib/module/chat-composer/MessageContextMenu.js +11 -99
  133. package/lib/module/chat-composer/MessageContextMenu.js.map +1 -1
  134. package/lib/module/chat-composer/MessageContextMenu.web.js +15 -0
  135. package/lib/module/chat-composer/MessageContextMenu.web.js.map +1 -0
  136. package/lib/module/chat-composer/ReactionPicker.js +5 -104
  137. package/lib/module/chat-composer/ReactionPicker.js.map +1 -1
  138. package/lib/module/chat-composer/ReactionPicker.web.js +10 -0
  139. package/lib/module/chat-composer/ReactionPicker.web.js.map +1 -0
  140. package/lib/module/chat-composer/SuggestionList.js +4 -219
  141. package/lib/module/chat-composer/SuggestionList.js.map +1 -1
  142. package/lib/module/chat-composer/SuggestionList.web.js +8 -0
  143. package/lib/module/chat-composer/SuggestionList.web.js.map +1 -0
  144. package/lib/module/chat-composer/VoiceRecorder.js +6 -260
  145. package/lib/module/chat-composer/VoiceRecorder.js.map +1 -1
  146. package/lib/module/chat-composer/VoiceRecorder.web.js +12 -0
  147. package/lib/module/chat-composer/VoiceRecorder.web.js.map +1 -0
  148. package/lib/module/chat-composer/create-attachment-menu.js +238 -0
  149. package/lib/module/chat-composer/create-attachment-menu.js.map +1 -0
  150. package/lib/module/chat-composer/create-chat-composer.js +395 -0
  151. package/lib/module/chat-composer/create-chat-composer.js.map +1 -0
  152. package/lib/module/chat-composer/create-composer-attachment-strip.js +206 -0
  153. package/lib/module/chat-composer/create-composer-attachment-strip.js.map +1 -0
  154. package/lib/module/chat-composer/create-composer-banner.js +171 -0
  155. package/lib/module/chat-composer/create-composer-banner.js.map +1 -0
  156. package/lib/module/chat-composer/create-emoji-picker.js +451 -0
  157. package/lib/module/chat-composer/create-emoji-picker.js.map +1 -0
  158. package/lib/module/chat-composer/create-message-context-menu.js +114 -0
  159. package/lib/module/chat-composer/create-message-context-menu.js.map +1 -0
  160. package/lib/module/chat-composer/create-reaction-picker.js +115 -0
  161. package/lib/module/chat-composer/create-reaction-picker.js.map +1 -0
  162. package/lib/module/chat-composer/create-suggestion-list.js +229 -0
  163. package/lib/module/chat-composer/create-suggestion-list.js.map +1 -0
  164. package/lib/module/chat-composer/create-voice-recorder.js +272 -0
  165. package/lib/module/chat-composer/create-voice-recorder.js.map +1 -0
  166. package/lib/module/chat-composer/index.js +9 -9
  167. package/lib/module/chat-composer/index.js.map +1 -1
  168. package/lib/module/chat-composer/index.web.js +9 -9
  169. package/lib/module/chat-composer/index.web.js.map +1 -1
  170. package/lib/module/earnings/EarningsSummary.js +12 -2
  171. package/lib/module/earnings/EarningsSummary.js.map +1 -1
  172. package/lib/module/field/Field.js +2 -0
  173. package/lib/module/field/Field.js.map +1 -1
  174. package/lib/module/item/Item.js +16 -8
  175. package/lib/module/item/Item.js.map +1 -1
  176. package/lib/module/job-board/JobCard.js +6 -2
  177. package/lib/module/job-board/JobCard.js.map +1 -1
  178. package/lib/module/label/Label.js +2 -1
  179. package/lib/module/label/Label.js.map +1 -1
  180. package/lib/module/listing-details/AmenityList.js +4 -3
  181. package/lib/module/listing-details/AmenityList.js.map +1 -1
  182. package/lib/module/mail-compose/MailComposeSurface.js +1 -1
  183. package/lib/module/mail-compose/MailComposeSurface.js.map +1 -1
  184. package/lib/module/overlay/InteractionBoundary.js +25 -0
  185. package/lib/module/overlay/InteractionBoundary.js.map +1 -0
  186. package/lib/module/payment-method/PaymentMethodList.js +3 -2
  187. package/lib/module/payment-method/PaymentMethodList.js.map +1 -1
  188. package/lib/module/place-details/PlaceAmenities.js +15 -4
  189. package/lib/module/place-details/PlaceAmenities.js.map +1 -1
  190. package/lib/module/place-details/PlacePopularTimes.js +7 -1
  191. package/lib/module/place-details/PlacePopularTimes.js.map +1 -1
  192. package/lib/module/proof-of-delivery/ProofOfDelivery.js +10 -1
  193. package/lib/module/proof-of-delivery/ProofOfDelivery.js.map +1 -1
  194. package/lib/module/proof-of-delivery/shared.js +1 -1
  195. package/lib/module/proof-of-delivery/shared.js.map +1 -1
  196. package/lib/module/select/Select.js +7 -4
  197. package/lib/module/select/Select.js.map +1 -1
  198. package/lib/module/select/Select.web.js +7 -4
  199. package/lib/module/select/Select.web.js.map +1 -1
  200. package/lib/module/select/use-required-description.js +33 -0
  201. package/lib/module/select/use-required-description.js.map +1 -0
  202. package/lib/typescript/commonjs/button/Button.d.ts.map +1 -1
  203. package/lib/typescript/commonjs/card-form/shared.d.ts +2 -1
  204. package/lib/typescript/commonjs/card-form/shared.d.ts.map +1 -1
  205. package/lib/typescript/commonjs/chat-composer/AttachmentMenu.d.ts +1 -2
  206. package/lib/typescript/commonjs/chat-composer/AttachmentMenu.d.ts.map +1 -1
  207. package/lib/typescript/commonjs/chat-composer/AttachmentMenu.web.d.ts +2 -0
  208. package/lib/typescript/commonjs/chat-composer/AttachmentMenu.web.d.ts.map +1 -0
  209. package/lib/typescript/commonjs/chat-composer/ChatComposer.d.ts +1 -2
  210. package/lib/typescript/commonjs/chat-composer/ChatComposer.d.ts.map +1 -1
  211. package/lib/typescript/commonjs/chat-composer/ChatComposer.web.d.ts +2 -0
  212. package/lib/typescript/commonjs/chat-composer/ChatComposer.web.d.ts.map +1 -0
  213. package/lib/typescript/commonjs/chat-composer/ComposerAttachmentStrip.d.ts +1 -2
  214. package/lib/typescript/commonjs/chat-composer/ComposerAttachmentStrip.d.ts.map +1 -1
  215. package/lib/typescript/commonjs/chat-composer/ComposerAttachmentStrip.web.d.ts +2 -0
  216. package/lib/typescript/commonjs/chat-composer/ComposerAttachmentStrip.web.d.ts.map +1 -0
  217. package/lib/typescript/commonjs/chat-composer/ComposerBanner.d.ts +1 -2
  218. package/lib/typescript/commonjs/chat-composer/ComposerBanner.d.ts.map +1 -1
  219. package/lib/typescript/commonjs/chat-composer/ComposerBanner.web.d.ts +2 -0
  220. package/lib/typescript/commonjs/chat-composer/ComposerBanner.web.d.ts.map +1 -0
  221. package/lib/typescript/commonjs/chat-composer/EmojiPicker.d.ts +1 -2
  222. package/lib/typescript/commonjs/chat-composer/EmojiPicker.d.ts.map +1 -1
  223. package/lib/typescript/commonjs/chat-composer/EmojiPicker.web.d.ts +2 -0
  224. package/lib/typescript/commonjs/chat-composer/EmojiPicker.web.d.ts.map +1 -0
  225. package/lib/typescript/commonjs/chat-composer/MessageContextMenu.d.ts +1 -2
  226. package/lib/typescript/commonjs/chat-composer/MessageContextMenu.d.ts.map +1 -1
  227. package/lib/typescript/commonjs/chat-composer/MessageContextMenu.web.d.ts +2 -0
  228. package/lib/typescript/commonjs/chat-composer/MessageContextMenu.web.d.ts.map +1 -0
  229. package/lib/typescript/commonjs/chat-composer/ReactionPicker.d.ts +1 -2
  230. package/lib/typescript/commonjs/chat-composer/ReactionPicker.d.ts.map +1 -1
  231. package/lib/typescript/commonjs/chat-composer/ReactionPicker.web.d.ts +2 -0
  232. package/lib/typescript/commonjs/chat-composer/ReactionPicker.web.d.ts.map +1 -0
  233. package/lib/typescript/commonjs/chat-composer/SuggestionList.d.ts +1 -2
  234. package/lib/typescript/commonjs/chat-composer/SuggestionList.d.ts.map +1 -1
  235. package/lib/typescript/commonjs/chat-composer/SuggestionList.web.d.ts +2 -0
  236. package/lib/typescript/commonjs/chat-composer/SuggestionList.web.d.ts.map +1 -0
  237. package/lib/typescript/commonjs/chat-composer/VoiceRecorder.d.ts +1 -2
  238. package/lib/typescript/commonjs/chat-composer/VoiceRecorder.d.ts.map +1 -1
  239. package/lib/typescript/commonjs/chat-composer/VoiceRecorder.web.d.ts +2 -0
  240. package/lib/typescript/commonjs/chat-composer/VoiceRecorder.web.d.ts.map +1 -0
  241. package/lib/typescript/commonjs/chat-composer/create-attachment-menu.d.ts +11 -0
  242. package/lib/typescript/commonjs/chat-composer/create-attachment-menu.d.ts.map +1 -0
  243. package/lib/typescript/commonjs/chat-composer/create-chat-composer.d.ts +11 -0
  244. package/lib/typescript/commonjs/chat-composer/create-chat-composer.d.ts.map +1 -0
  245. package/lib/typescript/commonjs/chat-composer/create-composer-attachment-strip.d.ts +7 -0
  246. package/lib/typescript/commonjs/chat-composer/create-composer-attachment-strip.d.ts.map +1 -0
  247. package/lib/typescript/commonjs/chat-composer/create-composer-banner.d.ts +7 -0
  248. package/lib/typescript/commonjs/chat-composer/create-composer-banner.d.ts.map +1 -0
  249. package/lib/typescript/commonjs/chat-composer/create-emoji-picker.d.ts +9 -0
  250. package/lib/typescript/commonjs/chat-composer/create-emoji-picker.d.ts.map +1 -0
  251. package/lib/typescript/commonjs/chat-composer/create-message-context-menu.d.ts +14 -0
  252. package/lib/typescript/commonjs/chat-composer/create-message-context-menu.d.ts.map +1 -0
  253. package/lib/typescript/commonjs/chat-composer/create-reaction-picker.d.ts +9 -0
  254. package/lib/typescript/commonjs/chat-composer/create-reaction-picker.d.ts.map +1 -0
  255. package/lib/typescript/commonjs/chat-composer/create-suggestion-list.d.ts +7 -0
  256. package/lib/typescript/commonjs/chat-composer/create-suggestion-list.d.ts.map +1 -0
  257. package/lib/typescript/commonjs/chat-composer/create-voice-recorder.d.ts +11 -0
  258. package/lib/typescript/commonjs/chat-composer/create-voice-recorder.d.ts.map +1 -0
  259. package/lib/typescript/commonjs/chat-composer/index.web.d.ts +9 -9
  260. package/lib/typescript/commonjs/chat-composer/index.web.d.ts.map +1 -1
  261. package/lib/typescript/commonjs/earnings/EarningsSummary.d.ts.map +1 -1
  262. package/lib/typescript/commonjs/field/Field.d.ts +1 -1
  263. package/lib/typescript/commonjs/field/Field.d.ts.map +1 -1
  264. package/lib/typescript/commonjs/field/types.d.ts +2 -0
  265. package/lib/typescript/commonjs/field/types.d.ts.map +1 -1
  266. package/lib/typescript/commonjs/floating/types.d.ts +1 -0
  267. package/lib/typescript/commonjs/floating/types.d.ts.map +1 -1
  268. package/lib/typescript/commonjs/item/Item.d.ts.map +1 -1
  269. package/lib/typescript/commonjs/job-board/JobCard.d.ts.map +1 -1
  270. package/lib/typescript/commonjs/label/Label.d.ts +1 -1
  271. package/lib/typescript/commonjs/label/Label.d.ts.map +1 -1
  272. package/lib/typescript/commonjs/label/types.d.ts +2 -0
  273. package/lib/typescript/commonjs/label/types.d.ts.map +1 -1
  274. package/lib/typescript/commonjs/listing-details/AmenityList.d.ts.map +1 -1
  275. package/lib/typescript/commonjs/overlay/InteractionBoundary.d.ts +7 -0
  276. package/lib/typescript/commonjs/overlay/InteractionBoundary.d.ts.map +1 -0
  277. package/lib/typescript/commonjs/payment-method/PaymentMethodList.d.ts.map +1 -1
  278. package/lib/typescript/commonjs/place-details/PlaceAmenities.d.ts.map +1 -1
  279. package/lib/typescript/commonjs/place-details/PlacePopularTimes.d.ts.map +1 -1
  280. package/lib/typescript/commonjs/proof-of-delivery/ProofOfDelivery.d.ts.map +1 -1
  281. package/lib/typescript/commonjs/select/Select.d.ts.map +1 -1
  282. package/lib/typescript/commonjs/select/Select.web.d.ts.map +1 -1
  283. package/lib/typescript/commonjs/select/use-required-description.d.ts +7 -0
  284. package/lib/typescript/commonjs/select/use-required-description.d.ts.map +1 -0
  285. package/lib/typescript/module/button/Button.d.ts.map +1 -1
  286. package/lib/typescript/module/card-form/shared.d.ts +2 -1
  287. package/lib/typescript/module/card-form/shared.d.ts.map +1 -1
  288. package/lib/typescript/module/chat-composer/AttachmentMenu.d.ts +1 -2
  289. package/lib/typescript/module/chat-composer/AttachmentMenu.d.ts.map +1 -1
  290. package/lib/typescript/module/chat-composer/AttachmentMenu.web.d.ts +2 -0
  291. package/lib/typescript/module/chat-composer/AttachmentMenu.web.d.ts.map +1 -0
  292. package/lib/typescript/module/chat-composer/ChatComposer.d.ts +1 -2
  293. package/lib/typescript/module/chat-composer/ChatComposer.d.ts.map +1 -1
  294. package/lib/typescript/module/chat-composer/ChatComposer.web.d.ts +2 -0
  295. package/lib/typescript/module/chat-composer/ChatComposer.web.d.ts.map +1 -0
  296. package/lib/typescript/module/chat-composer/ComposerAttachmentStrip.d.ts +1 -2
  297. package/lib/typescript/module/chat-composer/ComposerAttachmentStrip.d.ts.map +1 -1
  298. package/lib/typescript/module/chat-composer/ComposerAttachmentStrip.web.d.ts +2 -0
  299. package/lib/typescript/module/chat-composer/ComposerAttachmentStrip.web.d.ts.map +1 -0
  300. package/lib/typescript/module/chat-composer/ComposerBanner.d.ts +1 -2
  301. package/lib/typescript/module/chat-composer/ComposerBanner.d.ts.map +1 -1
  302. package/lib/typescript/module/chat-composer/ComposerBanner.web.d.ts +2 -0
  303. package/lib/typescript/module/chat-composer/ComposerBanner.web.d.ts.map +1 -0
  304. package/lib/typescript/module/chat-composer/EmojiPicker.d.ts +1 -2
  305. package/lib/typescript/module/chat-composer/EmojiPicker.d.ts.map +1 -1
  306. package/lib/typescript/module/chat-composer/EmojiPicker.web.d.ts +2 -0
  307. package/lib/typescript/module/chat-composer/EmojiPicker.web.d.ts.map +1 -0
  308. package/lib/typescript/module/chat-composer/MessageContextMenu.d.ts +1 -2
  309. package/lib/typescript/module/chat-composer/MessageContextMenu.d.ts.map +1 -1
  310. package/lib/typescript/module/chat-composer/MessageContextMenu.web.d.ts +2 -0
  311. package/lib/typescript/module/chat-composer/MessageContextMenu.web.d.ts.map +1 -0
  312. package/lib/typescript/module/chat-composer/ReactionPicker.d.ts +1 -2
  313. package/lib/typescript/module/chat-composer/ReactionPicker.d.ts.map +1 -1
  314. package/lib/typescript/module/chat-composer/ReactionPicker.web.d.ts +2 -0
  315. package/lib/typescript/module/chat-composer/ReactionPicker.web.d.ts.map +1 -0
  316. package/lib/typescript/module/chat-composer/SuggestionList.d.ts +1 -2
  317. package/lib/typescript/module/chat-composer/SuggestionList.d.ts.map +1 -1
  318. package/lib/typescript/module/chat-composer/SuggestionList.web.d.ts +2 -0
  319. package/lib/typescript/module/chat-composer/SuggestionList.web.d.ts.map +1 -0
  320. package/lib/typescript/module/chat-composer/VoiceRecorder.d.ts +1 -2
  321. package/lib/typescript/module/chat-composer/VoiceRecorder.d.ts.map +1 -1
  322. package/lib/typescript/module/chat-composer/VoiceRecorder.web.d.ts +2 -0
  323. package/lib/typescript/module/chat-composer/VoiceRecorder.web.d.ts.map +1 -0
  324. package/lib/typescript/module/chat-composer/create-attachment-menu.d.ts +11 -0
  325. package/lib/typescript/module/chat-composer/create-attachment-menu.d.ts.map +1 -0
  326. package/lib/typescript/module/chat-composer/create-chat-composer.d.ts +11 -0
  327. package/lib/typescript/module/chat-composer/create-chat-composer.d.ts.map +1 -0
  328. package/lib/typescript/module/chat-composer/create-composer-attachment-strip.d.ts +7 -0
  329. package/lib/typescript/module/chat-composer/create-composer-attachment-strip.d.ts.map +1 -0
  330. package/lib/typescript/module/chat-composer/create-composer-banner.d.ts +7 -0
  331. package/lib/typescript/module/chat-composer/create-composer-banner.d.ts.map +1 -0
  332. package/lib/typescript/module/chat-composer/create-emoji-picker.d.ts +9 -0
  333. package/lib/typescript/module/chat-composer/create-emoji-picker.d.ts.map +1 -0
  334. package/lib/typescript/module/chat-composer/create-message-context-menu.d.ts +14 -0
  335. package/lib/typescript/module/chat-composer/create-message-context-menu.d.ts.map +1 -0
  336. package/lib/typescript/module/chat-composer/create-reaction-picker.d.ts +9 -0
  337. package/lib/typescript/module/chat-composer/create-reaction-picker.d.ts.map +1 -0
  338. package/lib/typescript/module/chat-composer/create-suggestion-list.d.ts +7 -0
  339. package/lib/typescript/module/chat-composer/create-suggestion-list.d.ts.map +1 -0
  340. package/lib/typescript/module/chat-composer/create-voice-recorder.d.ts +11 -0
  341. package/lib/typescript/module/chat-composer/create-voice-recorder.d.ts.map +1 -0
  342. package/lib/typescript/module/chat-composer/index.web.d.ts +9 -9
  343. package/lib/typescript/module/chat-composer/index.web.d.ts.map +1 -1
  344. package/lib/typescript/module/earnings/EarningsSummary.d.ts.map +1 -1
  345. package/lib/typescript/module/field/Field.d.ts +1 -1
  346. package/lib/typescript/module/field/Field.d.ts.map +1 -1
  347. package/lib/typescript/module/field/types.d.ts +2 -0
  348. package/lib/typescript/module/field/types.d.ts.map +1 -1
  349. package/lib/typescript/module/floating/types.d.ts +1 -0
  350. package/lib/typescript/module/floating/types.d.ts.map +1 -1
  351. package/lib/typescript/module/item/Item.d.ts.map +1 -1
  352. package/lib/typescript/module/job-board/JobCard.d.ts.map +1 -1
  353. package/lib/typescript/module/label/Label.d.ts +1 -1
  354. package/lib/typescript/module/label/Label.d.ts.map +1 -1
  355. package/lib/typescript/module/label/types.d.ts +2 -0
  356. package/lib/typescript/module/label/types.d.ts.map +1 -1
  357. package/lib/typescript/module/listing-details/AmenityList.d.ts.map +1 -1
  358. package/lib/typescript/module/overlay/InteractionBoundary.d.ts +7 -0
  359. package/lib/typescript/module/overlay/InteractionBoundary.d.ts.map +1 -0
  360. package/lib/typescript/module/payment-method/PaymentMethodList.d.ts.map +1 -1
  361. package/lib/typescript/module/place-details/PlaceAmenities.d.ts.map +1 -1
  362. package/lib/typescript/module/place-details/PlacePopularTimes.d.ts.map +1 -1
  363. package/lib/typescript/module/proof-of-delivery/ProofOfDelivery.d.ts.map +1 -1
  364. package/lib/typescript/module/select/Select.d.ts.map +1 -1
  365. package/lib/typescript/module/select/Select.web.d.ts.map +1 -1
  366. package/lib/typescript/module/select/use-required-description.d.ts +7 -0
  367. package/lib/typescript/module/select/use-required-description.d.ts.map +1 -0
  368. package/package.json +1 -1
  369. package/src/__tests__/support/adoption-matrix.ts +708 -0
  370. package/src/__tests__/support/card-surface.ts +17 -0
  371. package/src/__tests__/support/collision-fixture-barrel.ts +20 -0
  372. package/src/__tests__/support/commerce-harness.tsx +97 -0
  373. package/src/__tests__/support/composite.ts +68 -0
  374. package/src/__tests__/support/constructed-style-sheets.ts +68 -0
  375. package/src/__tests__/support/press-host.ts +30 -0
  376. package/src/__tests__/support/rendered-style.ts +99 -0
  377. package/src/__tests__/support/unread-hook-fixture.ts +33 -0
  378. package/src/__tests__/support/worklet-capture-fixture.tsx +28 -0
  379. package/src/button/Button.tsx +35 -10
  380. package/src/button/GlyphButton.tsx +3 -3
  381. package/src/card-form/shared.ts +3 -2
  382. package/src/chat-composer/AttachmentMenu.tsx +2 -214
  383. package/src/chat-composer/AttachmentMenu.web.tsx +5 -0
  384. package/src/chat-composer/ChatComposer.tsx +2 -459
  385. package/src/chat-composer/ChatComposer.web.tsx +6 -0
  386. package/src/chat-composer/ComposerAttachmentStrip.tsx +2 -202
  387. package/src/chat-composer/ComposerAttachmentStrip.web.tsx +4 -0
  388. package/src/chat-composer/ComposerBanner.tsx +2 -157
  389. package/src/chat-composer/ComposerBanner.web.tsx +4 -0
  390. package/src/chat-composer/EmojiPicker.tsx +2 -402
  391. package/src/chat-composer/EmojiPicker.web.tsx +5 -0
  392. package/src/chat-composer/MessageContextMenu.tsx +2 -88
  393. package/src/chat-composer/MessageContextMenu.web.tsx +12 -0
  394. package/src/chat-composer/ReactionPicker.tsx +2 -100
  395. package/src/chat-composer/ReactionPicker.web.tsx +5 -0
  396. package/src/chat-composer/SuggestionList.tsx +2 -209
  397. package/src/chat-composer/SuggestionList.web.tsx +4 -0
  398. package/src/chat-composer/VoiceRecorder.tsx +2 -287
  399. package/src/chat-composer/VoiceRecorder.web.tsx +6 -0
  400. package/src/chat-composer/create-attachment-menu.tsx +228 -0
  401. package/src/chat-composer/create-chat-composer.tsx +473 -0
  402. package/src/chat-composer/create-composer-attachment-strip.tsx +212 -0
  403. package/src/chat-composer/create-composer-banner.tsx +167 -0
  404. package/src/chat-composer/create-emoji-picker.tsx +414 -0
  405. package/src/chat-composer/create-message-context-menu.tsx +112 -0
  406. package/src/chat-composer/create-reaction-picker.tsx +112 -0
  407. package/src/chat-composer/create-suggestion-list.tsx +219 -0
  408. package/src/chat-composer/create-voice-recorder.tsx +301 -0
  409. package/src/chat-composer/index.web.ts +9 -9
  410. package/src/earnings/EarningsSummary.tsx +9 -2
  411. package/src/field/Field.tsx +2 -1
  412. package/src/field/types.ts +2 -0
  413. package/src/floating/types.ts +1 -0
  414. package/src/item/Item.tsx +16 -11
  415. package/src/job-board/JobCard.tsx +4 -1
  416. package/src/label/Label.tsx +2 -1
  417. package/src/label/types.ts +2 -0
  418. package/src/listing-details/AmenityList.tsx +4 -3
  419. package/src/overlay/InteractionBoundary.tsx +24 -0
  420. package/src/payment-method/PaymentMethodList.tsx +2 -1
  421. package/src/place-details/PlaceAmenities.tsx +9 -0
  422. package/src/place-details/PlacePopularTimes.tsx +7 -1
  423. package/src/proof-of-delivery/ProofOfDelivery.tsx +9 -1
  424. package/src/proof-of-delivery/shared.ts +1 -1
  425. package/src/select/Select.tsx +5 -1
  426. package/src/select/Select.web.tsx +5 -1
  427. package/src/select/use-required-description.tsx +20 -0
  428. package/src/theme/__tests__/__fixtures__/golden-resolved-tokens.json +9346 -0
  429. package/src/theme/__tests__/__fixtures__/tonal-glass-primary-failures.json +69 -0
  430. package/src/theme/__tests__/fixtures/color-engine-golden.json +1 -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 });