@b3dotfun/sdk 0.0.65-test.5 → 0.0.65-test.6

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 (69) hide show
  1. package/dist/cjs/anyspend/react/components/AnySpend.js +1 -1
  2. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +2 -1
  3. package/dist/cjs/anyspend/react/components/common/FiatPaymentMethod.js +2 -2
  4. package/dist/cjs/anyspend/react/components/common/OrderDetails.js +1 -1
  5. package/dist/cjs/anyspend/react/components/common/OrderHistory.js +1 -1
  6. package/dist/cjs/anyspend/react/components/common/OrderHistoryItem.js +1 -1
  7. package/dist/cjs/anyspend/react/components/common/PanelOnramp.js +4 -2
  8. package/dist/cjs/anyspend/react/components/common/RecipientSelection.js +1 -1
  9. package/dist/cjs/anyspend/react/hooks/useConnectedWalletDisplay.js +2 -1
  10. package/dist/cjs/global-account/react/components/AccountAssets/AccountAssets.js +9 -9
  11. package/dist/cjs/global-account/react/components/AvatarEditor/AvatarEditor.js +3 -3
  12. package/dist/cjs/global-account/react/components/B3DynamicModal.js +2 -1
  13. package/dist/cjs/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.js +1 -1
  14. package/dist/cjs/global-account/react/components/LinkAccount/LinkAccount.js +30 -9
  15. package/dist/cjs/global-account/react/components/ManageAccount/Header.js +1 -1
  16. package/dist/cjs/global-account/react/components/ManageAccount/SettingsContent.js +5 -1
  17. package/dist/cjs/global-account/react/components/SignInWithB3/SignIn.js +1 -1
  18. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -1
  19. package/dist/cjs/global-account/react/components/ui/Tabs.js +1 -1
  20. package/dist/cjs/global-account/react/components/ui/dialog.js +1 -1
  21. package/dist/cjs/global-account/react/utils/profileDisplay.d.ts +1 -0
  22. package/dist/cjs/global-account/react/utils/profileDisplay.js +1 -1
  23. package/dist/esm/anyspend/react/components/AnySpend.js +1 -1
  24. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +3 -2
  25. package/dist/esm/anyspend/react/components/common/FiatPaymentMethod.js +2 -2
  26. package/dist/esm/anyspend/react/components/common/OrderDetails.js +1 -1
  27. package/dist/esm/anyspend/react/components/common/OrderHistory.js +1 -1
  28. package/dist/esm/anyspend/react/components/common/OrderHistoryItem.js +1 -1
  29. package/dist/esm/anyspend/react/components/common/PanelOnramp.js +4 -2
  30. package/dist/esm/anyspend/react/components/common/RecipientSelection.js +1 -1
  31. package/dist/esm/anyspend/react/hooks/useConnectedWalletDisplay.js +2 -1
  32. package/dist/esm/global-account/react/components/AccountAssets/AccountAssets.js +9 -9
  33. package/dist/esm/global-account/react/components/AvatarEditor/AvatarEditor.js +3 -3
  34. package/dist/esm/global-account/react/components/B3DynamicModal.js +2 -1
  35. package/dist/esm/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.js +1 -1
  36. package/dist/esm/global-account/react/components/LinkAccount/LinkAccount.js +31 -10
  37. package/dist/esm/global-account/react/components/ManageAccount/Header.js +1 -1
  38. package/dist/esm/global-account/react/components/ManageAccount/SettingsContent.js +5 -1
  39. package/dist/esm/global-account/react/components/SignInWithB3/SignIn.js +1 -1
  40. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -1
  41. package/dist/esm/global-account/react/components/ui/Tabs.js +1 -1
  42. package/dist/esm/global-account/react/components/ui/dialog.js +1 -1
  43. package/dist/esm/global-account/react/utils/profileDisplay.d.ts +1 -0
  44. package/dist/esm/global-account/react/utils/profileDisplay.js +1 -1
  45. package/dist/styles/index.css +1 -1
  46. package/dist/types/global-account/react/utils/profileDisplay.d.ts +1 -0
  47. package/package.json +1 -1
  48. package/src/anyspend/react/components/AnySpend.tsx +1 -1
  49. package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +7 -2
  50. package/src/anyspend/react/components/common/FiatPaymentMethod.tsx +2 -2
  51. package/src/anyspend/react/components/common/OrderDetails.tsx +4 -1
  52. package/src/anyspend/react/components/common/OrderHistory.tsx +1 -1
  53. package/src/anyspend/react/components/common/OrderHistoryItem.tsx +4 -4
  54. package/src/anyspend/react/components/common/PanelOnramp.tsx +5 -2
  55. package/src/anyspend/react/components/common/RecipientSelection.tsx +1 -1
  56. package/src/anyspend/react/hooks/useConnectedWalletDisplay.ts +2 -1
  57. package/src/global-account/react/components/AccountAssets/AccountAssets.tsx +20 -20
  58. package/src/global-account/react/components/AvatarEditor/AvatarEditor.tsx +4 -4
  59. package/src/global-account/react/components/B3DynamicModal.tsx +5 -1
  60. package/src/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.tsx +1 -1
  61. package/src/global-account/react/components/LinkAccount/LinkAccount.tsx +42 -14
  62. package/src/global-account/react/components/ManageAccount/Header.tsx +1 -1
  63. package/src/global-account/react/components/ManageAccount/SettingsContent.tsx +7 -1
  64. package/src/global-account/react/components/SignInWithB3/SignIn.tsx +1 -1
  65. package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +1 -1
  66. package/src/global-account/react/components/ui/Tabs.tsx +1 -1
  67. package/src/global-account/react/components/ui/dialog.tsx +1 -10
  68. package/src/global-account/react/utils/profileDisplay.ts +2 -1
  69. package/src/styles/index.css +6 -0
