@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxy.so/bloom",
3
- "version": "5.1.0",
3
+ "version": "5.2.0",
4
4
  "packageManager": "bun@1.3.14",
5
5
  "description": "Bloom UI — Oxy ecosystem component library for React Native + Expo + Web",
6
6
  "main": "lib/commonjs/index.js",
@@ -769,6 +769,20 @@
769
769
  "default": "./lib/commonjs/settings-modal/index.js"
770
770
  }
771
771
  },
772
+ "./settings-modal/rows": {
773
+ "react-native": {
774
+ "types": "./lib/typescript/module/settings-modal/rows.d.ts",
775
+ "default": "./src/settings-modal/rows.ts"
776
+ },
777
+ "import": {
778
+ "types": "./lib/typescript/module/settings-modal/rows.d.ts",
779
+ "default": "./lib/module/settings-modal/rows.js"
780
+ },
781
+ "require": {
782
+ "types": "./lib/typescript/commonjs/settings-modal/rows.d.ts",
783
+ "default": "./lib/commonjs/settings-modal/rows.js"
784
+ }
785
+ },
772
786
  "./auth-card": {
773
787
  "react-native": {
774
788
  "types": "./lib/typescript/module/auth-card/index.d.ts",
@@ -1966,6 +1980,20 @@
1966
1980
  "default": "./lib/commonjs/chat-people/index.js"
1967
1981
  }
1968
1982
  },
