@wallet-ui/react 4.0.5 → 4.1.0-canary-20260430184135

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.
@@ -1,16 +1,18 @@
1
1
  'use strict';
2
2
 
3
- var React18 = require('react');
3
+ var React19 = require('react');
4
4
  var react$1 = require('@wallet-standard/react');
5
5
  var react$2 = require('@zag-js/react');
6
6
  var menu = require('@zag-js/menu');
7
7
  var dialog = require('@zag-js/dialog');
8
+ var walletStandardFeatures = require('@solana/wallet-standard-features');
9
+ var walletStandardUtil = require('@solana/wallet-standard-util');
10
+ var ui = require('@wallet-standard/ui');
11
+ var uiRegistry = require('@wallet-standard/ui-registry');
8
12
  var react = require('@solana/react');
9
13
  var react$3 = require('@nanostores/react');
10
14
  var core$1 = require('@wallet-ui/core');
11
- var walletStandardFeatures = require('@solana/wallet-standard-features');
12
15
  var core = require('@wallet-standard/core');
13
- var ui = require('@wallet-standard/ui');
14
16
 
15
17
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
18
 
@@ -32,25 +34,25 @@ function _interopNamespace(e) {
32
34
  return Object.freeze(n);
33
35
  }
34
36
 
35
- var React18__default = /*#__PURE__*/_interopDefault(React18);
37
+ var React19__default = /*#__PURE__*/_interopDefault(React19);
36
38
  var menu__namespace = /*#__PURE__*/_interopNamespace(menu);
37
39
  var dialog__namespace = /*#__PURE__*/_interopNamespace(dialog);
38
40
 
39
41
  // src/base-button.tsx
40
42
  function BaseButton({ className, label, leftSection, onClick, rightSection, ...props }) {
41
- return /* @__PURE__ */ React18__default.default.createElement("button", { "data-wu": "base-button", className: `${className ?? ""}`, onClick, ...props }, leftSection ? /* @__PURE__ */ React18__default.default.createElement("span", { "data-wu": "base-button-left-section" }, leftSection) : null, label, rightSection ? /* @__PURE__ */ React18__default.default.createElement("span", { "data-wu": "base-button-right-section" }, rightSection) : null);
43
+ return /* @__PURE__ */ React19__default.default.createElement("button", { "data-wu": "base-button", className: `${className ?? ""}`, onClick, ...props }, leftSection ? /* @__PURE__ */ React19__default.default.createElement("span", { "data-wu": "base-button-left-section" }, leftSection) : null, label, rightSection ? /* @__PURE__ */ React19__default.default.createElement("span", { "data-wu": "base-button-right-section" }, rightSection) : null);
42
44
  }
43
- var WalletUiContext = React18__default.default.createContext({});
45
+ var WalletUiContext = React19__default.default.createContext({});
44
46
 
45
47
  // src/use-wallet-ui.tsx
46
48
  function useWalletUi() {
47
- return React18__default.default.useContext(WalletUiContext);
49
+ return React19__default.default.useContext(WalletUiContext);
48
50
  }
49
- var WalletUiAccountContext = React18.createContext({});
51
+ var WalletUiAccountContext = React19.createContext({});
50
52
 
51
53
  // src/use-wallet-ui-account.tsx
52
54
  function useWalletUiAccount() {
53
- return React18.useContext(WalletUiAccountContext);
55
+ return React19.useContext(WalletUiAccountContext);
54
56
  }
55
57
 
56
58
  // src/use-wallet-ui-wallet.tsx