@@ -88,7 +88,7 @@ export function RecipientSelection({
88
88
  const canConfirm = recipientAddress && isAddressValid;
89
89
 
90
90
  return (
91
- <div className="recipient-selection mx-auto w-[460px] max-w-full px-5">
91
+ <div className="recipient-selection mx-auto w-[460px] max-w-full p-5">
92
92
  <div className="flex flex-col gap-6">
93
93
  {/* Header */}
94
94
  <div className="flex justify-around">
@@ -32,7 +32,8 @@ export function useConnectedWalletDisplay(
32
32
 
33
33
  // Determine which wallet to show (prefer connectedEOAWallet if both exist and are the same)
34
34
  const shouldShowConnectedEOA = !!connectedEOAWallet;
35
- const shouldShowWagmiWallet = wagmiWalletIsConnected && (!isWalletDuplicated || !connectedEOAWallet);
35
+ // this is disabled because we don't want to display In-App Wallet as a payment method
36
+ const shouldShowWagmiWallet = false; // wagmiWalletIsConnected && (!isWalletDuplicated || !connectedEOAWallet);
36
37
 
37
38
  // Determine which address to use based on payment method
38
39
  let walletAddress: string | undefined;
@@ -15,6 +15,26 @@ interface GroupedNFTs {
15
15
 
16
16
  export function AccountAssets({ nfts, isLoading }: AccountAssetsProps) {
17
17
  // Initialize with all collections expanded
18
+ // Group NFTs by collection
19
+ const groupedNFTs = nfts?.nfts?.reduce(
20
+ (acc, nft) => {
21
+ const collectionId = nft.collection?.collection_id || "unknown";
22
+ if (!acc[collectionId]) {
23
+ acc[collectionId] = {
24
+ collection_id: collectionId,
25
+ collection_name: nft.collection?.name || "Unknown Collection",
26
+ collection_image: nft.collection?.image_url || nft.previews?.image_small_url || "",
27
+ nfts: [],
28
+ };
29
+ }
30
+ acc[collectionId].nfts.push(nft);
31
+ return acc;
32
+ },
33
+ {} as Record<string, GroupedNFTs>,
34
+ );
35
+
36
+ const collections = Object.values(groupedNFTs || {});
37
+
18
38
  const [expandedCollections, setExpandedCollections] = useState<Set<string>>(
19
39
  () => new Set(collections.map(c => c.collection_id)),
20
40
  );
@@ -39,26 +59,6 @@ export function AccountAssets({ nfts, isLoading }: AccountAssetsProps) {
39
59
  return <div className="text-b3-react-muted-foreground py-8 text-center">No NFTs found</div>;
40
60
  }
41
61
 
42
- // Group NFTs by collection
43
- const groupedNFTs = nfts.nfts.reduce(
44
- (acc, nft) => {
45
- const collectionId = nft.collection?.collection_id || "unknown";
46
- if (!acc[collectionId]) {
47
- acc[collectionId] = {
48
- collection_id: collectionId,
49
- collection_name: nft.collection?.name || "Unknown Collection",
50
- collection_image: nft.collection?.image_url || nft.previews?.image_small_url || "",
51
- nfts: [],
52
- };
53
- }
54
- acc[collectionId].nfts.push(nft);
55
- return acc;
56
- },
57
- {} as Record<string, GroupedNFTs>,
58
- );
59
-
60
- const collections = Object.values(groupedNFTs);
61
-
62
62
  const toggleCollection = (collectionId: string) => {
63
63
  setExpandedCollections(prev => {
64
64
  const next = new Set(prev);
@@ -359,7 +359,7 @@ export function AvatarEditor({ onSetAvatar, className }: AvatarEditorProps) {
359
359
  .filter(p => p.avatar !== null) || []; // Filter out profiles with invalid avatars
360
360
 
361
361
  return (
362
- <div className={cn("flex w-full max-w-md flex-col bg-white", className)}>
362
+ <div className={cn("b3-modal-avatar-editor flex w-full max-w-md flex-col bg-white", className)}>
363
363
  {/* Header */}
364
364
  {viewStep === "upload" && <ModalHeader title="Upload Image" />}
365
365
 
@@ -449,7 +449,7 @@ export function AvatarEditor({ onSetAvatar, className }: AvatarEditorProps) {
449
449
  {/* Link More Account */}
450
450
  <button
451
451
  onClick={handleLinkMoreAccount}
452
- className="font-inter flex items-center gap-2 text-sm font-semibold text-[#3368ef] hover:underline"
452
+ className="b3-modal-link-more-account font-inter flex items-center gap-2 text-sm font-semibold text-[#3368ef] hover:underline"
453
453
  >
454
454
  <svg
455
455
  width="16"
@@ -479,7 +479,7 @@ export function AvatarEditor({ onSetAvatar, className }: AvatarEditorProps) {
479
479
  onDragOver={handleDragOver}
480
480
  onDrop={handleDrop}
481
481
  className={cn(
482
- "mb-6 flex w-full cursor-pointer flex-col items-center justify-center rounded-xl border-2 border-dashed p-16 transition-colors",
482
+ "b3-modal-upload-view mb-6 flex w-full cursor-pointer flex-col items-center justify-center rounded-xl border-2 border-dashed p-16 transition-colors",
483
483
  isDragging
484
484
  ? "border-[#3368ef] bg-[#f0f5ff]"
485
485
  : "border-[#e4e4e7] hover:border-[#3368ef] hover:bg-[#f0f5ff]",
@@ -565,7 +565,7 @@ export function AvatarEditor({ onSetAvatar, className }: AvatarEditorProps) {
565
565
  <Button
566
566
  onClick={handleSaveChanges}
567
567
  disabled={isLoading || (!selectedFile && !selectedProfileType)}
568
- className="flex-1 rounded-xl bg-[#3368ef] text-white hover:bg-[#2952cc]"
568
+ className="b3-modal-save-button flex-1 rounded-xl bg-[#3368ef] text-white hover:bg-[#2952cc]"
569
569
  >
570
570
  {isLoading ? (
571
571
  <>
@@ -90,6 +90,7 @@ export function B3DynamicModal() {
90
90
 
91
91
  // Check if current content type is in freestyle types
92
92
  const isFreestyleType = freestyleTypes.includes(contentType?.type as string);
93
+ console.log("contentType :", contentType);
93
94
  const hideCloseButton = true;
94
95
 
95
96
  // Build content class using cn utility
@@ -100,7 +101,10 @@ export function B3DynamicModal() {
100
101
  fullWidthTypes.includes(contentType?.type as string) && "w-full",
101
102
  isFreestyleType && "b3-modal-freestyle",
102
103
  contentType?.type === "signInWithB3" && "p-0",
103
- contentType?.type === "anySpend" && "md:px-6",
104
+ contentType?.type === "anySpend" && "md:p-0",
105
+ contentType?.type === "send" && "p-0",
106
+ contentType?.type === "manageAccount" && " md:p-0 md:pt-2",
107
+ contentType?.type === "linkAccount" && "md:p-0",
104
108
  // Add specific styles for avatar editor
105
109
  // contentType?.type === "avatarEditor_disabled" &&
106
110
  // "h-[90dvh] w-[90vw] bg-black p-0 overflow-y-auto overflow-x-hidden max-md:-mt-8 max-md:rounded-t-xl",
@@ -59,7 +59,7 @@ export function IPFSMediaRenderer({
59
59
  if (!src) {
60
60
  return (
61
61
  <div className={className} style={style} aria-label={alt}>
62
- <div className="bg-b3-primary-wash flex h-full w-full items-center justify-center">
62
+ <div className="bg-b3-primary-wash flex h-full w-full items-center justify-center rounded-full">
63
63
  <span className="text-b3-grey font-neue-montreal-semibold text-xs">{alt.charAt(0).toUpperCase()}</span>
64
64
  </div>
65
65
  </div>
@@ -3,7 +3,7 @@ import { Button, ManageAccountModalProps, useB3, useModalStore, useQueryB3 } fro
3
3
  import { client } from "@b3dotfun/sdk/shared/utils/thirdweb";
4
4
  import { truncateAddress } from "@b3dotfun/sdk/shared/utils/truncateAddress";
5
5
  import { Copy, Loader2, Pencil, UnlinkIcon } from "lucide-react";
6
- import { useRef, useState } from "react";
6
+ import { useEffect, useRef, useState } from "react";
7
7
  import { toast } from "sonner";
8
8
  import { useProfiles, useUnlinkProfile } from "thirdweb/react";
9
9
 
@@ -41,6 +41,7 @@ export const LinkAccount = ({
41
41
  chain: Chain;
42
42
  }) => {
43
43
  const [unlinkingAccountId, setUnlinkingAccountId] = useState<string | null>(null);
44
+ const [profileToUnlink, setProfileToUnlink] = useState<any>(null);
44
45
  const { data: profilesRaw = [], isLoading: isLoadingProfiles } = useProfiles({ client });
45
46
  const { mutate: unlinkProfile, isPending: isUnlinking } = useUnlinkProfile();
46
47
  const setB3ModalContentType = useModalStore(state => state.setB3ModalContentType);
@@ -115,15 +116,33 @@ export const LinkAccount = ({
115
116
  ...getProfileDisplayInfo(profile),
116
117
  originalProfile: profile,
117
118
  }));
119
+ console.log("profiles :", profiles);
118
120
 
119
- const handleUnlink = async (profile: any) => {
120
- setUnlinkingAccountId(profile.title);
121
- try {
122
- unlinkProfile({ client, profileToUnlink: profile.originalProfile }, mutationOptions);
123
- } catch (error) {
124
- console.error("Error unlinking account:", error);
125
- } finally {
126
- setUnlinkingAccountId(null);
121
+ // Reset confirmation state after 3 seconds
122
+ useEffect(() => {
123
+ if (profileToUnlink) {
124
+ const timer = setTimeout(() => {
125
+ setProfileToUnlink(null);
126
+ }, 5000);
127
+ return () => clearTimeout(timer);
128
+ }
129
+ }, [profileToUnlink]);
130
+
131
+ const handleUnlinkClick = (profile: any) => {
132
+ // If this profile is already pending confirmation, perform the unlink
133
+ if (profileToUnlink?.title === profile.title) {
134
+ setUnlinkingAccountId(profile.title);
135
+ try {
136
+ unlinkProfile({ client, profileToUnlink: profile.originalProfile }, mutationOptions);
137
+ } catch (error) {
138
+ console.error("Error unlinking account:", error);
139
+ } finally {
140
+ setUnlinkingAccountId(null);
141
+ setProfileToUnlink(null);
142
+ }
143
+ } else {
144
+ // First click - set pending confirmation
145
+ setProfileToUnlink(profile);
127
146
  }
128
147
  };
129
148
 
@@ -225,13 +244,22 @@ export const LinkAccount = ({
225
244
  </div>
226
245
  <Button
227
246
  variant="ghost"
228
- size="icon"
229
- className="linked-account-unlink-button text-b3-grey hover:text-b3-negative"
230
- onClick={() => handleUnlink(profile)}
247
+ size={profileToUnlink?.title === profile.title ? "sm" : "icon"}
248
+ className={`linked-account-unlink-button transition-all ${
249
+ profileToUnlink?.title === profile.title
250
+ ? "bg-b3-negative hover:bg-b3-negative/90 text-white"
251
+ : "text-b3-grey hover:text-b3-negative"
252
+ }`}
253
+ onClick={() => handleUnlinkClick(profile)}
231
254
  disabled={unlinkingAccountId === profile.title || isUnlinking}
232
255
  >
233
256
  {unlinkingAccountId === profile.title || isUnlinking ? (
234
- <Loader2 className="linked-account-unlink-loading animate-spin" />
257
+ <Loader2 className="linked-account-unlink-loading h-4 w-4 animate-spin" />
258
+ ) : profileToUnlink?.title === profile.title ? (
259
+ <div className="flex items-center gap-1.5">
260
+ <UnlinkIcon size={14} className="linked-account-unlink-icon" />
261
+ <span className="text-xs font-semibold">Unlink</span>
262
+ </div>
235
263
  ) : (
236
264
  <UnlinkIcon size={16} className="linked-account-unlink-icon" />
237
265
  )}
@@ -240,7 +268,7 @@ export const LinkAccount = ({
240
268
  ))}
241
269
  </div>
242
270
  ) : (
243
- <div className="linked-accounts-empty text-b3-foreground-muted py-8 text-center">
271
+ <div className="linked-accounts-empty font-neue-montreal-medium text-b3-foreground-muted py-8 text-center">
244
272
  No linked accounts found
245
273
  </div>
246
274
  )}
@@ -157,7 +157,7 @@ export function Header({ onLogout }: { onLogout?: () => void }) {
157
157
  )}
158
158
  </div>
159
159
  <div className="flex flex-col gap-0.5">
160
- <p className="text-b3-grey font-neue-montreal-semibold text-sm">Active Wallet</p>
160
+ <p className="text-b3-grey font-neue-montreal-semibold text-left text-sm">Active Wallet</p>
161
161
  <div className="flex items-center gap-1">
162
162
  <p className="text-b3-foreground-muted font-neue-montreal-medium text-sm">
163
163
  {centerTruncate(address, 4)}
@@ -1,5 +1,7 @@
1
1
  import { useModalStore } from "@b3dotfun/sdk/global-account/react";
2
+ import { client } from "@b3dotfun/sdk/shared/utils/thirdweb";
2
3
  import { Chain } from "thirdweb";
4
+ import { useProfiles } from "thirdweb/react";
3
5
  import LinkIcon from "../icons/LinkIcon";
4
6
  import ModalHeader from "../ModalHeader/ModalHeader";
5
7
  import SettingsMenuItem from "./SettingsMenuItem";
@@ -17,6 +19,10 @@ const SettingsContent = ({
17
19
  const setB3ModalContentType = useModalStore(state => state.setB3ModalContentType);
18
20
  const setB3ModalOpen = useModalStore(state => state.setB3ModalOpen);
19
21
 
22
+ const { data: profilesRaw = [] } = useProfiles({ client });
23
+
24
+ const profiles = profilesRaw.filter((profile: any) => !["custom_auth_endpoint"].includes(profile.type));
25
+
20
26
  const handleNavigate = (type: "home" | "swap" | "linkAccount" | "avatarEditor") => {
21
27
  if (type === "home") {
22
28
  setB3ModalContentType({
@@ -64,7 +70,7 @@ const SettingsContent = ({
64
70
  <SettingsMenuItem
65
71
  icon={<LinkIcon className="text-b3-grey-500" />}
66
72
  title="Linked Accounts"
67
- subtitle="3 connected accounts"
73
+ subtitle={`${profiles.length} connected account${profiles.length > 1 ? "s" : ""}`}
68
74
  onClick={() => handleNavigate("linkAccount")}
69
75
  />
70
76
  {/* <SettingsMenuItem
@@ -124,7 +124,7 @@ export function SignIn(props: SignInWithB3Props) {
124
124
  <div className="ml-4 grow">
125
125
  {ensName && <div>{ensName}</div>}
126
126
  <div>{truncateAddress(globalAddress)}</div>
127
- <div>{walletInfo?.name}</div>
127
+ {/* <div>{walletInfo?.name}</div> */}
128
128
  </div>
129
129
  </div>
130
130
  {isActiveEOAWallet && <Icon className="fill-b3-react-primary" name="check" />}
@@ -217,7 +217,7 @@ export function SignInWithB3Flow({
217
217
  if (isAuthenticating || (isFetchingSigners && step === "login") || source === "requestPermissions") {
218
218
  return (
219
219
  <LoginStepContainer partnerId={partnerId}>
220
- <div className="mt-8 flex items-center justify-center">
220
+ <div className="my-8 flex min-h-[350px] items-center justify-center">
221
221
  <Loading variant="white" size="lg" />
222
222
  </div>
223
223
  </LoginStepContainer>
@@ -25,7 +25,7 @@ export function TabTrigger({ className, ...props }: React.ComponentProps<typeof
25
25
  className={cn(
26
26
  "text-md inline-flex h-full items-center justify-center whitespace-nowrap px-3 font-semibold transition-all",
27
27
  "focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50",
28
- "data-[state=active]:text-b3-react-primary data-[state=active]:font-bold",
28
+ "data-[state=active]:font-bold data-[state=active]:text-[#0B57C2]",
29
29
  "hover:text-b3-react-foreground data-[state=inactive]:text-b3-react-muted-foreground",
30
30
  "flex-1",
31
31
  className,
@@ -76,16 +76,7 @@ const DialogContent: React.ForwardRefExoticComponent<DialogContentProps & React.
76
76
  </div>
77
77
  {/* Global Account Footer */}
78
78
  <div className="b3-modal-ga-branding flex items-center justify-center gap-1.5 pt-[10px]">
79
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
80
- <path
81
- d="M2 4.66667C2 3.19391 3.19391 2 4.66667 2H11.3333C12.8061 2 14 3.19391 14 4.66667V11.3333C14 12.8061 12.8061 14 11.3333 14H4.66667C3.19391 14 2 12.8061 2 11.3333V4.66667Z"
82
- fill="#0B57C2"
83
- />
84
- <path
85
- d="M5.33333 6C5.33333 5.63181 5.63181 5.33333 6 5.33333H10C10.3682 5.33333 10.6667 5.63181 10.6667 6V10C10.6667 10.3682 10.3682 10.6667 10 10.6667H6C5.63181 10.6667 5.33333 10.3682 5.33333 10V6Z"
86
- fill="white"
87
- />
88
- </svg>
79
+ <img src="https://cdn.b3.fun/b3_logo.svg" alt="B3" className="h-4 w-4" />
89
80
  <span className="font-neue-montreal-semibold text-xs uppercase leading-none tracking-[0.72px] text-[#0B57C2]">
90
81
  Global Account
91
82
  </span>
@@ -64,6 +64,7 @@ export function validateImageUrl(url: string | null | undefined): string | null
64
64
  }
65
65
 
66
66
  export interface ExtendedProfileDetails {
67
+ fid?: string;
67
68
  id?: string;
68
69
  email?: string;
69
70
  phone?: string;
@@ -112,7 +113,7 @@ export function getProfileDisplayInfo(profile: ExtendedProfile): ProfileDisplayI
112
113
  break;
113
114
  case "farcaster":
114
115
  displayInfo = {
115
- title: details.name || details.username || "Unknown",
116
+ title: details.name || details.username || "FID:" + details?.fid || "Unknown",
116
117
  subtitle: details.username ? `@${details.username}` : "Farcaster Account",
117
118
  imageUrl: validateImageUrl(details.pfpUrl || details.profileImageUrl),
118
119
  initial: "F",
@@ -390,6 +390,8 @@ Dark version
390
390
  }
391
391
 
392
392
  .b3-login-step {
393
+ padding-bottom: 10px;
394
+
393
395
  & > div > div > div > div > div > div > div > img {
394
396
  display: none;
395
397
  }
@@ -662,3 +664,7 @@ Dark version
662
664
  .animate-accordion-up {
663
665
  animation: accordion-up 0.2s ease-out;
664
666
  }
667
+
668
+ .tw-header {
669
+ display: none !important; /* Hide the TW "BSMNT" header */
670
+ }