1983
+ "./chat-people/contact-row": {
1984
+ "react-native": {
1985
+ "types": "./lib/typescript/module/chat-people/contact-row.d.ts",
1986
+ "default": "./src/chat-people/contact-row.ts"
1987
+ },
1988
+ "import": {
1989
+ "types": "./lib/typescript/module/chat-people/contact-row.d.ts",
1990
+ "default": "./lib/module/chat-people/contact-row.js"
1991
+ },
1992
+ "require": {
1993
+ "types": "./lib/typescript/commonjs/chat-people/contact-row.d.ts",
1994
+ "default": "./lib/commonjs/chat-people/contact-row.js"
1995
+ }
1996
+ },
1969
1997
  "./chat-screen": {
1970
1998
  "react-native": {
1971
1999
  "types": "./lib/typescript/module/chat-screen/index.d.ts",
@@ -3659,6 +3687,9 @@
3659
3687
  "settings-modal": [
3660
3688
  "./lib/typescript/module/settings-modal/index.d.ts"
3661
3689
  ],
3690
+ "settings-modal/rows": [
3691
+ "./lib/typescript/module/settings-modal/rows.d.ts"
3692
+ ],
3662
3693
  "auth-card": [
3663
3694
  "./lib/typescript/module/auth-card/index.d.ts"
3664
3695
  ],
@@ -3893,6 +3924,9 @@
3893
3924
  "chat-people": [
3894
3925
  "./lib/typescript/module/chat-people/index.d.ts"
3895
3926
  ],
3927
+ "chat-people/contact-row": [
3928
+ "./lib/typescript/module/chat-people/contact-row.d.ts"
3929
+ ],
3896
3930
  "chat-screen": [
3897
3931
  "./lib/typescript/module/chat-screen/index.d.ts"
3898
3932
  ],
@@ -0,0 +1,151 @@
1
+ /**
2
+ * The divider grip between two resizable panes. Its own module because three
3
+ * families draw it — `AiChatShell`, `AppShell`'s `split` variant and
4
+ * `ChatSplitLayout` — and the two that are not the AI chat must not link the
5
+ * chat shell (Metro does not tree-shake): importing it from `AiChatShell` put
6
+ * that module, its reanimated drawers and the whole ai-chat message catalog in
7
+ * every app that renders an `AppShell`.
8
+ */
9
+ import React, { useMemo, useRef, useState } from 'react';
10
+ import { PanResponder, View, type LayoutChangeEvent, type PointerEvent } from 'react-native';
11
+
12
+ import { useCommonMessages } from '../locale/common-messages';
13
+ import type { WebCssStyle } from '../styles/web-view-style';
14
+ import { dataHook, IS_WEB, useAiChatPalette, useAiChatWebCss } from './shared';
15
+ import type { AiChatResizeHandleProps } from './types';
16
+
17
+ /**
18
+ * The resize grip (`DragHandle`): a 20px strip straddling the chat's right edge
19
+ * (10px past it). Hovering it reveals a 15×25 grip — radius 4, 1px
20
+ * border-button-default, background-primary, shadow-xs, three 1×13
21
+ * icon-quaternary lines 2 apart — that follows the pointer along the edge
22
+ * (kept 13px inside it) and stays up while dragging (150ms fade). Holding and
23
+ * dragging reports the horizontal distance from where the drag started.
24
+ */
25
+ export function AiChatResizeHandle({
26
+ onResizeStart,
27
+ onResize,
28
+ onResizeEnd,
29
+ label: labelProp,
30
+ onNudge,
31
+ style,
32
+ testID,
33
+ }: AiChatResizeHandleProps) {
34
+ useAiChatWebCss();
35
+ const palette = useAiChatPalette();
36
+ const common = useCommonMessages();
37
+ const label = labelProp ?? common.resizePanels;
38
+ const [gripY, setGripY] = useState<number | null>(null);
39
+ const [dragging, setDragging] = useState(false);
40
+ const height = useRef(0);
41
+ const startX = useRef(0);
42
+ const callbacks = useRef({ onResizeStart, onResize, onResizeEnd });
43
+ callbacks.current = { onResizeStart, onResize, onResizeEnd };
44
+
45
+ const track = (localY: number) => {
46
+ const h = height.current;
47
+ if (h > 0) setGripY(Math.min(h - 13, Math.max(13, localY)));
48
+ };
49
+
50
+ // Native: a pan responder (web uses pointer capture below).
51
+ const responder = useMemo(
52
+ () =>
53
+ PanResponder.create({
54
+ onStartShouldSetPanResponder: () => true,
55
+ onMoveShouldSetPanResponder: () => true,
56
+ onPanResponderGrant: (event) => {
57
+ track(event.nativeEvent.locationY);
58
+ setDragging(true);
59
+ callbacks.current.onResizeStart?.();
60
+ },
61
+ onPanResponderMove: (_event, gesture) => callbacks.current.onResize(gesture.dx),
62
+ onPanResponderRelease: () => {
63
+ setDragging(false);
64
+ callbacks.current.onResizeEnd?.();
65
+ },
66
+ onPanResponderTerminate: () => {
67
+ setDragging(false);
68
+ callbacks.current.onResizeEnd?.();
69
+ },
70
+ }),
71
+ [],
72
+ );
73
+
74
+ type DomTarget = {
75
+ getBoundingClientRect: () => { top: number };
76
+ setPointerCapture: (id: number) => void;
77
+ hasPointerCapture: (id: number) => boolean;
78
+ };
79
+ const web = IS_WEB
80
+ ? {
81
+ onPointerDown: (event: PointerEvent) => {
82
+ event.preventDefault();
83
+ startX.current = event.nativeEvent.clientX;
84
+ setDragging(true);
85
+ callbacks.current.onResizeStart?.();
86
+ (event.currentTarget as unknown as DomTarget).setPointerCapture(event.nativeEvent.pointerId);
87
+ },
88
+ onPointerMove: (event: PointerEvent) => {
89
+ const target = event.currentTarget as unknown as DomTarget;
90
+ track(event.nativeEvent.clientY - target.getBoundingClientRect().top);
91
+ if (target.hasPointerCapture(event.nativeEvent.pointerId)) {
92
+ callbacks.current.onResize(event.nativeEvent.clientX - startX.current);
93
+ }
94
+ },
95
+ onPointerUp: () => {
96
+ setDragging(false);
97
+ callbacks.current.onResizeEnd?.();
98
+ },
99
+ onPointerCancel: () => {
100
+ setDragging(false);
101
+ callbacks.current.onResizeEnd?.();
102
+ },
103
+ onKeyDown: (event: { nativeEvent: { key: string } }) => {
104
+ if (event.nativeEvent.key === 'ArrowLeft') onNudge?.(-16);
105
+ if (event.nativeEvent.key === 'ArrowRight') onNudge?.(16);
106
+ },
107
+ tabIndex: onNudge ? (0 as const) : undefined,
108
+ }
109
+ : responder.panHandlers;
110
+
111
+ const grip: WebCssStyle = {
112
+ position: 'absolute',
113
+ ...(gripY === null ? { top: '50%' } : { top: gripY }),
114
+ width: 15,
115
+ height: 25,
116
+ marginTop: -12.5,
117
+ flexDirection: 'row',
118
+ alignItems: 'center',
119
+ justifyContent: 'center',
120
+ gap: 2,
121
+ borderRadius: 4,
122
+ borderWidth: 1,
123
+ borderColor: palette.border,
124
+ backgroundColor: palette.primary,
125
+ boxShadow: palette.shadowXs,
126
+ ...(IS_WEB ? null : { opacity: dragging ? 1 : 0 }),
127
+ };
128
+
129
+ return (
130
+ <View
131
+ {...dataHook('bloomAiChatGrip')}
132
+ {...web}
133
+ role="separator"
134
+ aria-orientation="vertical"
135
+ accessibilityLabel={label}
136
+ testID={testID}
137
+ onLayout={(event: LayoutChangeEvent) => {
138
+ height.current = event.nativeEvent.layout.height;
139
+ }}
140
+ style={[
141
+ { position: 'absolute', top: 0, bottom: 0, right: -10, zIndex: 10, width: 20, alignItems: 'center' },
142
+ style,
143
+ ]}>
144
+ <View {...dataHook('bloomAiChatGripPill', dragging ? 'dragging' : '')} pointerEvents="none" style={grip}>
145
+ {[0, 1, 2].map((line) => (
146
+ <View key={line} style={{ width: 1, height: 13, backgroundColor: palette.iconQuaternary }} />
147
+ ))}
148
+ </View>
149
+ </View>
150
+ );
151
+ }
@@ -9,7 +9,6 @@ import {
9
9
  useWindowDimensions,
10
10
  type GestureResponderEvent,
11
11
  type LayoutChangeEvent,
12
- type PointerEvent,
13
12
  type ViewProps,
14
13
  } from 'react-native';
15
14
  import Animated, {
@@ -39,9 +38,11 @@ import {
39
38
  useAiChatPalette,
40
39
  useAiChatWebCss,
41
40
  } from './shared';
41
+ import { useCommonMessages } from '../locale/common-messages';
42
42
  import { useMessages } from '../locale/messages';
43
43
  import { AI_CHAT_MESSAGES } from './messages';
44
- import type { AiChatMobileHeaderProps, AiChatResizeHandleProps, AiChatShellProps } from './types';
44
+ import type { AiChatMobileHeaderProps, AiChatShellProps } from './types';
45
+ import { AiChatResizeHandle } from './AiChatResizeHandle';
45
46
  import { clamp01 } from '../styles/clamp';
46
47
 
47
48
  const REVEAL_EASE = Easing.bezier(0.42, 0, 0.58, 1);
@@ -90,146 +91,6 @@ const NAV_SETTLE_MIN_MS = 120;
90
91
 
91
92
 
92
93
 
93
- // ---------------------------------------------------------------------------
94
- // Resize handle
95
- // ---------------------------------------------------------------------------
96
-
97
- /**
98
- * The resize grip (`DragHandle`): a 20px strip straddling the chat's right edge
99
- * (10px past it). Hovering it reveals a 15×25 grip — radius 4, 1px
100
- * border-button-default, background-primary, shadow-xs, three 1×13
101
- * icon-quaternary lines 2 apart — that follows the pointer along the edge
102
- * (kept 13px inside it) and stays up while dragging (150ms fade). Holding and
103
- * dragging reports the horizontal distance from where the drag started.
104
- */
105
- export function AiChatResizeHandle({
106
- onResizeStart,
107
- onResize,
108
- onResizeEnd,
109
- label: labelProp,
110
- onNudge,
111
- style,
112
- testID,
113
- }: AiChatResizeHandleProps) {
114
- useAiChatWebCss();
115
- const palette = useAiChatPalette();
116
- const { messages } = useMessages(AI_CHAT_MESSAGES);
117
- const label = labelProp ?? messages.shell.resize;
118
- const [gripY, setGripY] = useState<number | null>(null);
119
- const [dragging, setDragging] = useState(false);
120
- const height = useRef(0);
121
- const startX = useRef(0);
122
- const callbacks = useRef({ onResizeStart, onResize, onResizeEnd });
123
- callbacks.current = { onResizeStart, onResize, onResizeEnd };
124
-
125
- const track = (localY: number) => {
126
- const h = height.current;
127
- if (h > 0) setGripY(Math.min(h - 13, Math.max(13, localY)));
128
- };
129
-
130
- // Native: a pan responder (web uses pointer capture below).
131
- const responder = useMemo(
132
- () =>
133
- PanResponder.create({
134
- onStartShouldSetPanResponder: () => true,
135
- onMoveShouldSetPanResponder: () => true,
136
- onPanResponderGrant: (event) => {
137
- track(event.nativeEvent.locationY);
138
- setDragging(true);
139
- callbacks.current.onResizeStart?.();
140
- },
141
- onPanResponderMove: (_event, gesture) => callbacks.current.onResize(gesture.dx),
142
- onPanResponderRelease: () => {
143
- setDragging(false);
144
- callbacks.current.onResizeEnd?.();
145
- },
146
- onPanResponderTerminate: () => {
147
- setDragging(false);
148
- callbacks.current.onResizeEnd?.();
149
- },
150
- }),
151
- [],
152
- );
153
-
154
- type DomTarget = {
155
- getBoundingClientRect: () => { top: number };
156
- setPointerCapture: (id: number) => void;
157
- hasPointerCapture: (id: number) => boolean;
158
- };
159
- const web = IS_WEB
160
- ? {
161
- onPointerDown: (event: PointerEvent) => {
162
- event.preventDefault();
163
- startX.current = event.nativeEvent.clientX;
164
- setDragging(true);
165
- callbacks.current.onResizeStart?.();
166
- (event.currentTarget as unknown as DomTarget).setPointerCapture(event.nativeEvent.pointerId);
167
- },
168
- onPointerMove: (event: PointerEvent) => {
169
- const target = event.currentTarget as unknown as DomTarget;
170
- track(event.nativeEvent.clientY - target.getBoundingClientRect().top);
171
- if (target.hasPointerCapture(event.nativeEvent.pointerId)) {
172
- callbacks.current.onResize(event.nativeEvent.clientX - startX.current);
173
- }
174
- },
175
- onPointerUp: () => {
176
- setDragging(false);
177
- callbacks.current.onResizeEnd?.();
178
- },
179
- onPointerCancel: () => {
180
- setDragging(false);
181
- callbacks.current.onResizeEnd?.();
182
- },
183
- onKeyDown: (event: { nativeEvent: { key: string } }) => {
184
- if (event.nativeEvent.key === 'ArrowLeft') onNudge?.(-16);
185
- if (event.nativeEvent.key === 'ArrowRight') onNudge?.(16);
186
- },
187
- tabIndex: onNudge ? (0 as const) : undefined,
188
- }
189
- : responder.panHandlers;
190
-
191
- const grip: WebCssStyle = {
192
- position: 'absolute',
193
- ...(gripY === null ? { top: '50%' } : { top: gripY }),
194
- width: 15,
195
- height: 25,
196
- marginTop: -12.5,
197
- flexDirection: 'row',
198
- alignItems: 'center',
199
- justifyContent: 'center',
200
- gap: 2,
201
- borderRadius: 4,
202
- borderWidth: 1,
203
- borderColor: palette.border,
204
- backgroundColor: palette.primary,
205
- boxShadow: palette.shadowXs,
206
- ...(IS_WEB ? null : { opacity: dragging ? 1 : 0 }),
207
- };
208
-
209
- return (
210
- <View
211
- {...dataHook('bloomAiChatGrip')}
212
- {...web}
213
- role="separator"
214
- aria-orientation="vertical"
215
- accessibilityLabel={label}
216
- testID={testID}
217
- onLayout={(event: LayoutChangeEvent) => {
218
- height.current = event.nativeEvent.layout.height;
219
- }}
220
- style={[
221
- { position: 'absolute', top: 0, bottom: 0, right: -10, zIndex: 10, width: 20, alignItems: 'center' },
222
- style,
223
- ]}>
224
- <View {...dataHook('bloomAiChatGripPill', dragging ? 'dragging' : '')} pointerEvents="none" style={grip}>
225
- {[0, 1, 2].map((line) => (
226
- <View key={line} style={{ width: 1, height: 13, backgroundColor: palette.iconQuaternary }} />
227
- ))}
228
- </View>
229
- </View>
230
- );
231
- }
232
-
233
94
  // ---------------------------------------------------------------------------
234
95
  // Mobile header
235
96
  // ---------------------------------------------------------------------------
@@ -344,7 +205,11 @@ export function AiChatShell({
344
205
  const reducedMotion = useReducedMotion();
345
206
  const { messages } = useMessages(AI_CHAT_MESSAGES);
346
207
  const panelLabel = panelLabelProp ?? messages.code;
347
- const l = useMemo(() => ({ ...messages.shell, ...labels }), [messages, labels]);
208
+ const common = useCommonMessages();
209
+ const l = useMemo(
210
+ () => ({ ...messages.shell, resize: common.resizePanels, ...labels }),
211
+ [messages, common, labels],
212
+ );
348
213
  const { width: windowWidth } = useWindowDimensions();
349
214
  // Native has no document: `document` is `container` there.
350
215
  const documentScroll = IS_WEB && scroll === 'document';
@@ -15,7 +15,8 @@ export {
15
15
  AiChatMessageLine,
16
16
  AiChatStrong,
17
17
  } from './AiChatMessages';
18
- export { AiChatMobileHeader, AiChatResizeHandle, AiChatShell } from './AiChatShell';
18
+ export { AiChatResizeHandle } from './AiChatResizeHandle';
19
+ export { AiChatMobileHeader, AiChatShell } from './AiChatShell';
19
20
  export { useAiChatChromeInsets, useAiChatShell } from './context';
20
21
  export type { AiChatChromeInsets, AiChatShellState } from './context';
21
22
  export type {
@@ -20,7 +20,8 @@ export {
20
20
  AiChatMessageLine,
21
21
  AiChatStrong,
22
22
  } from './AiChatMessages';
23
- export { AiChatMobileHeader, AiChatResizeHandle, AiChatShell } from './AiChatShell';
23
+ export { AiChatResizeHandle } from './AiChatResizeHandle';
24
+ export { AiChatMobileHeader, AiChatShell } from './AiChatShell';
24
25
  export { useAiChatChromeInsets, useAiChatShell } from './context';
25
26
  export type { AiChatChromeInsets, AiChatShellState } from './context';
26
27
  export type {
@@ -60,7 +60,6 @@ export interface AiChatMessages {
60
60
  closeNavigation: string;
61
61
  openPanel: (panel: string) => string;
62
62
  closePanel: (panel: string) => string;
63
- resize: string;
64
63
  };
65
64
  /** The shell's default panel name. */
66
65
  code: string;
@@ -105,7 +104,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
105
104
  closeNavigation: 'Close navigation',
106
105
  openPanel: (panel) => `Open ${String(panel).toLowerCase()}`,
107
106
  closePanel: (panel) => `Close ${String(panel).toLowerCase()}`,
108
- resize: 'Resize panels',
109
107
  },
110
108
  code: 'Code',
111
109
  },
@@ -145,7 +143,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
145
143
  closeNavigation: 'Cerrar navegación',
146
144
  openPanel: (panel) => `Abrir ${String(panel).toLowerCase()}`,
147
145
  closePanel: (panel) => `Cerrar ${String(panel).toLowerCase()}`,
148
- resize: 'Cambiar tamaño de los paneles',
149
146
  },
150
147
  code: 'Código',
151
148
  },
@@ -185,7 +182,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
185
182
  closeNavigation: 'Tanca la navegació',
186
183
  openPanel: (panel) => `Obre ${String(panel).toLowerCase()}`,
187
184
  closePanel: (panel) => `Tanca ${String(panel).toLowerCase()}`,
188
- resize: 'Canvia la mida dels taulers',
189
185
  },
190
186
  code: 'Codi',
191
187
  },
@@ -226,7 +222,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
226
222
  closeNavigation: 'Navigation schließen',
227
223
  openPanel: (panel) => `${panel} öffnen`,
228
224
  closePanel: (panel) => `${panel} schließen`,
229
- resize: 'Bereichsgröße ändern',
230
225
  },
