accesly 0.1.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.
@@ -0,0 +1,104 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ /**
5
+ * types.ts - Public TypeScript types for the Accesly SDK.
6
+ */
7
+ /** Configuration for AcceslyProvider */
8
+ interface AcceslyConfig {
9
+ /** Your developer API key (starts with "acc_") */
10
+ appId: string;
11
+ /** Base URL of the Accesly backend. Defaults to https://accesly.vercel.app */
12
+ baseUrl?: string;
13
+ /** Stellar network. Defaults to "testnet" */
14
+ network?: 'testnet' | 'mainnet';
15
+ /** UI theme. Defaults to "dark" */
16
+ theme?: 'dark' | 'light';
17
+ /** Called when a wallet is connected */
18
+ onConnect?: (wallet: WalletInfo) => void;
19
+ /** Called when the wallet is disconnected */
20
+ onDisconnect?: () => void;
21
+ }
22
+ /** Wallet information returned after connecting */
23
+ interface WalletInfo {
24
+ contractId: string;
25
+ publicKey: string;
26
+ stellarAddress: string;
27
+ email: string;
28
+ emailHash: string;
29
+ createdAt: string;
30
+ recoverySigners?: Array<{
31
+ publicKey: string;
32
+ createdAt: string;
33
+ }>;
34
+ }
35
+ /** A single transaction record */
36
+ interface TransactionRecord {
37
+ id: string;
38
+ type: 'sent' | 'received';
39
+ amount: string;
40
+ asset: string;
41
+ counterparty: string;
42
+ createdAt: string;
43
+ }
44
+ /** Parameters for sending a payment */
45
+ interface SendPaymentParams {
46
+ destination: string;
47
+ amount: string;
48
+ memo?: string;
49
+ }
50
+ /** The public context provided by useAccesly hook */
51
+ interface AcceslyContextType {
52
+ /** Whether the initial auth check is in progress */
53
+ loading: boolean;
54
+ /** Whether a wallet is being created for a new user */
55
+ creating: boolean;
56
+ /** The connected wallet info, or null if not connected */
57
+ wallet: WalletInfo | null;
58
+ /** Current XLM balance string, or null */
59
+ balance: string | null;
60
+ /** Last error message, or null */
61
+ error: string | null;
62
+ /** Open the auth popup and connect */
63
+ connect: () => Promise<void>;
64
+ /** Disconnect and clear all state */
65
+ disconnect: () => void;
66
+ /** Send a payment */
67
+ sendPayment: (params: SendPaymentParams) => Promise<{
68
+ txHash: string;
69
+ }>;
70
+ /** Refresh the balance */
71
+ refreshBalance: () => Promise<void>;
72
+ /** Refresh wallet info */
73
+ refreshWallet: () => Promise<void>;
74
+ }
75
+
76
+ declare function AcceslyProvider({ children, ...config }: AcceslyConfig & {
77
+ children: ReactNode;
78
+ }): react_jsx_runtime.JSX.Element;
79
+
80
+ /**
81
+ * ConnectButton.tsx - SDK drop-in wallet button.
82
+ *
83
+ * Renders a dynamic button that:
84
+ * - Shows "Connect Wallet" when disconnected → opens ConnectModal
85
+ * - Shows a pill with address + balance when connected → opens WalletPanel
86
+ * - Handles loading/creating states with spinners
87
+ *
88
+ * Usage:
89
+ * <ConnectButton />
90
+ */
91
+ declare function ConnectButton(): react_jsx_runtime.JSX.Element;
92
+
93
+ /**
94
+ * useAccesly.ts - Public hook for accessing wallet state and actions.
95
+ *
96
+ * Usage:
97
+ * const { wallet, balance, connect, disconnect, sendPayment } = useAccesly();
98
+ *
99
+ * Must be used within an <AcceslyProvider>.
100
+ */
101
+
102
+ declare function useAccesly(): AcceslyContextType;
103
+
104
+ export { type AcceslyConfig, type AcceslyContextType, AcceslyProvider, ConnectButton, type SendPaymentParams, type TransactionRecord, type WalletInfo, useAccesly };
@@ -0,0 +1,104 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ /**
5
+ * types.ts - Public TypeScript types for the Accesly SDK.
6
+ */
7
+ /** Configuration for AcceslyProvider */
8
+ interface AcceslyConfig {
9
+ /** Your developer API key (starts with "acc_") */
10
+ appId: string;
11
+ /** Base URL of the Accesly backend. Defaults to https://accesly.vercel.app */
12
+ baseUrl?: string;
13
+ /** Stellar network. Defaults to "testnet" */
14
+ network?: 'testnet' | 'mainnet';
15
+ /** UI theme. Defaults to "dark" */
16
+ theme?: 'dark' | 'light';
17
+ /** Called when a wallet is connected */
18
+ onConnect?: (wallet: WalletInfo) => void;
19
+ /** Called when the wallet is disconnected */
20
+ onDisconnect?: () => void;
21
+ }
22
+ /** Wallet information returned after connecting */
23
+ interface WalletInfo {
24
+ contractId: string;
25
+ publicKey: string;
26
+ stellarAddress: string;
27
+ email: string;
28
+ emailHash: string;
29
+ createdAt: string;
30
+ recoverySigners?: Array<{
31
+ publicKey: string;
32
+ createdAt: string;
33
+ }>;
34
+ }
35
+ /** A single transaction record */
36
+ interface TransactionRecord {
37
+ id: string;
38
+ type: 'sent' | 'received';
39
+ amount: string;
40
+ asset: string;
41
+ counterparty: string;
42
+ createdAt: string;
43
+ }
44
+ /** Parameters for sending a payment */
45
+ interface SendPaymentParams {
46
+ destination: string;
47
+ amount: string;
48
+ memo?: string;
49
+ }
50
+ /** The public context provided by useAccesly hook */
51
+ interface AcceslyContextType {
52
+ /** Whether the initial auth check is in progress */
53
+ loading: boolean;
54
+ /** Whether a wallet is being created for a new user */
55
+ creating: boolean;
56
+ /** The connected wallet info, or null if not connected */
57
+ wallet: WalletInfo | null;
58
+ /** Current XLM balance string, or null */
59
+ balance: string | null;
60
+ /** Last error message, or null */
61
+ error: string | null;
62
+ /** Open the auth popup and connect */
63
+ connect: () => Promise<void>;
64
+ /** Disconnect and clear all state */
65
+ disconnect: () => void;
66
+ /** Send a payment */
67
+ sendPayment: (params: SendPaymentParams) => Promise<{
68
+ txHash: string;
69
+ }>;
70
+ /** Refresh the balance */
71
+ refreshBalance: () => Promise<void>;
72
+ /** Refresh wallet info */
73
+ refreshWallet: () => Promise<void>;
74
+ }
75
+
76
+ declare function AcceslyProvider({ children, ...config }: AcceslyConfig & {
77
+ children: ReactNode;
78
+ }): react_jsx_runtime.JSX.Element;
79
+
80
+ /**
81
+ * ConnectButton.tsx - SDK drop-in wallet button.
82
+ *
83
+ * Renders a dynamic button that:
84
+ * - Shows "Connect Wallet" when disconnected → opens ConnectModal
85
+ * - Shows a pill with address + balance when connected → opens WalletPanel
86
+ * - Handles loading/creating states with spinners
87
+ *
88
+ * Usage:
89
+ * <ConnectButton />
90
+ */
91
+ declare function ConnectButton(): react_jsx_runtime.JSX.Element;
92
+
93
+ /**
94
+ * useAccesly.ts - Public hook for accessing wallet state and actions.
95
+ *
96
+ * Usage:
97
+ * const { wallet, balance, connect, disconnect, sendPayment } = useAccesly();
98
+ *
99
+ * Must be used within an <AcceslyProvider>.
100
+ */
101
+
102
+ declare function useAccesly(): AcceslyContextType;
103
+
104
+ export { type AcceslyConfig, type AcceslyContextType, AcceslyProvider, ConnectButton, type SendPaymentParams, type TransactionRecord, type WalletInfo, useAccesly };
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');var O="accesly_auth",ce="https://accesly.vercel.app",U=class{constructor(e,r){this.appId=e,this.baseUrl=r||ce;}setTokens(e){localStorage.setItem(O,JSON.stringify(e));}getTokens(){let e=localStorage.getItem(O);if(!e)return null;try{return JSON.parse(e)}catch{return null}}clearTokens(){localStorage.removeItem(O);}hasSession(){return this.getTokens()!==null}async request(e,r={},o=true){let d=this.getTokens(),h={"Content-Type":"application/json","x-accesly-key":this.appId,...d?{Authorization:`Bearer ${d.accessToken}`}:{}},i=await fetch(`${this.baseUrl}${e}`,{...r,headers:{...h,...r.headers}});if(i.status===401&&o&&d?.refreshToken){if(await this.refreshToken(d.refreshToken))return this.request(e,r,false);throw this.clearTokens(),new Error("Session expired. Please reconnect.")}if(!i.ok){let m=await i.json().catch(()=>({}));throw new Error(m.error||m.details||`Request failed: ${i.status}`)}return i.json()}async refreshToken(e){try{let r=await fetch(`${this.baseUrl}/api/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e})});if(!r.ok)return !1;let o=await r.json(),d=this.getTokens();return d&&this.setTokens({...d,accessToken:o.accessToken,refreshToken:o.refreshToken,expiresAt:o.expiresAt}),!0}catch{return false}}async getWalletInfo(){return this.request("/api/wallet/info")}async createWallet(){return this.request("/api/wallet/create",{method:"POST"})}async getBalance(){return this.request("/api/wallet/balance")}async sendPayment(e){return this.request("/api/wallet/send",{method:"POST",body:JSON.stringify(e)})}async getTransactions(e=20){return this.request(`/api/wallet/transactions?limit=${e}`)}async rotateKeys(){return this.request("/api/wallet/rotate",{method:"POST"})}};function X(a,e){return new Promise((r,o)=>{let d=window.screenX+(window.innerWidth-450)/2,h=window.screenY+(window.innerHeight-600)/2,i=window.open(`${a}/auth/popup?appId=${e}`,"accesly-auth",`width=450,height=600,left=${d},top=${h},toolbar=no,menubar=no`);if(!i){o(new Error("Failed to open popup. Please allow popups for this site."));return}function m(u){u.origin.includes(new URL(a).host)&&(u.data?.type==="accesly-auth-success"&&(p(),r(u.data.payload)),u.data?.type==="accesly-auth-error"&&(p(),o(new Error(u.data.error||"Authentication failed"))));}let b=setInterval(()=>{i.closed&&(p(),o(new Error("Authentication cancelled")));},500);function p(){window.removeEventListener("message",m),clearInterval(b);}window.addEventListener("message",m);})}var _=react.createContext(null),ue="https://accesly.vercel.app";function ye({children:a,...e}){let r=e.baseUrl||ue,o=react.useMemo(()=>new U(e.appId,r),[e.appId,r]),[d,h]=react.useState(null),[i,m]=react.useState(null),[b,p]=react.useState(true),[u,C]=react.useState(false),[P,v]=react.useState(null);react.useEffect(()=>{o.hasSession()?S():p(false);},[o]),react.useEffect(()=>{if(!d)return;T();let l=setInterval(T,15e3);return ()=>clearInterval(l)},[d]);async function S(){v(null);try{let l=await o.getWalletInfo();h(l.wallet),e.onConnect?.(l.wallet);}catch(l){if(l.message?.includes("404")||l.message?.includes("not found")){await L();return}l.message?.includes("Session expired")&&(o.clearTokens(),h(null)),v(l.message);}finally{p(false);}}async function L(){C(true),v(null);try{await o.createWallet();let l=await o.getWalletInfo();h(l.wallet),e.onConnect?.(l.wallet);}catch(l){v(l.message);}finally{C(false),p(false);}}async function T(){try{let A=(await o.getBalance()).balances.find(D=>D.asset==="native");m(A?.balance||"0");}catch{}}let M=react.useCallback(async()=>{v(null);try{let l=await X(r,e.appId);o.setTokens(l),p(!0),await S();}catch(l){l.message!=="Authentication cancelled"&&v(l.message);}},[r,e.appId,o]),E=react.useCallback(()=>{o.clearTokens(),h(null),m(null),v(null),e.onDisconnect?.();},[o,e.onDisconnect]),F=react.useCallback(async l=>o.sendPayment(l),[o]),$=react.useCallback(async()=>{await T();},[o]),G=react.useCallback(async()=>{await S();},[o]),q={loading:b,creating:u,wallet:d,balance:i,error:P,connect:M,disconnect:E,sendPayment:F,refreshBalance:$,refreshWallet:G};return jsxRuntime.jsx(_.Provider,{value:q,children:a})}function R(){let a=react.useContext(_);if(!a)throw new Error('useAccesly must be used within an <AcceslyProvider>. Wrap your app with <AcceslyProvider appId="acc_xxxxx">.');return a}function K({onClose:a,onConnect:e}){return jsxRuntime.jsx("div",{style:w.overlay,onClick:a,children:jsxRuntime.jsxs("div",{style:w.modal,onClick:r=>r.stopPropagation(),children:[jsxRuntime.jsx("button",{onClick:a,style:w.closeBtn,children:jsxRuntime.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsxRuntime.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),jsxRuntime.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}),jsxRuntime.jsx("div",{style:w.iconWrapper,children:jsxRuntime.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"#667eea",strokeWidth:"1.5",children:[jsxRuntime.jsx("path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5"}),jsxRuntime.jsx("path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"})]})}),jsxRuntime.jsx("h2",{style:w.title,children:"Connect to Accesly"}),jsxRuntime.jsx("p",{style:w.subtitle,children:"Choose how you want to connect"}),jsxRuntime.jsxs("button",{onClick:e,style:w.googleBtn,children:[jsxRuntime.jsxs("svg",{style:w.googleIcon,viewBox:"0 0 24 24",children:[jsxRuntime.jsx("path",{d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z",fill:"#4285F4"}),jsxRuntime.jsx("path",{d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z",fill:"#34A853"}),jsxRuntime.jsx("path",{d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z",fill:"#FBBC05"}),jsxRuntime.jsx("path",{d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z",fill:"#EA4335"})]}),"Continue with Google"]}),jsxRuntime.jsx("p",{style:w.footer,children:"Powered by Accesly"})]})})}var w={overlay:{position:"fixed",inset:0,backgroundColor:"rgba(0, 0, 0, 0.6)",backdropFilter:"blur(4px)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:99999,padding:"1rem",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},modal:{position:"relative",backgroundColor:"#141428",borderRadius:"20px",border:"1px solid #2a2a4a",padding:"2rem",width:"100%",maxWidth:"380px",textAlign:"center"},closeBtn:{position:"absolute",top:"1rem",right:"1rem",background:"none",border:"none",color:"#64748b",cursor:"pointer",padding:"4px"},iconWrapper:{width:"56px",height:"56px",borderRadius:"16px",backgroundColor:"rgba(102, 126, 234, 0.1)",border:"1px solid rgba(102, 126, 234, 0.2)",display:"flex",alignItems:"center",justifyContent:"center",margin:"0 auto 1rem"},title:{fontSize:"1.3rem",fontWeight:700,color:"#e2e8f0",margin:"0 0 0.25rem"},subtitle:{color:"#64748b",fontSize:"0.85rem",margin:"0 0 1.5rem"},googleBtn:{display:"flex",alignItems:"center",justifyContent:"center",gap:"0.75rem",padding:"0.85rem 1.5rem",backgroundColor:"#1a1a2e",color:"#e2e8f0",border:"1px solid #2a2a4a",borderRadius:"12px",fontSize:"0.95rem",fontWeight:500,cursor:"pointer",width:"100%",marginBottom:"1.25rem"},googleIcon:{width:"20px",height:"20px",flexShrink:0},footer:{color:"#475569",fontSize:"0.7rem",margin:0}};function Y({onClose:a}){let{wallet:e,balance:r,disconnect:o,sendPayment:d,refreshBalance:h}=R(),[i,m]=react.useState("wallet"),[b,p]=react.useState(""),[u,C]=react.useState(""),[P,v]=react.useState(""),[S,L]=react.useState(false),[T,M]=react.useState(null),[E,F]=react.useState(null),[$,G]=react.useState([]),[q,l]=react.useState(false),[A,D]=react.useState(null);if(react.useEffect(()=>{i==="activity"&&$.length===0&&Z();},[i]),!e)return null;async function Z(){l(true);try{let s=await fetch("/api/wallet/transactions?limit=20");}catch{}finally{l(false);}}async function ee(){if(!(!b||!u)){L(true),F(null);try{let s=await d({destination:b,amount:u,memo:P||void 0});M(s.txHash),h();}catch(s){F(s.message);}finally{L(false);}}}function V(s,y=6,N=6){return s.length<=y+N+3?s:`${s.slice(0,y)}...${s.slice(-N)}`}async function j(s,y){await navigator.clipboard.writeText(s),D(y),setTimeout(()=>D(null),1500);}function te(){o(),a();}let ne=r?parseFloat(r).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}):"---",oe=he(e.stellarAddress),re=[{key:"wallet",label:"Wallet"},{key:"activity",label:"Activity"},{key:"account",label:"Account"},{key:"security",label:"Security"}];return jsxRuntime.jsx("div",{style:t.overlay,onClick:a,children:jsxRuntime.jsxs("div",{style:t.panel,onClick:s=>s.stopPropagation(),children:[jsxRuntime.jsxs("div",{style:t.header,children:[jsxRuntime.jsx("button",{onClick:a,style:t.closeBtn,children:jsxRuntime.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsxRuntime.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),jsxRuntime.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}),jsxRuntime.jsx("div",{style:{...t.identicon,backgroundColor:oe}}),jsxRuntime.jsx("p",{style:t.headerAddr,children:V(e.stellarAddress,8,8)}),jsxRuntime.jsxs("p",{style:t.headerBalance,children:[ne," ",jsxRuntime.jsx("span",{style:t.headerCurrency,children:"XLM"})]})]}),jsxRuntime.jsx("div",{style:t.tabBar,children:re.map(s=>jsxRuntime.jsx("button",{onClick:()=>m(s.key),style:{...t.tab,...i===s.key?t.tabActive:{}},children:s.label},s.key))}),jsxRuntime.jsxs("div",{style:t.content,children:[i==="wallet"&&ae(),i==="activity"&&se(),i==="account"&&le(),i==="security"&&ie()]})]})});function ae(){return T?jsxRuntime.jsxs("div",{style:t.centeredCol,children:[jsxRuntime.jsxs("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"#34d399",strokeWidth:"2",children:[jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"10"}),jsxRuntime.jsx("polyline",{points:"8 12 11 15 16 9"})]}),jsxRuntime.jsx("p",{style:{color:"#34d399",fontWeight:600,margin:"0.5rem 0"},children:"Payment Sent"}),jsxRuntime.jsxs("p",{style:{color:"#64748b",fontSize:"0.75rem",fontFamily:"monospace"},children:[T.slice(0,12),"...",T.slice(-12)]}),jsxRuntime.jsx("button",{onClick:()=>{M(null),p(""),C(""),v("");},style:t.primaryBtn,children:"Done"})]}):jsxRuntime.jsxs("div",{style:t.walletTab,children:[jsxRuntime.jsxs("div",{style:t.formGroup,children:[jsxRuntime.jsx("label",{style:t.formLabel,children:"Destination"}),jsxRuntime.jsx("input",{type:"text",placeholder:"G...",value:b,onChange:s=>p(s.target.value),maxLength:56,style:t.formInput})]}),jsxRuntime.jsxs("div",{style:t.formGroup,children:[jsxRuntime.jsx("label",{style:t.formLabel,children:"Amount (XLM)"}),jsxRuntime.jsx("input",{type:"number",placeholder:"0.00",value:u,onChange:s=>C(s.target.value),min:"0.0000001",step:"any",style:t.formInput})]}),jsxRuntime.jsxs("div",{style:t.formGroup,children:[jsxRuntime.jsx("label",{style:t.formLabel,children:"Memo (optional)"}),jsxRuntime.jsx("input",{type:"text",placeholder:"What is this for?",value:P,onChange:s=>v(s.target.value),maxLength:28,style:t.formInput})]}),E&&jsxRuntime.jsx("p",{style:t.error,children:E}),jsxRuntime.jsx("button",{onClick:ee,disabled:S||!b||!u,style:{...t.primaryBtn,opacity:S||!b||!u?.5:1},children:S?"Sending...":"Send Payment"}),jsxRuntime.jsx("button",{onClick:()=>j(e.stellarAddress,"receive"),style:t.receiveBtn,children:A==="receive"?"Address Copied!":"Copy Address to Receive"})]})}function se(){return jsxRuntime.jsx("p",{style:t.emptyText,children:"Transaction history coming soon."})}function le(){let s=[{label:"Email",value:e.email,key:"email"},{label:"Contract ID",value:e.contractId,key:"contract",copy:true},{label:"Stellar Address",value:e.stellarAddress,key:"stellar",copy:true},{label:"Public Key",value:e.publicKey,key:"pubkey",copy:true},{label:"Created",value:new Date(e.createdAt).toLocaleDateString(),key:"created"}];return jsxRuntime.jsx("div",{style:t.fieldList,children:s.map(y=>jsxRuntime.jsxs("div",{style:t.field,children:[jsxRuntime.jsx("span",{style:t.fieldLabel,children:y.label}),y.copy?jsxRuntime.jsx("button",{onClick:()=>j(y.value,y.key),style:{...t.copyBtn,color:A===y.key?"#34d399":"#a5b4fc",borderColor:A===y.key?"#34d399":"#2a2a4a"},children:A===y.key?"Copied!":V(y.value,8,8)}):jsxRuntime.jsx("span",{style:t.fieldValue,children:y.value})]},y.key))})}function ie(){return jsxRuntime.jsxs("div",{style:t.securityTab,children:[jsxRuntime.jsxs("div",{style:t.fieldList,children:[jsxRuntime.jsxs("div",{style:t.field,children:[jsxRuntime.jsx("span",{style:t.fieldLabel,children:"Recovery"}),jsxRuntime.jsx("span",{style:{...t.fieldValue,color:"#34d399"},children:"Protected"})]}),jsxRuntime.jsxs("div",{style:t.field,children:[jsxRuntime.jsx("span",{style:t.fieldLabel,children:"Method"}),jsxRuntime.jsxs("span",{style:t.fieldValue,children:["Google (",e.email,")"]})]})]}),jsxRuntime.jsxs("button",{onClick:te,style:t.disconnectBtn,children:[jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsxRuntime.jsx("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),jsxRuntime.jsx("polyline",{points:"16 17 21 12 16 7"}),jsxRuntime.jsx("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]}),"Disconnect"]})]})}}function he(a){let e=0;for(let r=0;r<a.length;r++)e=a.charCodeAt(r)+((e<<5)-e);return `hsl(${Math.abs(e)%360}, 65%, 55%)`}var t={overlay:{position:"fixed",inset:0,backgroundColor:"rgba(0, 0, 0, 0.6)",backdropFilter:"blur(4px)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:99999,padding:"1rem",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},panel:{backgroundColor:"#0f0f1e",borderRadius:"20px",border:"1px solid #2a2a4a",width:"100%",maxWidth:"420px",maxHeight:"85vh",display:"flex",flexDirection:"column",overflow:"hidden"},header:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",padding:"1.5rem 1.5rem 1rem",background:"linear-gradient(180deg, #1a1a3a 0%, #0f0f1e 100%)"},closeBtn:{position:"absolute",top:"1rem",right:"1rem",background:"none",border:"none",color:"#64748b",cursor:"pointer",padding:"4px"},identicon:{width:"48px",height:"48px",borderRadius:"50%",marginBottom:"0.5rem"},headerAddr:{fontFamily:"monospace",fontSize:"0.8rem",color:"#8b8ba7",margin:"0 0 0.25rem"},headerBalance:{fontSize:"1.75rem",fontWeight:700,color:"#ffffff",margin:0},headerCurrency:{fontSize:"0.85rem",fontWeight:500,color:"#8b8ba7"},tabBar:{display:"flex",borderBottom:"1px solid #2a2a4a",padding:"0 0.5rem"},tab:{flex:1,padding:"0.75rem 0.5rem",background:"none",border:"none",borderBottom:"2px solid transparent",color:"#64748b",fontSize:"0.8rem",fontWeight:500,cursor:"pointer",transition:"color 0.2s, border-color 0.2s",borderRadius:0},tabActive:{color:"#e2e8f0",borderBottomColor:"#667eea"},content:{flex:1,overflowY:"auto",padding:"1rem 1.25rem 1.25rem"},walletTab:{display:"flex",flexDirection:"column",gap:"0.75rem"},formGroup:{display:"flex",flexDirection:"column",gap:"0.3rem"},formLabel:{color:"#8b8ba7",fontSize:"0.75rem",fontWeight:500},formInput:{backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"8px",padding:"0.65rem 0.75rem",color:"#e2e8f0",fontSize:"0.9rem",outline:"none",width:"100%",boxSizing:"border-box",fontFamily:"inherit"},primaryBtn:{backgroundColor:"#667eea",color:"#fff",border:"none",borderRadius:"10px",padding:"0.75rem",fontSize:"0.95rem",fontWeight:600,cursor:"pointer",width:"100%",marginTop:"0.25rem"},receiveBtn:{backgroundColor:"transparent",color:"#a5b4fc",border:"1.5px solid #4a4a7a",borderRadius:"10px",padding:"0.65rem",fontSize:"0.85rem",fontWeight:600,cursor:"pointer",width:"100%"},error:{color:"#f87171",fontSize:"0.8rem",margin:0,padding:"0.4rem 0.6rem",backgroundColor:"rgba(248, 113, 113, 0.1)",borderRadius:"6px"},centeredCol:{display:"flex",flexDirection:"column",alignItems:"center",gap:"0.5rem",padding:"1rem 0"},fieldList:{display:"flex",flexDirection:"column"},field:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"0.6rem 0",borderBottom:"1px solid #1a1a2e"},fieldLabel:{color:"#8b8ba7",fontSize:"0.8rem"},fieldValue:{color:"#e2e8f0",fontSize:"0.8rem",fontWeight:500},copyBtn:{background:"none",border:"1px solid #2a2a4a",color:"#a5b4fc",padding:"0.2rem 0.5rem",borderRadius:"4px",fontSize:"0.72rem",fontFamily:"monospace",cursor:"pointer",transition:"color 0.2s, border-color 0.2s"},securityTab:{display:"flex",flexDirection:"column",gap:"1rem"},disconnectBtn:{display:"flex",alignItems:"center",justifyContent:"center",gap:"0.5rem",width:"100%",padding:"0.65rem",backgroundColor:"transparent",color:"#f87171",border:"1px solid rgba(248, 113, 113, 0.2)",borderRadius:"10px",fontSize:"0.85rem",fontWeight:500,cursor:"pointer"},emptyText:{color:"#64748b",fontSize:"0.85rem",textAlign:"center",padding:"2rem 0"}};function be(){let{wallet:a,balance:e,loading:r,creating:o,connect:d}=R(),[h,i]=react.useState(false),[m,b]=react.useState(false);if(r)return jsxRuntime.jsx("div",{style:x.pillLoading,children:jsxRuntime.jsx("div",{style:x.spinner})});if(!a)return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{onClick:()=>i(true),style:o?x.pill:x.connectBtn,disabled:o,children:o?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{style:x.spinnerSmall}),jsxRuntime.jsx("span",{style:x.pillText,children:"Creating wallet..."})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsxRuntime.jsx("path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5"}),jsxRuntime.jsx("path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"})]}),"Connect Wallet"]})}),h&&jsxRuntime.jsx(K,{onClose:()=>i(false),onConnect:async()=>{i(false),await d();}})]});let p=a.stellarAddress,u=`${p.slice(0,4)}...${p.slice(-4)}`,C=e?`${parseFloat(e).toFixed(2)} XLM`:"--- XLM",P=xe(p);return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("button",{onClick:()=>b(true),style:x.pill,children:[jsxRuntime.jsx("div",{style:{...x.identicon,backgroundColor:P}}),jsxRuntime.jsx("span",{style:x.pillAddr,children:u}),jsxRuntime.jsx("span",{style:x.divider}),jsxRuntime.jsx("span",{style:x.pillBalance,children:C})]}),m&&jsxRuntime.jsx(Y,{onClose:()=>b(false)})]})}function xe(a){let e=0;for(let r=0;r<a.length;r++)e=a.charCodeAt(r)+((e<<5)-e);return `hsl(${Math.abs(e)%360}, 65%, 55%)`}var x={connectBtn:{display:"flex",alignItems:"center",gap:"0.6rem",padding:"0.85rem 1.75rem",background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)",color:"#fff",border:"none",borderRadius:"12px",fontSize:"1rem",fontWeight:600,cursor:"pointer",transition:"transform 0.15s, box-shadow 0.15s",boxShadow:"0 4px 15px rgba(102, 126, 234, 0.4)",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},pill:{display:"flex",alignItems:"center",gap:"0.5rem",padding:"0.5rem 0.85rem",backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"50px",cursor:"pointer",transition:"border-color 0.2s, box-shadow 0.2s",color:"#e2e8f0",fontSize:"0.85rem",fontWeight:500,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},pillLoading:{display:"flex",alignItems:"center",justifyContent:"center",padding:"0.5rem 1.5rem",backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"50px",height:"42px"},identicon:{width:"24px",height:"24px",borderRadius:"50%",flexShrink:0},pillAddr:{fontFamily:"monospace",fontSize:"0.8rem",color:"#e2e8f0"},divider:{width:"1px",height:"16px",backgroundColor:"#3a3a5a"},pillBalance:{fontSize:"0.8rem",color:"#8b8ba7",fontWeight:500},pillText:{fontSize:"0.8rem",color:"#8b8ba7"},spinner:{width:"20px",height:"20px",border:"2px solid #2a2a4a",borderTop:"2px solid #667eea",borderRadius:"50%",animation:"accesly-spin 1s linear infinite"},spinnerSmall:{width:"16px",height:"16px",border:"2px solid #2a2a4a",borderTop:"2px solid #667eea",borderRadius:"50%",animation:"accesly-spin 1s linear infinite",flexShrink:0}};if(typeof document<"u"){let a="accesly-keyframes";if(!document.getElementById(a)){let e=document.createElement("style");e.id=a,e.textContent=`
2
+ @keyframes accesly-spin {
3
+ to { transform: rotate(360deg); }
4
+ }
5
+ `,document.head.appendChild(e);}}exports.AcceslyProvider=ye;exports.ConnectButton=be;exports.useAccesly=R;//# sourceMappingURL=index.js.map
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/AcceslyClient.ts","../src/auth.ts","../src/AcceslyProvider.tsx","../src/hooks/useAccesly.ts","../src/components/ConnectModal.tsx","../src/components/WalletPanel.tsx","../src/components/ConnectButton.tsx","../src/index.ts"],"names":["STORAGE_KEY","DEFAULT_BASE_URL","AcceslyClient","appId","baseUrl","tokens","raw","path","options","retry","headers","res","data","refreshToken","params","limit","openAuthPopup","resolve","reject","left","top","popup","handleMessage","event","cleanup","pollClosed","AcceslyContext","createContext","AcceslyProvider","children","config","client","useMemo","wallet","setWallet","useState","balance","setBalance","loading","setLoading","creating","setCreating","error","setError","useEffect","loadWallet","fetchBalance","interval","err","createWallet","native","b","connect","useCallback","disconnect","sendPayment","refreshBalance","refreshWallet","contextValue","jsx","useAccesly","context","useContext","ConnectModal","onClose","onConnect","styles","jsxs","e","WalletPanel","activeTab","setActiveTab","sendDest","setSendDest","sendAmount","setSendAmount","sendMemo","setSendMemo","sending","setSending","sendResult","setSendResult","sendError","setSendError","transactions","setTransactions","txLoading","setTxLoading","copiedField","setCopiedField","loadTransactions","handleSend","result","truncate","addr","start","end","copyToClipboard","text","field","handleDisconnect","formattedBalance","idColor","identiconColor","tabs","tab","renderWalletTab","renderActivityTab","renderAccountTab","renderSecurityTab","fields","f","address","hash","i","ConnectButton","showModal","setShowModal","showPanel","setShowPanel","Fragment","truncated","balanceText","color","STYLE_ID","style"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * AcceslyClient.ts - HTTP client for the Accesly backend API.\r\n *\r\n * Handles:\r\n * - All wallet API calls (balance, send, create, etc.)\r\n * - Automatic token refresh on 401 responses\r\n * - API key injection in every request\r\n */\r\n\r\nimport type { WalletInfo, TransactionRecord, SendPaymentParams, AuthTokens } from './types';\r\n\r\nconst STORAGE_KEY = 'accesly_auth';\r\nconst DEFAULT_BASE_URL = 'https://accesly.vercel.app';\r\n\r\nexport class AcceslyClient {\r\n private baseUrl: string;\r\n private appId: string;\r\n\r\n constructor(appId: string, baseUrl?: string) {\r\n this.appId = appId;\r\n this.baseUrl = baseUrl || DEFAULT_BASE_URL;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Token management (stored in localStorage)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Save auth tokens to localStorage */\r\n setTokens(tokens: AuthTokens): void {\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify(tokens));\r\n }\r\n\r\n /** Get stored auth tokens */\r\n getTokens(): AuthTokens | null {\r\n const raw = localStorage.getItem(STORAGE_KEY);\r\n if (!raw) return null;\r\n try {\r\n return JSON.parse(raw) as AuthTokens;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /** Clear stored auth tokens */\r\n clearTokens(): void {\r\n localStorage.removeItem(STORAGE_KEY);\r\n }\r\n\r\n /** Check if we have a stored session */\r\n hasSession(): boolean {\r\n return this.getTokens() !== null;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // HTTP layer\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Make an authenticated request to the Accesly API.\r\n * Automatically adds the API key and auth token.\r\n * Retries once with a refreshed token on 401.\r\n */\r\n private async request<T>(\r\n path: string,\r\n options: RequestInit = {},\r\n retry = true\r\n ): Promise<T> {\r\n const tokens = this.getTokens();\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n 'x-accesly-key': this.appId,\r\n ...(tokens ? { Authorization: `Bearer ${tokens.accessToken}` } : {}),\r\n };\r\n\r\n const res = await fetch(`${this.baseUrl}${path}`, {\r\n ...options,\r\n headers: { ...headers, ...(options.headers as Record<string, string>) },\r\n });\r\n\r\n // If unauthorized, try to refresh the token once\r\n if (res.status === 401 && retry && tokens?.refreshToken) {\r\n const refreshed = await this.refreshToken(tokens.refreshToken);\r\n if (refreshed) {\r\n return this.request<T>(path, options, false);\r\n }\r\n // Refresh failed - clear tokens\r\n this.clearTokens();\r\n throw new Error('Session expired. Please reconnect.');\r\n }\r\n\r\n if (!res.ok) {\r\n const data = await res.json().catch(() => ({}));\r\n throw new Error(data.error || data.details || `Request failed: ${res.status}`);\r\n }\r\n\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** Refresh the access token using the refresh token */\r\n private async refreshToken(refreshToken: string): Promise<boolean> {\r\n try {\r\n const res = await fetch(`${this.baseUrl}/api/auth/refresh`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ refreshToken }),\r\n });\r\n\r\n if (!res.ok) return false;\r\n\r\n const data = await res.json();\r\n const tokens = this.getTokens();\r\n if (tokens) {\r\n this.setTokens({\r\n ...tokens,\r\n accessToken: data.accessToken,\r\n refreshToken: data.refreshToken,\r\n expiresAt: data.expiresAt,\r\n });\r\n }\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Wallet API methods\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Get wallet info for the authenticated user */\r\n async getWalletInfo(): Promise<{ wallet: WalletInfo }> {\r\n return this.request('/api/wallet/info');\r\n }\r\n\r\n /** Create a new wallet for the authenticated user */\r\n async createWallet(): Promise<{ wallet: WalletInfo }> {\r\n return this.request('/api/wallet/create', { method: 'POST' });\r\n }\r\n\r\n /** Get the wallet's balance */\r\n async getBalance(): Promise<{ balances: Array<{ asset: string; balance: string }> }> {\r\n return this.request('/api/wallet/balance');\r\n }\r\n\r\n /** Send a payment */\r\n async sendPayment(params: SendPaymentParams): Promise<{ txHash: string }> {\r\n return this.request('/api/wallet/send', {\r\n method: 'POST',\r\n body: JSON.stringify(params),\r\n });\r\n }\r\n\r\n /** Get transaction history */\r\n async getTransactions(limit = 20): Promise<{ transactions: TransactionRecord[] }> {\r\n return this.request(`/api/wallet/transactions?limit=${limit}`);\r\n }\r\n\r\n /** Rotate wallet keys */\r\n async rotateKeys(): Promise<{ newStellarAddress: string }> {\r\n return this.request('/api/wallet/rotate', { method: 'POST' });\r\n }\r\n}\r\n","/**\r\n * auth.ts - Popup-based OAuth authentication for the SDK.\r\n *\r\n * Opens a popup window pointing to the Accesly auth page.\r\n * The popup handles Google OAuth and sends the resulting tokens\r\n * back to this window via postMessage.\r\n */\r\n\r\nimport type { AuthTokens } from './types';\r\n\r\n/** Popup window dimensions */\r\nconst POPUP_WIDTH = 450;\r\nconst POPUP_HEIGHT = 600;\r\n\r\n/**\r\n * Open the Accesly auth popup and wait for the user to authenticate.\r\n * Returns the auth tokens on success, or throws on failure/cancellation.\r\n */\r\nexport function openAuthPopup(baseUrl: string, appId: string): Promise<AuthTokens> {\r\n return new Promise((resolve, reject) => {\r\n // Center the popup on screen\r\n const left = window.screenX + (window.innerWidth - POPUP_WIDTH) / 2;\r\n const top = window.screenY + (window.innerHeight - POPUP_HEIGHT) / 2;\r\n\r\n const popup = window.open(\r\n `${baseUrl}/auth/popup?appId=${appId}`,\r\n 'accesly-auth',\r\n `width=${POPUP_WIDTH},height=${POPUP_HEIGHT},left=${left},top=${top},toolbar=no,menubar=no`\r\n );\r\n\r\n if (!popup) {\r\n reject(new Error('Failed to open popup. Please allow popups for this site.'));\r\n return;\r\n }\r\n\r\n /** Handle messages from the popup */\r\n function handleMessage(event: MessageEvent) {\r\n // Only accept messages from the Accesly domain\r\n if (!event.origin.includes(new URL(baseUrl).host)) return;\r\n\r\n if (event.data?.type === 'accesly-auth-success') {\r\n cleanup();\r\n resolve(event.data.payload as AuthTokens);\r\n }\r\n\r\n if (event.data?.type === 'accesly-auth-error') {\r\n cleanup();\r\n reject(new Error(event.data.error || 'Authentication failed'));\r\n }\r\n }\r\n\r\n /** Detect if the user closed the popup manually */\r\n const pollClosed = setInterval(() => {\r\n if (popup.closed) {\r\n cleanup();\r\n reject(new Error('Authentication cancelled'));\r\n }\r\n }, 500);\r\n\r\n /** Remove all listeners and intervals */\r\n function cleanup() {\r\n window.removeEventListener('message', handleMessage);\r\n clearInterval(pollClosed);\r\n }\r\n\r\n window.addEventListener('message', handleMessage);\r\n });\r\n}\r\n","/**\r\n * AcceslyProvider.tsx - Main SDK provider component.\r\n *\r\n * Wraps the application and provides wallet state to all children.\r\n * Handles auth token management, wallet loading, and balance refresh.\r\n *\r\n * Usage:\r\n * <AcceslyProvider appId=\"acc_xxxxx\">\r\n * <App />\r\n * </AcceslyProvider>\r\n */\r\n\r\nimport {\r\n createContext,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n useMemo,\r\n type ReactNode,\r\n} from 'react';\r\nimport { AcceslyClient } from './AcceslyClient';\r\nimport { openAuthPopup } from './auth';\r\nimport type {\r\n AcceslyConfig,\r\n AcceslyContextType,\r\n WalletInfo,\r\n SendPaymentParams,\r\n} from './types';\r\n\r\n/** Internal context - use the useAccesly hook to access it */\r\nexport const AcceslyContext = createContext<AcceslyContextType | null>(null);\r\n\r\nconst DEFAULT_BASE_URL = 'https://accesly.vercel.app';\r\n\r\nexport function AcceslyProvider({\r\n children,\r\n ...config\r\n}: AcceslyConfig & { children: ReactNode }) {\r\n const baseUrl = config.baseUrl || DEFAULT_BASE_URL;\r\n\r\n // Create a stable client instance\r\n const client = useMemo(\r\n () => new AcceslyClient(config.appId, baseUrl),\r\n [config.appId, baseUrl]\r\n );\r\n\r\n const [wallet, setWallet] = useState<WalletInfo | null>(null);\r\n const [balance, setBalance] = useState<string | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [creating, setCreating] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n // --- Check for existing session on mount ---\r\n useEffect(() => {\r\n if (client.hasSession()) {\r\n loadWallet();\r\n } else {\r\n setLoading(false);\r\n }\r\n }, [client]);\r\n\r\n // --- Auto-refresh balance every 15s when connected ---\r\n useEffect(() => {\r\n if (!wallet) return;\r\n fetchBalance();\r\n const interval = setInterval(fetchBalance, 15000);\r\n return () => clearInterval(interval);\r\n }, [wallet]);\r\n\r\n /** Load wallet info from the backend. Creates wallet if first login. */\r\n async function loadWallet() {\r\n setError(null);\r\n try {\r\n const data = await client.getWalletInfo();\r\n setWallet(data.wallet);\r\n config.onConnect?.(data.wallet);\r\n } catch (err: any) {\r\n // If 404, create wallet (first login)\r\n if (err.message?.includes('404') || err.message?.includes('not found')) {\r\n await createWallet();\r\n return;\r\n }\r\n // If session expired, clear and let user reconnect\r\n if (err.message?.includes('Session expired')) {\r\n client.clearTokens();\r\n setWallet(null);\r\n }\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n /** Create a new wallet for the user */\r\n async function createWallet() {\r\n setCreating(true);\r\n setError(null);\r\n try {\r\n await client.createWallet();\r\n // Fetch the full wallet info after creation\r\n const data = await client.getWalletInfo();\r\n setWallet(data.wallet);\r\n config.onConnect?.(data.wallet);\r\n } catch (err: any) {\r\n setError(err.message);\r\n } finally {\r\n setCreating(false);\r\n setLoading(false);\r\n }\r\n }\r\n\r\n /** Fetch current XLM balance */\r\n async function fetchBalance() {\r\n try {\r\n const data = await client.getBalance();\r\n const native = data.balances.find((b) => b.asset === 'native');\r\n setBalance(native?.balance || '0');\r\n } catch {\r\n // Silently fail, keep previous balance\r\n }\r\n }\r\n\r\n /** Open auth popup, get tokens, load wallet */\r\n const connect = useCallback(async () => {\r\n setError(null);\r\n try {\r\n const tokens = await openAuthPopup(baseUrl, config.appId);\r\n client.setTokens(tokens);\r\n setLoading(true);\r\n await loadWallet();\r\n } catch (err: any) {\r\n if (err.message !== 'Authentication cancelled') {\r\n setError(err.message);\r\n }\r\n }\r\n }, [baseUrl, config.appId, client]);\r\n\r\n /** Disconnect: clear tokens and state */\r\n const disconnect = useCallback(() => {\r\n client.clearTokens();\r\n setWallet(null);\r\n setBalance(null);\r\n setError(null);\r\n config.onDisconnect?.();\r\n }, [client, config.onDisconnect]);\r\n\r\n /** Send a payment */\r\n const sendPayment = useCallback(\r\n async (params: SendPaymentParams) => {\r\n return client.sendPayment(params);\r\n },\r\n [client]\r\n );\r\n\r\n /** Refresh balance on demand */\r\n const refreshBalance = useCallback(async () => {\r\n await fetchBalance();\r\n }, [client]);\r\n\r\n /** Refresh wallet info on demand */\r\n const refreshWallet = useCallback(async () => {\r\n await loadWallet();\r\n }, [client]);\r\n\r\n const contextValue: AcceslyContextType = {\r\n loading,\r\n creating,\r\n wallet,\r\n balance,\r\n error,\r\n connect,\r\n disconnect,\r\n sendPayment,\r\n refreshBalance,\r\n refreshWallet,\r\n };\r\n\r\n return (\r\n <AcceslyContext.Provider value={contextValue}>\r\n {children}\r\n </AcceslyContext.Provider>\r\n );\r\n}\r\n","/**\r\n * useAccesly.ts - Public hook for accessing wallet state and actions.\r\n *\r\n * Usage:\r\n * const { wallet, balance, connect, disconnect, sendPayment } = useAccesly();\r\n *\r\n * Must be used within an <AcceslyProvider>.\r\n */\r\n\r\nimport { useContext } from 'react';\r\nimport { AcceslyContext } from '../AcceslyProvider';\r\nimport type { AcceslyContextType } from '../types';\r\n\r\nexport function useAccesly(): AcceslyContextType {\r\n const context = useContext(AcceslyContext);\r\n if (!context) {\r\n throw new Error(\r\n 'useAccesly must be used within an <AcceslyProvider>. ' +\r\n 'Wrap your app with <AcceslyProvider appId=\"acc_xxxxx\">.'\r\n );\r\n }\r\n return context;\r\n}\r\n","/**\r\n * ConnectModal.tsx - SDK login modal.\r\n *\r\n * Shows a centered modal with the Google login option.\r\n * When the user clicks \"Continue with Google\", triggers the\r\n * popup-based OAuth flow.\r\n */\r\n\r\ninterface ConnectModalProps {\r\n onClose: () => void;\r\n onConnect: () => void;\r\n}\r\n\r\nexport function ConnectModal({ onClose, onConnect }: ConnectModalProps) {\r\n return (\r\n <div style={styles.overlay} onClick={onClose}>\r\n <div style={styles.modal} onClick={(e) => e.stopPropagation()}>\r\n {/* Close button */}\r\n <button onClick={onClose} style={styles.closeBtn}>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Branding */}\r\n <div style={styles.iconWrapper}>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667eea\" strokeWidth=\"1.5\">\r\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5\" />\r\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\r\n </svg>\r\n </div>\r\n <h2 style={styles.title}>Connect to Accesly</h2>\r\n <p style={styles.subtitle}>Choose how you want to connect</p>\r\n\r\n {/* Google button */}\r\n <button onClick={onConnect} style={styles.googleBtn}>\r\n <svg style={styles.googleIcon} viewBox=\"0 0 24 24\">\r\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\" />\r\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\r\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\r\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\r\n </svg>\r\n Continue with Google\r\n </button>\r\n\r\n <p style={styles.footer}>\r\n Powered by Accesly\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n overlay: {\r\n position: 'fixed',\r\n inset: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\r\n backdropFilter: 'blur(4px)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 99999,\r\n padding: '1rem',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n modal: {\r\n position: 'relative' as const,\r\n backgroundColor: '#141428',\r\n borderRadius: '20px',\r\n border: '1px solid #2a2a4a',\r\n padding: '2rem',\r\n width: '100%',\r\n maxWidth: '380px',\r\n textAlign: 'center' as const,\r\n },\r\n closeBtn: {\r\n position: 'absolute' as const,\r\n top: '1rem',\r\n right: '1rem',\r\n background: 'none',\r\n border: 'none',\r\n color: '#64748b',\r\n cursor: 'pointer',\r\n padding: '4px',\r\n },\r\n iconWrapper: {\r\n width: '56px',\r\n height: '56px',\r\n borderRadius: '16px',\r\n backgroundColor: 'rgba(102, 126, 234, 0.1)',\r\n border: '1px solid rgba(102, 126, 234, 0.2)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto 1rem',\r\n },\r\n title: {\r\n fontSize: '1.3rem',\r\n fontWeight: 700,\r\n color: '#e2e8f0',\r\n margin: '0 0 0.25rem',\r\n },\r\n subtitle: {\r\n color: '#64748b',\r\n fontSize: '0.85rem',\r\n margin: '0 0 1.5rem',\r\n },\r\n googleBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.75rem',\r\n padding: '0.85rem 1.5rem',\r\n backgroundColor: '#1a1a2e',\r\n color: '#e2e8f0',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '12px',\r\n fontSize: '0.95rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n width: '100%',\r\n marginBottom: '1.25rem',\r\n },\r\n googleIcon: {\r\n width: '20px',\r\n height: '20px',\r\n flexShrink: 0,\r\n },\r\n footer: {\r\n color: '#475569',\r\n fontSize: '0.7rem',\r\n margin: 0,\r\n },\r\n};\r\n","/**\r\n * WalletPanel.tsx - SDK wallet panel modal with tabs.\r\n *\r\n * Opened by clicking the connected pill.\r\n * Tabs: Wallet (send/receive), Activity (transactions),\r\n * Account (details), Security (recovery + disconnect).\r\n */\r\n\r\nimport { useState, useEffect, useCallback } from 'react';\r\nimport { useAccesly } from '../hooks/useAccesly';\r\nimport type { TransactionRecord, SendPaymentParams } from '../types';\r\n\r\ntype Tab = 'wallet' | 'activity' | 'account' | 'security';\r\n\r\ninterface WalletPanelProps {\r\n onClose: () => void;\r\n}\r\n\r\nexport function WalletPanel({ onClose }: WalletPanelProps) {\r\n const { wallet, balance, disconnect, sendPayment, refreshBalance } = useAccesly();\r\n const [activeTab, setActiveTab] = useState<Tab>('wallet');\r\n\r\n // Send form state\r\n const [sendDest, setSendDest] = useState('');\r\n const [sendAmount, setSendAmount] = useState('');\r\n const [sendMemo, setSendMemo] = useState('');\r\n const [sending, setSending] = useState(false);\r\n const [sendResult, setSendResult] = useState<string | null>(null);\r\n const [sendError, setSendError] = useState<string | null>(null);\r\n\r\n // Activity state\r\n const [transactions, setTransactions] = useState<TransactionRecord[]>([]);\r\n const [txLoading, setTxLoading] = useState(false);\r\n\r\n // Clipboard feedback\r\n const [copiedField, setCopiedField] = useState<string | null>(null);\r\n\r\n // Lazy-load transactions when Activity tab is selected\r\n useEffect(() => {\r\n if (activeTab === 'activity' && transactions.length === 0) {\r\n loadTransactions();\r\n }\r\n }, [activeTab]);\r\n\r\n if (!wallet) return null;\r\n\r\n async function loadTransactions() {\r\n setTxLoading(true);\r\n try {\r\n // Use the AcceslyClient indirectly through the parent context\r\n // For SDK, we fetch directly since we have the client\r\n const res = await fetch('/api/wallet/transactions?limit=20');\r\n // Note: This won't work cross-origin. In the SDK, transactions\r\n // are loaded via the AcceslyClient. For now, we'll show placeholder.\r\n // TODO: Expose getTransactions through context\r\n } catch {\r\n // Silently fail\r\n } finally {\r\n setTxLoading(false);\r\n }\r\n }\r\n\r\n async function handleSend() {\r\n if (!sendDest || !sendAmount) return;\r\n setSending(true);\r\n setSendError(null);\r\n try {\r\n const result = await sendPayment({\r\n destination: sendDest,\r\n amount: sendAmount,\r\n memo: sendMemo || undefined,\r\n });\r\n setSendResult(result.txHash);\r\n refreshBalance();\r\n } catch (err: any) {\r\n setSendError(err.message);\r\n } finally {\r\n setSending(false);\r\n }\r\n }\r\n\r\n function truncate(addr: string, start = 6, end = 6): string {\r\n if (addr.length <= start + end + 3) return addr;\r\n return `${addr.slice(0, start)}...${addr.slice(-end)}`;\r\n }\r\n\r\n async function copyToClipboard(text: string, field: string) {\r\n await navigator.clipboard.writeText(text);\r\n setCopiedField(field);\r\n setTimeout(() => setCopiedField(null), 1500);\r\n }\r\n\r\n function handleDisconnect() {\r\n disconnect();\r\n onClose();\r\n }\r\n\r\n const formattedBalance = balance\r\n ? parseFloat(balance).toLocaleString('en-US', {\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n })\r\n : '---';\r\n\r\n const idColor = identiconColor(wallet.stellarAddress);\r\n\r\n const tabs: { key: Tab; label: string }[] = [\r\n { key: 'wallet', label: 'Wallet' },\r\n { key: 'activity', label: 'Activity' },\r\n { key: 'account', label: 'Account' },\r\n { key: 'security', label: 'Security' },\r\n ];\r\n\r\n return (\r\n <div style={styles.overlay} onClick={onClose}>\r\n <div style={styles.panel} onClick={(e) => e.stopPropagation()}>\r\n {/* Header */}\r\n <div style={styles.header}>\r\n <button onClick={onClose} style={styles.closeBtn}>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n <div style={{ ...styles.identicon, backgroundColor: idColor }} />\r\n <p style={styles.headerAddr}>{truncate(wallet.stellarAddress, 8, 8)}</p>\r\n <p style={styles.headerBalance}>\r\n {formattedBalance} <span style={styles.headerCurrency}>XLM</span>\r\n </p>\r\n </div>\r\n\r\n {/* Tab bar */}\r\n <div style={styles.tabBar}>\r\n {tabs.map((tab) => (\r\n <button\r\n key={tab.key}\r\n onClick={() => setActiveTab(tab.key)}\r\n style={{\r\n ...styles.tab,\r\n ...(activeTab === tab.key ? styles.tabActive : {}),\r\n }}\r\n >\r\n {tab.label}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab content */}\r\n <div style={styles.content}>\r\n {activeTab === 'wallet' && renderWalletTab()}\r\n {activeTab === 'activity' && renderActivityTab()}\r\n {activeTab === 'account' && renderAccountTab()}\r\n {activeTab === 'security' && renderSecurityTab()}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n // --- Tab renderers ---\r\n\r\n function renderWalletTab() {\r\n // Send success state\r\n if (sendResult) {\r\n return (\r\n <div style={styles.centeredCol}>\r\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#34d399\" strokeWidth=\"2\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <polyline points=\"8 12 11 15 16 9\" />\r\n </svg>\r\n <p style={{ color: '#34d399', fontWeight: 600, margin: '0.5rem 0' }}>Payment Sent</p>\r\n <p style={{ color: '#64748b', fontSize: '0.75rem', fontFamily: 'monospace' }}>\r\n {sendResult.slice(0, 12)}...{sendResult.slice(-12)}\r\n </p>\r\n <button onClick={() => { setSendResult(null); setSendDest(''); setSendAmount(''); setSendMemo(''); }} style={styles.primaryBtn}>\r\n Done\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={styles.walletTab}>\r\n {/* Send form */}\r\n <div style={styles.formGroup}>\r\n <label style={styles.formLabel}>Destination</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"G...\"\r\n value={sendDest}\r\n onChange={(e) => setSendDest(e.target.value)}\r\n maxLength={56}\r\n style={styles.formInput}\r\n />\r\n </div>\r\n <div style={styles.formGroup}>\r\n <label style={styles.formLabel}>Amount (XLM)</label>\r\n <input\r\n type=\"number\"\r\n placeholder=\"0.00\"\r\n value={sendAmount}\r\n onChange={(e) => setSendAmount(e.target.value)}\r\n min=\"0.0000001\"\r\n step=\"any\"\r\n style={styles.formInput}\r\n />\r\n </div>\r\n <div style={styles.formGroup}>\r\n <label style={styles.formLabel}>Memo (optional)</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"What is this for?\"\r\n value={sendMemo}\r\n onChange={(e) => setSendMemo(e.target.value)}\r\n maxLength={28}\r\n style={styles.formInput}\r\n />\r\n </div>\r\n {sendError && <p style={styles.error}>{sendError}</p>}\r\n <button\r\n onClick={handleSend}\r\n disabled={sending || !sendDest || !sendAmount}\r\n style={{\r\n ...styles.primaryBtn,\r\n opacity: sending || !sendDest || !sendAmount ? 0.5 : 1,\r\n }}\r\n >\r\n {sending ? 'Sending...' : 'Send Payment'}\r\n </button>\r\n\r\n {/* Copy address for receiving */}\r\n <button\r\n onClick={() => copyToClipboard(wallet!.stellarAddress, 'receive')}\r\n style={styles.receiveBtn}\r\n >\r\n {copiedField === 'receive' ? 'Address Copied!' : 'Copy Address to Receive'}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n function renderActivityTab() {\r\n return (\r\n <p style={styles.emptyText}>\r\n Transaction history coming soon.\r\n </p>\r\n );\r\n }\r\n\r\n function renderAccountTab() {\r\n const fields = [\r\n { label: 'Email', value: wallet!.email, key: 'email' },\r\n { label: 'Contract ID', value: wallet!.contractId, key: 'contract', copy: true },\r\n { label: 'Stellar Address', value: wallet!.stellarAddress, key: 'stellar', copy: true },\r\n { label: 'Public Key', value: wallet!.publicKey, key: 'pubkey', copy: true },\r\n { label: 'Created', value: new Date(wallet!.createdAt).toLocaleDateString(), key: 'created' },\r\n ];\r\n\r\n return (\r\n <div style={styles.fieldList}>\r\n {fields.map((f) => (\r\n <div key={f.key} style={styles.field}>\r\n <span style={styles.fieldLabel}>{f.label}</span>\r\n {f.copy ? (\r\n <button\r\n onClick={() => copyToClipboard(f.value, f.key)}\r\n style={{\r\n ...styles.copyBtn,\r\n color: copiedField === f.key ? '#34d399' : '#a5b4fc',\r\n borderColor: copiedField === f.key ? '#34d399' : '#2a2a4a',\r\n }}\r\n >\r\n {copiedField === f.key ? 'Copied!' : truncate(f.value, 8, 8)}\r\n </button>\r\n ) : (\r\n <span style={styles.fieldValue}>{f.value}</span>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n function renderSecurityTab() {\r\n return (\r\n <div style={styles.securityTab}>\r\n <div style={styles.fieldList}>\r\n <div style={styles.field}>\r\n <span style={styles.fieldLabel}>Recovery</span>\r\n <span style={{ ...styles.fieldValue, color: '#34d399' }}>Protected</span>\r\n </div>\r\n <div style={styles.field}>\r\n <span style={styles.fieldLabel}>Method</span>\r\n <span style={styles.fieldValue}>Google ({wallet!.email})</span>\r\n </div>\r\n </div>\r\n <button onClick={handleDisconnect} style={styles.disconnectBtn}>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\r\n <polyline points=\"16 17 21 12 16 7\" />\r\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\r\n </svg>\r\n Disconnect\r\n </button>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nfunction identiconColor(address: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < address.length; i++) {\r\n hash = address.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n return `hsl(${Math.abs(hash) % 360}, 65%, 55%)`;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Styles\r\n// ---------------------------------------------------------------------------\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n overlay: {\r\n position: 'fixed',\r\n inset: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\r\n backdropFilter: 'blur(4px)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 99999,\r\n padding: '1rem',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n panel: {\r\n backgroundColor: '#0f0f1e',\r\n borderRadius: '20px',\r\n border: '1px solid #2a2a4a',\r\n width: '100%',\r\n maxWidth: '420px',\r\n maxHeight: '85vh',\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n overflow: 'hidden',\r\n },\r\n header: {\r\n position: 'relative' as const,\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n padding: '1.5rem 1.5rem 1rem',\r\n background: 'linear-gradient(180deg, #1a1a3a 0%, #0f0f1e 100%)',\r\n },\r\n closeBtn: {\r\n position: 'absolute' as const,\r\n top: '1rem',\r\n right: '1rem',\r\n background: 'none',\r\n border: 'none',\r\n color: '#64748b',\r\n cursor: 'pointer',\r\n padding: '4px',\r\n },\r\n identicon: {\r\n width: '48px',\r\n height: '48px',\r\n borderRadius: '50%',\r\n marginBottom: '0.5rem',\r\n },\r\n headerAddr: {\r\n fontFamily: 'monospace',\r\n fontSize: '0.8rem',\r\n color: '#8b8ba7',\r\n margin: '0 0 0.25rem',\r\n },\r\n headerBalance: {\r\n fontSize: '1.75rem',\r\n fontWeight: 700,\r\n color: '#ffffff',\r\n margin: 0,\r\n },\r\n headerCurrency: {\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n color: '#8b8ba7',\r\n },\r\n tabBar: {\r\n display: 'flex',\r\n borderBottom: '1px solid #2a2a4a',\r\n padding: '0 0.5rem',\r\n },\r\n tab: {\r\n flex: 1,\r\n padding: '0.75rem 0.5rem',\r\n background: 'none',\r\n border: 'none',\r\n borderBottom: '2px solid transparent',\r\n color: '#64748b',\r\n fontSize: '0.8rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'color 0.2s, border-color 0.2s',\r\n borderRadius: 0,\r\n },\r\n tabActive: {\r\n color: '#e2e8f0',\r\n borderBottomColor: '#667eea',\r\n },\r\n content: {\r\n flex: 1,\r\n overflowY: 'auto' as const,\r\n padding: '1rem 1.25rem 1.25rem',\r\n },\r\n // Wallet tab\r\n walletTab: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '0.75rem',\r\n },\r\n formGroup: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '0.3rem',\r\n },\r\n formLabel: {\r\n color: '#8b8ba7',\r\n fontSize: '0.75rem',\r\n fontWeight: 500,\r\n },\r\n formInput: {\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '8px',\r\n padding: '0.65rem 0.75rem',\r\n color: '#e2e8f0',\r\n fontSize: '0.9rem',\r\n outline: 'none',\r\n width: '100%',\r\n boxSizing: 'border-box' as const,\r\n fontFamily: 'inherit',\r\n },\r\n primaryBtn: {\r\n backgroundColor: '#667eea',\r\n color: '#fff',\r\n border: 'none',\r\n borderRadius: '10px',\r\n padding: '0.75rem',\r\n fontSize: '0.95rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n width: '100%',\r\n marginTop: '0.25rem',\r\n },\r\n receiveBtn: {\r\n backgroundColor: 'transparent',\r\n color: '#a5b4fc',\r\n border: '1.5px solid #4a4a7a',\r\n borderRadius: '10px',\r\n padding: '0.65rem',\r\n fontSize: '0.85rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n width: '100%',\r\n },\r\n error: {\r\n color: '#f87171',\r\n fontSize: '0.8rem',\r\n margin: 0,\r\n padding: '0.4rem 0.6rem',\r\n backgroundColor: 'rgba(248, 113, 113, 0.1)',\r\n borderRadius: '6px',\r\n },\r\n centeredCol: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n gap: '0.5rem',\r\n padding: '1rem 0',\r\n },\r\n // Account tab\r\n fieldList: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n },\r\n field: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '0.6rem 0',\r\n borderBottom: '1px solid #1a1a2e',\r\n },\r\n fieldLabel: {\r\n color: '#8b8ba7',\r\n fontSize: '0.8rem',\r\n },\r\n fieldValue: {\r\n color: '#e2e8f0',\r\n fontSize: '0.8rem',\r\n fontWeight: 500,\r\n },\r\n copyBtn: {\r\n background: 'none',\r\n border: '1px solid #2a2a4a',\r\n color: '#a5b4fc',\r\n padding: '0.2rem 0.5rem',\r\n borderRadius: '4px',\r\n fontSize: '0.72rem',\r\n fontFamily: 'monospace',\r\n cursor: 'pointer',\r\n transition: 'color 0.2s, border-color 0.2s',\r\n },\r\n // Security tab\r\n securityTab: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '1rem',\r\n },\r\n disconnectBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.5rem',\r\n width: '100%',\r\n padding: '0.65rem',\r\n backgroundColor: 'transparent',\r\n color: '#f87171',\r\n border: '1px solid rgba(248, 113, 113, 0.2)',\r\n borderRadius: '10px',\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n },\r\n emptyText: {\r\n color: '#64748b',\r\n fontSize: '0.85rem',\r\n textAlign: 'center' as const,\r\n padding: '2rem 0',\r\n },\r\n};\r\n","/**\r\n * ConnectButton.tsx - SDK drop-in wallet button.\r\n *\r\n * Renders a dynamic button that:\r\n * - Shows \"Connect Wallet\" when disconnected → opens ConnectModal\r\n * - Shows a pill with address + balance when connected → opens WalletPanel\r\n * - Handles loading/creating states with spinners\r\n *\r\n * Usage:\r\n * <ConnectButton />\r\n */\r\n\r\nimport { useState } from 'react';\r\nimport { useAccesly } from '../hooks/useAccesly';\r\nimport { ConnectModal } from './ConnectModal';\r\nimport { WalletPanel } from './WalletPanel';\r\n\r\nexport function ConnectButton() {\r\n const { wallet, balance, loading, creating, connect } = useAccesly();\r\n const [showModal, setShowModal] = useState(false);\r\n const [showPanel, setShowPanel] = useState(false);\r\n\r\n // Initial auth check\r\n if (loading) {\r\n return (\r\n <div style={styles.pillLoading}>\r\n <div style={styles.spinner} />\r\n </div>\r\n );\r\n }\r\n\r\n // Not connected\r\n if (!wallet) {\r\n return (\r\n <>\r\n <button\r\n onClick={() => setShowModal(true)}\r\n style={creating ? styles.pill : styles.connectBtn}\r\n disabled={creating}\r\n >\r\n {creating ? (\r\n <>\r\n <div style={styles.spinnerSmall} />\r\n <span style={styles.pillText}>Creating wallet...</span>\r\n </>\r\n ) : (\r\n <>\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5\" />\r\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\r\n </svg>\r\n Connect Wallet\r\n </>\r\n )}\r\n </button>\r\n\r\n {showModal && (\r\n <ConnectModal\r\n onClose={() => setShowModal(false)}\r\n onConnect={async () => {\r\n setShowModal(false);\r\n await connect();\r\n }}\r\n />\r\n )}\r\n </>\r\n );\r\n }\r\n\r\n // Connected - show pill\r\n const addr = wallet.stellarAddress;\r\n const truncated = `${addr.slice(0, 4)}...${addr.slice(-4)}`;\r\n const balanceText = balance\r\n ? `${parseFloat(balance).toFixed(2)} XLM`\r\n : '--- XLM';\r\n const color = identiconColor(addr);\r\n\r\n return (\r\n <>\r\n <button onClick={() => setShowPanel(true)} style={styles.pill}>\r\n <div style={{ ...styles.identicon, backgroundColor: color }} />\r\n <span style={styles.pillAddr}>{truncated}</span>\r\n <span style={styles.divider} />\r\n <span style={styles.pillBalance}>{balanceText}</span>\r\n </button>\r\n\r\n {showPanel && <WalletPanel onClose={() => setShowPanel(false)} />}\r\n </>\r\n );\r\n}\r\n\r\n/** Generate a deterministic HSL color from a Stellar address */\r\nfunction identiconColor(address: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < address.length; i++) {\r\n hash = address.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n return `hsl(${Math.abs(hash) % 360}, 65%, 55%)`;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Inline styles (zero CSS dependencies)\r\n// ---------------------------------------------------------------------------\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n connectBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.6rem',\r\n padding: '0.85rem 1.75rem',\r\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\r\n color: '#fff',\r\n border: 'none',\r\n borderRadius: '12px',\r\n fontSize: '1rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'transform 0.15s, box-shadow 0.15s',\r\n boxShadow: '0 4px 15px rgba(102, 126, 234, 0.4)',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n pill: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.5rem',\r\n padding: '0.5rem 0.85rem',\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '50px',\r\n cursor: 'pointer',\r\n transition: 'border-color 0.2s, box-shadow 0.2s',\r\n color: '#e2e8f0',\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n pillLoading: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: '0.5rem 1.5rem',\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '50px',\r\n height: '42px',\r\n },\r\n identicon: {\r\n width: '24px',\r\n height: '24px',\r\n borderRadius: '50%',\r\n flexShrink: 0,\r\n },\r\n pillAddr: {\r\n fontFamily: 'monospace',\r\n fontSize: '0.8rem',\r\n color: '#e2e8f0',\r\n },\r\n divider: {\r\n width: '1px',\r\n height: '16px',\r\n backgroundColor: '#3a3a5a',\r\n },\r\n pillBalance: {\r\n fontSize: '0.8rem',\r\n color: '#8b8ba7',\r\n fontWeight: 500,\r\n },\r\n pillText: {\r\n fontSize: '0.8rem',\r\n color: '#8b8ba7',\r\n },\r\n spinner: {\r\n width: '20px',\r\n height: '20px',\r\n border: '2px solid #2a2a4a',\r\n borderTop: '2px solid #667eea',\r\n borderRadius: '50%',\r\n animation: 'accesly-spin 1s linear infinite',\r\n },\r\n spinnerSmall: {\r\n width: '16px',\r\n height: '16px',\r\n border: '2px solid #2a2a4a',\r\n borderTop: '2px solid #667eea',\r\n borderRadius: '50%',\r\n animation: 'accesly-spin 1s linear infinite',\r\n flexShrink: 0,\r\n },\r\n};\r\n","/**\r\n * Accesly SDK - Account abstraction wallet for Stellar.\r\n *\r\n * Quick start:\r\n *\r\n * import { AcceslyProvider, ConnectButton } from 'accesly';\r\n *\r\n * function App() {\r\n * return (\r\n * <AcceslyProvider appId=\"acc_xxxxx\">\r\n * <ConnectButton />\r\n * </AcceslyProvider>\r\n * );\r\n * }\r\n *\r\n * For custom UI, use the useAccesly hook:\r\n *\r\n * import { useAccesly } from 'accesly';\r\n *\r\n * function MyWallet() {\r\n * const { wallet, balance, connect, disconnect, sendPayment } = useAccesly();\r\n * // Build your own UI\r\n * }\r\n */\r\n\r\n// --- CSS keyframes injection ---\r\n// Since the SDK uses inline styles, we inject required keyframes once\r\nif (typeof document !== 'undefined') {\r\n const STYLE_ID = 'accesly-keyframes';\r\n if (!document.getElementById(STYLE_ID)) {\r\n const style = document.createElement('style');\r\n style.id = STYLE_ID;\r\n style.textContent = `\r\n @keyframes accesly-spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n}\r\n\r\n// --- Components ---\r\nexport { AcceslyProvider } from './AcceslyProvider';\r\nexport { ConnectButton } from './components/ConnectButton';\r\n\r\n// --- Hooks ---\r\nexport { useAccesly } from './hooks/useAccesly';\r\n\r\n// --- Types ---\r\nexport type {\r\n AcceslyConfig,\r\n WalletInfo,\r\n TransactionRecord,\r\n SendPaymentParams,\r\n AcceslyContextType,\r\n} from './types';\r\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,6 @@
1
+ import {createContext,useMemo,useState,useEffect,useCallback,useContext}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var O="accesly_auth",ce="https://accesly.vercel.app",U=class{constructor(e,r){this.appId=e,this.baseUrl=r||ce;}setTokens(e){localStorage.setItem(O,JSON.stringify(e));}getTokens(){let e=localStorage.getItem(O);if(!e)return null;try{return JSON.parse(e)}catch{return null}}clearTokens(){localStorage.removeItem(O);}hasSession(){return this.getTokens()!==null}async request(e,r={},o=true){let d=this.getTokens(),h={"Content-Type":"application/json","x-accesly-key":this.appId,...d?{Authorization:`Bearer ${d.accessToken}`}:{}},i=await fetch(`${this.baseUrl}${e}`,{...r,headers:{...h,...r.headers}});if(i.status===401&&o&&d?.refreshToken){if(await this.refreshToken(d.refreshToken))return this.request(e,r,false);throw this.clearTokens(),new Error("Session expired. Please reconnect.")}if(!i.ok){let m=await i.json().catch(()=>({}));throw new Error(m.error||m.details||`Request failed: ${i.status}`)}return i.json()}async refreshToken(e){try{let r=await fetch(`${this.baseUrl}/api/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e})});if(!r.ok)return !1;let o=await r.json(),d=this.getTokens();return d&&this.setTokens({...d,accessToken:o.accessToken,refreshToken:o.refreshToken,expiresAt:o.expiresAt}),!0}catch{return false}}async getWalletInfo(){return this.request("/api/wallet/info")}async createWallet(){return this.request("/api/wallet/create",{method:"POST"})}async getBalance(){return this.request("/api/wallet/balance")}async sendPayment(e){return this.request("/api/wallet/send",{method:"POST",body:JSON.stringify(e)})}async getTransactions(e=20){return this.request(`/api/wallet/transactions?limit=${e}`)}async rotateKeys(){return this.request("/api/wallet/rotate",{method:"POST"})}};function X(a,e){return new Promise((r,o)=>{let d=window.screenX+(window.innerWidth-450)/2,h=window.screenY+(window.innerHeight-600)/2,i=window.open(`${a}/auth/popup?appId=${e}`,"accesly-auth",`width=450,height=600,left=${d},top=${h},toolbar=no,menubar=no`);if(!i){o(new Error("Failed to open popup. Please allow popups for this site."));return}function m(u){u.origin.includes(new URL(a).host)&&(u.data?.type==="accesly-auth-success"&&(p(),r(u.data.payload)),u.data?.type==="accesly-auth-error"&&(p(),o(new Error(u.data.error||"Authentication failed"))));}let b=setInterval(()=>{i.closed&&(p(),o(new Error("Authentication cancelled")));},500);function p(){window.removeEventListener("message",m),clearInterval(b);}window.addEventListener("message",m);})}var _=createContext(null),ue="https://accesly.vercel.app";function ye({children:a,...e}){let r=e.baseUrl||ue,o=useMemo(()=>new U(e.appId,r),[e.appId,r]),[d,h]=useState(null),[i,m]=useState(null),[b,p]=useState(true),[u,C]=useState(false),[P,v]=useState(null);useEffect(()=>{o.hasSession()?S():p(false);},[o]),useEffect(()=>{if(!d)return;T();let l=setInterval(T,15e3);return ()=>clearInterval(l)},[d]);async function S(){v(null);try{let l=await o.getWalletInfo();h(l.wallet),e.onConnect?.(l.wallet);}catch(l){if(l.message?.includes("404")||l.message?.includes("not found")){await L();return}l.message?.includes("Session expired")&&(o.clearTokens(),h(null)),v(l.message);}finally{p(false);}}async function L(){C(true),v(null);try{await o.createWallet();let l=await o.getWalletInfo();h(l.wallet),e.onConnect?.(l.wallet);}catch(l){v(l.message);}finally{C(false),p(false);}}async function T(){try{let A=(await o.getBalance()).balances.find(D=>D.asset==="native");m(A?.balance||"0");}catch{}}let M=useCallback(async()=>{v(null);try{let l=await X(r,e.appId);o.setTokens(l),p(!0),await S();}catch(l){l.message!=="Authentication cancelled"&&v(l.message);}},[r,e.appId,o]),E=useCallback(()=>{o.clearTokens(),h(null),m(null),v(null),e.onDisconnect?.();},[o,e.onDisconnect]),F=useCallback(async l=>o.sendPayment(l),[o]),$=useCallback(async()=>{await T();},[o]),G=useCallback(async()=>{await S();},[o]),q={loading:b,creating:u,wallet:d,balance:i,error:P,connect:M,disconnect:E,sendPayment:F,refreshBalance:$,refreshWallet:G};return jsx(_.Provider,{value:q,children:a})}function R(){let a=useContext(_);if(!a)throw new Error('useAccesly must be used within an <AcceslyProvider>. Wrap your app with <AcceslyProvider appId="acc_xxxxx">.');return a}function K({onClose:a,onConnect:e}){return jsx("div",{style:w.overlay,onClick:a,children:jsxs("div",{style:w.modal,onClick:r=>r.stopPropagation(),children:[jsx("button",{onClick:a,style:w.closeBtn,children:jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}),jsx("div",{style:w.iconWrapper,children:jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"#667eea",strokeWidth:"1.5",children:[jsx("path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5"}),jsx("path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"})]})}),jsx("h2",{style:w.title,children:"Connect to Accesly"}),jsx("p",{style:w.subtitle,children:"Choose how you want to connect"}),jsxs("button",{onClick:e,style:w.googleBtn,children:[jsxs("svg",{style:w.googleIcon,viewBox:"0 0 24 24",children:[jsx("path",{d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z",fill:"#4285F4"}),jsx("path",{d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z",fill:"#34A853"}),jsx("path",{d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z",fill:"#FBBC05"}),jsx("path",{d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z",fill:"#EA4335"})]}),"Continue with Google"]}),jsx("p",{style:w.footer,children:"Powered by Accesly"})]})})}var w={overlay:{position:"fixed",inset:0,backgroundColor:"rgba(0, 0, 0, 0.6)",backdropFilter:"blur(4px)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:99999,padding:"1rem",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},modal:{position:"relative",backgroundColor:"#141428",borderRadius:"20px",border:"1px solid #2a2a4a",padding:"2rem",width:"100%",maxWidth:"380px",textAlign:"center"},closeBtn:{position:"absolute",top:"1rem",right:"1rem",background:"none",border:"none",color:"#64748b",cursor:"pointer",padding:"4px"},iconWrapper:{width:"56px",height:"56px",borderRadius:"16px",backgroundColor:"rgba(102, 126, 234, 0.1)",border:"1px solid rgba(102, 126, 234, 0.2)",display:"flex",alignItems:"center",justifyContent:"center",margin:"0 auto 1rem"},title:{fontSize:"1.3rem",fontWeight:700,color:"#e2e8f0",margin:"0 0 0.25rem"},subtitle:{color:"#64748b",fontSize:"0.85rem",margin:"0 0 1.5rem"},googleBtn:{display:"flex",alignItems:"center",justifyContent:"center",gap:"0.75rem",padding:"0.85rem 1.5rem",backgroundColor:"#1a1a2e",color:"#e2e8f0",border:"1px solid #2a2a4a",borderRadius:"12px",fontSize:"0.95rem",fontWeight:500,cursor:"pointer",width:"100%",marginBottom:"1.25rem"},googleIcon:{width:"20px",height:"20px",flexShrink:0},footer:{color:"#475569",fontSize:"0.7rem",margin:0}};function Y({onClose:a}){let{wallet:e,balance:r,disconnect:o,sendPayment:d,refreshBalance:h}=R(),[i,m]=useState("wallet"),[b,p]=useState(""),[u,C]=useState(""),[P,v]=useState(""),[S,L]=useState(false),[T,M]=useState(null),[E,F]=useState(null),[$,G]=useState([]),[q,l]=useState(false),[A,D]=useState(null);if(useEffect(()=>{i==="activity"&&$.length===0&&Z();},[i]),!e)return null;async function Z(){l(true);try{let s=await fetch("/api/wallet/transactions?limit=20");}catch{}finally{l(false);}}async function ee(){if(!(!b||!u)){L(true),F(null);try{let s=await d({destination:b,amount:u,memo:P||void 0});M(s.txHash),h();}catch(s){F(s.message);}finally{L(false);}}}function V(s,y=6,N=6){return s.length<=y+N+3?s:`${s.slice(0,y)}...${s.slice(-N)}`}async function j(s,y){await navigator.clipboard.writeText(s),D(y),setTimeout(()=>D(null),1500);}function te(){o(),a();}let ne=r?parseFloat(r).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}):"---",oe=he(e.stellarAddress),re=[{key:"wallet",label:"Wallet"},{key:"activity",label:"Activity"},{key:"account",label:"Account"},{key:"security",label:"Security"}];return jsx("div",{style:t.overlay,onClick:a,children:jsxs("div",{style:t.panel,onClick:s=>s.stopPropagation(),children:[jsxs("div",{style:t.header,children:[jsx("button",{onClick:a,style:t.closeBtn,children:jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}),jsx("div",{style:{...t.identicon,backgroundColor:oe}}),jsx("p",{style:t.headerAddr,children:V(e.stellarAddress,8,8)}),jsxs("p",{style:t.headerBalance,children:[ne," ",jsx("span",{style:t.headerCurrency,children:"XLM"})]})]}),jsx("div",{style:t.tabBar,children:re.map(s=>jsx("button",{onClick:()=>m(s.key),style:{...t.tab,...i===s.key?t.tabActive:{}},children:s.label},s.key))}),jsxs("div",{style:t.content,children:[i==="wallet"&&ae(),i==="activity"&&se(),i==="account"&&le(),i==="security"&&ie()]})]})});function ae(){return T?jsxs("div",{style:t.centeredCol,children:[jsxs("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"#34d399",strokeWidth:"2",children:[jsx("circle",{cx:"12",cy:"12",r:"10"}),jsx("polyline",{points:"8 12 11 15 16 9"})]}),jsx("p",{style:{color:"#34d399",fontWeight:600,margin:"0.5rem 0"},children:"Payment Sent"}),jsxs("p",{style:{color:"#64748b",fontSize:"0.75rem",fontFamily:"monospace"},children:[T.slice(0,12),"...",T.slice(-12)]}),jsx("button",{onClick:()=>{M(null),p(""),C(""),v("");},style:t.primaryBtn,children:"Done"})]}):jsxs("div",{style:t.walletTab,children:[jsxs("div",{style:t.formGroup,children:[jsx("label",{style:t.formLabel,children:"Destination"}),jsx("input",{type:"text",placeholder:"G...",value:b,onChange:s=>p(s.target.value),maxLength:56,style:t.formInput})]}),jsxs("div",{style:t.formGroup,children:[jsx("label",{style:t.formLabel,children:"Amount (XLM)"}),jsx("input",{type:"number",placeholder:"0.00",value:u,onChange:s=>C(s.target.value),min:"0.0000001",step:"any",style:t.formInput})]}),jsxs("div",{style:t.formGroup,children:[jsx("label",{style:t.formLabel,children:"Memo (optional)"}),jsx("input",{type:"text",placeholder:"What is this for?",value:P,onChange:s=>v(s.target.value),maxLength:28,style:t.formInput})]}),E&&jsx("p",{style:t.error,children:E}),jsx("button",{onClick:ee,disabled:S||!b||!u,style:{...t.primaryBtn,opacity:S||!b||!u?.5:1},children:S?"Sending...":"Send Payment"}),jsx("button",{onClick:()=>j(e.stellarAddress,"receive"),style:t.receiveBtn,children:A==="receive"?"Address Copied!":"Copy Address to Receive"})]})}function se(){return jsx("p",{style:t.emptyText,children:"Transaction history coming soon."})}function le(){let s=[{label:"Email",value:e.email,key:"email"},{label:"Contract ID",value:e.contractId,key:"contract",copy:true},{label:"Stellar Address",value:e.stellarAddress,key:"stellar",copy:true},{label:"Public Key",value:e.publicKey,key:"pubkey",copy:true},{label:"Created",value:new Date(e.createdAt).toLocaleDateString(),key:"created"}];return jsx("div",{style:t.fieldList,children:s.map(y=>jsxs("div",{style:t.field,children:[jsx("span",{style:t.fieldLabel,children:y.label}),y.copy?jsx("button",{onClick:()=>j(y.value,y.key),style:{...t.copyBtn,color:A===y.key?"#34d399":"#a5b4fc",borderColor:A===y.key?"#34d399":"#2a2a4a"},children:A===y.key?"Copied!":V(y.value,8,8)}):jsx("span",{style:t.fieldValue,children:y.value})]},y.key))})}function ie(){return jsxs("div",{style:t.securityTab,children:[jsxs("div",{style:t.fieldList,children:[jsxs("div",{style:t.field,children:[jsx("span",{style:t.fieldLabel,children:"Recovery"}),jsx("span",{style:{...t.fieldValue,color:"#34d399"},children:"Protected"})]}),jsxs("div",{style:t.field,children:[jsx("span",{style:t.fieldLabel,children:"Method"}),jsxs("span",{style:t.fieldValue,children:["Google (",e.email,")"]})]})]}),jsxs("button",{onClick:te,style:t.disconnectBtn,children:[jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),jsx("polyline",{points:"16 17 21 12 16 7"}),jsx("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]}),"Disconnect"]})]})}}function he(a){let e=0;for(let r=0;r<a.length;r++)e=a.charCodeAt(r)+((e<<5)-e);return `hsl(${Math.abs(e)%360}, 65%, 55%)`}var t={overlay:{position:"fixed",inset:0,backgroundColor:"rgba(0, 0, 0, 0.6)",backdropFilter:"blur(4px)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:99999,padding:"1rem",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},panel:{backgroundColor:"#0f0f1e",borderRadius:"20px",border:"1px solid #2a2a4a",width:"100%",maxWidth:"420px",maxHeight:"85vh",display:"flex",flexDirection:"column",overflow:"hidden"},header:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",padding:"1.5rem 1.5rem 1rem",background:"linear-gradient(180deg, #1a1a3a 0%, #0f0f1e 100%)"},closeBtn:{position:"absolute",top:"1rem",right:"1rem",background:"none",border:"none",color:"#64748b",cursor:"pointer",padding:"4px"},identicon:{width:"48px",height:"48px",borderRadius:"50%",marginBottom:"0.5rem"},headerAddr:{fontFamily:"monospace",fontSize:"0.8rem",color:"#8b8ba7",margin:"0 0 0.25rem"},headerBalance:{fontSize:"1.75rem",fontWeight:700,color:"#ffffff",margin:0},headerCurrency:{fontSize:"0.85rem",fontWeight:500,color:"#8b8ba7"},tabBar:{display:"flex",borderBottom:"1px solid #2a2a4a",padding:"0 0.5rem"},tab:{flex:1,padding:"0.75rem 0.5rem",background:"none",border:"none",borderBottom:"2px solid transparent",color:"#64748b",fontSize:"0.8rem",fontWeight:500,cursor:"pointer",transition:"color 0.2s, border-color 0.2s",borderRadius:0},tabActive:{color:"#e2e8f0",borderBottomColor:"#667eea"},content:{flex:1,overflowY:"auto",padding:"1rem 1.25rem 1.25rem"},walletTab:{display:"flex",flexDirection:"column",gap:"0.75rem"},formGroup:{display:"flex",flexDirection:"column",gap:"0.3rem"},formLabel:{color:"#8b8ba7",fontSize:"0.75rem",fontWeight:500},formInput:{backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"8px",padding:"0.65rem 0.75rem",color:"#e2e8f0",fontSize:"0.9rem",outline:"none",width:"100%",boxSizing:"border-box",fontFamily:"inherit"},primaryBtn:{backgroundColor:"#667eea",color:"#fff",border:"none",borderRadius:"10px",padding:"0.75rem",fontSize:"0.95rem",fontWeight:600,cursor:"pointer",width:"100%",marginTop:"0.25rem"},receiveBtn:{backgroundColor:"transparent",color:"#a5b4fc",border:"1.5px solid #4a4a7a",borderRadius:"10px",padding:"0.65rem",fontSize:"0.85rem",fontWeight:600,cursor:"pointer",width:"100%"},error:{color:"#f87171",fontSize:"0.8rem",margin:0,padding:"0.4rem 0.6rem",backgroundColor:"rgba(248, 113, 113, 0.1)",borderRadius:"6px"},centeredCol:{display:"flex",flexDirection:"column",alignItems:"center",gap:"0.5rem",padding:"1rem 0"},fieldList:{display:"flex",flexDirection:"column"},field:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"0.6rem 0",borderBottom:"1px solid #1a1a2e"},fieldLabel:{color:"#8b8ba7",fontSize:"0.8rem"},fieldValue:{color:"#e2e8f0",fontSize:"0.8rem",fontWeight:500},copyBtn:{background:"none",border:"1px solid #2a2a4a",color:"#a5b4fc",padding:"0.2rem 0.5rem",borderRadius:"4px",fontSize:"0.72rem",fontFamily:"monospace",cursor:"pointer",transition:"color 0.2s, border-color 0.2s"},securityTab:{display:"flex",flexDirection:"column",gap:"1rem"},disconnectBtn:{display:"flex",alignItems:"center",justifyContent:"center",gap:"0.5rem",width:"100%",padding:"0.65rem",backgroundColor:"transparent",color:"#f87171",border:"1px solid rgba(248, 113, 113, 0.2)",borderRadius:"10px",fontSize:"0.85rem",fontWeight:500,cursor:"pointer"},emptyText:{color:"#64748b",fontSize:"0.85rem",textAlign:"center",padding:"2rem 0"}};function be(){let{wallet:a,balance:e,loading:r,creating:o,connect:d}=R(),[h,i]=useState(false),[m,b]=useState(false);if(r)return jsx("div",{style:x.pillLoading,children:jsx("div",{style:x.spinner})});if(!a)return jsxs(Fragment,{children:[jsx("button",{onClick:()=>i(true),style:o?x.pill:x.connectBtn,disabled:o,children:o?jsxs(Fragment,{children:[jsx("div",{style:x.spinnerSmall}),jsx("span",{style:x.pillText,children:"Creating wallet..."})]}):jsxs(Fragment,{children:[jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5"}),jsx("path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"})]}),"Connect Wallet"]})}),h&&jsx(K,{onClose:()=>i(false),onConnect:async()=>{i(false),await d();}})]});let p=a.stellarAddress,u=`${p.slice(0,4)}...${p.slice(-4)}`,C=e?`${parseFloat(e).toFixed(2)} XLM`:"--- XLM",P=xe(p);return jsxs(Fragment,{children:[jsxs("button",{onClick:()=>b(true),style:x.pill,children:[jsx("div",{style:{...x.identicon,backgroundColor:P}}),jsx("span",{style:x.pillAddr,children:u}),jsx("span",{style:x.divider}),jsx("span",{style:x.pillBalance,children:C})]}),m&&jsx(Y,{onClose:()=>b(false)})]})}function xe(a){let e=0;for(let r=0;r<a.length;r++)e=a.charCodeAt(r)+((e<<5)-e);return `hsl(${Math.abs(e)%360}, 65%, 55%)`}var x={connectBtn:{display:"flex",alignItems:"center",gap:"0.6rem",padding:"0.85rem 1.75rem",background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)",color:"#fff",border:"none",borderRadius:"12px",fontSize:"1rem",fontWeight:600,cursor:"pointer",transition:"transform 0.15s, box-shadow 0.15s",boxShadow:"0 4px 15px rgba(102, 126, 234, 0.4)",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},pill:{display:"flex",alignItems:"center",gap:"0.5rem",padding:"0.5rem 0.85rem",backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"50px",cursor:"pointer",transition:"border-color 0.2s, box-shadow 0.2s",color:"#e2e8f0",fontSize:"0.85rem",fontWeight:500,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},pillLoading:{display:"flex",alignItems:"center",justifyContent:"center",padding:"0.5rem 1.5rem",backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"50px",height:"42px"},identicon:{width:"24px",height:"24px",borderRadius:"50%",flexShrink:0},pillAddr:{fontFamily:"monospace",fontSize:"0.8rem",color:"#e2e8f0"},divider:{width:"1px",height:"16px",backgroundColor:"#3a3a5a"},pillBalance:{fontSize:"0.8rem",color:"#8b8ba7",fontWeight:500},pillText:{fontSize:"0.8rem",color:"#8b8ba7"},spinner:{width:"20px",height:"20px",border:"2px solid #2a2a4a",borderTop:"2px solid #667eea",borderRadius:"50%",animation:"accesly-spin 1s linear infinite"},spinnerSmall:{width:"16px",height:"16px",border:"2px solid #2a2a4a",borderTop:"2px solid #667eea",borderRadius:"50%",animation:"accesly-spin 1s linear infinite",flexShrink:0}};if(typeof document<"u"){let a="accesly-keyframes";if(!document.getElementById(a)){let e=document.createElement("style");e.id=a,e.textContent=`
2
+ @keyframes accesly-spin {
3
+ to { transform: rotate(360deg); }
4
+ }
5
+ `,document.head.appendChild(e);}}export{ye as AcceslyProvider,be as ConnectButton,R as useAccesly};//# sourceMappingURL=index.mjs.map
6
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/AcceslyClient.ts","../src/auth.ts","../src/AcceslyProvider.tsx","../src/hooks/useAccesly.ts","../src/components/ConnectModal.tsx","../src/components/WalletPanel.tsx","../src/components/ConnectButton.tsx","../src/index.ts"],"names":["STORAGE_KEY","DEFAULT_BASE_URL","AcceslyClient","appId","baseUrl","tokens","raw","path","options","retry","headers","res","data","refreshToken","params","limit","openAuthPopup","resolve","reject","left","top","popup","handleMessage","event","cleanup","pollClosed","AcceslyContext","createContext","AcceslyProvider","children","config","client","useMemo","wallet","setWallet","useState","balance","setBalance","loading","setLoading","creating","setCreating","error","setError","useEffect","loadWallet","fetchBalance","interval","err","createWallet","native","b","connect","useCallback","disconnect","sendPayment","refreshBalance","refreshWallet","contextValue","jsx","useAccesly","context","useContext","ConnectModal","onClose","onConnect","styles","jsxs","e","WalletPanel","activeTab","setActiveTab","sendDest","setSendDest","sendAmount","setSendAmount","sendMemo","setSendMemo","sending","setSending","sendResult","setSendResult","sendError","setSendError","transactions","setTransactions","txLoading","setTxLoading","copiedField","setCopiedField","loadTransactions","handleSend","result","truncate","addr","start","end","copyToClipboard","text","field","handleDisconnect","formattedBalance","idColor","identiconColor","tabs","tab","renderWalletTab","renderActivityTab","renderAccountTab","renderSecurityTab","fields","f","address","hash","i","ConnectButton","showModal","setShowModal","showPanel","setShowPanel","Fragment","truncated","balanceText","color","STYLE_ID","style"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * AcceslyClient.ts - HTTP client for the Accesly backend API.\r\n *\r\n * Handles:\r\n * - All wallet API calls (balance, send, create, etc.)\r\n * - Automatic token refresh on 401 responses\r\n * - API key injection in every request\r\n */\r\n\r\nimport type { WalletInfo, TransactionRecord, SendPaymentParams, AuthTokens } from './types';\r\n\r\nconst STORAGE_KEY = 'accesly_auth';\r\nconst DEFAULT_BASE_URL = 'https://accesly.vercel.app';\r\n\r\nexport class AcceslyClient {\r\n private baseUrl: string;\r\n private appId: string;\r\n\r\n constructor(appId: string, baseUrl?: string) {\r\n this.appId = appId;\r\n this.baseUrl = baseUrl || DEFAULT_BASE_URL;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Token management (stored in localStorage)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Save auth tokens to localStorage */\r\n setTokens(tokens: AuthTokens): void {\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify(tokens));\r\n }\r\n\r\n /** Get stored auth tokens */\r\n getTokens(): AuthTokens | null {\r\n const raw = localStorage.getItem(STORAGE_KEY);\r\n if (!raw) return null;\r\n try {\r\n return JSON.parse(raw) as AuthTokens;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /** Clear stored auth tokens */\r\n clearTokens(): void {\r\n localStorage.removeItem(STORAGE_KEY);\r\n }\r\n\r\n /** Check if we have a stored session */\r\n hasSession(): boolean {\r\n return this.getTokens() !== null;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // HTTP layer\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Make an authenticated request to the Accesly API.\r\n * Automatically adds the API key and auth token.\r\n * Retries once with a refreshed token on 401.\r\n */\r\n private async request<T>(\r\n path: string,\r\n options: RequestInit = {},\r\n retry = true\r\n ): Promise<T> {\r\n const tokens = this.getTokens();\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n 'x-accesly-key': this.appId,\r\n ...(tokens ? { Authorization: `Bearer ${tokens.accessToken}` } : {}),\r\n };\r\n\r\n const res = await fetch(`${this.baseUrl}${path}`, {\r\n ...options,\r\n headers: { ...headers, ...(options.headers as Record<string, string>) },\r\n });\r\n\r\n // If unauthorized, try to refresh the token once\r\n if (res.status === 401 && retry && tokens?.refreshToken) {\r\n const refreshed = await this.refreshToken(tokens.refreshToken);\r\n if (refreshed) {\r\n return this.request<T>(path, options, false);\r\n }\r\n // Refresh failed - clear tokens\r\n this.clearTokens();\r\n throw new Error('Session expired. Please reconnect.');\r\n }\r\n\r\n if (!res.ok) {\r\n const data = await res.json().catch(() => ({}));\r\n throw new Error(data.error || data.details || `Request failed: ${res.status}`);\r\n }\r\n\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** Refresh the access token using the refresh token */\r\n private async refreshToken(refreshToken: string): Promise<boolean> {\r\n try {\r\n const res = await fetch(`${this.baseUrl}/api/auth/refresh`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ refreshToken }),\r\n });\r\n\r\n if (!res.ok) return false;\r\n\r\n const data = await res.json();\r\n const tokens = this.getTokens();\r\n if (tokens) {\r\n this.setTokens({\r\n ...tokens,\r\n accessToken: data.accessToken,\r\n refreshToken: data.refreshToken,\r\n expiresAt: data.expiresAt,\r\n });\r\n }\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Wallet API methods\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Get wallet info for the authenticated user */\r\n async getWalletInfo(): Promise<{ wallet: WalletInfo }> {\r\n return this.request('/api/wallet/info');\r\n }\r\n\r\n /** Create a new wallet for the authenticated user */\r\n async createWallet(): Promise<{ wallet: WalletInfo }> {\r\n return this.request('/api/wallet/create', { method: 'POST' });\r\n }\r\n\r\n /** Get the wallet's balance */\r\n async getBalance(): Promise<{ balances: Array<{ asset: string; balance: string }> }> {\r\n return this.request('/api/wallet/balance');\r\n }\r\n\r\n /** Send a payment */\r\n async sendPayment(params: SendPaymentParams): Promise<{ txHash: string }> {\r\n return this.request('/api/wallet/send', {\r\n method: 'POST',\r\n body: JSON.stringify(params),\r\n });\r\n }\r\n\r\n /** Get transaction history */\r\n async getTransactions(limit = 20): Promise<{ transactions: TransactionRecord[] }> {\r\n return this.request(`/api/wallet/transactions?limit=${limit}`);\r\n }\r\n\r\n /** Rotate wallet keys */\r\n async rotateKeys(): Promise<{ newStellarAddress: string }> {\r\n return this.request('/api/wallet/rotate', { method: 'POST' });\r\n }\r\n}\r\n","/**\r\n * auth.ts - Popup-based OAuth authentication for the SDK.\r\n *\r\n * Opens a popup window pointing to the Accesly auth page.\r\n * The popup handles Google OAuth and sends the resulting tokens\r\n * back to this window via postMessage.\r\n */\r\n\r\nimport type { AuthTokens } from './types';\r\n\r\n/** Popup window dimensions */\r\nconst POPUP_WIDTH = 450;\r\nconst POPUP_HEIGHT = 600;\r\n\r\n/**\r\n * Open the Accesly auth popup and wait for the user to authenticate.\r\n * Returns the auth tokens on success, or throws on failure/cancellation.\r\n */\r\nexport function openAuthPopup(baseUrl: string, appId: string): Promise<AuthTokens> {\r\n return new Promise((resolve, reject) => {\r\n // Center the popup on screen\r\n const left = window.screenX + (window.innerWidth - POPUP_WIDTH) / 2;\r\n const top = window.screenY + (window.innerHeight - POPUP_HEIGHT) / 2;\r\n\r\n const popup = window.open(\r\n `${baseUrl}/auth/popup?appId=${appId}`,\r\n 'accesly-auth',\r\n `width=${POPUP_WIDTH},height=${POPUP_HEIGHT},left=${left},top=${top},toolbar=no,menubar=no`\r\n );\r\n\r\n if (!popup) {\r\n reject(new Error('Failed to open popup. Please allow popups for this site.'));\r\n return;\r\n }\r\n\r\n /** Handle messages from the popup */\r\n function handleMessage(event: MessageEvent) {\r\n // Only accept messages from the Accesly domain\r\n if (!event.origin.includes(new URL(baseUrl).host)) return;\r\n\r\n if (event.data?.type === 'accesly-auth-success') {\r\n cleanup();\r\n resolve(event.data.payload as AuthTokens);\r\n }\r\n\r\n if (event.data?.type === 'accesly-auth-error') {\r\n cleanup();\r\n reject(new Error(event.data.error || 'Authentication failed'));\r\n }\r\n }\r\n\r\n /** Detect if the user closed the popup manually */\r\n const pollClosed = setInterval(() => {\r\n if (popup.closed) {\r\n cleanup();\r\n reject(new Error('Authentication cancelled'));\r\n }\r\n }, 500);\r\n\r\n /** Remove all listeners and intervals */\r\n function cleanup() {\r\n window.removeEventListener('message', handleMessage);\r\n clearInterval(pollClosed);\r\n }\r\n\r\n window.addEventListener('message', handleMessage);\r\n });\r\n}\r\n","/**\r\n * AcceslyProvider.tsx - Main SDK provider component.\r\n *\r\n * Wraps the application and provides wallet state to all children.\r\n * Handles auth token management, wallet loading, and balance refresh.\r\n *\r\n * Usage:\r\n * <AcceslyProvider appId=\"acc_xxxxx\">\r\n * <App />\r\n * </AcceslyProvider>\r\n */\r\n\r\nimport {\r\n createContext,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n useMemo,\r\n type ReactNode,\r\n} from 'react';\r\nimport { AcceslyClient } from './AcceslyClient';\r\nimport { openAuthPopup } from './auth';\r\nimport type {\r\n AcceslyConfig,\r\n AcceslyContextType,\r\n WalletInfo,\r\n SendPaymentParams,\r\n} from './types';\r\n\r\n/** Internal context - use the useAccesly hook to access it */\r\nexport const AcceslyContext = createContext<AcceslyContextType | null>(null);\r\n\r\nconst DEFAULT_BASE_URL = 'https://accesly.vercel.app';\r\n\r\nexport function AcceslyProvider({\r\n children,\r\n ...config\r\n}: AcceslyConfig & { children: ReactNode }) {\r\n const baseUrl = config.baseUrl || DEFAULT_BASE_URL;\r\n\r\n // Create a stable client instance\r\n const client = useMemo(\r\n () => new AcceslyClient(config.appId, baseUrl),\r\n [config.appId, baseUrl]\r\n );\r\n\r\n const [wallet, setWallet] = useState<WalletInfo | null>(null);\r\n const [balance, setBalance] = useState<string | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [creating, setCreating] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n // --- Check for existing session on mount ---\r\n useEffect(() => {\r\n if (client.hasSession()) {\r\n loadWallet();\r\n } else {\r\n setLoading(false);\r\n }\r\n }, [client]);\r\n\r\n // --- Auto-refresh balance every 15s when connected ---\r\n useEffect(() => {\r\n if (!wallet) return;\r\n fetchBalance();\r\n const interval = setInterval(fetchBalance, 15000);\r\n return () => clearInterval(interval);\r\n }, [wallet]);\r\n\r\n /** Load wallet info from the backend. Creates wallet if first login. */\r\n async function loadWallet() {\r\n setError(null);\r\n try {\r\n const data = await client.getWalletInfo();\r\n setWallet(data.wallet);\r\n config.onConnect?.(data.wallet);\r\n } catch (err: any) {\r\n // If 404, create wallet (first login)\r\n if (err.message?.includes('404') || err.message?.includes('not found')) {\r\n await createWallet();\r\n return;\r\n }\r\n // If session expired, clear and let user reconnect\r\n if (err.message?.includes('Session expired')) {\r\n client.clearTokens();\r\n setWallet(null);\r\n }\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n /** Create a new wallet for the user */\r\n async function createWallet() {\r\n setCreating(true);\r\n setError(null);\r\n try {\r\n await client.createWallet();\r\n // Fetch the full wallet info after creation\r\n const data = await client.getWalletInfo();\r\n setWallet(data.wallet);\r\n config.onConnect?.(data.wallet);\r\n } catch (err: any) {\r\n setError(err.message);\r\n } finally {\r\n setCreating(false);\r\n setLoading(false);\r\n }\r\n }\r\n\r\n /** Fetch current XLM balance */\r\n async function fetchBalance() {\r\n try {\r\n const data = await client.getBalance();\r\n const native = data.balances.find((b) => b.asset === 'native');\r\n setBalance(native?.balance || '0');\r\n } catch {\r\n // Silently fail, keep previous balance\r\n }\r\n }\r\n\r\n /** Open auth popup, get tokens, load wallet */\r\n const connect = useCallback(async () => {\r\n setError(null);\r\n try {\r\n const tokens = await openAuthPopup(baseUrl, config.appId);\r\n client.setTokens(tokens);\r\n setLoading(true);\r\n await loadWallet();\r\n } catch (err: any) {\r\n if (err.message !== 'Authentication cancelled') {\r\n setError(err.message);\r\n }\r\n }\r\n }, [baseUrl, config.appId, client]);\r\n\r\n /** Disconnect: clear tokens and state */\r\n const disconnect = useCallback(() => {\r\n client.clearTokens();\r\n setWallet(null);\r\n setBalance(null);\r\n setError(null);\r\n config.onDisconnect?.();\r\n }, [client, config.onDisconnect]);\r\n\r\n /** Send a payment */\r\n const sendPayment = useCallback(\r\n async (params: SendPaymentParams) => {\r\n return client.sendPayment(params);\r\n },\r\n [client]\r\n );\r\n\r\n /** Refresh balance on demand */\r\n const refreshBalance = useCallback(async () => {\r\n await fetchBalance();\r\n }, [client]);\r\n\r\n /** Refresh wallet info on demand */\r\n const refreshWallet = useCallback(async () => {\r\n await loadWallet();\r\n }, [client]);\r\n\r\n const contextValue: AcceslyContextType = {\r\n loading,\r\n creating,\r\n wallet,\r\n balance,\r\n error,\r\n connect,\r\n disconnect,\r\n sendPayment,\r\n refreshBalance,\r\n refreshWallet,\r\n };\r\n\r\n return (\r\n <AcceslyContext.Provider value={contextValue}>\r\n {children}\r\n </AcceslyContext.Provider>\r\n );\r\n}\r\n","/**\r\n * useAccesly.ts - Public hook for accessing wallet state and actions.\r\n *\r\n * Usage:\r\n * const { wallet, balance, connect, disconnect, sendPayment } = useAccesly();\r\n *\r\n * Must be used within an <AcceslyProvider>.\r\n */\r\n\r\nimport { useContext } from 'react';\r\nimport { AcceslyContext } from '../AcceslyProvider';\r\nimport type { AcceslyContextType } from '../types';\r\n\r\nexport function useAccesly(): AcceslyContextType {\r\n const context = useContext(AcceslyContext);\r\n if (!context) {\r\n throw new Error(\r\n 'useAccesly must be used within an <AcceslyProvider>. ' +\r\n 'Wrap your app with <AcceslyProvider appId=\"acc_xxxxx\">.'\r\n );\r\n }\r\n return context;\r\n}\r\n","/**\r\n * ConnectModal.tsx - SDK login modal.\r\n *\r\n * Shows a centered modal with the Google login option.\r\n * When the user clicks \"Continue with Google\", triggers the\r\n * popup-based OAuth flow.\r\n */\r\n\r\ninterface ConnectModalProps {\r\n onClose: () => void;\r\n onConnect: () => void;\r\n}\r\n\r\nexport function ConnectModal({ onClose, onConnect }: ConnectModalProps) {\r\n return (\r\n <div style={styles.overlay} onClick={onClose}>\r\n <div style={styles.modal} onClick={(e) => e.stopPropagation()}>\r\n {/* Close button */}\r\n <button onClick={onClose} style={styles.closeBtn}>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Branding */}\r\n <div style={styles.iconWrapper}>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667eea\" strokeWidth=\"1.5\">\r\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5\" />\r\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\r\n </svg>\r\n </div>\r\n <h2 style={styles.title}>Connect to Accesly</h2>\r\n <p style={styles.subtitle}>Choose how you want to connect</p>\r\n\r\n {/* Google button */}\r\n <button onClick={onConnect} style={styles.googleBtn}>\r\n <svg style={styles.googleIcon} viewBox=\"0 0 24 24\">\r\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\" />\r\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\r\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\r\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\r\n </svg>\r\n Continue with Google\r\n </button>\r\n\r\n <p style={styles.footer}>\r\n Powered by Accesly\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n overlay: {\r\n position: 'fixed',\r\n inset: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\r\n backdropFilter: 'blur(4px)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 99999,\r\n padding: '1rem',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n modal: {\r\n position: 'relative' as const,\r\n backgroundColor: '#141428',\r\n borderRadius: '20px',\r\n border: '1px solid #2a2a4a',\r\n padding: '2rem',\r\n width: '100%',\r\n maxWidth: '380px',\r\n textAlign: 'center' as const,\r\n },\r\n closeBtn: {\r\n position: 'absolute' as const,\r\n top: '1rem',\r\n right: '1rem',\r\n background: 'none',\r\n border: 'none',\r\n color: '#64748b',\r\n cursor: 'pointer',\r\n padding: '4px',\r\n },\r\n iconWrapper: {\r\n width: '56px',\r\n height: '56px',\r\n borderRadius: '16px',\r\n backgroundColor: 'rgba(102, 126, 234, 0.1)',\r\n border: '1px solid rgba(102, 126, 234, 0.2)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto 1rem',\r\n },\r\n title: {\r\n fontSize: '1.3rem',\r\n fontWeight: 700,\r\n color: '#e2e8f0',\r\n margin: '0 0 0.25rem',\r\n },\r\n subtitle: {\r\n color: '#64748b',\r\n fontSize: '0.85rem',\r\n margin: '0 0 1.5rem',\r\n },\r\n googleBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.75rem',\r\n padding: '0.85rem 1.5rem',\r\n backgroundColor: '#1a1a2e',\r\n color: '#e2e8f0',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '12px',\r\n fontSize: '0.95rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n width: '100%',\r\n marginBottom: '1.25rem',\r\n },\r\n googleIcon: {\r\n width: '20px',\r\n height: '20px',\r\n flexShrink: 0,\r\n },\r\n footer: {\r\n color: '#475569',\r\n fontSize: '0.7rem',\r\n margin: 0,\r\n },\r\n};\r\n","/**\r\n * WalletPanel.tsx - SDK wallet panel modal with tabs.\r\n *\r\n * Opened by clicking the connected pill.\r\n * Tabs: Wallet (send/receive), Activity (transactions),\r\n * Account (details), Security (recovery + disconnect).\r\n */\r\n\r\nimport { useState, useEffect, useCallback } from 'react';\r\nimport { useAccesly } from '../hooks/useAccesly';\r\nimport type { TransactionRecord, SendPaymentParams } from '../types';\r\n\r\ntype Tab = 'wallet' | 'activity' | 'account' | 'security';\r\n\r\ninterface WalletPanelProps {\r\n onClose: () => void;\r\n}\r\n\r\nexport function WalletPanel({ onClose }: WalletPanelProps) {\r\n const { wallet, balance, disconnect, sendPayment, refreshBalance } = useAccesly();\r\n const [activeTab, setActiveTab] = useState<Tab>('wallet');\r\n\r\n // Send form state\r\n const [sendDest, setSendDest] = useState('');\r\n const [sendAmount, setSendAmount] = useState('');\r\n const [sendMemo, setSendMemo] = useState('');\r\n const [sending, setSending] = useState(false);\r\n const [sendResult, setSendResult] = useState<string | null>(null);\r\n const [sendError, setSendError] = useState<string | null>(null);\r\n\r\n // Activity state\r\n const [transactions, setTransactions] = useState<TransactionRecord[]>([]);\r\n const [txLoading, setTxLoading] = useState(false);\r\n\r\n // Clipboard feedback\r\n const [copiedField, setCopiedField] = useState<string | null>(null);\r\n\r\n // Lazy-load transactions when Activity tab is selected\r\n useEffect(() => {\r\n if (activeTab === 'activity' && transactions.length === 0) {\r\n loadTransactions();\r\n }\r\n }, [activeTab]);\r\n\r\n if (!wallet) return null;\r\n\r\n async function loadTransactions() {\r\n setTxLoading(true);\r\n try {\r\n // Use the AcceslyClient indirectly through the parent context\r\n // For SDK, we fetch directly since we have the client\r\n const res = await fetch('/api/wallet/transactions?limit=20');\r\n // Note: This won't work cross-origin. In the SDK, transactions\r\n // are loaded via the AcceslyClient. For now, we'll show placeholder.\r\n // TODO: Expose getTransactions through context\r\n } catch {\r\n // Silently fail\r\n } finally {\r\n setTxLoading(false);\r\n }\r\n }\r\n\r\n async function handleSend() {\r\n if (!sendDest || !sendAmount) return;\r\n setSending(true);\r\n setSendError(null);\r\n try {\r\n const result = await sendPayment({\r\n destination: sendDest,\r\n amount: sendAmount,\r\n memo: sendMemo || undefined,\r\n });\r\n setSendResult(result.txHash);\r\n refreshBalance();\r\n } catch (err: any) {\r\n setSendError(err.message);\r\n } finally {\r\n setSending(false);\r\n }\r\n }\r\n\r\n function truncate(addr: string, start = 6, end = 6): string {\r\n if (addr.length <= start + end + 3) return addr;\r\n return `${addr.slice(0, start)}...${addr.slice(-end)}`;\r\n }\r\n\r\n async function copyToClipboard(text: string, field: string) {\r\n await navigator.clipboard.writeText(text);\r\n setCopiedField(field);\r\n setTimeout(() => setCopiedField(null), 1500);\r\n }\r\n\r\n function handleDisconnect() {\r\n disconnect();\r\n onClose();\r\n }\r\n\r\n const formattedBalance = balance\r\n ? parseFloat(balance).toLocaleString('en-US', {\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n })\r\n : '---';\r\n\r\n const idColor = identiconColor(wallet.stellarAddress);\r\n\r\n const tabs: { key: Tab; label: string }[] = [\r\n { key: 'wallet', label: 'Wallet' },\r\n { key: 'activity', label: 'Activity' },\r\n { key: 'account', label: 'Account' },\r\n { key: 'security', label: 'Security' },\r\n ];\r\n\r\n return (\r\n <div style={styles.overlay} onClick={onClose}>\r\n <div style={styles.panel} onClick={(e) => e.stopPropagation()}>\r\n {/* Header */}\r\n <div style={styles.header}>\r\n <button onClick={onClose} style={styles.closeBtn}>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n <div style={{ ...styles.identicon, backgroundColor: idColor }} />\r\n <p style={styles.headerAddr}>{truncate(wallet.stellarAddress, 8, 8)}</p>\r\n <p style={styles.headerBalance}>\r\n {formattedBalance} <span style={styles.headerCurrency}>XLM</span>\r\n </p>\r\n </div>\r\n\r\n {/* Tab bar */}\r\n <div style={styles.tabBar}>\r\n {tabs.map((tab) => (\r\n <button\r\n key={tab.key}\r\n onClick={() => setActiveTab(tab.key)}\r\n style={{\r\n ...styles.tab,\r\n ...(activeTab === tab.key ? styles.tabActive : {}),\r\n }}\r\n >\r\n {tab.label}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab content */}\r\n <div style={styles.content}>\r\n {activeTab === 'wallet' && renderWalletTab()}\r\n {activeTab === 'activity' && renderActivityTab()}\r\n {activeTab === 'account' && renderAccountTab()}\r\n {activeTab === 'security' && renderSecurityTab()}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n // --- Tab renderers ---\r\n\r\n function renderWalletTab() {\r\n // Send success state\r\n if (sendResult) {\r\n return (\r\n <div style={styles.centeredCol}>\r\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#34d399\" strokeWidth=\"2\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <polyline points=\"8 12 11 15 16 9\" />\r\n </svg>\r\n <p style={{ color: '#34d399', fontWeight: 600, margin: '0.5rem 0' }}>Payment Sent</p>\r\n <p style={{ color: '#64748b', fontSize: '0.75rem', fontFamily: 'monospace' }}>\r\n {sendResult.slice(0, 12)}...{sendResult.slice(-12)}\r\n </p>\r\n <button onClick={() => { setSendResult(null); setSendDest(''); setSendAmount(''); setSendMemo(''); }} style={styles.primaryBtn}>\r\n Done\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={styles.walletTab}>\r\n {/* Send form */}\r\n <div style={styles.formGroup}>\r\n <label style={styles.formLabel}>Destination</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"G...\"\r\n value={sendDest}\r\n onChange={(e) => setSendDest(e.target.value)}\r\n maxLength={56}\r\n style={styles.formInput}\r\n />\r\n </div>\r\n <div style={styles.formGroup}>\r\n <label style={styles.formLabel}>Amount (XLM)</label>\r\n <input\r\n type=\"number\"\r\n placeholder=\"0.00\"\r\n value={sendAmount}\r\n onChange={(e) => setSendAmount(e.target.value)}\r\n min=\"0.0000001\"\r\n step=\"any\"\r\n style={styles.formInput}\r\n />\r\n </div>\r\n <div style={styles.formGroup}>\r\n <label style={styles.formLabel}>Memo (optional)</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"What is this for?\"\r\n value={sendMemo}\r\n onChange={(e) => setSendMemo(e.target.value)}\r\n maxLength={28}\r\n style={styles.formInput}\r\n />\r\n </div>\r\n {sendError && <p style={styles.error}>{sendError}</p>}\r\n <button\r\n onClick={handleSend}\r\n disabled={sending || !sendDest || !sendAmount}\r\n style={{\r\n ...styles.primaryBtn,\r\n opacity: sending || !sendDest || !sendAmount ? 0.5 : 1,\r\n }}\r\n >\r\n {sending ? 'Sending...' : 'Send Payment'}\r\n </button>\r\n\r\n {/* Copy address for receiving */}\r\n <button\r\n onClick={() => copyToClipboard(wallet!.stellarAddress, 'receive')}\r\n style={styles.receiveBtn}\r\n >\r\n {copiedField === 'receive' ? 'Address Copied!' : 'Copy Address to Receive'}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n function renderActivityTab() {\r\n return (\r\n <p style={styles.emptyText}>\r\n Transaction history coming soon.\r\n </p>\r\n );\r\n }\r\n\r\n function renderAccountTab() {\r\n const fields = [\r\n { label: 'Email', value: wallet!.email, key: 'email' },\r\n { label: 'Contract ID', value: wallet!.contractId, key: 'contract', copy: true },\r\n { label: 'Stellar Address', value: wallet!.stellarAddress, key: 'stellar', copy: true },\r\n { label: 'Public Key', value: wallet!.publicKey, key: 'pubkey', copy: true },\r\n { label: 'Created', value: new Date(wallet!.createdAt).toLocaleDateString(), key: 'created' },\r\n ];\r\n\r\n return (\r\n <div style={styles.fieldList}>\r\n {fields.map((f) => (\r\n <div key={f.key} style={styles.field}>\r\n <span style={styles.fieldLabel}>{f.label}</span>\r\n {f.copy ? (\r\n <button\r\n onClick={() => copyToClipboard(f.value, f.key)}\r\n style={{\r\n ...styles.copyBtn,\r\n color: copiedField === f.key ? '#34d399' : '#a5b4fc',\r\n borderColor: copiedField === f.key ? '#34d399' : '#2a2a4a',\r\n }}\r\n >\r\n {copiedField === f.key ? 'Copied!' : truncate(f.value, 8, 8)}\r\n </button>\r\n ) : (\r\n <span style={styles.fieldValue}>{f.value}</span>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n function renderSecurityTab() {\r\n return (\r\n <div style={styles.securityTab}>\r\n <div style={styles.fieldList}>\r\n <div style={styles.field}>\r\n <span style={styles.fieldLabel}>Recovery</span>\r\n <span style={{ ...styles.fieldValue, color: '#34d399' }}>Protected</span>\r\n </div>\r\n <div style={styles.field}>\r\n <span style={styles.fieldLabel}>Method</span>\r\n <span style={styles.fieldValue}>Google ({wallet!.email})</span>\r\n </div>\r\n </div>\r\n <button onClick={handleDisconnect} style={styles.disconnectBtn}>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\r\n <polyline points=\"16 17 21 12 16 7\" />\r\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\r\n </svg>\r\n Disconnect\r\n </button>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nfunction identiconColor(address: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < address.length; i++) {\r\n hash = address.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n return `hsl(${Math.abs(hash) % 360}, 65%, 55%)`;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Styles\r\n// ---------------------------------------------------------------------------\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n overlay: {\r\n position: 'fixed',\r\n inset: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\r\n backdropFilter: 'blur(4px)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 99999,\r\n padding: '1rem',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n panel: {\r\n backgroundColor: '#0f0f1e',\r\n borderRadius: '20px',\r\n border: '1px solid #2a2a4a',\r\n width: '100%',\r\n maxWidth: '420px',\r\n maxHeight: '85vh',\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n overflow: 'hidden',\r\n },\r\n header: {\r\n position: 'relative' as const,\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n padding: '1.5rem 1.5rem 1rem',\r\n background: 'linear-gradient(180deg, #1a1a3a 0%, #0f0f1e 100%)',\r\n },\r\n closeBtn: {\r\n position: 'absolute' as const,\r\n top: '1rem',\r\n right: '1rem',\r\n background: 'none',\r\n border: 'none',\r\n color: '#64748b',\r\n cursor: 'pointer',\r\n padding: '4px',\r\n },\r\n identicon: {\r\n width: '48px',\r\n height: '48px',\r\n borderRadius: '50%',\r\n marginBottom: '0.5rem',\r\n },\r\n headerAddr: {\r\n fontFamily: 'monospace',\r\n fontSize: '0.8rem',\r\n color: '#8b8ba7',\r\n margin: '0 0 0.25rem',\r\n },\r\n headerBalance: {\r\n fontSize: '1.75rem',\r\n fontWeight: 700,\r\n color: '#ffffff',\r\n margin: 0,\r\n },\r\n headerCurrency: {\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n color: '#8b8ba7',\r\n },\r\n tabBar: {\r\n display: 'flex',\r\n borderBottom: '1px solid #2a2a4a',\r\n padding: '0 0.5rem',\r\n },\r\n tab: {\r\n flex: 1,\r\n padding: '0.75rem 0.5rem',\r\n background: 'none',\r\n border: 'none',\r\n borderBottom: '2px solid transparent',\r\n color: '#64748b',\r\n fontSize: '0.8rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'color 0.2s, border-color 0.2s',\r\n borderRadius: 0,\r\n },\r\n tabActive: {\r\n color: '#e2e8f0',\r\n borderBottomColor: '#667eea',\r\n },\r\n content: {\r\n flex: 1,\r\n overflowY: 'auto' as const,\r\n padding: '1rem 1.25rem 1.25rem',\r\n },\r\n // Wallet tab\r\n walletTab: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '0.75rem',\r\n },\r\n formGroup: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '0.3rem',\r\n },\r\n formLabel: {\r\n color: '#8b8ba7',\r\n fontSize: '0.75rem',\r\n fontWeight: 500,\r\n },\r\n formInput: {\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '8px',\r\n padding: '0.65rem 0.75rem',\r\n color: '#e2e8f0',\r\n fontSize: '0.9rem',\r\n outline: 'none',\r\n width: '100%',\r\n boxSizing: 'border-box' as const,\r\n fontFamily: 'inherit',\r\n },\r\n primaryBtn: {\r\n backgroundColor: '#667eea',\r\n color: '#fff',\r\n border: 'none',\r\n borderRadius: '10px',\r\n padding: '0.75rem',\r\n fontSize: '0.95rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n width: '100%',\r\n marginTop: '0.25rem',\r\n },\r\n receiveBtn: {\r\n backgroundColor: 'transparent',\r\n color: '#a5b4fc',\r\n border: '1.5px solid #4a4a7a',\r\n borderRadius: '10px',\r\n padding: '0.65rem',\r\n fontSize: '0.85rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n width: '100%',\r\n },\r\n error: {\r\n color: '#f87171',\r\n fontSize: '0.8rem',\r\n margin: 0,\r\n padding: '0.4rem 0.6rem',\r\n backgroundColor: 'rgba(248, 113, 113, 0.1)',\r\n borderRadius: '6px',\r\n },\r\n centeredCol: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n gap: '0.5rem',\r\n padding: '1rem 0',\r\n },\r\n // Account tab\r\n fieldList: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n },\r\n field: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '0.6rem 0',\r\n borderBottom: '1px solid #1a1a2e',\r\n },\r\n fieldLabel: {\r\n color: '#8b8ba7',\r\n fontSize: '0.8rem',\r\n },\r\n fieldValue: {\r\n color: '#e2e8f0',\r\n fontSize: '0.8rem',\r\n fontWeight: 500,\r\n },\r\n copyBtn: {\r\n background: 'none',\r\n border: '1px solid #2a2a4a',\r\n color: '#a5b4fc',\r\n padding: '0.2rem 0.5rem',\r\n borderRadius: '4px',\r\n fontSize: '0.72rem',\r\n fontFamily: 'monospace',\r\n cursor: 'pointer',\r\n transition: 'color 0.2s, border-color 0.2s',\r\n },\r\n // Security tab\r\n securityTab: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '1rem',\r\n },\r\n disconnectBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.5rem',\r\n width: '100%',\r\n padding: '0.65rem',\r\n backgroundColor: 'transparent',\r\n color: '#f87171',\r\n border: '1px solid rgba(248, 113, 113, 0.2)',\r\n borderRadius: '10px',\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n },\r\n emptyText: {\r\n color: '#64748b',\r\n fontSize: '0.85rem',\r\n textAlign: 'center' as const,\r\n padding: '2rem 0',\r\n },\r\n};\r\n","/**\r\n * ConnectButton.tsx - SDK drop-in wallet button.\r\n *\r\n * Renders a dynamic button that:\r\n * - Shows \"Connect Wallet\" when disconnected → opens ConnectModal\r\n * - Shows a pill with address + balance when connected → opens WalletPanel\r\n * - Handles loading/creating states with spinners\r\n *\r\n * Usage:\r\n * <ConnectButton />\r\n */\r\n\r\nimport { useState } from 'react';\r\nimport { useAccesly } from '../hooks/useAccesly';\r\nimport { ConnectModal } from './ConnectModal';\r\nimport { WalletPanel } from './WalletPanel';\r\n\r\nexport function ConnectButton() {\r\n const { wallet, balance, loading, creating, connect } = useAccesly();\r\n const [showModal, setShowModal] = useState(false);\r\n const [showPanel, setShowPanel] = useState(false);\r\n\r\n // Initial auth check\r\n if (loading) {\r\n return (\r\n <div style={styles.pillLoading}>\r\n <div style={styles.spinner} />\r\n </div>\r\n );\r\n }\r\n\r\n // Not connected\r\n if (!wallet) {\r\n return (\r\n <>\r\n <button\r\n onClick={() => setShowModal(true)}\r\n style={creating ? styles.pill : styles.connectBtn}\r\n disabled={creating}\r\n >\r\n {creating ? (\r\n <>\r\n <div style={styles.spinnerSmall} />\r\n <span style={styles.pillText}>Creating wallet...</span>\r\n </>\r\n ) : (\r\n <>\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5\" />\r\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\r\n </svg>\r\n Connect Wallet\r\n </>\r\n )}\r\n </button>\r\n\r\n {showModal && (\r\n <ConnectModal\r\n onClose={() => setShowModal(false)}\r\n onConnect={async () => {\r\n setShowModal(false);\r\n await connect();\r\n }}\r\n />\r\n )}\r\n </>\r\n );\r\n }\r\n\r\n // Connected - show pill\r\n const addr = wallet.stellarAddress;\r\n const truncated = `${addr.slice(0, 4)}...${addr.slice(-4)}`;\r\n const balanceText = balance\r\n ? `${parseFloat(balance).toFixed(2)} XLM`\r\n : '--- XLM';\r\n const color = identiconColor(addr);\r\n\r\n return (\r\n <>\r\n <button onClick={() => setShowPanel(true)} style={styles.pill}>\r\n <div style={{ ...styles.identicon, backgroundColor: color }} />\r\n <span style={styles.pillAddr}>{truncated}</span>\r\n <span style={styles.divider} />\r\n <span style={styles.pillBalance}>{balanceText}</span>\r\n </button>\r\n\r\n {showPanel && <WalletPanel onClose={() => setShowPanel(false)} />}\r\n </>\r\n );\r\n}\r\n\r\n/** Generate a deterministic HSL color from a Stellar address */\r\nfunction identiconColor(address: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < address.length; i++) {\r\n hash = address.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n return `hsl(${Math.abs(hash) % 360}, 65%, 55%)`;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Inline styles (zero CSS dependencies)\r\n// ---------------------------------------------------------------------------\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n connectBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.6rem',\r\n padding: '0.85rem 1.75rem',\r\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\r\n color: '#fff',\r\n border: 'none',\r\n borderRadius: '12px',\r\n fontSize: '1rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'transform 0.15s, box-shadow 0.15s',\r\n boxShadow: '0 4px 15px rgba(102, 126, 234, 0.4)',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n pill: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.5rem',\r\n padding: '0.5rem 0.85rem',\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '50px',\r\n cursor: 'pointer',\r\n transition: 'border-color 0.2s, box-shadow 0.2s',\r\n color: '#e2e8f0',\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n pillLoading: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: '0.5rem 1.5rem',\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '50px',\r\n height: '42px',\r\n },\r\n identicon: {\r\n width: '24px',\r\n height: '24px',\r\n borderRadius: '50%',\r\n flexShrink: 0,\r\n },\r\n pillAddr: {\r\n fontFamily: 'monospace',\r\n fontSize: '0.8rem',\r\n color: '#e2e8f0',\r\n },\r\n divider: {\r\n width: '1px',\r\n height: '16px',\r\n backgroundColor: '#3a3a5a',\r\n },\r\n pillBalance: {\r\n fontSize: '0.8rem',\r\n color: '#8b8ba7',\r\n fontWeight: 500,\r\n },\r\n pillText: {\r\n fontSize: '0.8rem',\r\n color: '#8b8ba7',\r\n },\r\n spinner: {\r\n width: '20px',\r\n height: '20px',\r\n border: '2px solid #2a2a4a',\r\n borderTop: '2px solid #667eea',\r\n borderRadius: '50%',\r\n animation: 'accesly-spin 1s linear infinite',\r\n },\r\n spinnerSmall: {\r\n width: '16px',\r\n height: '16px',\r\n border: '2px solid #2a2a4a',\r\n borderTop: '2px solid #667eea',\r\n borderRadius: '50%',\r\n animation: 'accesly-spin 1s linear infinite',\r\n flexShrink: 0,\r\n },\r\n};\r\n","/**\r\n * Accesly SDK - Account abstraction wallet for Stellar.\r\n *\r\n * Quick start:\r\n *\r\n * import { AcceslyProvider, ConnectButton } from 'accesly';\r\n *\r\n * function App() {\r\n * return (\r\n * <AcceslyProvider appId=\"acc_xxxxx\">\r\n * <ConnectButton />\r\n * </AcceslyProvider>\r\n * );\r\n * }\r\n *\r\n * For custom UI, use the useAccesly hook:\r\n *\r\n * import { useAccesly } from 'accesly';\r\n *\r\n * function MyWallet() {\r\n * const { wallet, balance, connect, disconnect, sendPayment } = useAccesly();\r\n * // Build your own UI\r\n * }\r\n */\r\n\r\n// --- CSS keyframes injection ---\r\n// Since the SDK uses inline styles, we inject required keyframes once\r\nif (typeof document !== 'undefined') {\r\n const STYLE_ID = 'accesly-keyframes';\r\n if (!document.getElementById(STYLE_ID)) {\r\n const style = document.createElement('style');\r\n style.id = STYLE_ID;\r\n style.textContent = `\r\n @keyframes accesly-spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n}\r\n\r\n// --- Components ---\r\nexport { AcceslyProvider } from './AcceslyProvider';\r\nexport { ConnectButton } from './components/ConnectButton';\r\n\r\n// --- Hooks ---\r\nexport { useAccesly } from './hooks/useAccesly';\r\n\r\n// --- Types ---\r\nexport type {\r\n AcceslyConfig,\r\n WalletInfo,\r\n TransactionRecord,\r\n SendPaymentParams,\r\n AcceslyContextType,\r\n} from './types';\r\n"]}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "accesly",
3
+ "version": "0.1.0",
4
+ "description": "Accesly SDK - Account abstraction wallet for Stellar. Drop-in React components for wallet authentication, balance display, and payments.",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "dev": "tsup --watch"
21
+ },
22
+ "peerDependencies": {
23
+ "react": ">=18.0.0",
24
+ "react-dom": ">=18.0.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/react": "^19.0.0",
28
+ "@types/react-dom": "^19.0.0",
29
+ "react": "^19.0.0",
30
+ "react-dom": "^19.0.0",
31
+ "tsup": "^8.0.0",
32
+ "typescript": "^5.0.0"
33
+ },
34
+ "keywords": [
35
+ "stellar",
36
+ "wallet",
37
+ "account-abstraction",
38
+ "web3",
39
+ "soroban",
40
+ "react"
41
+ ],
42
+ "license": "MIT",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "https://github.com/accesly/sdk"
46
+ }
47
+ }