@oxy.so/services 3.0.0 → 4.0.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 (363) hide show
  1. package/LICENSE +675 -201
  2. package/NOTICE +215 -3
  3. package/README.md +1 -3
  4. package/lib/commonjs/assets/assets/fonts/icons/OxyServicesIonicons.ttf +0 -0
  5. package/lib/commonjs/assets/assets/fonts/icons/OxyServicesMaterialCommunityIcons.ttf +0 -0
  6. package/lib/commonjs/assets/assets/fonts/icons/manifest.json +5 -11
  7. package/lib/commonjs/assets/fonts/icons/OxyServicesIonicons.ttf +0 -0
  8. package/lib/commonjs/assets/fonts/icons/OxyServicesMaterialCommunityIcons.ttf +0 -0
  9. package/lib/commonjs/assets/fonts/icons/manifest.json +5 -11
  10. package/lib/commonjs/ui/components/FollowButton.js +15 -28
  11. package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
  12. package/lib/commonjs/ui/components/FollowTargetButton.js +17 -13
  13. package/lib/commonjs/ui/components/FollowTargetButton.js.map +1 -1
  14. package/lib/commonjs/ui/components/OxyAuthPrompt.js +3 -2
  15. package/lib/commonjs/ui/components/OxyAuthPrompt.js.map +1 -1
  16. package/lib/commonjs/ui/components/OxyConsentScreen.js +4 -2
  17. package/lib/commonjs/ui/components/OxyConsentScreen.js.map +1 -1
  18. package/lib/commonjs/ui/components/OxySignInButton.js +1 -1
  19. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  20. package/lib/commonjs/ui/components/OxySignInRequestSurface.js +2 -1
  21. package/lib/commonjs/ui/components/OxySignInRequestSurface.js.map +1 -1
  22. package/lib/commonjs/ui/components/ProfileButton.js +67 -267
  23. package/lib/commonjs/ui/components/ProfileButton.js.map +1 -1
  24. package/lib/commonjs/ui/components/ProfileSummaryCard.js +2 -2
  25. package/lib/commonjs/ui/components/ProfileSummaryCard.js.map +1 -1
  26. package/lib/commonjs/ui/components/SurfaceHeaderAction.js +9 -49
  27. package/lib/commonjs/ui/components/SurfaceHeaderAction.js.map +1 -1
  28. package/lib/commonjs/ui/components/SurfaceScreen.js +3 -2
  29. package/lib/commonjs/ui/components/SurfaceScreen.js.map +1 -1
  30. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js +2 -1
  31. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  32. package/lib/commonjs/ui/components/authChooser/SignInEntryView.js +2 -1
  33. package/lib/commonjs/ui/components/authChooser/SignInEntryView.js.map +1 -1
  34. package/lib/commonjs/ui/components/authChooser/SignUpView.js +4 -2
  35. package/lib/commonjs/ui/components/authChooser/SignUpView.js.map +1 -1
  36. package/lib/commonjs/ui/components/authChooser/requestSurfaces.js +2 -1
  37. package/lib/commonjs/ui/components/authChooser/requestSurfaces.js.map +1 -1
  38. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js +20 -14
  39. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  40. package/lib/commonjs/ui/components/fileManagement/FileViewer.js +48 -85
  41. package/lib/commonjs/ui/components/fileManagement/FileViewer.js.map +1 -1
  42. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +35 -31
  43. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
  44. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +9 -6
  45. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -1
  46. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +22 -19
  47. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  48. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js +6 -3
  49. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js.map +1 -1
  50. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js +6 -3
  51. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js.map +1 -1
  52. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js +7 -5
  53. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js.map +1 -1
  54. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +20 -17
  55. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -1
  56. package/lib/commonjs/ui/components/photogrid/JustifiedPhotoGrid.js +2 -1
  57. package/lib/commonjs/ui/components/photogrid/JustifiedPhotoGrid.js.map +1 -1
  58. package/lib/commonjs/ui/components/surfaces/ActionSheetSurface.js +5 -3
  59. package/lib/commonjs/ui/components/surfaces/ActionSheetSurface.js.map +1 -1
  60. package/lib/commonjs/ui/icons/subsetGlyphMaps.js +0 -6
  61. package/lib/commonjs/ui/icons/subsetGlyphMaps.js.map +1 -1
  62. package/lib/commonjs/ui/screens/AccountMembersScreen.js +36 -60
  63. package/lib/commonjs/ui/screens/AccountMembersScreen.js.map +1 -1
  64. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +2 -1
  65. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  66. package/lib/commonjs/ui/screens/AccountVerificationScreen.js +16 -7
  67. package/lib/commonjs/ui/screens/AccountVerificationScreen.js.map +1 -1
  68. package/lib/commonjs/ui/screens/AvatarCropScreen.js +7 -6
  69. package/lib/commonjs/ui/screens/AvatarCropScreen.js.map +1 -1
  70. package/lib/commonjs/ui/screens/CreateAccountScreen.js +2 -1
  71. package/lib/commonjs/ui/screens/CreateAccountScreen.js.map +1 -1
  72. package/lib/commonjs/ui/screens/FeedbackScreen.js +18 -9
  73. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  74. package/lib/commonjs/ui/screens/FileManagementScreen.js +99 -200
  75. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  76. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +8 -9
  77. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  78. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js +19 -8
  79. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js.map +1 -1
  80. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +2 -1
  81. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
  82. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +20 -10
  83. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  84. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +4 -2
  85. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  86. package/lib/commonjs/ui/screens/ProfileScreen.js +2 -1
  87. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  88. package/lib/commonjs/ui/screens/UserListScreen.js +31 -33
  89. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -1
  90. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +22 -11
  91. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  92. package/lib/commonjs/ui/screens/fileManagement/FileLibraryError.js +7 -18
  93. package/lib/commonjs/ui/screens/fileManagement/FileLibraryError.js.map +1 -1
  94. package/lib/commonjs/ui/screens/fileManagement/FileListSection.js +7 -16
  95. package/lib/commonjs/ui/screens/fileManagement/FileListSection.js.map +1 -1
  96. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js +6 -6
  97. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  98. package/lib/commonjs/ui/screens/fileManagement/UploadBar.js +23 -66
  99. package/lib/commonjs/ui/screens/fileManagement/UploadBar.js.map +1 -1
  100. package/lib/commonjs/ui/screens/trust/TrustAboutScreen.js +17 -8
  101. package/lib/commonjs/ui/screens/trust/TrustAboutScreen.js.map +1 -1
  102. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js +2 -1
  103. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  104. package/lib/commonjs/ui/screens/trust/TrustRulesScreen.js +3 -2
  105. package/lib/commonjs/ui/screens/trust/TrustRulesScreen.js.map +1 -1
  106. package/lib/module/assets/assets/fonts/icons/OxyServicesIonicons.ttf +0 -0
  107. package/lib/module/assets/assets/fonts/icons/OxyServicesMaterialCommunityIcons.ttf +0 -0
  108. package/lib/module/assets/assets/fonts/icons/manifest.json +5 -11
  109. package/lib/module/assets/fonts/icons/OxyServicesIonicons.ttf +0 -0
  110. package/lib/module/assets/fonts/icons/OxyServicesMaterialCommunityIcons.ttf +0 -0
  111. package/lib/module/assets/fonts/icons/manifest.json +5 -11
  112. package/lib/module/ui/components/FollowButton.js +15 -28
  113. package/lib/module/ui/components/FollowButton.js.map +1 -1
  114. package/lib/module/ui/components/FollowTargetButton.js +15 -12
  115. package/lib/module/ui/components/FollowTargetButton.js.map +1 -1
  116. package/lib/module/ui/components/OxyAuthPrompt.js +2 -1
  117. package/lib/module/ui/components/OxyAuthPrompt.js.map +1 -1
  118. package/lib/module/ui/components/OxyConsentScreen.js +4 -2
  119. package/lib/module/ui/components/OxyConsentScreen.js.map +1 -1
  120. package/lib/module/ui/components/OxySignInButton.js +1 -1
  121. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  122. package/lib/module/ui/components/OxySignInRequestSurface.js +2 -1
  123. package/lib/module/ui/components/OxySignInRequestSurface.js.map +1 -1
  124. package/lib/module/ui/components/ProfileButton.js +70 -269
  125. package/lib/module/ui/components/ProfileButton.js.map +1 -1
  126. package/lib/module/ui/components/ProfileSummaryCard.js +2 -2
  127. package/lib/module/ui/components/ProfileSummaryCard.js.map +1 -1
  128. package/lib/module/ui/components/SurfaceHeaderAction.js +8 -48
  129. package/lib/module/ui/components/SurfaceHeaderAction.js.map +1 -1
  130. package/lib/module/ui/components/SurfaceScreen.js +2 -1
  131. package/lib/module/ui/components/SurfaceScreen.js.map +1 -1
  132. package/lib/module/ui/components/authChooser/AccountsMenuView.js +2 -1
  133. package/lib/module/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  134. package/lib/module/ui/components/authChooser/SignInEntryView.js +2 -1
  135. package/lib/module/ui/components/authChooser/SignInEntryView.js.map +1 -1
  136. package/lib/module/ui/components/authChooser/SignUpView.js +4 -2
  137. package/lib/module/ui/components/authChooser/SignUpView.js.map +1 -1
  138. package/lib/module/ui/components/authChooser/requestSurfaces.js +2 -1
  139. package/lib/module/ui/components/authChooser/requestSurfaces.js.map +1 -1
  140. package/lib/module/ui/components/fileManagement/FileDetailsModal.js +12 -6
  141. package/lib/module/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  142. package/lib/module/ui/components/fileManagement/FileViewer.js +38 -75
  143. package/lib/module/ui/components/fileManagement/FileViewer.js.map +1 -1
  144. package/lib/module/ui/components/fileManagement/UploadPreview.js +31 -27
  145. package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
  146. package/lib/module/ui/components/modals/DeleteAccountModal.js +6 -3
  147. package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -1
  148. package/lib/module/ui/components/payment/PaymentDetailsStep.js +6 -3
  149. package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  150. package/lib/module/ui/components/payment/PaymentMethodStep.js +6 -3
  151. package/lib/module/ui/components/payment/PaymentMethodStep.js.map +1 -1
  152. package/lib/module/ui/components/payment/PaymentReviewStep.js +6 -3
  153. package/lib/module/ui/components/payment/PaymentReviewStep.js.map +1 -1
  154. package/lib/module/ui/components/payment/PaymentSuccessStep.js +4 -2
  155. package/lib/module/ui/components/payment/PaymentSuccessStep.js.map +1 -1
  156. package/lib/module/ui/components/payment/PaymentSummaryStep.js +6 -3
  157. package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -1
  158. package/lib/module/ui/components/photogrid/JustifiedPhotoGrid.js +2 -1
  159. package/lib/module/ui/components/photogrid/JustifiedPhotoGrid.js.map +1 -1
  160. package/lib/module/ui/components/surfaces/ActionSheetSurface.js +4 -2
  161. package/lib/module/ui/components/surfaces/ActionSheetSurface.js.map +1 -1
  162. package/lib/module/ui/icons/subsetGlyphMaps.js +0 -6
  163. package/lib/module/ui/icons/subsetGlyphMaps.js.map +1 -1
  164. package/lib/module/ui/screens/AccountMembersScreen.js +37 -61
  165. package/lib/module/ui/screens/AccountMembersScreen.js.map +1 -1
  166. package/lib/module/ui/screens/AccountSettingsScreen.js +2 -1
  167. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  168. package/lib/module/ui/screens/AccountVerificationScreen.js +15 -7
  169. package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
  170. package/lib/module/ui/screens/AvatarCropScreen.js +2 -1
  171. package/lib/module/ui/screens/AvatarCropScreen.js.map +1 -1
  172. package/lib/module/ui/screens/CreateAccountScreen.js +2 -1
  173. package/lib/module/ui/screens/CreateAccountScreen.js.map +1 -1
  174. package/lib/module/ui/screens/FeedbackScreen.js +18 -9
  175. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  176. package/lib/module/ui/screens/FileManagementScreen.js +91 -192
  177. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  178. package/lib/module/ui/screens/LanguageSelectorScreen.js +9 -10
  179. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  180. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js +18 -7
  181. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js.map +1 -1
  182. package/lib/module/ui/screens/PaymentGatewayScreen.js +2 -1
  183. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
  184. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +20 -10
  185. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  186. package/lib/module/ui/screens/PrivacySettingsScreen.js +4 -2
  187. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  188. package/lib/module/ui/screens/ProfileScreen.js +2 -1
  189. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  190. package/lib/module/ui/screens/UserListScreen.js +32 -34
  191. package/lib/module/ui/screens/UserListScreen.js.map +1 -1
  192. package/lib/module/ui/screens/WelcomeNewUserScreen.js +22 -11
  193. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  194. package/lib/module/ui/screens/fileManagement/FileLibraryError.js +6 -17
  195. package/lib/module/ui/screens/fileManagement/FileLibraryError.js.map +1 -1
  196. package/lib/module/ui/screens/fileManagement/FileListSection.js +5 -14
  197. package/lib/module/ui/screens/fileManagement/FileListSection.js.map +1 -1
  198. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js +3 -3
  199. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  200. package/lib/module/ui/screens/fileManagement/UploadBar.js +24 -66
  201. package/lib/module/ui/screens/fileManagement/UploadBar.js.map +1 -1
  202. package/lib/module/ui/screens/trust/TrustAboutScreen.js +16 -7
  203. package/lib/module/ui/screens/trust/TrustAboutScreen.js.map +1 -1
  204. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js +2 -1
  205. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  206. package/lib/module/ui/screens/trust/TrustRulesScreen.js +2 -1
  207. package/lib/module/ui/screens/trust/TrustRulesScreen.js.map +1 -1
  208. package/lib/typescript/commonjs/ui/components/FollowButton.d.ts.map +1 -1
  209. package/lib/typescript/commonjs/ui/components/FollowTargetButton.d.ts.map +1 -1
  210. package/lib/typescript/commonjs/ui/components/OxyAuthPrompt.d.ts.map +1 -1
  211. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts +1 -1
  212. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
  213. package/lib/typescript/commonjs/ui/components/ProfileButton.d.ts +1 -20
  214. package/lib/typescript/commonjs/ui/components/ProfileButton.d.ts.map +1 -1
  215. package/lib/typescript/commonjs/ui/components/ProfileSummaryCard.d.ts.map +1 -1
  216. package/lib/typescript/commonjs/ui/components/SurfaceHeaderAction.d.ts +1 -5
  217. package/lib/typescript/commonjs/ui/components/SurfaceHeaderAction.d.ts.map +1 -1
  218. package/lib/typescript/commonjs/ui/components/SurfaceScreen.d.ts.map +1 -1
  219. package/lib/typescript/commonjs/ui/components/fileManagement/FileDetailsModal.d.ts.map +1 -1
  220. package/lib/typescript/commonjs/ui/components/fileManagement/FileViewer.d.ts.map +1 -1
  221. package/lib/typescript/commonjs/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
  222. package/lib/typescript/commonjs/ui/components/modals/DeleteAccountModal.d.ts.map +1 -1
  223. package/lib/typescript/commonjs/ui/components/payment/PaymentDetailsStep.d.ts.map +1 -1
  224. package/lib/typescript/commonjs/ui/components/payment/PaymentMethodStep.d.ts.map +1 -1
  225. package/lib/typescript/commonjs/ui/components/payment/PaymentReviewStep.d.ts.map +1 -1
  226. package/lib/typescript/commonjs/ui/components/payment/PaymentSuccessStep.d.ts.map +1 -1
  227. package/lib/typescript/commonjs/ui/components/payment/PaymentSummaryStep.d.ts.map +1 -1
  228. package/lib/typescript/commonjs/ui/components/photogrid/JustifiedPhotoGrid.d.ts.map +1 -1
  229. package/lib/typescript/commonjs/ui/components/surfaces/ActionSheetSurface.d.ts.map +1 -1
  230. package/lib/typescript/commonjs/ui/icons/Ionicons.d.ts +1 -1
  231. package/lib/typescript/commonjs/ui/icons/Ionicons.d.ts.map +1 -1
  232. package/lib/typescript/commonjs/ui/icons/MaterialCommunityIcons.d.ts +1 -1
  233. package/lib/typescript/commonjs/ui/icons/MaterialCommunityIcons.d.ts.map +1 -1
  234. package/lib/typescript/commonjs/ui/icons/subsetGlyphMaps.d.ts +0 -6
  235. package/lib/typescript/commonjs/ui/icons/subsetGlyphMaps.d.ts.map +1 -1
  236. package/lib/typescript/commonjs/ui/screens/AccountMembersScreen.d.ts.map +1 -1
  237. package/lib/typescript/commonjs/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  238. package/lib/typescript/commonjs/ui/screens/AvatarCropScreen.d.ts.map +1 -1
  239. package/lib/typescript/commonjs/ui/screens/FileManagementScreen.d.ts.map +1 -1
  240. package/lib/typescript/commonjs/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  241. package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -1
  242. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts.map +1 -1
  243. package/lib/typescript/commonjs/ui/screens/fileManagement/FileLibraryError.d.ts +0 -2
  244. package/lib/typescript/commonjs/ui/screens/fileManagement/FileLibraryError.d.ts.map +1 -1
  245. package/lib/typescript/commonjs/ui/screens/fileManagement/FileListSection.d.ts.map +1 -1
  246. package/lib/typescript/commonjs/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
  247. package/lib/typescript/commonjs/ui/screens/fileManagement/UploadBar.d.ts +1 -14
  248. package/lib/typescript/commonjs/ui/screens/fileManagement/UploadBar.d.ts.map +1 -1
  249. package/lib/typescript/commonjs/ui/screens/trust/TrustAboutScreen.d.ts.map +1 -1
  250. package/lib/typescript/commonjs/ui/screens/trust/TrustRulesScreen.d.ts.map +1 -1
  251. package/lib/typescript/module/ui/components/FollowButton.d.ts.map +1 -1
  252. package/lib/typescript/module/ui/components/FollowTargetButton.d.ts.map +1 -1
  253. package/lib/typescript/module/ui/components/OxyAuthPrompt.d.ts.map +1 -1
  254. package/lib/typescript/module/ui/components/OxySignInButton.d.ts +1 -1
  255. package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
  256. package/lib/typescript/module/ui/components/ProfileButton.d.ts +1 -20
  257. package/lib/typescript/module/ui/components/ProfileButton.d.ts.map +1 -1
  258. package/lib/typescript/module/ui/components/ProfileSummaryCard.d.ts.map +1 -1
  259. package/lib/typescript/module/ui/components/SurfaceHeaderAction.d.ts +1 -5
  260. package/lib/typescript/module/ui/components/SurfaceHeaderAction.d.ts.map +1 -1
  261. package/lib/typescript/module/ui/components/SurfaceScreen.d.ts.map +1 -1
  262. package/lib/typescript/module/ui/components/fileManagement/FileDetailsModal.d.ts.map +1 -1
  263. package/lib/typescript/module/ui/components/fileManagement/FileViewer.d.ts.map +1 -1
  264. package/lib/typescript/module/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
  265. package/lib/typescript/module/ui/components/modals/DeleteAccountModal.d.ts.map +1 -1
  266. package/lib/typescript/module/ui/components/payment/PaymentDetailsStep.d.ts.map +1 -1
  267. package/lib/typescript/module/ui/components/payment/PaymentMethodStep.d.ts.map +1 -1
  268. package/lib/typescript/module/ui/components/payment/PaymentReviewStep.d.ts.map +1 -1
  269. package/lib/typescript/module/ui/components/payment/PaymentSuccessStep.d.ts.map +1 -1
  270. package/lib/typescript/module/ui/components/payment/PaymentSummaryStep.d.ts.map +1 -1
  271. package/lib/typescript/module/ui/components/photogrid/JustifiedPhotoGrid.d.ts.map +1 -1
  272. package/lib/typescript/module/ui/components/surfaces/ActionSheetSurface.d.ts.map +1 -1
  273. package/lib/typescript/module/ui/icons/Ionicons.d.ts +1 -1
  274. package/lib/typescript/module/ui/icons/Ionicons.d.ts.map +1 -1
  275. package/lib/typescript/module/ui/icons/MaterialCommunityIcons.d.ts +1 -1
  276. package/lib/typescript/module/ui/icons/MaterialCommunityIcons.d.ts.map +1 -1
  277. package/lib/typescript/module/ui/icons/subsetGlyphMaps.d.ts +0 -6
  278. package/lib/typescript/module/ui/icons/subsetGlyphMaps.d.ts.map +1 -1
  279. package/lib/typescript/module/ui/screens/AccountMembersScreen.d.ts.map +1 -1
  280. package/lib/typescript/module/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  281. package/lib/typescript/module/ui/screens/AvatarCropScreen.d.ts.map +1 -1
  282. package/lib/typescript/module/ui/screens/FileManagementScreen.d.ts.map +1 -1
  283. package/lib/typescript/module/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  284. package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -1
  285. package/lib/typescript/module/ui/screens/UserListScreen.d.ts.map +1 -1
  286. package/lib/typescript/module/ui/screens/fileManagement/FileLibraryError.d.ts +0 -2
  287. package/lib/typescript/module/ui/screens/fileManagement/FileLibraryError.d.ts.map +1 -1
  288. package/lib/typescript/module/ui/screens/fileManagement/FileListSection.d.ts.map +1 -1
  289. package/lib/typescript/module/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
  290. package/lib/typescript/module/ui/screens/fileManagement/UploadBar.d.ts +1 -14
  291. package/lib/typescript/module/ui/screens/fileManagement/UploadBar.d.ts.map +1 -1
  292. package/lib/typescript/module/ui/screens/trust/TrustAboutScreen.d.ts.map +1 -1
  293. package/lib/typescript/module/ui/screens/trust/TrustRulesScreen.d.ts.map +1 -1
  294. package/package.json +7 -7
  295. package/src/assets/fonts/icons/OxyServicesIonicons.ttf +0 -0
  296. package/src/assets/fonts/icons/OxyServicesMaterialCommunityIcons.ttf +0 -0
  297. package/src/assets/fonts/icons/manifest.json +5 -11
  298. package/src/ui/components/FollowButton.tsx +14 -29
  299. package/src/ui/components/FollowTargetButton.tsx +14 -12
  300. package/src/ui/components/OxyAuthPrompt.tsx +2 -7
  301. package/src/ui/components/OxyConsentScreen.tsx +2 -2
  302. package/src/ui/components/OxySignInButton.tsx +2 -2
  303. package/src/ui/components/OxySignInRequestSurface.tsx +1 -1
  304. package/src/ui/components/ProfileButton.tsx +30 -297
  305. package/src/ui/components/ProfileSummaryCard.tsx +1 -2
  306. package/src/ui/components/SurfaceHeaderAction.tsx +7 -49
  307. package/src/ui/components/SurfaceScreen.tsx +2 -1
  308. package/src/ui/components/authChooser/AccountsMenuView.tsx +1 -1
  309. package/src/ui/components/authChooser/SignInEntryView.tsx +1 -1
  310. package/src/ui/components/authChooser/SignUpView.tsx +2 -2
  311. package/src/ui/components/authChooser/requestSurfaces.tsx +1 -1
  312. package/src/ui/components/fileManagement/FileDetailsModal.tsx +8 -6
  313. package/src/ui/components/fileManagement/FileViewer.tsx +21 -50
  314. package/src/ui/components/fileManagement/UploadPreview.tsx +12 -29
  315. package/src/ui/components/modals/DeleteAccountModal.tsx +4 -3
  316. package/src/ui/components/payment/PaymentDetailsStep.tsx +4 -3
  317. package/src/ui/components/payment/PaymentMethodStep.tsx +4 -3
  318. package/src/ui/components/payment/PaymentReviewStep.tsx +4 -3
  319. package/src/ui/components/payment/PaymentSuccessStep.tsx +3 -2
  320. package/src/ui/components/payment/PaymentSummaryStep.tsx +4 -3
  321. package/src/ui/components/photogrid/JustifiedPhotoGrid.tsx +2 -1
  322. package/src/ui/components/surfaces/ActionSheetSurface.tsx +3 -2
  323. package/src/ui/icons/subsetGlyphMaps.ts +0 -6
  324. package/src/ui/screens/AccountMembersScreen.tsx +17 -65
  325. package/src/ui/screens/AccountSettingsScreen.tsx +1 -1
  326. package/src/ui/screens/AccountVerificationScreen.tsx +14 -7
  327. package/src/ui/screens/AvatarCropScreen.tsx +2 -10
  328. package/src/ui/screens/CreateAccountScreen.tsx +1 -1
  329. package/src/ui/screens/FeedbackScreen.tsx +9 -9
  330. package/src/ui/screens/FileManagementScreen.tsx +37 -184
  331. package/src/ui/screens/LanguageSelectorScreen.tsx +5 -13
  332. package/src/ui/screens/LearnMoreUsernamesScreen.tsx +17 -7
  333. package/src/ui/screens/PaymentGatewayScreen.tsx +1 -1
  334. package/src/ui/screens/PremiumSubscriptionScreen.tsx +10 -10
  335. package/src/ui/screens/PrivacySettingsScreen.tsx +2 -2
  336. package/src/ui/screens/ProfileScreen.tsx +1 -1
  337. package/src/ui/screens/UserListScreen.tsx +17 -44
  338. package/src/ui/screens/WelcomeNewUserScreen.tsx +11 -11
  339. package/src/ui/screens/fileManagement/FileLibraryError.tsx +6 -14
  340. package/src/ui/screens/fileManagement/FileListSection.tsx +4 -16
  341. package/src/ui/screens/fileManagement/PhotoPickerSection.tsx +2 -13
  342. package/src/ui/screens/fileManagement/UploadBar.tsx +17 -56
  343. package/src/ui/screens/trust/TrustAboutScreen.tsx +16 -7
  344. package/src/ui/screens/trust/TrustLeaderboardScreen.tsx +1 -1
  345. package/src/ui/screens/trust/TrustRulesScreen.tsx +2 -1
  346. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js +0 -61
  347. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js.map +0 -1
  348. package/lib/commonjs/ui/components/internal/PinInput.js +0 -118
  349. package/lib/commonjs/ui/components/internal/PinInput.js.map +0 -1
  350. package/lib/module/ui/components/fileManagement/AnimatedButton.js +0 -55
  351. package/lib/module/ui/components/fileManagement/AnimatedButton.js.map +0 -1
  352. package/lib/module/ui/components/internal/PinInput.js +0 -113
  353. package/lib/module/ui/components/internal/PinInput.js.map +0 -1
  354. package/lib/typescript/commonjs/ui/components/fileManagement/AnimatedButton.d.ts +0 -17
  355. package/lib/typescript/commonjs/ui/components/fileManagement/AnimatedButton.d.ts.map +0 -1
  356. package/lib/typescript/commonjs/ui/components/internal/PinInput.d.ts +0 -23
  357. package/lib/typescript/commonjs/ui/components/internal/PinInput.d.ts.map +0 -1
  358. package/lib/typescript/module/ui/components/fileManagement/AnimatedButton.d.ts +0 -17
  359. package/lib/typescript/module/ui/components/fileManagement/AnimatedButton.d.ts.map +0 -1
  360. package/lib/typescript/module/ui/components/internal/PinInput.d.ts +0 -23
  361. package/lib/typescript/module/ui/components/internal/PinInput.d.ts.map +0 -1
  362. package/src/ui/components/fileManagement/AnimatedButton.tsx +0 -64
  363. package/src/ui/components/internal/PinInput.tsx +0 -123