231
226
  code: 'Code',
232
227
  },
@@ -272,7 +267,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
272
267
  closeNavigation: 'Fermer la navigation',
273
268
  openPanel: (panel) => `Ouvrir le panneau ${panel}`,
274
269
  closePanel: (panel) => `Fermer le panneau ${panel}`,
275
- resize: 'Redimensionner les panneaux',
276
270
  },
277
271
  code: 'Code',
278
272
  },
@@ -312,7 +306,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
312
306
  closeNavigation: 'Chiudi navigazione',
313
307
  openPanel: (panel) => `Apri ${String(panel).toLowerCase()}`,
314
308
  closePanel: (panel) => `Chiudi ${String(panel).toLowerCase()}`,
315
- resize: 'Ridimensiona pannelli',
316
309
  },
317
310
  code: 'Codice',
318
311
  },
@@ -352,7 +345,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
352
345
  closeNavigation: 'Fechar navegação',
353
346
  openPanel: (panel) => `Abrir ${String(panel).toLowerCase()}`,
354
347
  closePanel: (panel) => `Fechar ${String(panel).toLowerCase()}`,
355
- resize: 'Redimensionar painéis',
356
348
  },
357
349
  code: 'Código',
358
350
  },
@@ -399,7 +391,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
399
391
  closeNavigation: 'Закрыть навигацию',