@@ -59,7 +61,7 @@ function useWalletUiWallet({ wallet }) {
59
61
  const { setAccount } = useWalletUiAccount();
60
62
  const [isConnecting, connect3] = react$1.useConnect(wallet);
61
63
  const [isDisconnecting, disconnect] = react$1.useDisconnect(wallet);
62
- React18.useEffect(() => {
64
+ React19.useEffect(() => {
63
65
  }, [isDisconnecting]);
64
66
  return {
65
67
  connect: async () => {
@@ -82,7 +84,7 @@ function WalletUiIcon({ className, wallet, ...props }) {
82
84
  if (!wallet) {
83
85
  return null;
84
86
  }
85
- return /* @__PURE__ */ React18__default.default.createElement("img", { "data-wu": "wallet-ui-icon", src: wallet.icon, alt: wallet.name, className: className ?? "", ...props });
87
+ return /* @__PURE__ */ React19__default.default.createElement("img", { "data-wu": "wallet-ui-icon", src: wallet.icon, alt: wallet.name, className: className ?? "", ...props });
86
88
  }
87
89
 
88
90
  // src/base-dropdown.tsx
@@ -96,16 +98,16 @@ var BaseDropdownItemType = /* @__PURE__ */ ((BaseDropdownItemType2) => {
96
98
  })(BaseDropdownItemType || {});
97
99
  function BaseDropdown({ buttonProps, dropdown, items, showIndicator }) {
98
100
  const api = dropdown.api;
99
- const trigger = /* @__PURE__ */ React18__default.default.createElement(
101
+ const trigger = /* @__PURE__ */ React19__default.default.createElement(
100
102
  BaseButton,
101
103
  {
102
104
  ...api.getTriggerProps(),
103
- rightSection: showIndicator ? /* @__PURE__ */ React18__default.default.createElement("span", { ...api.getIndicatorProps() }, /* @__PURE__ */ React18__default.default.createElement(BaseDropdownChevronDown, null)) : null,
105
+ rightSection: showIndicator ? /* @__PURE__ */ React19__default.default.createElement("span", { ...api.getIndicatorProps() }, /* @__PURE__ */ React19__default.default.createElement(BaseDropdownChevronDown, null)) : null,
104
106
  ...buttonProps
105
107
  }
106
108
  );
107
- return /* @__PURE__ */ React18__default.default.createElement("div", { "data-wu": "base-dropdown" }, trigger, /* @__PURE__ */ React18__default.default.createElement("div", { ...api.getPositionerProps(), "data-wu": "base-dropdown-wrapper" }, /* @__PURE__ */ React18__default.default.createElement("div", { ...api.getContentProps(), "data-wu": "base-dropdown-list", "data-part": "content" }, items.map((item) => {
108
- return /* @__PURE__ */ React18__default.default.createElement(
109
+ return /* @__PURE__ */ React19__default.default.createElement("div", { "data-wu": "base-dropdown" }, trigger, /* @__PURE__ */ React19__default.default.createElement("div", { ...api.getPositionerProps(), "data-wu": "base-dropdown-wrapper" }, /* @__PURE__ */ React19__default.default.createElement("div", { ...api.getContentProps(), "data-wu": "base-dropdown-list", "data-part": "content" }, items.map((item) => {
110
+ return /* @__PURE__ */ React19__default.default.createElement(
109
111
  BaseDropdownItem,
110
112
  {
111
113
  ...api.getItemProps({ value: item.value }),
@@ -125,17 +127,17 @@ function BaseDropdown({ buttonProps, dropdown, items, showIndicator }) {
125
127
  }
126
128
  function BaseDropdownItem({ afterClick, item }) {
127
129
  if (!item.wallet) {
128
- return /* @__PURE__ */ React18__default.default.createElement(BaseDropdownItemRender, { afterClick, item });
130
+ return /* @__PURE__ */ React19__default.default.createElement(BaseDropdownItemRender, { afterClick, item });
129
131
  }
130
132
  switch (item.type) {
131
133
  case "Item" /* Item */:
132
- return /* @__PURE__ */ React18__default.default.createElement(BaseDropdownItemRender, { afterClick, item });
134
+ return /* @__PURE__ */ React19__default.default.createElement(BaseDropdownItemRender, { afterClick, item });
133
135
  case "WalletConnect" /* WalletConnect */:
134
- return /* @__PURE__ */ React18__default.default.createElement(BaseDropdownItemWalletConnect, { afterClick, item, wallet: item.wallet });
136
+ return /* @__PURE__ */ React19__default.default.createElement(BaseDropdownItemWalletConnect, { afterClick, item, wallet: item.wallet });
135
137
  case "WalletCopy" /* WalletCopy */:
136
- return /* @__PURE__ */ React18__default.default.createElement(BaseDropdownItemRender, { afterClick, item });
138
+ return /* @__PURE__ */ React19__default.default.createElement(BaseDropdownItemRender, { afterClick, item });
137
139
  case "WalletDisconnect" /* WalletDisconnect */:
138
- return /* @__PURE__ */ React18__default.default.createElement(BaseDropdownItemWalletDisconnect, { afterClick, item, wallet: item.wallet });
140
+ return /* @__PURE__ */ React19__default.default.createElement(BaseDropdownItemWalletDisconnect, { afterClick, item, wallet: item.wallet });
139
141
  }
140
142
  }
141
143
  function BaseDropdownItemWalletConnect({
@@ -144,7 +146,7 @@ function BaseDropdownItemWalletConnect({
144
146
  wallet
145
147
  }) {
146
148
  const { connect: connect3 } = useWalletUiWallet({ wallet });
147
- return /* @__PURE__ */ React18__default.default.createElement(
149
+ return /* @__PURE__ */ React19__default.default.createElement(
148
150
  BaseDropdownItemRender,
149
151
  {
150
152
  afterClick,
@@ -154,7 +156,7 @@ function BaseDropdownItemWalletConnect({
154
156
  await connect3();
155
157
  return await item.handler();
156
158
  },
157
- leftSection: wallet ? /* @__PURE__ */ React18__default.default.createElement(WalletUiIcon, { wallet }) : void 0
159
+ leftSection: wallet ? /* @__PURE__ */ React19__default.default.createElement(WalletUiIcon, { wallet }) : void 0
158
160
  }
159
161
  }
160
162
  );
@@ -165,7 +167,7 @@ function BaseDropdownItemWalletDisconnect({
165
167
  wallet
166
168
  }) {
167
169
  const { disconnect } = useWalletUiWallet({ wallet });
168
- return /* @__PURE__ */ React18__default.default.createElement(
170
+ return /* @__PURE__ */ React19__default.default.createElement(
169
171
  BaseDropdownItemRender,
170
172
  {
171
173
  afterClick,
@@ -188,10 +190,10 @@ function BaseDropdownItemRender({ afterClick, item }) {
188
190
  afterClick();
189
191
  });
190
192
  }
191
- return /* @__PURE__ */ React18__default.default.createElement("button", { type: "button", "data-wu": "base-dropdown-item", "data-part": "item", onClick }, item.leftSection ? /* @__PURE__ */ React18__default.default.createElement("span", { "data-wu": "base-dropdown-item-left-section" }, item.leftSection) : null, item.label, item.rightSection ? /* @__PURE__ */ React18__default.default.createElement("span", { "data-wu": "base-dropdown-item-right-section" }, item.rightSection) : null);
193
+ return /* @__PURE__ */ React19__default.default.createElement("button", { type: "button", "data-wu": "base-dropdown-item", "data-part": "item", onClick }, item.leftSection ? /* @__PURE__ */ React19__default.default.createElement("span", { "data-wu": "base-dropdown-item-left-section" }, item.leftSection) : null, item.label, item.rightSection ? /* @__PURE__ */ React19__default.default.createElement("span", { "data-wu": "base-dropdown-item-right-section" }, item.rightSection) : null);
192
194
  }
193
195
  function BaseDropdownChevronDown(props) {
194
- return /* @__PURE__ */ React18__default.default.createElement(
196
+ return /* @__PURE__ */ React19__default.default.createElement(
195
197
  "svg",
196
198
  {
197
199
  xmlns: "http://www.w3.org/2000/svg",
@@ -205,16 +207,16 @@ function BaseDropdownChevronDown(props) {
205
207
  strokeLinejoin: "round",
206
208
  ...props
207
209
  },
208
- /* @__PURE__ */ React18__default.default.createElement("path", { d: "m6 9 6 6 6-6" })
210
+ /* @__PURE__ */ React19__default.default.createElement("path", { d: "m6 9 6 6 6-6" })
209
211
  );
210
212
  }
211
213
  function BaseSvg({ ...props }) {
212
- return /* @__PURE__ */ React18__default.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", ...props }, props.children);
214
+ return /* @__PURE__ */ React19__default.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", ...props }, props.children);
213
215
  }
214
216
 
215
217
  // src/wallet-ui-icon-close.tsx
216
218
  function WalletUiIconClose({ ...props }) {
217
- return /* @__PURE__ */ React18__default.default.createElement(
219
+ return /* @__PURE__ */ React19__default.default.createElement(
218
220
  BaseSvg,
219
221
  {
220
222
  fill: "none",
@@ -225,17 +227,17 @@ function WalletUiIconClose({ ...props }) {
225
227
  viewBox: "0 0 14 14",
226
228
  ...props
227
229
  },
228
- /* @__PURE__ */ React18__default.default.createElement("path", { d: "M14 12.461 8.3 6.772l5.234-5.233L12.006 0 6.772 5.234 1.54 0 0 1.539l5.234 5.233L0 12.006l1.539 1.528L6.772 8.3l5.69 5.7L14 12.461z" })
230
+ /* @__PURE__ */ React19__default.default.createElement("path", { d: "M14 12.461 8.3 6.772l5.234-5.233L12.006 0 6.772 5.234 1.54 0 0 1.539l5.234 5.233L0 12.006l1.539 1.528L6.772 8.3l5.69 5.7L14 12.461z" })
229
231
  );
230
232
  }
231
233
 
232
234
  // src/base-modal.tsx
233
235
  function BaseModal({ modal, buttonLabel, buttonProps = {}, ...props }) {
234
236
  const api = modal.api;
235
- return /* @__PURE__ */ React18__default.default.createElement(React18__default.default.Fragment, null, buttonLabel ? /* @__PURE__ */ React18__default.default.createElement(BaseButton, { label: buttonLabel, ...buttonProps, ...api.getTriggerProps() }) : null, api.open && /* @__PURE__ */ React18__default.default.createElement(react$2.Portal, null, /* @__PURE__ */ React18__default.default.createElement("div", { ...api.getBackdropProps() }), /* @__PURE__ */ React18__default.default.createElement("div", { ...api.getPositionerProps() }, /* @__PURE__ */ React18__default.default.createElement("div", { ...api.getContentProps() }, /* @__PURE__ */ React18__default.default.createElement("header", null, /* @__PURE__ */ React18__default.default.createElement("button", { ...api.getCloseTriggerProps() }, /* @__PURE__ */ React18__default.default.createElement(WalletUiIconClose, null))), props.description ? /* @__PURE__ */ React18__default.default.createElement("p", { ...api.getDescriptionProps() }, props.description) : null, /* @__PURE__ */ React18__default.default.createElement("main", null, props.children)))));
237
+ return /* @__PURE__ */ React19__default.default.createElement(React19__default.default.Fragment, null, buttonLabel ? /* @__PURE__ */ React19__default.default.createElement(BaseButton, { label: buttonLabel, ...buttonProps, ...api.getTriggerProps() }) : null, api.open && /* @__PURE__ */ React19__default.default.createElement(react$2.Portal, null, /* @__PURE__ */ React19__default.default.createElement("div", { ...api.getBackdropProps() }), /* @__PURE__ */ React19__default.default.createElement("div", { ...api.getPositionerProps() }, /* @__PURE__ */ React19__default.default.createElement("div", { ...api.getContentProps() }, /* @__PURE__ */ React19__default.default.createElement("header", null, /* @__PURE__ */ React19__default.default.createElement("button", { ...api.getCloseTriggerProps() }, /* @__PURE__ */ React19__default.default.createElement(WalletUiIconClose, null))), props.description ? /* @__PURE__ */ React19__default.default.createElement("p", { ...api.getDescriptionProps() }, props.description) : null, /* @__PURE__ */ React19__default.default.createElement("main", null, props.children)))));
236
238
  }
237
239
  function useBaseDropdown() {
238
- const service = react$2.useMachine(menu__namespace.machine, { id: React18.useId() });
240
+ const service = react$2.useMachine(menu__namespace.machine, { id: React19.useId() });
239
241
  const api = menu__namespace.connect(service, react$2.normalizeProps);
240
242
  return {
241
243
  api,
@@ -244,7 +246,7 @@ function useBaseDropdown() {
244
246
  };
245
247
  }
246
248
  function useBaseModal() {
247
- const service = react$2.useMachine(dialog__namespace.machine, { id: React18.useId(), modal: true });
249
+ const service = react$2.useMachine(dialog__namespace.machine, { id: React19.useId(), modal: true });
248
250
  const api = dialog__namespace.connect(service, react$2.normalizeProps);
249
251
  return {
250
252
  api,
@@ -252,11 +254,237 @@ function useBaseModal() {
252
254
  open: () => service.send({ type: "OPEN" })
253
255
  };
254
256
  }
255
- var WalletUiClusterContext = React18.createContext({});
257
+
258
+ // src/wallet-ui-auth-types.ts
259
+ var AUTH_ERROR_MESSAGES = {
260
+ "auth-unsupported": "The selected wallet does not support Sign In With Solana or message signing.",
261
+ "message-signing-unavailable": "The selected wallet account does not support message signing.",
262
+ "missing-domain": "A Sign In With Solana fallback message requires a domain.",
263
+ "wallet-not-connected": "Connect a wallet account before signing in."
264
+ };
265
+ var WalletUiAuthError = class extends Error {
266
+ cause;
267
+ reason;
268
+ constructor(reason, cause) {
269
+ super(AUTH_ERROR_MESSAGES[reason]);
270
+ this.cause = cause;
271
+ this.name = "WalletUiAuthError";
272
+ this.reason = reason;
273
+ }
274
+ };
275
+ var getOrCreateUiWalletAccountForStandardWalletAccount = uiRegistry.getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
276
+ var getWalletAccountForUiWalletAccount = uiRegistry.getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
277
+ var getWalletForHandle = uiRegistry.getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
278
+
279
+ // src/wallet-ui-auth-utils.ts
280
+ function getTargetAccount(account, wallet) {
281
+ if (account && ui.uiWalletAccountBelongsToUiWallet(account, wallet)) {
282
+ return account;
283
+ }
284
+ return void 0;
285
+ }
286
+ function hasFeature(handle, featureName) {
287
+ return Boolean(handle && handle.features.includes(featureName));
288
+ }
289
+ async function signInWithMessageFeature({
290
+ account,
291
+ input
292
+ }) {
293
+ const messageSignInInput = getMessageSignInInput(account, input);
294
+ const { signMessage } = ui.getWalletAccountFeature(
295
+ account,
296
+ walletStandardFeatures.SolanaSignMessage
297
+ );
298
+ const walletAccount = getWalletAccountForUiWalletAccount(account);
299
+ const [output] = await signMessage({ account: walletAccount, message: walletStandardUtil.createSignInMessage(messageSignInInput) });
300
+ if (!output) {
301
+ throw new WalletUiAuthError("message-signing-unavailable");
302
+ }
303
+ return getMessageSignInResult({ account, input: messageSignInInput, output });
304
+ }
305
+ async function signInWithMessageSigner({
306
+ account,
307
+ input,
308
+ signMessage
309
+ }) {
310
+ const messageSignInInput = getMessageSignInInput(account, input);
311
+ const output = await signMessage({ message: walletStandardUtil.createSignInMessage(messageSignInInput) });
312
+ return getMessageSignInResult({ account, input: messageSignInInput, output });
313
+ }
314
+ function getMessageSignInResult({
315
+ account,
316
+ input,
317
+ output
318
+ }) {
319
+ return {
320
+ account,
321
+ input,
322
+ method: walletStandardFeatures.SolanaSignMessage,
323
+ signature: output.signature,
324
+ signedMessage: output.signedMessage
325
+ };
326
+ }
327
+ async function signInWithNativeFeature({
328
+ account,
329
+ connect: connect3,
330
+ input,
331
+ wallet
332
+ }) {
333
+ const signInInput = account?.address && !input.address ? { ...input, address: account.address } : { ...input };
334
+ const { signIn } = ui.getWalletFeature(wallet, walletStandardFeatures.SolanaSignIn);
335
+ const [output] = await signIn(signInInput);
336
+ if (!output) {
337
+ throw new WalletUiAuthError("auth-unsupported");
338
+ }
339
+ const uiAccount = getUiWalletAccountForSignedInAccount({ account, output, wallet });
340
+ if (wallet.accounts.includes(uiAccount)) {
341
+ connect3(uiAccount);
342
+ }
343
+ return {
344
+ account: uiAccount,
345
+ input: signInInput,
346
+ method: walletStandardFeatures.SolanaSignIn,
347
+ signature: output.signature,
348
+ signedMessage: output.signedMessage
349
+ };
350
+ }
351
+ function getUiWalletAccountForSignedInAccount({
352
+ account,
353
+ output,
354
+ wallet
355
+ }) {
356
+ const matchingCurrentAccount = account?.address === output.account.address ? account : void 0;
357
+ return wallet.accounts.find((walletAccount) => walletAccount.address === output.account.address) ?? matchingCurrentAccount ?? getOrCreateUiWalletAccountForStandardWalletAccount(getWalletForHandle(wallet), output.account);
358
+ }
359
+ function getLocationHost() {
360
+ if (typeof location === "undefined") {
361
+ return void 0;
362
+ }
363
+ return location.host || void 0;
364
+ }
365
+ function getMessageSignInInput(account, input) {
366
+ const domain = input.domain ?? getLocationHost();
367
+ if (!domain) {
368
+ throw new WalletUiAuthError("missing-domain");
369
+ }
370
+ return {
371
+ ...input,
372
+ address: account.address,
373
+ domain
374
+ };
375
+ }
376
+
377
+ // src/use-wallet-ui-auth-message.ts
378
+ function useWalletUiAuthMessage({
379
+ account,
380
+ enabled = Boolean(account),
381
+ reason = account ? "message-signing-unavailable" : "wallet-not-connected",
382
+ signMessage
383
+ }) {
384
+ const [isSigningIn, setIsSigningIn] = React19.useState(false);
385
+ const canSignIn = Boolean(enabled && account);
386
+ const unavailableReason = account ? reason : "wallet-not-connected";
387
+ const signIn = React19.useCallback(
388
+ async ({ input = {} } = {}) => {
389
+ if (!canSignIn || !account) {
390
+ throw new WalletUiAuthError(unavailableReason);
391
+ }
392
+ setIsSigningIn(true);
393
+ try {
394
+ if (signMessage) {
395
+ return await signInWithMessageSigner({
396
+ account,
397
+ input,
398
+ signMessage
399
+ });
400
+ }
401
+ return await signInWithMessageFeature({
402
+ account,
403
+ input
404
+ });
405
+ } finally {
406
+ setIsSigningIn(false);
407
+ }
408
+ },
409
+ [account, canSignIn, signMessage, unavailableReason]
410
+ );
411
+ return {
412
+ canSignIn,
413
+ isSigningIn,
414
+ messageSigningAvailable: canSignIn,
415
+ nativeSignInAvailable: false,
416
+ reason: canSignIn ? void 0 : unavailableReason,
417
+ signIn
418
+ };
419
+ }
420
+ function useWalletUiAuthNative({ enabled = true, wallet }) {
421
+ const { account, connect: connect3 } = useWalletUi();
422
+ const [isSigningIn, setIsSigningIn] = React19.useState(false);
423
+ const targetAccount = getTargetAccount(account, wallet);
424
+ const messageSigningAvailable = hasFeature(targetAccount, walletStandardFeatures.SolanaSignMessage);
425
+ const signIn = React19.useCallback(
426
+ async ({ input = {} } = {}) => {
427
+ if (!enabled) {
428
+ throw new WalletUiAuthError("auth-unsupported");
429
+ }
430
+ setIsSigningIn(true);
431
+ try {
432
+ return await signInWithNativeFeature({
433
+ account: targetAccount,
434
+ connect: connect3,
435
+ input,
436
+ wallet
437
+ });
438
+ } finally {
439
+ setIsSigningIn(false);
440
+ }
441
+ },
442
+ [connect3, enabled, targetAccount, wallet]
443
+ );
444
+ return {
445
+ canSignIn: enabled,
446
+ isSigningIn,
447
+ messageSigningAvailable,
448
+ nativeSignInAvailable: enabled,
449
+ reason: enabled ? void 0 : "auth-unsupported",
450
+ signIn
451
+ };
452
+ }
453
+
454
+ // src/use-wallet-ui-auth.tsx
455
+ function useWalletUiAuth({ wallet }) {
456
+ const { account } = useWalletUi();
457
+ const targetAccount = getTargetAccount(account, wallet);
458
+ const nativeSignInAvailable = hasFeature(wallet, walletStandardFeatures.SolanaSignIn);
459
+ const messageSigningAvailable = Boolean(targetAccount && hasFeature(targetAccount, walletStandardFeatures.SolanaSignMessage));
460
+ const nativeAuth = useWalletUiAuthNative({ enabled: nativeSignInAvailable, wallet });
461
+ const messageAuth = useWalletUiAuthMessage({
462
+ account: targetAccount,
463
+ enabled: messageSigningAvailable,
464
+ reason: targetAccount ? "message-signing-unavailable" : "wallet-not-connected"});
465
+ if (nativeSignInAvailable) {
466
+ return nativeAuth;
467
+ }
468
+ if (messageSigningAvailable) {
469
+ return messageAuth;
470
+ }
471
+ const reason = targetAccount || !hasFeature(wallet, walletStandardFeatures.SolanaSignMessage) ? "auth-unsupported" : "wallet-not-connected";
472
+ return {
473
+ canSignIn: false,
474
+ isSigningIn: false,
475
+ messageSigningAvailable: false,
476
+ nativeSignInAvailable: false,
477
+ reason,
478
+ signIn() {
479
+ return Promise.reject(new WalletUiAuthError(reason));
480
+ }
481
+ };
482
+ }
483
+ var WalletUiClusterContext = React19.createContext({});
256
484
 
257
485
  // src/use-wallet-ui-cluster.tsx
258
486
  function useWalletUiCluster() {
259
- return React18.useContext(WalletUiClusterContext);
487
+ return React19.useContext(WalletUiClusterContext);
260
488
  }
261
489
  function getDropdownItemsWallets({
262
490
  wallets,
@@ -290,8 +518,8 @@ function getDropdownItemsWallets({
290
518
  function useWalletUiDropdown() {
291
519
  const dropdown = useBaseDropdown();
292
520
  const { account, connect: connect3, copy, disconnect, connected, wallet, wallets } = useWalletUi();
293
- const itemsWallets = React18.useMemo(() => getDropdownItemsWallets({ connect: connect3, wallets }), [wallets, connect3]);
294
- const itemsConnected = React18.useMemo(
521
+ const itemsWallets = React19.useMemo(() => getDropdownItemsWallets({ connect: connect3, wallets }), [wallets, connect3]);
522
+ const itemsConnected = React19.useMemo(
295
523
  () => [
296
524
  {
297
525
  handler: async () => {
@@ -317,13 +545,13 @@ function useWalletUiDropdown() {
317
545
  ],
318
546
  [copy, disconnect, dropdown, wallet, itemsWallets]
319
547
  );
320
- const items = React18.useMemo(() => {
548
+ const items = React19.useMemo(() => {
321
549
  return connected ? itemsConnected : itemsWallets;
322
550
  }, [connected, itemsConnected, itemsWallets]);
323
- const buttonProps = React18.useMemo(() => {
551
+ const buttonProps = React19.useMemo(() => {
324
552
  return {
325
553
  label: connected ? (account ? ellipsify(account.address) : wallet?.name) ?? "Connected" : "Select Wallet",
326
- leftSection: connected ? /* @__PURE__ */ React18__default.default.createElement(WalletUiIcon, { wallet }) : void 0
554
+ leftSection: connected ? /* @__PURE__ */ React19__default.default.createElement(WalletUiIcon, { wallet }) : void 0
327
555
  };
328
556
  }, [account, connected, wallet]);
329
557
  return {
@@ -346,7 +574,7 @@ function useWalletUiSigner({
346
574
  }
347
575
  function useWalletUiWallets() {
348
576
  const readonlyWallets = react$1.useWallets();
349
- return React18.useMemo(
577
+ return React19.useMemo(
350
578
  () => readonlyWallets.filter((wallet) => wallet.chains.some((i) => i.startsWith("solana:"))).sort((a, b) => a.name.localeCompare(b.name)),
351
579
  [readonlyWallets]
352
580
  );
@@ -373,10 +601,10 @@ function WalletUiAccountContextProvider({ children, cluster, storage }) {
373
601
  storage = storage ?? core$1.createStorageAccount();
374
602
  const wallets = react$1.useWallets();
375
603
  const accountId = react$3.useStore(storage.value);
376
- const [account, setAccountInternal] = React18.useState(
604
+ const [account, setAccountInternal] = React19.useState(
377
605
  () => getSavedWalletAccount(wallets, accountId)
378
606
  );
379
- const setAccount = React18.useCallback(
607
+ const setAccount = React19.useCallback(
380
608
  (setStateAction) => {
381
609
  setAccountInternal((prevAccount) => {
382
610
  wasSetterInvoked = true;
@@ -388,13 +616,13 @@ function WalletUiAccountContextProvider({ children, cluster, storage }) {
388
616
  },
389
617
  [storage]
390
618
  );
391
- React18.useEffect(() => {
619
+ React19.useEffect(() => {
392
620
  const savedWalletAccount = getSavedWalletAccount(wallets, accountId);
393
621
  if (savedWalletAccount) {
394
622
  setAccountInternal(savedWalletAccount);
395
623
  }
396
624
  }, [accountId, wallets]);
397
- const walletAccount = React18.useMemo(() => {
625
+ const walletAccount = React19.useMemo(() => {
398
626
  if (account) {
399
627
  for (const uiWallet of wallets) {
400
628
  for (const uiWalletAccount of uiWallet.accounts) {
@@ -408,12 +636,12 @@ function WalletUiAccountContextProvider({ children, cluster, storage }) {
408
636
  }
409
637
  }
410
638
  }, [account, wallets]);
411
- React18.useEffect(() => {
639
+ React19.useEffect(() => {
412
640
  if (account && !walletAccount) {
413
641
  setAccountInternal(void 0);
414
642
  }
415
643
  }, [account, walletAccount]);
416
- const wallet = React18.useMemo(() => {
644
+ const wallet = React19.useMemo(() => {
417
645
  if (!walletAccount) {
418
646
  return void 0;
419
647
  }
@@ -428,16 +656,16 @@ function WalletUiAccountContextProvider({ children, cluster, storage }) {
428
656
  }
429
657
  }
430
658
  }, [walletAccount, wallets]);
431
- const accountKeys = React18.useMemo(() => {
659
+ const accountKeys = React19.useMemo(() => {
432
660
  if (!walletAccount) {
433
661
  return [];
434
662
  }
435
663
  return [cluster.id, react$1.getUiWalletAccountStorageKey(walletAccount)].filter(Boolean);
436
664
  }, [walletAccount, cluster.id]);
437
- return /* @__PURE__ */ React18__default.default.createElement(
665
+ return /* @__PURE__ */ React19__default.default.createElement(
438
666
  WalletUiAccountContext.Provider,
439
667
  {
440
- value: React18.useMemo(
668
+ value: React19.useMemo(
441
669
  () => ({
442
670
  account: walletAccount,
443
671
  accountKeys,
@@ -459,7 +687,7 @@ function WalletUiClusterContextProvider({ clusters, render, storage }) {
459
687
  }
460
688
  const found = clusters.find((c) => c.id === clusterId);
461
689
  const first = clusters[0];
462
- const value = React18.useMemo(
690
+ const value = React19.useMemo(
463
691
  () => ({
464
692
  cluster: found ?? first,
465
693
  clusters,
@@ -473,13 +701,13 @@ function WalletUiClusterContextProvider({ clusters, render, storage }) {
473
701
  }),
474
702
  [clusters, first, found, storage]
475
703
  );
476
- return /* @__PURE__ */ React18__default.default.createElement(WalletUiClusterContext.Provider, { value }, render(value));
704
+ return /* @__PURE__ */ React19__default.default.createElement(WalletUiClusterContext.Provider, { value }, render(value));
477
705
  }
478
706
  function WalletUiContextProvider({ children }) {
479
707
  const { account, accountKeys, cluster, setAccount, wallet } = useWalletUiAccount();
480
708
  const wallets = useWalletUiWallets();
481
709
  const connected = Boolean(wallet && wallet?.accounts.length > 0);
482
- const value = React18.useMemo(
710
+ const value = React19.useMemo(
483
711
  () => ({
484
712
  account,
485
713
  accountKeys,
@@ -498,7 +726,7 @@ function WalletUiContextProvider({ children }) {
498
726
  }),
499
727
  [account, accountKeys, cluster, setAccount, connected, wallet, wallets]
500
728
  );
501
- return /* @__PURE__ */ React18__default.default.createElement(WalletUiContext.Provider, { value }, children);
729
+ return /* @__PURE__ */ React19__default.default.createElement(WalletUiContext.Provider, { value }, children);
502
730
  }
503
731
 
504
732
  // src/wallet-ui.tsx
@@ -506,31 +734,102 @@ function createWalletUiConfig(props) {
506
734
  return { ...props };
507
735
  }
508
736
  function WalletUi({ children, config: { accountStorage, clusters, clusterStorage, ...config } }) {
509
- return /* @__PURE__ */ React18__default.default.createElement(
737
+ return /* @__PURE__ */ React19__default.default.createElement(
510
738
  WalletUiClusterContextProvider,
511
739
  {
512
740
  clusters,
513
741
  storage: clusterStorage,
514
742
  render: ({ cluster }) => {
515
- return /* @__PURE__ */ React18__default.default.createElement(WalletUiAccountContextProvider, { cluster, storage: accountStorage }, /* @__PURE__ */ React18__default.default.createElement(WalletUiContextProvider, { ...config }, children));
743
+ return /* @__PURE__ */ React19__default.default.createElement(WalletUiAccountContextProvider, { cluster, storage: accountStorage }, /* @__PURE__ */ React19__default.default.createElement(WalletUiContextProvider, { ...config }, children));
516
744
  }
517
745
  }
518
746
  );
519
747
  }
520
748
  function WalletUiDropdown({ ...props }) {
521
749
  const { buttonProps, items, dropdown } = useWalletUiDropdown();
522
- return /* @__PURE__ */ React18__default.default.createElement(BaseDropdown, { ...props, buttonProps: { ...buttonProps }, dropdown, items });
750
+ return /* @__PURE__ */ React19__default.default.createElement(BaseDropdown, { ...props, buttonProps: { ...buttonProps }, dropdown, items });
523
751
  }
524
752
 
525
753
  // src/wallet-ui-account-guard.tsx
526
- function WalletUiAccountGuard({ fallback = /* @__PURE__ */ React18__default.default.createElement(WalletUiDropdown, null), render }) {
754
+ function WalletUiAccountGuard({ fallback = /* @__PURE__ */ React19__default.default.createElement(WalletUiDropdown, null), render }) {
527
755
  const { account, accountKeys, cluster, wallet } = useWalletUiAccount();
528
756
  return account ? render({ account, accountKeys, cluster, wallet }) : fallback;
529
757
  }
758
+ function WalletUiAuth({ children, wallet }) {
759
+ const { account } = useWalletUi();
760
+ const targetAccount = getTargetAccount(account, wallet);
761
+ if (hasFeature(wallet, walletStandardFeatures.SolanaSignIn)) {
762
+ return /* @__PURE__ */ React19__default.default.createElement(WalletUiAuthNative, { wallet }, children);
763
+ }
764
+ if (targetAccount && hasFeature(targetAccount, walletStandardFeatures.SolanaSignMessage)) {
765
+ return /* @__PURE__ */ React19__default.default.createElement(WalletUiAuthMessage, { account: targetAccount, wallet }, children);
766
+ }
767
+ if (hasFeature(wallet, walletStandardFeatures.SolanaSignMessage) && hasFeature(wallet, core.StandardConnect)) {
768
+ return /* @__PURE__ */ React19__default.default.createElement(WalletUiAuthMessageConnect, { wallet }, children);
769
+ }
770
+ return children({
771
+ canSignIn: false,
772
+ isSigningIn: false,
773
+ messageSigningAvailable: false,
774
+ nativeSignInAvailable: false,
775
+ reason: "auth-unsupported",
776
+ signIn() {
777
+ return Promise.reject(new WalletUiAuthError("auth-unsupported"));
778
+ }
779
+ });
780
+ }
781
+ function WalletUiAuthMessage({
782
+ account,
783
+ children,
784
+ wallet
785
+ }) {
786
+ const signMessage = react.useSignMessage(account);
787
+ const auth = useWalletUiAuthMessage({ account, signMessage});
788
+ return children(auth);
789
+ }
790
+ function WalletUiAuthMessageConnect({ children, wallet }) {
791
+ const { connect: selectAccount } = useWalletUi();
792
+ const [isConnecting, connectWallet] = react$1.useConnect(wallet);
793
+ const [isSigningIn, setIsSigningIn] = React19.useState(false);
794
+ const signIn = React19.useCallback(
795
+ async ({ input = {} } = {}) => {
796
+ setIsSigningIn(true);
797
+ try {
798
+ const [firstAccount] = await connectWallet();
799
+ if (!firstAccount) {
800
+ throw new WalletUiAuthError("wallet-not-connected");
801
+ }
802
+ if (!hasFeature(firstAccount, walletStandardFeatures.SolanaSignMessage)) {
803
+ throw new WalletUiAuthError("auth-unsupported");
804
+ }
805
+ const result = await signInWithMessageFeature({
806
+ account: firstAccount,
807
+ input
808
+ });
809
+ selectAccount(firstAccount);
810
+ return result;
811
+ } finally {
812
+ setIsSigningIn(false);
813
+ }
814
+ },
815
+ [connectWallet, selectAccount]
816
+ );
817
+ return children({
818
+ canSignIn: true,
819
+ isSigningIn: isConnecting || isSigningIn,
820
+ messageSigningAvailable: false,
821
+ nativeSignInAvailable: false,
822
+ reason: void 0,
823
+ signIn
824
+ });
825
+ }
826
+ function WalletUiAuthNative({ children, wallet }) {
827
+ return children(useWalletUiAuthNative({ wallet }));
828
+ }
530
829
  function WalletUiClusterDropdown({ buttonProps, ...props }) {
531
830
  const dropdown = useBaseDropdown();
532
831
  const { cluster, clusters, setCluster } = useWalletUiCluster();
533
- return /* @__PURE__ */ React18__default.default.createElement(
832
+ return /* @__PURE__ */ React19__default.default.createElement(
534
833
  BaseDropdown,
535
834
  {
536
835
  buttonProps: { ...buttonProps, label: cluster.label },
@@ -549,7 +848,7 @@ function WalletUiClusterDropdown({ buttonProps, ...props }) {
549
848
  );
550
849
  }
551
850
  function WalletUiIconNoWallet({ ...props }) {
552
- return /* @__PURE__ */ React18__default.default.createElement(BaseSvg, { fill: "none", height: 100, width: 100, viewBox: "0 0 97 96", ...props }, /* @__PURE__ */ React18__default.default.createElement("circle", { cx: "48.5", cy: "48", r: "48", fill: "url(#paint0_linear_880_5115)", fillOpacity: "0.1" }), /* @__PURE__ */ React18__default.default.createElement(
851
+ return /* @__PURE__ */ React19__default.default.createElement(BaseSvg, { fill: "none", height: 100, width: 100, viewBox: "0 0 97 96", ...props }, /* @__PURE__ */ React19__default.default.createElement("circle", { cx: "48.5", cy: "48", r: "48", fill: "url(#paint0_linear_880_5115)", fillOpacity: "0.1" }), /* @__PURE__ */ React19__default.default.createElement(
553
852
  "circle",
554
853
  {
555
854
  cx: "48.5",
@@ -559,19 +858,19 @@ function WalletUiIconNoWallet({ ...props }) {
559
858
  strokeOpacity: "0.4",
560
859
  strokeWidth: "2"
561
860
  }
562
- ), /* @__PURE__ */ React18__default.default.createElement("g", { clipPath: "url(#clip0_880_5115)" }, /* @__PURE__ */ React18__default.default.createElement(
861
+ ), /* @__PURE__ */ React19__default.default.createElement("g", { clipPath: "url(#clip0_880_5115)" }, /* @__PURE__ */ React19__default.default.createElement(
563
862
  "path",
564
863
  {
565
864
  d: "M65.5769 28.1523H31.4231C27.6057 28.1523 24.5 31.258 24.5 35.0754V60.9215C24.5 64.7389 27.6057 67.8446 31.4231 67.8446H65.5769C69.3943 67.8446 72.5 64.7389 72.5 60.9215V35.0754C72.5 31.258 69.3943 28.1523 65.5769 28.1523ZM69.7308 52.1523H59.5769C57.2865 52.1523 55.4231 50.289 55.4231 47.9985C55.4231 45.708 57.2864 43.8446 59.5769 43.8446H69.7308V52.1523ZM69.7308 41.0754H59.5769C55.7595 41.0754 52.6539 44.1811 52.6539 47.9985C52.6539 51.8159 55.7595 54.9215 59.5769 54.9215H69.7308V60.9215C69.7308 63.2119 67.8674 65.0754 65.5769 65.0754H31.4231C29.1327 65.0754 27.2692 63.212 27.2692 60.9215V35.0754C27.2692 32.785 29.1326 30.9215 31.4231 30.9215H65.5769C67.8673 30.9215 69.7308 32.7849 69.7308 35.0754V41.0754Z",
566
865
  fill: "url(#paint2_linear_880_5115)"
567
866
  }
568
- ), /* @__PURE__ */ React18__default.default.createElement(
867
+ ), /* @__PURE__ */ React19__default.default.createElement(
569
868
  "path",
570
869
  {
571
870
  d: "M61.4231 46.6172H59.577C58.8123 46.6172 58.1924 47.2371 58.1924 48.0018C58.1924 48.7665 58.8123 49.3863 59.577 49.3863H61.4231C62.1878 49.3863 62.8077 48.7664 62.8077 48.0018C62.8077 47.2371 62.1878 46.6172 61.4231 46.6172Z",
572
871
  fill: "url(#paint3_linear_880_5115)"
573
872
  }
574
- )), /* @__PURE__ */ React18__default.default.createElement("defs", null, /* @__PURE__ */ React18__default.default.createElement(
873
+ )), /* @__PURE__ */ React19__default.default.createElement("defs", null, /* @__PURE__ */ React19__default.default.createElement(
575
874
  "linearGradient",
576
875
  {
577
876
  id: "paint0_linear_880_5115",
@@ -581,13 +880,13 @@ function WalletUiIconNoWallet({ ...props }) {
581
880
  y2: "8.42498",
582
881
  gradientUnits: "userSpaceOnUse"
583
882
  },
584
- /* @__PURE__ */ React18__default.default.createElement("stop", { stopColor: "#9945FF" }),
585
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.14", stopColor: "#8A53F4" }),
586
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.42", stopColor: "#6377D6" }),
587
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.79", stopColor: "#24B0A7" }),
588
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.99", stopColor: "#00D18C" }),
589
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "1", stopColor: "#00D18C" })
590
- ), /* @__PURE__ */ React18__default.default.createElement(
883
+ /* @__PURE__ */ React19__default.default.createElement("stop", { stopColor: "#9945FF" }),
884
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.14", stopColor: "#8A53F4" }),
885
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.42", stopColor: "#6377D6" }),
886
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.79", stopColor: "#24B0A7" }),
887
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.99", stopColor: "#00D18C" }),
888
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "1", stopColor: "#00D18C" })
889
+ ), /* @__PURE__ */ React19__default.default.createElement(
591
890
  "linearGradient",
592
891
  {
593
892
  id: "paint1_linear_880_5115",
@@ -597,13 +896,13 @@ function WalletUiIconNoWallet({ ...props }) {
597
896
  y2: "8.42498",
598
897
  gradientUnits: "userSpaceOnUse"
599
898
  },
600
- /* @__PURE__ */ React18__default.default.createElement("stop", { stopColor: "#9945FF" }),
601
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.14", stopColor: "#8A53F4" }),
602
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.42", stopColor: "#6377D6" }),
603
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.79", stopColor: "#24B0A7" }),
604
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.99", stopColor: "#00D18C" }),
605
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "1", stopColor: "#00D18C" })
606
- ), /* @__PURE__ */ React18__default.default.createElement(
899
+ /* @__PURE__ */ React19__default.default.createElement("stop", { stopColor: "#9945FF" }),
900
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.14", stopColor: "#8A53F4" }),
901
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.42", stopColor: "#6377D6" }),
902
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.79", stopColor: "#24B0A7" }),
903
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.99", stopColor: "#00D18C" }),
904
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "1", stopColor: "#00D18C" })
905
+ ), /* @__PURE__ */ React19__default.default.createElement(
607
906
  "linearGradient",
608
907
  {
609
908
  id: "paint2_linear_880_5115",
@@ -613,13 +912,13 @@ function WalletUiIconNoWallet({ ...props }) {
613
912
  y2: "23.7879",
614
913
  gradientUnits: "userSpaceOnUse"
615
914
  },
616
- /* @__PURE__ */ React18__default.default.createElement("stop", { stopColor: "#9945FF" }),
617
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.14", stopColor: "#8A53F4" }),
618
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.42", stopColor: "#6377D6" }),
619
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.79", stopColor: "#24B0A7" }),
620
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.99", stopColor: "#00D18C" }),
621
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "1", stopColor: "#00D18C" })
622
- ), /* @__PURE__ */ React18__default.default.createElement(
915
+ /* @__PURE__ */ React19__default.default.createElement("stop", { stopColor: "#9945FF" }),
916
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.14", stopColor: "#8A53F4" }),
917
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.42", stopColor: "#6377D6" }),
918
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.79", stopColor: "#24B0A7" }),
919
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.99", stopColor: "#00D18C" }),
920
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "1", stopColor: "#00D18C" })
921
+ ), /* @__PURE__ */ React19__default.default.createElement(
623
922
  "linearGradient",
624
923
  {
625
924
  id: "paint3_linear_880_5115",
@@ -629,22 +928,22 @@ function WalletUiIconNoWallet({ ...props }) {
629
928
  y2: "45.4453",
630
929
  gradientUnits: "userSpaceOnUse"
631
930
  },
632
- /* @__PURE__ */ React18__default.default.createElement("stop", { stopColor: "#9945FF" }),
633
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.14", stopColor: "#8A53F4" }),
634
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.42", stopColor: "#6377D6" }),
635
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.79", stopColor: "#24B0A7" }),
636
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "0.99", stopColor: "#00D18C" }),
637
- /* @__PURE__ */ React18__default.default.createElement("stop", { offset: "1", stopColor: "#00D18C" })
638
- ), /* @__PURE__ */ React18__default.default.createElement("clipPath", { id: "clip0_880_5115" }, /* @__PURE__ */ React18__default.default.createElement("rect", { width: "48", height: "48", fill: "white", transform: "translate(24.5 24)" }))));
931
+ /* @__PURE__ */ React19__default.default.createElement("stop", { stopColor: "#9945FF" }),
932
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.14", stopColor: "#8A53F4" }),
933
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.42", stopColor: "#6377D6" }),
934
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.79", stopColor: "#24B0A7" }),
935
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "0.99", stopColor: "#00D18C" }),
936
+ /* @__PURE__ */ React19__default.default.createElement("stop", { offset: "1", stopColor: "#00D18C" })
937
+ ), /* @__PURE__ */ React19__default.default.createElement("clipPath", { id: "clip0_880_5115" }, /* @__PURE__ */ React19__default.default.createElement("rect", { width: "48", height: "48", fill: "white", transform: "translate(24.5 24)" }))));
639
938
  }
640
939
  function WalletUiLabel({ className, wallet, ...props }) {
641
940
  if (!wallet) {
642
941
  return null;
643
942
  }
644
- return /* @__PURE__ */ React18__default.default.createElement("span", { "data-wu": "wallet-ui-label", className: `${className ?? ""}`, ...props }, wallet.name);
943
+ return /* @__PURE__ */ React19__default.default.createElement("span", { "data-wu": "wallet-ui-label", className: `${className ?? ""}`, ...props }, wallet.name);
645
944
  }
646
945
  function WalletUiListButton({ className, select, wallet, ...props }) {
647
- const [pending, setPending] = React18__default.default.useState(false);
946
+ const [pending, setPending] = React19__default.default.useState(false);
648
947
  function handleSelect() {
649
948
  if (!select) {
650
949
  return;
@@ -656,7 +955,7 @@ function WalletUiListButton({ className, select, wallet, ...props }) {
656
955
  }
657
956
  void select(account).finally(() => setPending(false));
658
957
  }
659
- return /* @__PURE__ */ React18__default.default.createElement(
958
+ return /* @__PURE__ */ React19__default.default.createElement(
660
959
  "button",
661
960
  {
662
961
  disabled: pending,
@@ -665,20 +964,20 @@ function WalletUiListButton({ className, select, wallet, ...props }) {
665
964
  onClick: handleSelect,
666
965
  ...props
667
966
  },
668
- /* @__PURE__ */ React18__default.default.createElement(WalletUiIcon, { wallet }),
669
- /* @__PURE__ */ React18__default.default.createElement(WalletUiLabel, { wallet })
967
+ /* @__PURE__ */ React19__default.default.createElement(WalletUiIcon, { wallet }),
968
+ /* @__PURE__ */ React19__default.default.createElement(WalletUiLabel, { wallet })
670
969
  );
671
970
  }
672
971
 
673
972
  // src/wallet-ui-list.tsx
674
973
  function WalletUiList({ className, select, wallets, ...props }) {
675
- return /* @__PURE__ */ React18__default.default.createElement("div", { "data-wu": "wallet-ui-list", className: `${className ?? ""}`, ...props }, wallets.map((wallet) => /* @__PURE__ */ React18__default.default.createElement(WalletUiListButton, { key: wallet.name, select, wallet })));
974
+ return /* @__PURE__ */ React19__default.default.createElement("div", { "data-wu": "wallet-ui-list", className: `${className ?? ""}`, ...props }, wallets.map((wallet) => /* @__PURE__ */ React19__default.default.createElement(WalletUiListButton, { key: wallet.name, select, wallet })));
676
975
  }
677
976
  function WalletUiModal({ wallets, select, ...props }) {
678
- return /* @__PURE__ */ React18__default.default.createElement(BaseModal, { description: "Connect a wallet on Solana to continue", ...props }, /* @__PURE__ */ React18__default.default.createElement(WalletUiList, { wallets, select }));
977
+ return /* @__PURE__ */ React19__default.default.createElement(BaseModal, { description: "Connect a wallet on Solana to continue", ...props }, /* @__PURE__ */ React19__default.default.createElement(WalletUiList, { wallets, select }));
679
978
  }
680
979
  function WalletUiModalTrigger({ label = "Select Wallet", modal, ...props }) {
681
- return /* @__PURE__ */ React18__default.default.createElement(BaseButton, { label, onClick: () => void modal.open(), ...props });
980
+ return /* @__PURE__ */ React19__default.default.createElement(BaseButton, { label, onClick: () => void modal.open(), ...props });
682
981
  }
683
982
 
684
983
  Object.defineProperty(exports, "getWalletAccountFeature", {
@@ -707,6 +1006,8 @@ exports.WalletUi = WalletUi;
707
1006
  exports.WalletUiAccountContext = WalletUiAccountContext;
708
1007
  exports.WalletUiAccountContextProvider = WalletUiAccountContextProvider;
709
1008
  exports.WalletUiAccountGuard = WalletUiAccountGuard;
1009
+ exports.WalletUiAuth = WalletUiAuth;
1010
+ exports.WalletUiAuthError = WalletUiAuthError;
710
1011
  exports.WalletUiClusterContext = WalletUiClusterContext;
711
1012
  exports.WalletUiClusterContextProvider = WalletUiClusterContextProvider;
712
1013
  exports.WalletUiClusterDropdown = WalletUiClusterDropdown;
@@ -727,6 +1028,7 @@ exports.useBaseDropdown = useBaseDropdown;
727
1028
  exports.useBaseModal = useBaseModal;
728
1029
  exports.useWalletUi = useWalletUi;
729
1030
  exports.useWalletUiAccount = useWalletUiAccount;
1031
+ exports.useWalletUiAuth = useWalletUiAuth;
730
1032
  exports.useWalletUiCluster = useWalletUiCluster;
731
1033
  exports.useWalletUiDropdown = useWalletUiDropdown;
732
1034
  exports.useWalletUiSigner = useWalletUiSigner;
@@ -738,22 +1040,22 @@ Object.keys(react$1).forEach(function (k) {
738
1040
  get: function () { return react$1[k]; }
739
1041
  });
740
1042
  });
741
- Object.keys(react).forEach(function (k) {
1043
+ Object.keys(walletStandardFeatures).forEach(function (k) {
742
1044
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
743
1045
  enumerable: true,
744
- get: function () { return react[k]; }
1046
+ get: function () { return walletStandardFeatures[k]; }
745
1047
  });
746
1048
  });
747
- Object.keys(core$1).forEach(function (k) {
1049
+ Object.keys(react).forEach(function (k) {
748
1050
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
749
1051
  enumerable: true,
750
- get: function () { return core$1[k]; }
1052
+ get: function () { return react[k]; }
751
1053
  });
752
1054
  });
753
- Object.keys(walletStandardFeatures).forEach(function (k) {
1055
+ Object.keys(core$1).forEach(function (k) {
754
1056
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
755
1057
  enumerable: true,
756
- get: function () { return walletStandardFeatures[k]; }
1058
+ get: function () { return core$1[k]; }
757
1059
  });
758
1060
  });
759
1061
  Object.keys(core).forEach(function (k) {