@@ -5,13 +5,11 @@ import type {
5
5
  TextStyle,
6
6
  StyleProp,
7
7
  } from 'react-native';
8
- import { ActivityIndicator } from 'react-native';
9
8
  import { useOxy } from '../context/OxyContext';
10
9
  import { toast } from '@oxy.so/bloom/toast';
11
- import { Button } from '@oxy.so/bloom/button';
10
+ import { FollowButton as BloomFollowButton } from '@oxy.so/bloom/media-header';
12
11
  import { useFollow, useFollowForButton } from '../hooks/useFollow';
13
12
  import { useFollowStore } from '../stores/followStore';
14
- import { useTheme } from '@oxy.so/bloom/theme';
15
13
  import type { OxyServices, BulkFollowResult, BulkUnfollowResult } from '@oxy.so/core';
16
14
  import { useShallow } from 'zustand/react/shallow';
17
15
 
@@ -69,7 +67,6 @@ const FollowButtonInner = memo(function FollowButtonInner({
69
67
  showLoadingState = true,
70
68
  preventParentActions = true,
71
69
  }: SingleFollowButtonProps & { oxyServices: OxyServices }) {
72
- const { colors } = useTheme();
73
70
 
74
71
  const {
75
72
  isFollowing,
@@ -111,22 +108,16 @@ const FollowButtonInner = memo(function FollowButtonInner({
111
108
  const showSpinner = showLoadingState && isBusy;
112
109
 
113
110
  return (
114
- <Button
115
- variant={showFollowing ? 'secondary' : 'primary'}
111
+ <BloomFollowButton
112
+ following={showFollowing}
113
+ onFollowChange={() => { void handlePress(); }}
116
114
  size={size}
117
- onPress={() => { void handlePress(); }}
115
+ loading={showSpinner}
118
116
  disabled={disabled || isBusy}
119
117
  style={style}
120
118
  textStyle={textStyle}
121
- icon={showSpinner ? (
122
- <ActivityIndicator
123
- size="small"
124
- color={showFollowing ? colors.text : colors.primaryForeground}
125
- />
126
- ) : undefined}
127
- >
128
- {showSpinner ? undefined : (isKnown ? (isFollowing ? 'Following' : 'Follow') : undefined)}
129
- </Button>
119
+ label={isKnown || showSpinner ? 'Follow' : ''}
120
+ />
130
121
  );
131
122
  });
132
123
 
@@ -145,7 +136,6 @@ const FollowButtonMultiInner = memo(function FollowButtonMultiInner({
145
136
  showLoadingState = true,
146
137
  preventParentActions = true,
147
138
  }: MultiFollowButtonProps) {
148
- const { colors } = useTheme();
149
139
  const follow = useFollow(userIds);
150
140
  const followAllUsers = 'followAllUsers' in follow ? follow.followAllUsers : undefined;
151
141
  const unfollowAllUsers = 'unfollowAllUsers' in follow ? follow.unfollowAllUsers : undefined;
@@ -238,22 +228,17 @@ const FollowButtonMultiInner = memo(function FollowButtonMultiInner({
238
228
  const showSpinner = showLoadingState && isLoading;
239
229
 
240
230
  return (
241
- <Button
242
- variant={allFollowing ? 'secondary' : 'primary'}
231
+ <BloomFollowButton
232
+ following={allFollowing}
233
+ onFollowChange={() => { void handlePress(); }}
234
+ label={followAllLabel}
235
+ followingLabel={followedAllLabel}
243
236
  size={size}
244
- onPress={() => { void handlePress(); }}
237
+ loading={showSpinner}
245
238
  disabled={disabled || isLoading}
246
239
  style={style}
247
240
  textStyle={textStyle}
248
- icon={showSpinner ? (
249
- <ActivityIndicator
250
- size="small"
251
- color={allFollowing ? colors.text : colors.primaryForeground}
252
- />
253
- ) : undefined}
254
- >
255
- {showSpinner ? undefined : (allFollowing ? followedAllLabel : followAllLabel)}
256
- </Button>
241
+ />
257
242
  );
258
243
  });
259
244
 
@@ -35,8 +35,13 @@ import { memo, useCallback, useMemo } from 'react';
35
35
  import type { FollowApplicationMode, FollowStatus } from '@oxy.so/contracts';
36
36
  import type { StyleProp, ViewStyle } from 'react-native';
37
37
  import { View } from 'react-native';
38
+ import { FollowButton as BloomFollowButton } from '@oxy.so/bloom/media-header';
38
39
  import { Button } from '@oxy.so/bloom/button';
39
- import { RiArrowDownSLine as ChevronDown } from '@oxy.so/bloom/icons';
40
+ // Per glyph, never `@oxy.so/bloom/icons`. That barrel re-exports all 461 Remix
41
+ // glyphs and Metro does not tree-shake, so one import of it here re-ships every
42
+ // glyph — 313,123 B, measured — to every app in this package's graph, and no
43
+ // consumer can opt out of what a dependency asks for.
44
+ import { RiArrowDownSLine as ChevronDown } from '@oxy.so/bloom/icons/RiArrowDownSLine';
40
45
  import {
41
46
  DropdownMenu,
42
47
  DropdownMenuContent,
@@ -376,18 +381,15 @@ export const FollowTargetButton = memo(function FollowTargetButton({
376
381
  );
377
382
 
378
383
  const primary = (
379
- <Button
380
- variant={isFollowing ? 'secondary' : 'primary'}
384
+ <BloomFollowButton
385
+ following={isFollowing}
386
+ label={isFollowing ? text.idle : label}
387
+ followingLabel={label}
381
388
  size={size}
382
- // Unknown is not "not following": the button stays inert until the first
383
- // read settles rather than inviting a follow that may already exist.
384
389
  disabled={disabled || isUnknown}
385
- loading={isPending}
386
- onPress={() => void handlePrimary()}
387
- accessibilityLabel={label}
388
- >
389
- {label}
390
- </Button>
390
+ loading={isPending || isUnknown}
391
+ onFollowChange={() => void handlePrimary()}
392
+ />
391
393
  );
392
394
 
393
395
  if (!showOptions || menuItems.length === 0) {
@@ -406,7 +408,7 @@ export const FollowTargetButton = memo(function FollowTargetButton({
406
408
  */}
407
409
  <DropdownMenuTrigger asChild disabled={disabled || isUnknown}>
408
410
  <Button
409
- variant="secondary"
411
+ appearance="subtle" tone="support"
410
412
  size={size === 'large' ? 'large' : 'small'}
411
413
  icon={<ChevronDown width={16} />}
412
414
  disabled={disabled || isUnknown}
@@ -1,11 +1,6 @@
1
1
  import type React from 'react';
2
- import {
3
- StyleSheet,
4
- Text,
5
- View,
6
- type StyleProp,
7
- type ViewStyle,
8
- } from 'react-native';
2
+ import { StyleSheet, View, type StyleProp, type ViewStyle } from 'react-native';
3
+ import { Text } from '@oxy.so/bloom/typography';
9
4
  import { useTheme } from '@oxy.so/bloom/theme';
10
5
  import { useShallow } from 'zustand/react/shallow';
11
6
  import { useAuthStore } from '../stores/authStore';
@@ -429,7 +429,7 @@ export function OxyConsentScreen({
429
429
  <View style={styles.actions}>
430
430
  <Button
431
431
  testID="consent-allow"
432
- variant="primary"
432
+ appearance="solid" tone="accent"
433
433
  onPress={handleAllow}
434
434
  disabled={busy}
435
435
  loading={busy}
@@ -439,7 +439,7 @@ export function OxyConsentScreen({
439
439
  </Button>
440
440
  <Button
441
441
  testID="consent-deny"
442
- variant="ghost"
442
+ appearance="plain" tone="neutral"
443
443
  onPress={onDeny}
444
444
  disabled={busy}
445
445
  style={styles.actionButton}
@@ -65,7 +65,7 @@ export interface OxySignInButtonProps {
65
65
  */
66
66
  action?: OxySignInButtonAction;
67
67
 
68
- /** `medium` (36 tall, 300 wide) or `small` (32 × 250). @default 'medium' */
68
+ /** `md` (36 tall, 300 wide) or `sm` (32 × 250). @default 'md' */
69
69
  size?: SocialButtonSize;
70
70
 
71
71
  /** Fill the container's width instead of the fixed 300 / 250. */
@@ -177,7 +177,7 @@ export const OxySignInButton: React.FC<OxySignInButtonProps> = ({
177
177
  variant = 'default',
178
178
  appearance,
179
179
  action = 'signIn',
180
- size = 'medium',
180
+ size = 'md',
181
181
  fullWidth = false,
182
182
  iconOnly = false,
183
183
  onPress,
@@ -150,7 +150,7 @@ export const OxySignInRequestSurface: React.FC<OxySignInRequestSurfaceProps> = (
150
150
  return (
151
151
  <View style={styles.centeredBlock}>
152
152
  {onRetry ? (
153
- <Button variant="primary" onPress={onRetry} style={styles.primaryButton}>
153
+ <Button appearance="solid" tone="accent" onPress={onRetry} style={styles.primaryButton}>
154
154
  {t('common.actions.tryAgain')}
155
155
  </Button>
156
156
  ) : null}
@@ -1,13 +1,12 @@
1
1
  import type React from 'react';
2
- import { useCallback, useEffect, useMemo, useState } from 'react';
2
+ import { useCallback, useEffect, useMemo } from 'react';
3
3
  import {
4
- StyleSheet,
5
- Platform,
6
4
  type StyleProp,
7
5
  type ViewStyle,
8
6
  } from 'react-native';
9
- import { View, Pressable } from 'react-native-css/components';
10
- import MaterialCommunityIcons from '../icons/MaterialCommunityIcons';
7
+ import { View } from 'react-native-css/components';
8
+ import * as Icons from '@oxy.so/bloom/icons';
9
+ import { Button } from '@oxy.so/bloom/button';
11
10
  import { Avatar } from '@oxy.so/bloom/avatar';
12
11
  import * as Skeleton from '@oxy.so/bloom/skeleton';
13
12
  import { Text } from '@oxy.so/bloom/typography';
@@ -19,35 +18,6 @@ import { useI18n } from '../hooks/useI18n';
19
18
  import { registerAccountDialogConsumerHooks } from '../navigation/accountDialogManager';
20
19
  import type { AccountDialogMenuItem } from '../navigation/accountDialogManager';
21
20
 
22
- const isWeb = Platform.OS === 'web';
23
-
24
- /**
25
- * Web-only Bluesky-style hover animation timings, mirrored from
26
- * `social-app/src/view/shell/desktop/LeftNav.tsx`. The row background and the
27
- * name/handle/chevron opacity cross-fade quickly; the avatar shrink+slide is
28
- * slower and more deliberate. A short delay on the LEAVE transition keeps the
29
- * row from flickering when the pointer crosses a child boundary.
30
- */
31
- const BG_TRANSITION_MS = 150;
32
- const AVATAR_TRANSITION_MS = 250;
33
- const OPACITY_TRANSITION_MS = 150;
34
- const LEAVE_DELAY_MS = 50;
35
-
36
- /** Shrunk-avatar scale on hover, matching Bluesky's `scale: 2/3`. */
37
- const ACTIVE_AVATAR_SCALE = 2 / 3;
38
-
39
- /**
40
- * Reads the OS "reduce motion" preference on web. Guards `window`/`matchMedia`
41
- * so it is safe during SSR and on native (where it is never called). When
42
- * reduced motion is on, the avatar transform snaps instead of transitioning.
43
- */
44
- const prefersReducedMotion = (): boolean => {
45
- if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {
46
- return false;
47
- }
48
- return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
49
- };
50
-
51
21
  export interface ProfileButtonProps {
52
22
  /**
53
23
  * Expanded row (avatar + name + handle + chevron) when `true` (default), or a
@@ -82,26 +52,7 @@ export interface ProfileButtonProps {
82
52
  style?: StyleProp<ViewStyle>;
83
53
  }
84
54
 
85
- /**
86
- * Self-contained sidebar account trigger, modeled on Bluesky's ProfileCard and
87
- * the Oxy inbox's `MailboxDrawer` footer. Pressing it opens the unified
88
- * {@link OxyAccountDialogScreen} — the single account switcher + sign-in surface — via
89
- * `useOxy().openAccountDialog`.
90
- *
91
- * Three auth states from {@link useAuth}:
92
- * - **Undetermined** (`!isAuthResolved || isPrivateApiPending`): a neutral
93
- * avatar-sized skeleton circle, no press.
94
- * - **Signed in**: a pressable row — Bloom `Avatar` + display name + `@handle`
95
- * + a chevron. Press opens the dialog on its `accounts` view.
96
- * - **Signed out**: a "Sign in" row that calls `useAuth().signIn()` (which opens
97
- * the dialog on its `signin` view).
98
- *
99
- * Styling uses react-native `StyleSheet` + the Bloom theme (via `useTheme`) so
100
- * the layout renders identically in EVERY consumer — including apps that do not
101
- * use NativeWind (e.g. the accounts app). Only the web hover animation keeps
102
- * dynamic inline `style` (the CSS transition/transform values), which is what
103
- * the `react-native-web-style.d.ts` augmentation exists for.
104
- */
55
+ /** Account business binding over Bloom's shared Button and Avatar. */
105
56
  const ProfileButton: React.FC<ProfileButtonProps> = ({
106
57
  expanded = true,
107
58
  avatarSize,
@@ -123,11 +74,6 @@ const ProfileButton: React.FC<ProfileButtonProps> = ({
123
74
  const { colors } = useTheme();
124
75
  const { t, locale } = useI18n();
125
76
 
126
- // Web-only hover/focus tracking for the Bluesky-style reveal animation.
127
- // Native has no hover, so these stay false and the row renders statically.
128
- const [hovered, setHovered] = useState(false);
129
- const [focused, setFocused] = useState(false);
130
-
131
77
  const resolvedAvatarSize = avatarSize ?? (expanded ? 40 : 32);
132
78
 
133
79
  const openDialog = useCallback(() => {
@@ -165,248 +111,35 @@ const ProfileButton: React.FC<ProfileButtonProps> = ({
165
111
  );
166
112
  }
167
113
 
168
- // ── Signed out: "Sign in" row. ──────────────────────────────────────────
169
- if (!isAuthenticated || !user) {
170
- const signInLabel = t('common.actions.signIn') || 'Sign in';
171
- return (
172
- <Pressable
173
- className={className}
174
- style={[styles.row, expanded && styles.rowExpanded, style]}
175
- onPress={() => { void signIn(); }}
176
- accessibilityRole="button"
177
- accessibilityLabel={signInLabel}
178
- >
179
- <View
180
- style={[
181
- styles.avatarBadge,
182
- {
183
- width: resolvedAvatarSize,
184
- height: resolvedAvatarSize,
185
- backgroundColor: colors.backgroundSecondary,
186
- },
187
- ]}
188
- >
189
- <MaterialCommunityIcons
190
- name="login"
191
- size={Math.round(resolvedAvatarSize * 0.5)}
192
- color={colors.icon}
193
- />
194
- </View>
195
- {expanded ? (
196
- <Text
197
- style={[styles.signInLabel, { color: colors.text }]}
198
- numberOfLines={1}
199
- >
200
- {signInLabel}
201
- </Text>
202
- ) : null}
203
- </Pressable>
204
- );
205
- }
206
-
207
- // ── Signed in: avatar + identity + chevron. ─────────────────────────────
208
- const displayName =
209
- user?.name?.displayName ??
210
- getNormalizedUserHandle(user) ??
211
- getAccountDisplayName(null, locale);
212
- const handle = getAccountFallbackHandle(user);
213
- const handleLine = handle ? `@${handle}` : null;
214
-
215
- const avatarNode = (
216
- <Avatar
217
- source={avatarUrl}
218
- variant="thumb"
219
- name={displayName}
220
- size={resolvedAvatarSize}
221
- />
222
- );
223
-
224
- // `active` combines hover and keyboard focus — exactly like Bluesky's
225
- // `state.hovered || state.focused`. Only web ever sets these, so on native
226
- // the row renders statically.
227
- const active = hovered || focused;
228
- const accountLabel = t('accountSwitcher.switchWhileSignedInAs', { name: displayName });
229
-
230
- // Web-only pointer/focus handlers. RN-Web forwards `onHoverIn`/`onHoverOut`
231
- // to the underlying element; native Pressable ignores them harmlessly, but
232
- // we only attach them on web to keep the native path pristine.
233
- const webInteractionProps = isWeb
234
- ? {
235
- onHoverIn: () => setHovered(true),
236
- onHoverOut: () => setHovered(false),
237
- onFocus: () => setFocused(true),
238
- onBlur: () => setFocused(false),
239
- }
240
- : undefined;
241
-
242
- if (!expanded) {
243
- // Collapsed: avatar-only. On web, hovering just fades a subtle round
244
- // background behind the avatar — no shrink, no text.
245
- const collapsedBgStyle: ViewStyle | undefined = isWeb
246
- ? {
247
- backgroundColor: active ? colors.backgroundSecondary : 'transparent',
248
- transitionProperty: 'background-color',
249
- transitionDuration: `${BG_TRANSITION_MS}ms`,
250
- transitionDelay: active ? '0ms' : `${LEAVE_DELAY_MS}ms`,
251
- }
252
- : undefined;
253
- return (
254
- <View className={className} style={style}>
255
- <Pressable
256
- style={[styles.collapsedTrigger, collapsedBgStyle]}
257
- onPress={openDialog}
258
- accessibilityRole="button"
259
- accessibilityLabel={accountLabel}
260
- {...webInteractionProps}
261
- >
262
- {avatarNode}
263
- </Pressable>
264
- </View>
265
- );
266
- }
267
-
268
- // ── Expanded row animation ──────────────────────────────────────────────
269
- // On native everything is statically visible (no hover exists). On web we
270
- // reproduce Bluesky's reveal: the row fills with a subtle contrast bg, the
271
- // avatar shrinks + slides left, and the name/handle/actions fade in from
272
- // behind it. Keeping the identity hidden while inactive is what makes the
273
- // negative margin intentional instead of an overlap.
274
- const reducedMotion = isWeb && prefersReducedMotion();
275
-
276
- // Slide the shrunk avatar left so its visual left edge stays put as it
277
- // contracts. The avatar loses `size * (1 - scale)` of width; half of that
278
- // (the left half, since scale is centered) is the offset, plus the row's
279
- // left padding (8px) so it hugs the row edge like Bluesky's.
280
- const activeAvatarTranslateX =
281
- -(resolvedAvatarSize * (1 - ACTIVE_AVATAR_SCALE)) / 2 - 8;
282
-
283
- const rowStyle: StyleProp<ViewStyle> = isWeb
284
- ? {
285
- backgroundColor: active ? colors.backgroundSecondary : 'transparent',
286
- transitionProperty: 'background-color',
287
- transitionDuration: `${BG_TRANSITION_MS}ms`,
288
- transitionDelay: active ? '0ms' : `${LEAVE_DELAY_MS}ms`,
289
- }
290
- : undefined;
291
-
292
- const avatarWrapperStyle: ViewStyle | undefined = isWeb
293
- ? {
294
- zIndex: 10,
295
- ...(reducedMotion
296
- ? {}
297
- : {
298
- transitionProperty: 'transform',
299
- transitionDuration: `${AVATAR_TRANSITION_MS}ms`,
300
- transitionDelay: active ? '0ms' : `${LEAVE_DELAY_MS}ms`,
301
- }),
302
- transform: active
303
- ? [{ scale: ACTIVE_AVATAR_SCALE }, { translateX: activeAvatarTranslateX }]
304
- : [{ scale: 1 }, { translateX: 0 }],
305
- }
306
- : undefined;
307
-
308
- const identityStyle: ViewStyle | undefined = isWeb
309
- ? {
310
- marginLeft: -resolvedAvatarSize / 2,
311
- opacity: active ? 1 : 0,
312
- transitionProperty: 'opacity',
313
- transitionDuration: `${OPACITY_TRANSITION_MS}ms`,
314
- transitionDelay: active ? '0ms' : `${LEAVE_DELAY_MS}ms`,
315
- }
316
- : undefined;
317
-
318
- const actionStyle: ViewStyle | undefined = isWeb
319
- ? {
320
- opacity: active ? 1 : 0,
321
- transitionProperty: 'opacity',
322
- transitionDuration: `${OPACITY_TRANSITION_MS}ms`,
323
- transitionDelay: active ? '0ms' : `${LEAVE_DELAY_MS}ms`,
324
- }
325
- : undefined;
114
+ const signedIn = isAuthenticated && Boolean(user);
115
+ const displayName = signedIn
116
+ ? user?.name?.displayName ?? getNormalizedUserHandle(user) ?? getAccountDisplayName(null, locale)
117
+ : t('common.actions.signIn') || 'Sign in';
118
+ const handle = signedIn ? getAccountFallbackHandle(user) : undefined;
119
+ const label = signedIn ? t('accountSwitcher.switchWhileSignedInAs', { name: displayName }) : displayName;
326
120
 
327
121
  return (
328
- <View className={className} style={[styles.fullWidth, style]}>
329
- <Pressable
330
- style={[styles.row, styles.rowExpanded, rowStyle]}
331
- onPress={openDialog}
332
- accessibilityRole="button"
333
- accessibilityLabel={accountLabel}
334
- {...webInteractionProps}
335
- >
336
- <View style={avatarWrapperStyle}>{avatarNode}</View>
337
- <View style={[styles.identity, identityStyle]}>
338
- <Text
339
- style={[styles.displayName, { color: colors.text }]}
340
- numberOfLines={1}
341
- >
342
- {displayName}
343
- </Text>
344
- {handleLine ? (
345
- <Text
346
- style={[styles.handle, { color: colors.textSecondary }]}
347
- numberOfLines={1}
348
- >
349
- {handleLine}
350
- </Text>
351
- ) : null}
352
- </View>
353
- <View style={actionStyle}>
354
- <MaterialCommunityIcons
355
- name="dots-horizontal"
356
- size={18}
357
- color={colors.textSecondary}
358
- />
122
+ <Button
123
+ appearance="plain" tone="neutral"
124
+ className={className}
125
+ accessibilityLabel={label}
126
+ onPress={signedIn ? openDialog : () => { void signIn(); }}
127
+ style={[{ height: resolvedAvatarSize + 16, borderRadius: 9999, paddingLeft: 8, paddingRight: 8, ...(expanded ? { width: '100%' } : { width: resolvedAvatarSize + 16 }) }, style]}
128
+ trailing={
129
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12, ...(expanded ? { flex: 1 } : {}) }}>
130
+ {signedIn ? <Avatar source={avatarUrl} variant="thumb" name={displayName} size={resolvedAvatarSize} />
131
+ : <Icons.RiLoginBoxLine width={resolvedAvatarSize / 2} height={resolvedAvatarSize / 2} color={colors.icon} />}
132
+ {expanded ? <>
133
+ <View style={{ flex: 1, minWidth: 0 }}>
134
+ <Text variant="body-semibold" numberOfLines={1}>{displayName}</Text>
135
+ {handle ? <Text variant="caption-1-regular" numberOfLines={1} style={{ color: colors.textSecondary }}>@{handle}</Text> : null}
136
+ </View>
137
+ {signedIn ? <Icons.RiMoreLine width={18} height={18} color={colors.textSecondary} /> : null}
138
+ </> : null}
359
139
  </View>
360
- </Pressable>
361
- </View>
140
+ }
141
+ />
362
142
  );
363
143
  };
364
144
 
365
- const styles = StyleSheet.create({
366
- fullWidth: {
367
- width: '100%',
368
- },
369
- // Shared trigger row (`flex-row items-center gap-3 rounded-full px-2 py-2`).
370
- row: {
371
- flexDirection: 'row',
372
- alignItems: 'center',
373
- gap: 12,
374
- borderRadius: 9999,
375
- paddingHorizontal: 8,
376
- paddingVertical: 8,
377
- },
378
- // `w-full` on the expanded row + its signed-out variant.
379
- rowExpanded: {
380
- width: '100%',
381
- },
382
- // Signed-out login badge (`items-center justify-center rounded-full`).
383
- avatarBadge: {
384
- alignItems: 'center',
385
- justifyContent: 'center',
386
- borderRadius: 9999,
387
- },
388
- // Signed-out label (`flex-1 font-semibold`).
389
- signInLabel: {
390
- flex: 1,
391
- fontWeight: '600',
392
- },
393
- // Collapsed avatar-only trigger (`rounded-full`).
394
- collapsedTrigger: {
395
- borderRadius: 9999,
396
- },
397
- // Identity block (`min-w-0 flex-1`).
398
- identity: {
399
- flex: 1,
400
- minWidth: 0,
401
- },
402
- // Display name (`font-bold`).
403
- displayName: {
404
- fontWeight: '700',
405
- },
406
- // Handle line (`text-xs`).
407
- handle: {
408
- fontSize: 12,
409
- },
410
- });
411
-
412
145
  export default ProfileButton;
@@ -37,7 +37,6 @@ export interface ProfileSummaryCardProps {
37
37
  }
38
38
 
39
39
  const cardStyle: ViewStyle = {
40
- borderRadius: 20,
41
40
  marginBottom: 16,
42
41
  };
43
42
 
@@ -76,7 +75,7 @@ const ProfileSummaryCard: React.FC<ProfileSummaryCardProps> = ({
76
75
  );
77
76
 
78
77
  return (
79
- <Card variant="filled" style={cardStyle}>
78
+ <Card appearance="subtle" radius="radius-20" style={cardStyle}>
80
79
  <View className="items-center px-space-20 py-space-24">
81
80
  {avatarNode}
82
81
  <H4 className="text-text" numberOfLines={1}>
@@ -1,8 +1,5 @@
1
1
  import type React from 'react';
2
- import { ActivityIndicator, StyleSheet } from 'react-native';
3
- import { useTheme } from '@oxy.so/bloom/theme';
4
- import { PressableScale } from '@oxy.so/bloom/pressable-scale';
5
- import { Text } from '@oxy.so/bloom/typography';
2
+ import { Button } from '@oxy.so/bloom/button';
6
3
 
7
4
  export interface SurfaceHeaderActionProps {
8
5
  /** Button label (e.g. a translated "Save"). */
@@ -13,48 +10,9 @@ export interface SurfaceHeaderActionProps {
13
10
  disabled?: boolean;
14
11
  }
15
12
 
16
- /**
17
- * A filled pill action for a surface's nav-header right slot — the canonical
18
- * "Save" affordance. Pass a memoized instance to `useSurfaceHeader({ right })`
19
- * so the header does not thrash between renders.
20
- */
21
- export const SurfaceHeaderAction: React.FC<SurfaceHeaderActionProps> = ({
22
- label,
23
- onPress,
24
- loading,
25
- disabled,
26
- }) => {
27
- const { colors } = useTheme();
28
- const isDisabled = disabled || loading;
29
- return (
30
- <PressableScale
31
- onPress={onPress}
32
- disabled={isDisabled}
33
- accessibilityRole="button"
34
- accessibilityLabel={label}
35
- style={[styles.button, { backgroundColor: colors.primary, opacity: isDisabled ? 0.5 : 1 }]}
36
- >
37
- {loading ? (
38
- <ActivityIndicator size="small" color={colors.primaryForeground} />
39
- ) : (
40
- <Text style={[styles.label, { color: colors.primaryForeground }]}>{label}</Text>
41
- )}
42
- </PressableScale>
43
- );
44
- };
45
-
46
- const styles = StyleSheet.create({
47
- button: {
48
- height: 36,
49
- minWidth: 64,
50
- paddingHorizontal: 14,
51
- borderRadius: 18,
52
- alignItems: 'center',
53
- justifyContent: 'center',
54
- },
55
- label: {
56
- fontSize: 14,
57
- fontWeight: '600',
58
- letterSpacing: -0.2,
59
- },
60
- });
13
+ /** Header actions share Bloom's sizing, surface, disabled and loading behavior. */
14
+ export const SurfaceHeaderAction: React.FC<SurfaceHeaderActionProps> = ({ label, onPress, loading, disabled }) => (
15
+ <Button size="medium" onPress={onPress} loading={loading} disabled={disabled}>
16
+ {label}
17
+ </Button>
18
+ );
@@ -1,5 +1,6 @@
1
1
  import React, { Suspense, useCallback, useEffect, useMemo, useState, type ErrorInfo } from 'react';
2
- import { ActivityIndicator, StyleSheet, Text, View, useWindowDimensions } from 'react-native';
2
+ import { ActivityIndicator, StyleSheet, View, useWindowDimensions } from 'react-native';
3
+ import { Text } from '@oxy.so/bloom/typography';
3
4
  import { useStore } from 'zustand';
4
5
  import { useTheme } from '@oxy.so/bloom/theme';
5
6
  import {
@@ -362,7 +362,7 @@ const AccountsMenuView: React.FC<AccountsMenuViewProps> = ({
362
362
  variant, `small` the compact height; it hugs its label instead of
363
363
  spanning the surface. */}
364
364
  <Button
365
- variant="secondary"
365
+ appearance="subtle" tone="neutral"
366
366
  size="small"
367
367
  onPress={handlers.onManage}
368
368
  accessibilityLabel={manageLabel}