400
392
  openPanel: (panel) => `Открыть панель «${panel}»`,
401
393
  closePanel: (panel) => `Закрыть панель «${panel}»`,
402
- resize: 'Изменить размер панелей',
403
394
  },
404
395
  code: 'Код',
405
396
  },
@@ -439,7 +430,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
439
430
  closeNavigation: 'Gezinmeyi kapat',
440
431
  openPanel: (panel) => `${panel} panelini aç`,
441
432
  closePanel: (panel) => `${panel} panelini kapat`,
442
- resize: 'Panelleri yeniden boyutlandır',
443
433
  },
444
434
  code: 'Kod',
445
435
  },
@@ -479,7 +469,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
479
469
  closeNavigation: 'ナビゲーションを閉じる',
480
470
  openPanel: (panel) => `${panel}を開く`,
481
471
  closePanel: (panel) => `${panel}を閉じる`,
482
- resize: 'パネルのサイズを変更',
483
472
  },
484
473
  code: 'コード',
485
474
  },
@@ -519,7 +508,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
519
508
  closeNavigation: '关闭导航',
520
509
  openPanel: (panel) => `打开${panel}`,
521
510
  closePanel: (panel) => `关闭${panel}`,
522
- resize: '调整面板大小',
523
511
  },
524
512
  code: '代码',
525
513
  },
@@ -575,7 +563,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
575
563
  closeNavigation: 'إغلاق التنقل',
576
564
  openPanel: (panel) => `فتح لوحة ${panel}`,
577
565
  closePanel: (panel) => `إغلاق لوحة ${panel}`,
578
- resize: 'تغيير حجم اللوحات',
579
566
  },
580
567
  code: 'الرمز البرمجي',
581
568
  },
@@ -615,7 +602,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
615
602
  closeNavigation: 'नेविगेशन बंद करें',
616
603
  openPanel: (panel) => `${panel} खोलें`,
617
604
  closePanel: (panel) => `${panel} बंद करें`,
618
- resize: 'पैनल का आकार बदलें',
619
605
  },
620
606
  code: 'कोड',
621
607
  },
@@ -655,7 +641,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
655
641
  closeNavigation: 'নেভিগেশন বন্ধ করুন',
656
642
  openPanel: (panel) => `${panel} খুলুন`,
657
643
  closePanel: (panel) => `${panel} বন্ধ করুন`,
658
- resize: 'প্যানেলের আকার বদলান',
659
644
  },
660
645
  code: 'কোড',
661
646
  },
@@ -695,7 +680,6 @@ export const AI_CHAT_MESSAGES: MessageCatalog<AiChatMessages> = {
695
680
  closeNavigation: 'Tutup navigasi',
696
681
  openPanel: (panel) => `Buka ${String(panel).toLowerCase()}`,
697
682
  closePanel: (panel) => `Tutup ${String(panel).toLowerCase()}`,
698
- resize: 'Ubah ukuran panel',
699
683
  },
700
684
  code: 'Kode',
701
685
  },
@@ -17,7 +17,7 @@
17
17
  import React, { memo, useCallback, useRef, useState } from 'react';
18
18
  import { ScrollView, View } from 'react-native';
19
19
 
20
- import { AiChatResizeHandle } from '../ai-chat/AiChatShell';
20
+ import { AiChatResizeHandle } from '../ai-chat/AiChatResizeHandle';
21
21
  import { Z_INDEX } from '../styles/z-index';
22
22
  import { useTheme } from '../theme/use-theme';
23
23
 
@@ -43,6 +43,35 @@ function isTextContent(node: React.ReactNode): boolean {
43
43
  return React.isValidElement<{ children?: React.ReactNode }>(node) && node.type === React.Fragment && isTextContent(node.props.children);
44
44
  }
45
45
 
46
+ /** Keep contiguous labels together so the button's gap only separates layout nodes. */
47
+ function renderTextContent(node: React.ReactNode, wrap: (text: React.ReactNode) => React.ReactNode): React.ReactNode {
48
+ if (isTextContent(node)) return wrap(node);
49
+ const result: React.ReactNode[] = [];
50
+ let run: React.ReactNode[] = [];
51
+ let runKey = '';
52
+ const flush = () => {
53
+ if (run.length) result.push(<React.Fragment key={runKey}>{wrap(run)}</React.Fragment>);
54
+ run = [];
55
+ };
56
+ const visit = (children: React.ReactNode, path: string) => {
57
+ React.Children.toArray(children).forEach((child, index) => {
58
+ const key = `${path}/${React.isValidElement(child) ? child.key ?? index : index}`;
59
+ if (React.isValidElement<{ children?: React.ReactNode }>(child) && child.type === React.Fragment) {
60
+ visit(child.props.children, key);
61
+ } else if (typeof child === 'string' || typeof child === 'number') {
62
+ if (!run.length) runKey = key;
63
+ run.push(child);
64
+ } else {
65
+ flush();
66
+ result.push(<React.Fragment key={key}>{child}</React.Fragment>);
67
+ }
68
+ });
69
+ };
70
+ visit(node, 'content');
71
+ flush();
72
+ return result;
73
+ }
74
+
46
75
  export type {
47
76
  ButtonProps, LinkButtonProps,
48
77
  ButtonSize,
@@ -340,16 +369,12 @@ const ButtonComponent = forwardRef<View, ButtonProps>(function ButtonComponent({
340
369
  )}
341
370
  {leading}
342
371
  {iconNode}
343
- {!isSquare && children != null && (isTextContent(children) ? (
344
- <Text
345
- variant={textVariant ?? geometry.type}
346
- numberOfLines={numberOfLines}
347
- style={[computedTextStyle, textStyle]}
348
- >
349
- {children}
350
- </Text>
351
- ) : children)}
352
- {isSquare && !renderLeadingIcon && !LeadingIcon && !iconNode && children != null ? children : null}
372
+ {children != null && (!isSquare || (!renderLeadingIcon && !LeadingIcon && !iconNode))
373
+ ? renderTextContent(children, text => (
374
+ <Text variant={textVariant ?? geometry.type} numberOfLines={numberOfLines} style={[computedTextStyle, textStyle]}>
375
+ {text}
376
+ </Text>
377
+ )) : null}
353
378
  {trailing}
354
379
  {!isSquare
355
380
  ? resolveIconSlot(renderTrailingIcon, iconSize, paint.foreground, () =>
@@ -164,9 +164,9 @@ function GlyphButtonComponent(
164
164
  aria-busy={busy || undefined}
165
165
  aria-expanded={ariaExpanded}
166
166
  {...(ariaHasPopup == null ? {} : { 'aria-haspopup': ariaHasPopup })}
167
- disabled={blocked}
168
- onPress={onPress}
169
- onLongPress={onLongPress}
167
+ disabled={disabled}
168
+ onPress={onPress ? event => { if (!blocked) onPress(event); } : undefined}
169
+ onLongPress={onLongPress ? event => { if (!blocked) onLongPress(event); } : undefined}
170
170
  onHoverIn={onHoverIn}
171
171
  onHoverOut={onHoverOut}
172
172
  onPressIn={onPressIn}
@@ -65,7 +65,8 @@ export function groupCardDigits(digits: string, groups: readonly number[] = DEFA
65
65
  * re-groups it when the field is left.
66
66
  *
67
67
  * An edit that would push the number past `maxDigits` is refused outright:
68
- * returning a truncated value would move the caret too.
68
+ * returning a truncated value would move the caret too. Deletions still work
69
+ * when a scheme change made the existing value longer than the new limit.
69
70
  */
70
71
  export function applyCardNumberEdit(
71
72
  previous: string,
@@ -74,8 +75,8 @@ export function applyCardNumberEdit(
74
75
  maxDigits = 19,
75
76
  ): string {
76
77
  const nextDigits = cardDigits(next);
77
- if (nextDigits.length > maxDigits) return previous;
78
78
  const previousDigits = cardDigits(previous);
79
+ if (nextDigits.length > maxDigits && nextDigits.length >= previousDigits.length) return previous;
79
80
  const atEnd =
80
81
  previousDigits.startsWith(nextDigits) || nextDigits.startsWith(previousDigits);
81
82
  if (atEnd) return groupCardDigits(nextDigits, groups);