@xrpl-wallet-kit/browser 0.1.7 → 0.1.9

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,4 +1,4 @@
1
- /*! @xrpl-wallet-kit/browser v0.1.7 | MIT | https://github.com/XRPDomains/xrpl-wallet-kit */
1
+ /*! @xrpl-wallet-kit/browser v0.1.9 | MIT | https://github.com/XRPDomains/xrpl-wallet-kit */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __typeError = (msg) => {
4
4
  throw TypeError(msg);
@@ -2431,6 +2431,8 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2431
2431
  const SESSION_KEY = "session";
2432
2432
  const WALLET_STORAGE_VERSION = 1;
2433
2433
  const RECOVER_SESSION_RETRY_DELAYS_MS = [0, 700, 1600, 3e3];
2434
+ const DEFAULT_AUTO_RECONNECT_RESTORE_TIMEOUT_MS = 3e3;
2435
+ const DEFAULT_PENDING_RETURN_RECOVERY_TIMEOUT_MS = 1e4;
2434
2436
  const DEFAULT_ACCOUNT_STATUS_TIMEOUT_MS = 2500;
2435
2437
  const DEFAULT_AUTHENTICATE_EXPIRES_IN_SECONDS = 3600;
2436
2438
  const DEFAULT_TX_CONFIRMATION_ATTEMPTS = 6;
@@ -2543,9 +2545,14 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2543
2545
  }
2544
2546
  try {
2545
2547
  if (adapter.restoreSession) {
2546
- const restored = await adapter.restoreSession(session);
2548
+ const restoredResult = await this.withTimeout(adapter.restoreSession(session), DEFAULT_AUTO_RECONNECT_RESTORE_TIMEOUT_MS);
2549
+ if (restoredResult.timedOut) {
2550
+ await this.clearStoredSessionAsStale(session, "restore_timeout");
2551
+ return null;
2552
+ }
2553
+ const restored = restoredResult.value;
2547
2554
  if (!(restored == null ? void 0 : restored.session)) {
2548
- this.emit("session_stale", { adapterId: session.adapterId, account: session.account, session, reason: "restore_unavailable" });
2555
+ await this.clearStoredSessionAsStale(session, "restore_unavailable");
2549
2556
  return null;
2550
2557
  }
2551
2558
  const enrichedSession2 = await this.enrichSession(this.withWalletMetadata(restored.session, adapter));
@@ -2555,8 +2562,19 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2555
2562
  this.emit("connected", { adapterId: enrichedSession2.adapterId, account: enrichedSession2.account, session: enrichedSession2 });
2556
2563
  return enrichedSession2;
2557
2564
  }
2558
- if (adapter.isAvailable && !await adapter.isAvailable()) {
2559
- this.emit("session_stale", { adapterId: session.adapterId, account: session.account, session, reason: "adapter_unavailable" });
2565
+ if (adapter.isAvailable) {
2566
+ const availability = await this.withTimeout(Promise.resolve(adapter.isAvailable()), DEFAULT_AUTO_RECONNECT_RESTORE_TIMEOUT_MS);
2567
+ if (availability.timedOut) {
2568
+ await this.clearStoredSessionAsStale(session, "availability_timeout");
2569
+ return null;
2570
+ }
2571
+ if (!availability.value) {
2572
+ await this.clearStoredSessionAsStale(session, "adapter_unavailable");
2573
+ return null;
2574
+ }
2575
+ }
2576
+ if (session.expiresAt && session.expiresAt <= Date.now()) {
2577
+ await this.clearStoredSessionAsStale(session, "session_expired");
2560
2578
  return null;
2561
2579
  }
2562
2580
  const enrichedSession = await this.enrichSession(this.withWalletMetadata(session, adapter));
@@ -2590,16 +2608,34 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2590
2608
  return null;
2591
2609
  const announcedAdapters = /* @__PURE__ */ new Set();
2592
2610
  const recoveryRetryDelaysMs = this.config.recoveryRetryDelaysMs ?? RECOVER_SESSION_RETRY_DELAYS_MS;
2611
+ const recoveryDeadline = Date.now() + DEFAULT_PENDING_RETURN_RECOVERY_TIMEOUT_MS;
2612
+ let timedOut = false;
2593
2613
  for (const delayMs of recoveryRetryDelaysMs) {
2614
+ const remainingBeforeDelay = recoveryDeadline - Date.now();
2615
+ if (remainingBeforeDelay <= 0) {
2616
+ timedOut = true;
2617
+ break;
2618
+ }
2594
2619
  if (delayMs > 0)
2595
- await this.delay(delayMs);
2620
+ await this.delay(Math.min(delayMs, remainingBeforeDelay));
2596
2621
  for (const adapter of recoverableAdapters) {
2622
+ const remaining = recoveryDeadline - Date.now();
2623
+ if (remaining <= 0) {
2624
+ timedOut = true;
2625
+ break;
2626
+ }
2597
2627
  try {
2598
2628
  if (!announcedAdapters.has(adapter.metadata.id)) {
2599
2629
  announcedAdapters.add(adapter.metadata.id);
2600
2630
  this.emit("connecting", { adapterId: adapter.metadata.id, recovering: true });
2601
2631
  }
2602
- const recovered = await ((_a2 = adapter.recoverSession) == null ? void 0 : _a2.call(adapter, { network, walletId: adapter.metadata.id }));
2632
+ const recovery = await this.withTimeout((_a2 = adapter.recoverSession) == null ? void 0 : _a2.call(adapter, { network, walletId: adapter.metadata.id }), remaining);
2633
+ if (recovery.timedOut) {
2634
+ timedOut = true;
2635
+ this.logger.warn(`Session recovery timed out for ${adapter.metadata.id}`);
2636
+ break;
2637
+ }
2638
+ const recovered = recovery.value;
2603
2639
  if (!(recovered == null ? void 0 : recovered.session))
2604
2640
  continue;
2605
2641
  const enrichedSession = await this.enrichSession(this.withWalletMetadata(recovered.session, adapter));
@@ -2613,14 +2649,20 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2613
2649
  this.logger.warn(`Session recovery failed for ${adapter.metadata.id}`, error);
2614
2650
  }
2615
2651
  }
2652
+ if (timedOut)
2653
+ break;
2616
2654
  }
2617
2655
  recoverableAdapters.forEach((adapter) => {
2618
2656
  var _a3;
2619
- this.emit("session_stale", { adapterId: adapter.metadata.id, reason: "recover_unavailable", attempts: recoveryRetryDelaysMs.length });
2657
+ this.emit("session_stale", { adapterId: adapter.metadata.id, reason: timedOut ? "recover_timeout" : "recover_unavailable", attempts: recoveryRetryDelaysMs.length });
2620
2658
  void ((_a3 = adapter.cancelPendingConnection) == null ? void 0 : _a3.call(adapter));
2621
2659
  });
2622
2660
  return null;
2623
2661
  }
2662
+ async clearStoredSessionAsStale(session, reason) {
2663
+ await this.storage.removeItem(SESSION_KEY);
2664
+ this.emit("session_stale", { adapterId: session.adapterId, account: session.account, session, reason });
2665
+ }
2624
2666
  delay(ms2) {
2625
2667
  return new Promise((resolve) => setTimeout(resolve, ms2));
2626
2668
  }
@@ -4402,7 +4444,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
4402
4444
  async connect(options) {
4403
4445
  var _a2;
4404
4446
  const signInAndWait = this.requireMethod("signInAndWait");
4405
- const result = await signInAndWait(this.randomHex());
4447
+ const result = await this.withAbort(signInAndWait(this.randomHex()), options.signal);
4406
4448
  const address = this.pickString(result, ["response.data.address", "response.address", "address"]);
4407
4449
  if (!address)
4408
4450
  throw new Error("Crossmark did not return an XRPL address");
@@ -4511,6 +4553,37 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
4511
4553
  const value = pickPath(source, paths);
4512
4554
  return typeof value === "string" && value.trim() ? value : void 0;
4513
4555
  }
4556
+ withAbort(promise, signal) {
4557
+ if (!signal)
4558
+ return promise;
4559
+ if (signal.aborted)
4560
+ return Promise.reject(createWalletError.connectionRejected(this.metadata.name, new Error("Connection was cancelled")));
4561
+ return new Promise((resolve, reject) => {
4562
+ let settled = false;
4563
+ const cleanup = () => signal.removeEventListener("abort", abort);
4564
+ const abort = () => {
4565
+ if (settled)
4566
+ return;
4567
+ settled = true;
4568
+ cleanup();
4569
+ reject(createWalletError.connectionRejected(this.metadata.name, new Error("Connection was cancelled")));
4570
+ };
4571
+ signal.addEventListener("abort", abort, { once: true });
4572
+ promise.then((value) => {
4573
+ if (settled)
4574
+ return;
4575
+ settled = true;
4576
+ cleanup();
4577
+ resolve(value);
4578
+ }, (error) => {
4579
+ if (settled)
4580
+ return;
4581
+ settled = true;
4582
+ cleanup();
4583
+ reject(error);
4584
+ });
4585
+ });
4586
+ }
4514
4587
  }
4515
4588
  function createCrossmarkAdapter(options) {
4516
4589
  return new CrossmarkAdapter(options);
@@ -4537,14 +4610,14 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
4537
4610
  async connect(options) {
4538
4611
  var _a2;
4539
4612
  const provider = this.provider();
4540
- const state2 = await this.initialize(provider);
4541
- const connected = await this.resolveConnected(provider, state2);
4613
+ const state2 = await this.withAbort(this.initialize(provider), options.signal);
4614
+ const connected = await this.withAbort(this.resolveConnected(provider, state2), options.signal);
4542
4615
  if (!connected)
4543
4616
  throw new Error("DropFi connection was rejected");
4544
- const address = await this.resolveAddress(provider, connected, state2);
4617
+ const address = await this.withAbort(this.resolveAddress(provider, connected, state2), options.signal);
4545
4618
  if (!address)
4546
4619
  throw new Error("DropFi did not return an XRPL address");
4547
- const publicKey = await this.resolvePublicKey(provider, connected, state2);
4620
+ const publicKey = await this.withAbort(this.resolvePublicKey(provider, connected, state2), options.signal);
4548
4621
  this.activeAddress = address;
4549
4622
  return { account: { address, publicKey, network: options.network, networkType: (_a2 = options.network) == null ? void 0 : _a2.networkType }, raw: { connected, address, publicKey } };
4550
4623
  }
@@ -4639,6 +4712,37 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
4639
4712
  clearTimeout(timer);
4640
4713
  }
4641
4714
  }
4715
+ withAbort(promise, signal) {
4716
+ if (!signal)
4717
+ return promise;
4718
+ if (signal.aborted)
4719
+ return Promise.reject(createWalletError.connectionRejected(this.metadata.name, new Error("Connection was cancelled")));
4720
+ return new Promise((resolve, reject) => {
4721
+ let settled = false;
4722
+ const cleanup = () => signal.removeEventListener("abort", abort);
4723
+ const abort = () => {
4724
+ if (settled)
4725
+ return;
4726
+ settled = true;
4727
+ cleanup();
4728
+ reject(createWalletError.connectionRejected(this.metadata.name, new Error("Connection was cancelled")));
4729
+ };
4730
+ signal.addEventListener("abort", abort, { once: true });
4731
+ promise.then((value) => {
4732
+ if (settled)
4733
+ return;
4734
+ settled = true;
4735
+ cleanup();
4736
+ resolve(value);
4737
+ }, (error) => {
4738
+ if (settled)
4739
+ return;
4740
+ settled = true;
4741
+ cleanup();
4742
+ reject(error);
4743
+ });
4744
+ });
4745
+ }
4642
4746
  provider(required = true) {
4643
4747
  const host = globalThis;
4644
4748
  const provider = this.options.provider ?? host.__xwk_dropfi ?? host.dropfi ?? this.resolveLegacyXrplProvider(host.xrpl);
@@ -8855,7 +8959,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
8855
8959
  throw new Error("Please install GemWallet Extension");
8856
8960
  if (!provider.getAddress)
8857
8961
  throw new Error("GemWallet provider is missing getAddress()");
8858
- const [address, publicKey, network] = await Promise.all([provider.getAddress(), this.getPublicKey(provider), (_a2 = provider.getNetwork) == null ? void 0 : _a2.call(provider)]);
8962
+ const [address, publicKey, network] = await this.withAbort(Promise.all([provider.getAddress(), this.getPublicKey(provider), (_a2 = provider.getNetwork) == null ? void 0 : _a2.call(provider)]), options.signal);
8859
8963
  const accountAddress = (_b = address.result) == null ? void 0 : _b.address;
8860
8964
  if (!accountAddress)
8861
8965
  throw new Error("GemWallet did not return an XRPL address");
@@ -9031,6 +9135,37 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
9031
9135
  networkName(network) {
9032
9136
  return typeof network === "string" ? network : network == null ? void 0 : network.name;
9033
9137
  }
9138
+ withAbort(promise, signal) {
9139
+ if (!signal)
9140
+ return promise;
9141
+ if (signal.aborted)
9142
+ return Promise.reject(createWalletError.connectionRejected(this.metadata.name, new Error("Connection was cancelled")));
9143
+ return new Promise((resolve, reject) => {
9144
+ let settled = false;
9145
+ const cleanup = () => signal.removeEventListener("abort", abort);
9146
+ const abort = () => {
9147
+ if (settled)
9148
+ return;
9149
+ settled = true;
9150
+ cleanup();
9151
+ reject(createWalletError.connectionRejected(this.metadata.name, new Error("Connection was cancelled")));
9152
+ };
9153
+ signal.addEventListener("abort", abort, { once: true });
9154
+ promise.then((value) => {
9155
+ if (settled)
9156
+ return;
9157
+ settled = true;
9158
+ cleanup();
9159
+ resolve(value);
9160
+ }, (error) => {
9161
+ if (settled)
9162
+ return;
9163
+ settled = true;
9164
+ cleanup();
9165
+ reject(error);
9166
+ });
9167
+ });
9168
+ }
9034
9169
  }
9035
9170
  function createGemWalletAdapter(options) {
9036
9171
  return new GemWalletAdapter(options);
@@ -10546,9 +10681,10 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
10546
10681
  }
10547
10682
  }
10548
10683
  function createWalletConnectMetadata(metadata2) {
10684
+ var _a2;
10549
10685
  return {
10550
10686
  ...metadata2,
10551
- icons: [WALLETCONNECT_ICON]
10687
+ icons: ((_a2 = metadata2.icons) == null ? void 0 : _a2.length) ? metadata2.icons : [WALLETCONNECT_ICON]
10552
10688
  };
10553
10689
  }
10554
10690
  function createWalletConnectAdapter(options) {
@@ -15525,6 +15661,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
15525
15661
  var distExports = requireDist$4();
15526
15662
  const XAMAN_ICON = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAADAFBMVEUAAAABEEYCJaAABBQCCScAMNAHMs8ALcIDMtUCLsUEHnsACzMABRgEJJYAKrcBFlwML70BJ6kAIpEAGnIDFFMAMtcEIo8AFVsFJqAaNr8PJYktUP8bQvQSJogiROoiQucKFlAAMM////8AMNAAL80AL8wkSP8kSf8AL84AMM4AMNEjSP8AMNIBMM8AL88AMdQfRfsCMdIFM9UDMtQgRv0CMdEiR/4cQ/cGNNkdRPkiR/8INdsAJc0KL74aQvUFMc8ZQfMMOOEGL8EAKs4CMM0bN8UZNLkAMdMAMNMaNb0WLqUTPesPOuUKN98FLb0UKZMXQPEbOMgAKM4RO+cJNt0VPu4eP+AdO9UcOs4bNsEgQ+8cPNgGM9IePt0AI8wcOcsWLaAYMrMILroQIn0UPuwcO9MEL8QXMKsTKI8FM9cVMroXL6gfP+MQMb0fQOUePdoKM9AHMcwTJ4ogQusALc8CL8ghRPIYQO8NOeIUOdMONtEcOtAALc4DMMoTOdgVK5gPIHYSPOkMNdQGMMgYMa4SJYUiRvoAMtsQIHIgQegHLLUYMbAWLJ0OIXns8P0iRfYXO9sYMrUOHmsNNtgQNMcKKKASJIEOOuMONM0TNssKM8sGKrAIKaYVK5sOG2ASPOgVPOMYPOAAM98NN9wYN8oLMsgOLbEOHWba4fiBmegAMdkPMsMMKJs4XNoYOM8TN88VNcUUKpYPH24XPv/3+f7O2PcaP+YQOd4ALssXNMAOLrULIoOMoeojS9YQMLkIKaxMav7m6/zg5fjG0vahs+0AMdYXP9MQKp8KI4hNbN4NLKsNJpD7/P+Vp+trheJceeAAJMoQKJYNJYscQ//f5f7y9f25xvJDZNwdRtULJpS0wvGquu8YP+otUtcAK8+Zre0DKbkSLaaXqP+tu/7CzfN3kOYzVtkUPP0ON/M6WvDT2O6YrOsEMuZTcuQCL+SjreAoT9cCK9UvRbV7kv9lfv8WP/icr+wIMus+XeMoSM9sh/KltPEvS8gAJ8JBUJYJG3H8amTuAAAAIXRSTlMAN6IHFvbl0e/ediYMmMRbzbiPaEb1h07HomX66MzLxpgV7MnoAAAY2ElEQVR42pRXy27aUBClSWn6Squ+1YdaIe6dsRlFGGMwtiULVl2AJSTwrks2+QLYZsUnsIzEMv/RL+hvdNt9L9d3/ACapJONfbF9z51z5sykdjxOH3z6+O1LvZGFjPrgda3GvcLahBA6c1ms1B+dnTx9+7B273j+4fysHiNFgr85BZzwzd0I5gGSNxJ2sdRst388+vjpfhievX+yvWl1PfD5dTEn8C8a9w7ZHQLBNSNgXGP88vHB3dufvFt31DdGAFecRTtGSmTj/iEaYyBML0R1dYH469XtEE7fP75p6oenGEaCEwAQ243/CVus+oTDXgWB1fQB0p8ntxDx4OsfK/vAdweCJiMfHkuAbQkV/8Ql556C3WEErGXqD34+evmv/T99xrnI9kwIx9LsPwgPFCCk3XGjKLrsqktxHMHAIfC7VQQzVLlsbc9Pj+7/+hc6XTt7MgUyWBpSUbeRle2twWzo9MOQQs9fbi4b0jqGwA0AggoC+8KH3bfWr47RcPK7D0PDQC8Ap2Ne6jjq2i5RKebDEAFVwO4P+vHEFeKIFLsBoF9hQURE6pD2+uwQwcnNCHAm+TlccgJWAGNZ/uwSVHhxOr6+SodOqO+WA0scRQBxr5wemaLm9ucBgtdbucitR84ARtJkYAjhQJSEFCBRvOraQqqweoPJsI8AtBwI6wCBGyBML8rp63rkuerBmxdVHbxZNxo+cqrtGPRTKsRlv1yDct4nCBI7Z13hsNxZAARh6spDBA7hQlR1iIvdc+uTSv29a1mukoDIYLqe3tQkAyeyXEgw7e5tZMneyAdCb9IQB7XgEb/PkqLscNs3Jf85a6vKw1wCI8Br89KFb5LBB4KFfci2LZsbBwmGl3IfQULUj2Q1BVpTrXfPcgBPt+qHMXLlldQgBqTzwnpAnFpMyB6Ezjgk8DashHLtO6VitLsOeLrab17l/v+upe5j1OsqmkFeePIaccX45QTBr4i6SkQUA8GS/ZdDLAGn+Zo+qSFl+8EAOF9reTLv4jIs3vD1IMDSUE4qb+lBzSsi9PdosDoBQOZkLGvTaNtnp1kC6i3dcvFK5pU/kWzDGQNsiYUjHOdh7gB4idxrC0TZKbi3AGWFvc26wvu1oSoxvKf8gEp6ZsOcAM3MbSHdGIk2jLlI+pKXdKs3B2m/0PPPk+8ZrL5rsQSCXq46vcoJmBkwt9Gg4ONMMFB2di1wlqHHrXa9mw4+rHeXPQf8JksAjAQsMxfx9e0J4FYxI8Umb8dnhrgEcsrmun6tJZiRjakwEtAq5WRdSS4nvr4r5EYhGBsEnEn2dv7sTLIMT8++7+2aFj0hBXXJjsQc3Y1gRATX+12wmCm06dqabfdZ7UG9WfWeJveEiiGIOVfzfRGwAbPysVQcPpjJY/2m9qatl2Je4p5geOFNZQqYiCrZchdHpzK5IiqNcVmVm2Gjctyf57XzdiZMZBtKAGbSFKGeX/KxpFc+kugms/F4Nhr09mYyVgx5mdB4stbC4wwhTLgQX7Qyjkxpck/g0ZgNITG1y004WnrZUETBImrIgzSIxc627VJO2MVY8vqm9aT2iF1+JA1UNLZl94rRWBhl8oA9JgCgMCRQQfGoWYDj8S8G3fjLxa8AcUNi339cq2cM81nVbxgzTsKUGciwsLvHSOBfJ9FgPlk6oMJPrP0epIwTWAbFnMsqRIOmXsuKI1e+iEJcFBJYyVwYY5kbW4zgrZpSqJCik0wJAJau3C8F4DOXJ30ml7tDzbgcDm3eFXjXKfZZAosMPtMBwWVOuy1FNCXC0r+jvAtbF6fWL8pAZ5wBVDSYIneiXpClnQ2hkDA51eMKkQSg+GqKPRL0NMXEZd2GxwyWVI2T/Zcwq2ltIoqi8z9cJXmTTJSGRk3ShiGmzEIhBsJUN7PIyk1AREhpVLJxE8mmWXTRpZFuaqGrpB8LhWi1UKg20NaKVgS/WlGLYkXRjbfz3nkvyaT0rkJmmnvm3XPPPXdKHFTFwCguQRD4eAAu76amxzJ0CCngUmaIlxNJoSSUELNXwwkPMfjRtIEaQs2oSdy64HOunyvMEhsH4VdAXXEEIMFdHU0pZ4PGdRCPTYrF13LIFaoZLxioBtki1tcKJMiMwH9CjpDTlVilqyOS35pqPSUIEGxChV05obgNc9EbLJYOwgGrNWRY6meUsxC/MqUAsCHZeswVBMz/dBizjK6DSjgXb7CBXEgJMCiN7gG9oMU4ASnN6rHl+MjoIBM4ahTioUT4SE94iAAeHBW90t38EOZODui3Cad6bKO3GIwbM2AB1r4IaOymOpZBKCjktmB4uoAfK5G1RxBYiW5nILOUkBSw9A8jmlDqo+YZxhx9BjtRGs0ldkjA1KfkHkJfDsZAAZwjK8DLHBWMlkHxdgmPClLTQdMVjxJyC5KTF6QgxENp1qkC+Hh0BZASkw5HKgEEk7Kv5UFqXTtJGPsZvlSdIdlQOMaYhVMgDyeVbP6l342N2bY5JoUHAPQpCHFYtmqkvd9IjiiTGMNAITaU7bwd4SPAF/AxHZRQD+1SBsKNX8yv/H2//OLB6jnbZRUJjwSQwdGwgjDnlv3m70HoB31EhVRrts9tr89Z9mG5M6nhROnGmR4ILN3Z/Ck++cvW80d+N5bnTGpmV83AgRwZUqPTD5orT9b8/s1vZllkJT0FjWa35+lXXr3Js4uHr2ZCwdDg3TPdMygbch8DwnXodsesL35Ec72dPSV8Z/i05gsHUsEUNYFaEPNzj/mtD6wyvhTlTe5+JGgUE6v7tIsPJoaTQYKQ7bICMbh5qT5j5gO/iuanr/hJltXoiCvxklxLaejkV7dw61tCQIJAX3JGDTbe4dLaz0ZyNBoODN0+S0gyAyiDGmMKQDl/398ZLy4nRROwjEakqcRHxe3p4HDUnGvSPQrBoUpAECi/ioP9JYP8sX7mcB3NxYxOM0ZyqUpwPv/c3x2tjeGAUBsCsFipZIXkJYI5a4WfPxDYF+QUXfpK+VVsPbTFhjJyltaOgPI+wnWDhOa6vyd+Ni4z4XQIQL1Sg/hU4pn2s+57v9zZEIKAQsp4bUfUe+FQCQDcNUe9cw3trTZ7AbxrTOmCdMSBndq4aILpSmXk5kTPze83NkZ0Nz8KKWnw0PIpBPzUkTUhhajRkpRSAHbFmEmdojYs1RxeEHajUpn9Lu9SCGYN5O+ObbvzBaZyXwEJgGjTUk+kSrCH4Z7UwlGntiOMx91K7emtR14EF6y++bdeuicAoSfRlwCghfp+a9Obf601igokNeP0+HhdtPlOzYnmP3r/4Illqfwqnpk8C2wbjRGYUay6pkP5vU/UEF1K7xw0Njk+vihEv1Tb8ZXPfeiDwO6Tf+ZmWWSPjEVI0KVeKftp31ruk//RiV8BTI20xhYdZ1LYIWd8wfDZL2e8fzPv/Wrijcmz22Z5IGK2L8EBq0lqXX/VJ/9Eq0FX+TYQHNFY3XE4e4yC4xbDfEgIjo2JOZ7fsrefLc/M/1ufbKD5seeUrdd+bzRbDfIc8l8hmlF3imInmHacaeYDguPy591k9gqSzLcaOWU3qM3G7C/98n/bJcMC+5XRtcCCsyC6kIpBou8i2Dwuf4s/f2e9mge/dekaBtA3vbH+Ve4kRMEhpkUXinXOWKNeLPJihH983jwm/x5zxXHsQ9fD5YXppyeLoJ2647mNf0HpxBQyfdrpanFRCEi9uBDjUKZvA8ER+Xf5+OpR+S23LiwdpGGIAdQd99sXQy5B+W1ZAjBZrU5zAIGFal0I6GJx9PvM0fn/7NVcskSsF15msKE46WB+dc3fTzlODvN9lTu3AXJE09eqkxxA9Gr1nsEB3Ktesz1MVFlmRa3KKxO91z7lyVSEptrbTX8/QVuitVgMwhI37Np/xszsp4koCuPzr0xGEzphSlDrFrAJLVsfIG1Ma2mnRZHFUtpSSk2xVFKhYVFbF5BFoxjBHZfEDRUiLohxj1FEQUnURH1wSdzienvPvaUyRZynoZ3O+c39zv3O13LG4SC70OxwUDG6HXZupr1w6aglYren4i14UVLm0viH0MIlaa8QmeQYU6q4RQvhy+OcNQuW4h+nGVQrFR47aHeQteC67d3RvYDsR+p/4xY24IxwGGBUOuiGXn8K7b0oHSgojdao0P+0F66GBVi9EL5sMHp7NwcA2+z2IAAo9PpIEuux3EpwmycWj9BX7MPXecwJFunB6y8SL8U+4dPJUpeFQmuScBIJhSCIMqgW6byAXm/GAHKzqA8kSfcxzUj+fdZj8BkLiihSgq+XE63cqI6dsyMU2g22vxZiGADIKIBIdqFZFLf5E9aHnHjOuJ1joQlAg9mPS+/TkEN5w+H5sAXCobUCthwGPSzpvIgY4Ug3OJ1mqJ/w+DxgO8yRJbg9e23qEChvhMMw+YW14fDyOdg1GVEknSeYRCKGPOg0wfyd4XjXm86TSxNySgfASLT+Gq+3QCHDph+GEISYGKdIO8/kDJC7+gxBEHdGgrwJFg7PfxGARz/1erF/RUOYF/di0uIwg1Ybsq3S5PSRlFtTI+l/iaX4KcFdCat0AFjwsPV6T8PU24NDGGQwxmQyw53MBlMNAPiVtP7sBHxt7413s1z70iKPql2Fggf2oHkF3oJUGWFCABysu8tgCGIAj4rWn50guXZSM9z17J9XXsA/CSSh4EOi3+kCIoWiCgEYDAIA1BQXu+S4r2BNZyfwsDklw+vXT55Vff7Hdd8n/NjmqvCshdwTJwVj8LExAGX0JNEc3zxyOdGTpeTdKysbnsv7/U9mrP9wngpPOkdTE/Td/CoYZSi7FqAwFgNgj61bFwXQHb2ZKH9dSzAXRgbd7obhucnIkJRjM9R/EVGR+dp0JonEHiKFcDoaAZniGjkBWNEnkBEvnX+sbsUbyetv2oqKWmXYESY64WOSAWCfgDnjcNgVLJWCi5OCWUcB+jCAalQ6YV9ZkEv8/Cgl+PV7J4/rc5UDuS8S1B8an5DhXw/tDge2G1lUCiIAlgIBuABA2GftwO5+M1F9ls9olRL86krh8F5U27L6My9Ll+5rDpgcChBg+CAFCYA4CzIrXOS7FQDIPdPuM4SmCAYoPGI8Ne2t9hwW6m9ZubJC55tOsPnRBwGWHU08gUrRzUHsrGo6LbBRACUAKLXaDpwzR/4u8gPyd3L6xo3Pp3XiHXiLU/fX1w/IOJ3v1LQBEFSQ4QqDHp0hKebBWRORgrESgMpMbTtmAxug9T8+VwBA3vr1q3R/EVzRyaF+b3l5i5qLfkmJDyI377jMcEGEDjyhG0lBzmgWZvYBAFeZmdnJgRFemUoRHwcreAKQn9+cqrs2tcxjLj+sf69GU1rLY/ZvQ3EDwAXtLQ84xQBJHPZ4KQQWAAQA6KQArL+Cmvupb4Ol6TGAst4c9JC02Z+4VFD/RmHhJNTneip+jNGlu9N+jM52p4lIoY+XAs7mMR0EoMdoJACygf7bm3EN38/ScgqQUea+gXpO57qF9T3ox/WT1ZO7dmmqecyyITe3ovrR51NDB8Zuf2vvEyDemUwmkEIhivoglcJBRWE6WADYbjRWcqCpbcvz0YMPrzzSTZSUUwC+xN2wMzu6PmlH3z68MI4GDMyiEyeGq5NBxKysrB4uLY2tMZ/t2WdVQgMUx4ZsQBQDciKFPUJEcTDbCcDh3HMEYO6WlRUTFlWaTs5naDQUoNrd0IoLsbo09B4+y6nelZ9P69fasrJwUvN41FqttRPu6zMYfCTniSjMwxmSQgECOBxMZwwgV83BndCm5lg5XvfCwnSoytXeb7vHsXAQ70zJyC8rO0Lqq234Y2ApWm17bMIVUymcTiy7XCHqiRQc2hVxAOfULAFooa2fPgXA3i+6D4Tk4FKa3W73kVqoLxtoabEJHNb1eGYmEda1Dk04aABUP0ilgBwMUlAA9lxWrgxuvKGlHgOA++Qls3D+uK6tBF6Gv/nBhoaGYTXUFwbq61eSFdyemXlcAHPrW0GN1mcyxaQQ46VgKskNbVk2lgDUw94j7kMAUlob65qzY/VTqo8UtbXt5Hio319a2lLL0242KmEpUP1jRAqDwaAAKZxO0SyfkoICyGxbCAC/oTQhQFdjY2sKKc+nNDdsKirqyoZn5vrLy+upF+QaSTezHVZrn0DjXrFruhQRfVQKRsaSHqItxMPeA4AT+c1UgpK6k+c5GH7o8evq6s7nIR6or9GUb4h5QW4P3KhdayU2q0StSPei00lscRtIwaBzuvcoAOw94r8UgM2+vn9r1yGOz746d2fRycbGx9WkPt9fqNGUkL2IvQCsVavVQn0BhS1qi8iW6IQSsRQAAK1PADLiAP4Ubi6vTURRGI+vqvVVH6gbwXApmGHiJQuXUhhap3YxoRtbqdKYwTRQu2ggCxXtgAkdksyiowlqkoJRE9AgJqtowK6Kwazsrjv9TzzJvWfu6Ix6oNBCy3fu4/t9Z0omOeAvnkGjYfwIdbSiZdu2taXKqF+IxRT0IrCA6U9MIdth1nqIWJybQyxCQsFRuBvAqw/JP8O8h/xlRSK9TWjBsBuNhg3LJ3z/69WC0N/YWGH6IfDiM8K8OD/PM//K3bk511HAd64G8hmv+aVEMgX85RVJdzeHZfc1GuG3MfxtrVrl+iFgkcOCm1OcsROgzy5gGLEoEgoaOCC8J8yPDaSTjL+8g1Cla1m9SoJiU1LoW7SF+mFg0cYkQS8iC94sLj6/jFi8/2dCHQiMCO/5NtCU3PBT4YtGHBiNf41G15RpdhYDFj3i+teBq2wrwIsv2KpdWJxbWGBeDB8KHCRss0XwxqvVuMzN2S/tAoVdRcRPkEVfk8nvCdQHFj3hLAAvIgtmZ9/wrQB9PgCLo3g6EthL0fwu+mgyV9vVdzok6F/Tie+pFNcPSl+Wl5aeyJwF167/7kXE4mXEIibU7bHAKPV4r9VC/KlNnQWAtwiNJyGL0lz/6vLyUkJCFqAXV8GLq9yLoC+wiAl1Y2/gzC1sQBH0cfhbsXRN9dOX1HIqm212+GWJAwu9LFgVLHgOWBZYxKNYuDcKH6qVhzcPdkD24I+WDWOL+uhHSKWULRXDeG1m4M99WHDzJrJgcRHGb+ZFwDJPqIWFV3sGbzZw8ytOA8kcp4+qWWbTpwGa3oUs3JLZnsvxGEMHsiCELPjNi0wVsCwSauHw0UDgRE00gPwt8waktG72xMV3svBHVtdLOUq4fsHRD6+AvmDBJ4alCTEiARYf8qMALL4evGSw/5A0NH/Mh79E3mkbLGdEqeGirls7CuW/8rlaKMSZPlnJ5Dd8WABPXWGBxaCDxfUz7O0SpI/gr5NARbuNlwCXr+0YltHsqFw/t+ZwQ1oBFnlYQF5MTb0JOSOSmBbvq4f3BaD2rA/p48JfyuGvqrXtXoS4zDdeNEzT2pqWeBbW12BoQS8uZTI4F1y77rAAvQi5LLAIXpiojQaGdXwbGlirIn2Qv0yg27Bz1JGXyjAKtHsK5dEtQRa0hP4SsmDVlwXPQZ9dwCEWp0fgVRu2BXCRBP4m+9nvhLimAH0c9Iik0sly127bRiWoOlkYjaK+rAALFcnDAhgR36K+MyJ9eAj/GGEbwG6BHHfwR4LfS/1JIrZgs9HViBrpaE3LhurD8rn+pZ/JaFTj61eWgeYuFgT/ZMEqYHk1KLBIwYOswAg0LvAnNUuptMNfVWlvbjasXhcmEaheTsUwlDuQRagvKzMIcxIGfR8WzDpefD4/D1isnUH9AQvc/C3qWUVYj2rWJi+7l5OpyELIoqji0o9LHha8By/yVt7MsscVHJHgo/2uOvbIxd+KXoqrLuxNVrptu20MJhFKRF9JyMK00I994cZYyd/xYcEzGNH4ViwOsLg9BhYUte9k1Rk/aRkmfvqb9eV0Ih3ik4h4Lss2H6E+sPizRBgL8nkPC9jjUogRaIhlOoJvGeE1uBAtOwGgW0VsAK+iLBF3S/Lguaw4KTv6BdS/msnkkQWuGV148cXAi+ohSKE/O6iLADD6cvAfpU4WIQsrkpjhCnVCWC+ZTMY7F7wEL2Iuw4gUol596OD8epD7sGd0x8nf9WmiXyply9OEXUatWl2r8/UrS/9hwXBE2h4BfW8d3VuT2AJ3TUvz3QJ8LtT1lEa5GYChqC8nlnC2hVy+5swFn5AFZMiC9bEjAf86fegds4FpuhLILwv7CZ6FoL/WEvrAItQHFjksuO6wYGrqQe0UAshbR07WKGhoZnvXvwFClR3LsoqhCGZhq9XKyVwfWPjlnyz4ODX7+OA5f21E0tg6JeN623ok+S1f3tINQy+rEtevR6NR1H+yPDPzmTBR0N9w6XOyP5t9ODLqu3w3EU4cf1dr2u0y9Vt+3zTMHVcWJj36zIv5Ow4LriEL1AfzY6OQf/+vPWfPm2Z/W/KYr2KZplEMYxaGKqAfn2aaoB+rB7m+YBFjAaHb6+uHj50R8PvfNuw5cfH84UMH3Pok122bZvcH5Y2RztdUEvTxnwqxWD3MNl3J5PNuFkwcGDm+d3SP/97/AhJojZpbharQAAAAAElFTkSuQmCC";
15527
15663
  const XAMAN_PENDING_RECOVERY_TTL_MS = 18e4;
15664
+ const XAMAN_RESTORE_READY_TIMEOUT_MS = 2500;
15528
15665
  class XamanAdapter extends BaseWalletAdapter {
15529
15666
  constructor(options) {
15530
15667
  super();
@@ -15548,7 +15685,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
15548
15685
  async connect(options) {
15549
15686
  await this.setPendingRecoveryMarker();
15550
15687
  try {
15551
- const result = await this.authorize();
15688
+ const result = await this.withAbort(this.authorize(), options.signal);
15552
15689
  if (result instanceof Error)
15553
15690
  throw result;
15554
15691
  const connectResult = await this.createConnectResultFromAuth(result, options);
@@ -15578,7 +15715,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
15578
15715
  if (!await this.hasPendingRecoveryMarker())
15579
15716
  return null;
15580
15717
  try {
15581
- const result = await this.authorize();
15718
+ const result = await this.withAbort(this.authorize(), options.signal);
15582
15719
  if (!result || result instanceof Error) {
15583
15720
  this.clearPendingRecoveryMarker();
15584
15721
  return null;
@@ -15642,19 +15779,24 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
15642
15779
  });
15643
15780
  }
15644
15781
  async checkXamanState(options = {}) {
15645
- var _a2, _b, _c, _d, _e2, _f;
15646
- if (!((_b = (_a2 = this.sdk) == null ? void 0 : _a2.state) == null ? void 0 : _b.signedIn) && !((_d = (_c = this.sdk) == null ? void 0 : _c.state) == null ? void 0 : _d.account))
15782
+ var _a2, _b, _c, _d;
15783
+ if (!this.sdk)
15647
15784
  return null;
15648
- const accountAddress = await this.resolveSdkValue((_e2 = this.sdk.user) == null ? void 0 : _e2.account) ?? this.sdk.state.account;
15785
+ await this.waitForSdkReady(this.sdk);
15786
+ const openid = await this.resolveSdkValue((_a2 = this.sdk.environment) == null ? void 0 : _a2.openid);
15787
+ const accountAddress = await this.resolveSdkValue((_b = this.sdk.user) == null ? void 0 : _b.account) ?? ((_c = this.sdk.state) == null ? void 0 : _c.account) ?? (openid == null ? void 0 : openid.account) ?? (openid == null ? void 0 : openid.sub);
15649
15788
  if (!accountAddress)
15650
15789
  return null;
15651
15790
  return {
15652
15791
  account: {
15653
15792
  address: accountAddress,
15654
15793
  network: options.network,
15655
- networkType: await this.resolveSdkValue((_f = this.sdk.user) == null ? void 0 : _f.networkType)
15794
+ networkType: await this.resolveSdkValue((_d = this.sdk.user) == null ? void 0 : _d.networkType) ?? (openid == null ? void 0 : openid.networkType)
15656
15795
  },
15657
- raw: this.sdk.state
15796
+ raw: {
15797
+ state: this.sdk.state,
15798
+ openid
15799
+ }
15658
15800
  };
15659
15801
  }
15660
15802
  requireSdk() {
@@ -15730,6 +15872,20 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
15730
15872
  async resolveSdkValue(value) {
15731
15873
  return value instanceof Promise ? value : value;
15732
15874
  }
15875
+ async waitForSdkReady(sdk) {
15876
+ var _a2, _b, _c;
15877
+ const readySignals = [
15878
+ (_a2 = sdk.environment) == null ? void 0 : _a2.ready,
15879
+ (_b = sdk.environment) == null ? void 0 : _b.retrieved,
15880
+ (_c = sdk.environment) == null ? void 0 : _c.success
15881
+ ].filter((signal) => Boolean(signal));
15882
+ if (!readySignals.length)
15883
+ return;
15884
+ await Promise.race([
15885
+ Promise.race(readySignals).then(() => void 0),
15886
+ new Promise((resolve) => setTimeout(resolve, XAMAN_RESTORE_READY_TIMEOUT_MS))
15887
+ ]);
15888
+ }
15733
15889
  clearPkceStorage() {
15734
15890
  var _a2;
15735
15891
  if (typeof window === "undefined")
@@ -15739,6 +15895,37 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
15739
15895
  } catch {
15740
15896
  }
15741
15897
  }
15898
+ withAbort(promise, signal) {
15899
+ if (!signal)
15900
+ return promise;
15901
+ if (signal.aborted)
15902
+ return Promise.reject(createWalletError.connectionRejected(this.metadata.name, new Error("Connection was cancelled")));
15903
+ return new Promise((resolve, reject) => {
15904
+ let settled = false;
15905
+ const cleanup = () => signal.removeEventListener("abort", abort);
15906
+ const abort = () => {
15907
+ if (settled)
15908
+ return;
15909
+ settled = true;
15910
+ cleanup();
15911
+ reject(createWalletError.connectionRejected(this.metadata.name, new Error("Connection was cancelled")));
15912
+ };
15913
+ signal.addEventListener("abort", abort, { once: true });
15914
+ promise.then((value) => {
15915
+ if (settled)
15916
+ return;
15917
+ settled = true;
15918
+ cleanup();
15919
+ resolve(value);
15920
+ }, (error) => {
15921
+ if (settled)
15922
+ return;
15923
+ settled = true;
15924
+ cleanup();
15925
+ reject(error);
15926
+ });
15927
+ });
15928
+ }
15742
15929
  getPendingRecoveryKey() {
15743
15930
  return `xwk.xaman.pending.${this.options.apiKey ?? "injected"}`;
15744
15931
  }
@@ -15795,8 +15982,8 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
15795
15982
  async connect(options) {
15796
15983
  var _a2;
15797
15984
  const ethereum = this.ethereum();
15798
- await ethereum.request({ method: "wallet_requestSnaps", params: { [this.snapId]: {} } });
15799
- const snap = await ethereum.request({ method: "wallet_invokeSnap", params: { snapId: this.snapId, request: { method: "xrpl_getAccount" } } });
15985
+ await this.withAbort(ethereum.request({ method: "wallet_requestSnaps", params: { [this.snapId]: {} } }), options.signal);
15986
+ const snap = await this.withAbort(ethereum.request({ method: "wallet_invokeSnap", params: { snapId: this.snapId, request: { method: "xrpl_getAccount" } } }), options.signal);
15800
15987
  const address = snap.account;
15801
15988
  if (!address)
15802
15989
  throw new Error("XRPL Snap did not return an XRPL address");
@@ -15938,6 +16125,37 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
15938
16125
  throw new Error("No MetaMask provider installed");
15939
16126
  return ethereum;
15940
16127
  }
16128
+ withAbort(promise, signal) {
16129
+ if (!signal)
16130
+ return promise;
16131
+ if (signal.aborted)
16132
+ return Promise.reject(createWalletError.connectionRejected(this.metadata.name, new Error("Connection was cancelled")));
16133
+ return new Promise((resolve, reject) => {
16134
+ let settled = false;
16135
+ const cleanup = () => signal.removeEventListener("abort", abort);
16136
+ const abort = () => {
16137
+ if (settled)
16138
+ return;
16139
+ settled = true;
16140
+ cleanup();
16141
+ reject(createWalletError.connectionRejected(this.metadata.name, new Error("Connection was cancelled")));
16142
+ };
16143
+ signal.addEventListener("abort", abort, { once: true });
16144
+ promise.then((value) => {
16145
+ if (settled)
16146
+ return;
16147
+ settled = true;
16148
+ cleanup();
16149
+ resolve(value);
16150
+ }, (error) => {
16151
+ if (settled)
16152
+ return;
16153
+ settled = true;
16154
+ cleanup();
16155
+ reject(error);
16156
+ });
16157
+ });
16158
+ }
15941
16159
  }
15942
16160
  function createXrplSnapAdapter(options) {
15943
16161
  return new XrplSnapAdapter(options);
@@ -15951,11 +16169,11 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
15951
16169
  error: "#b45309",
15952
16170
  success: "#059669",
15953
16171
  muted: "#64748b",
15954
- border: "#e5e7eb",
16172
+ border: "rgba(17,24,39,.08)",
15955
16173
  overlay: "rgba(15,23,42,.46)",
15956
16174
  overlayBlur: 0,
15957
16175
  surface: "#f8fafc",
15958
- surfaceHover: "#f1f5f9",
16176
+ surfaceHover: "rgba(17,24,39,.04)",
15959
16177
  fallbackIconBackground: "rgba(15,23,42,.06)",
15960
16178
  fallbackIconColor: "#111827",
15961
16179
  shadow: "0 8px 40px rgba(15,23,42,.12), 0 0 0 1px rgba(15,23,42,.04)",
@@ -15973,7 +16191,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
15973
16191
  error: "#fbbf24",
15974
16192
  success: "#34d399",
15975
16193
  muted: "#94a3b8",
15976
- border: "#334155",
16194
+ border: "rgba(248,250,252,.10)",
15977
16195
  overlay: "rgba(2,6,23,.72)",
15978
16196
  overlayBlur: 0,
15979
16197
  surface: "#1f2937",
@@ -16036,12 +16254,12 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
16036
16254
  muted: "#64748b",
16037
16255
  border: "rgba(255,255,255,.50)",
16038
16256
  overlay: "rgba(15,23,42,.30)",
16039
- overlayBlur: 20,
16257
+ overlayBlur: 24,
16040
16258
  surface: "rgba(255,255,255,.52)",
16041
16259
  surfaceHover: "rgba(255,255,255,.66)",
16042
16260
  fallbackIconBackground: "rgba(99,102,241,.15)",
16043
16261
  fallbackIconColor: "#6366f1",
16044
- shadow: "0 8px 40px rgba(99,102,241,.15), 0 0 0 1px rgba(255,255,255,.30)",
16262
+ shadow: "0 0 0 1px rgba(255,255,255,.08), 0 12px 40px rgba(15,23,42,.24)",
16045
16263
  radius: "20px",
16046
16264
  walletRadius: "14px",
16047
16265
  spinnerTrail: "rgba(99,102,241,.15)",
@@ -16268,15 +16486,18 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
16268
16486
  const accountPanel = ui.accountPanel ?? {};
16269
16487
  const identity2 = ui.identity ?? {};
16270
16488
  const { accountPanelMode: overrideAccountPanelMode, ...restOverrides } = overrides;
16489
+ const themeMode = ui.mode ?? ui.themeMode ?? overrides.themeMode ?? "light";
16271
16490
  const theme = {
16272
- ...resolveWalletTheme({ mode: ui.mode ?? overrides.themeMode ?? "light", themeName: ui.themeName }),
16491
+ ...resolveWalletTheme({ mode: themeMode, themeName: ui.themeName }),
16492
+ ...ui.theme ?? {},
16273
16493
  ...ui.customTheme ?? {},
16274
16494
  ...overrides.theme ?? {}
16275
16495
  };
16276
- return createDefaultWalletButtonConfig({
16496
+ return createDefaultWalletButtonConfig(compactWalletButtonConfig({
16277
16497
  language: ui.language,
16278
16498
  messages: resolveWalletUiMessages(ui.language, ui.messages),
16279
16499
  label: connectButton.label,
16500
+ icon: connectButton.icon,
16280
16501
  showAdapterIcon: connectButton.showAdapterIcon,
16281
16502
  showChevron: connectButton.showChevron,
16282
16503
  showBalance: connectButton.showBalance,
@@ -16291,18 +16512,19 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
16291
16512
  showWeb3Name: identity2.enabled ?? true,
16292
16513
  fallbackToAddress: identity2.fallbackToAddress,
16293
16514
  identityResolver: identity2.resolver,
16294
- themeMode: ui.mode,
16515
+ themeMode,
16295
16516
  themeName: ui.themeName,
16296
16517
  ...restOverrides,
16297
16518
  accountPanelMode: overrideAccountPanelMode ?? accountPanel.mode ?? "modal",
16298
16519
  theme
16299
- });
16520
+ }));
16300
16521
  }
16301
16522
  function createDefaultWalletButtonConfig(overrides = {}) {
16302
16523
  const { theme, ...rest } = overrides;
16303
16524
  const messages = resolveWalletUiMessages(overrides.language, overrides.messages);
16304
- return {
16525
+ return compactWalletButtonConfig({
16305
16526
  showWeb3Name: true,
16527
+ icon: { type: "default" },
16306
16528
  showAdapterIcon: true,
16307
16529
  showChevron: true,
16308
16530
  showBalance: false,
@@ -16324,7 +16546,10 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
16324
16546
  ...resolveWalletTheme({ mode: rest.themeMode ?? "light", themeName: rest.themeName }),
16325
16547
  ...theme ?? {}
16326
16548
  }
16327
- };
16549
+ });
16550
+ }
16551
+ function compactWalletButtonConfig(config) {
16552
+ return Object.fromEntries(Object.entries(config).filter(([, value]) => value !== void 0));
16328
16553
  }
16329
16554
  var qrCodeStyling$1 = { exports: {} };
16330
16555
  var qrCodeStyling = qrCodeStyling$1.exports;
@@ -19620,13 +19845,6 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
19620
19845
  window.scrollTo(0, savedScrollY);
19621
19846
  savedScrollY = 0;
19622
19847
  }
19623
- function getWalletStyleId(prefix, styles2) {
19624
- let hash2 = 5381;
19625
- for (let index2 = 0; index2 < styles2.length; index2 += 1) {
19626
- hash2 = (hash2 << 5) + hash2 ^ styles2.charCodeAt(index2);
19627
- }
19628
- return `${prefix}-${(hash2 >>> 0).toString(36)}`;
19629
- }
19630
19848
  function ensureWalletStyle(id2, styles2) {
19631
19849
  if (typeof document === "undefined")
19632
19850
  return;
@@ -19636,6 +19854,8 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
19636
19854
  element = document.createElement("style");
19637
19855
  element.dataset.xwkStyle = id2;
19638
19856
  document.head.appendChild(element);
19857
+ } else if (element.nextSibling) {
19858
+ document.head.appendChild(element);
19639
19859
  }
19640
19860
  if (element.textContent !== styles2)
19641
19861
  element.textContent = styles2;
@@ -19654,6 +19874,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
19654
19874
  this.qrCopied = false;
19655
19875
  this.qrLightMode = false;
19656
19876
  this.availability = {};
19877
+ this.availabilityLoading = false;
19657
19878
  this.offEvents = [];
19658
19879
  this.openHandlers = /* @__PURE__ */ new Set();
19659
19880
  this.closeHandlers = /* @__PURE__ */ new Set();
@@ -19672,6 +19893,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
19672
19893
  }
19673
19894
  open() {
19674
19895
  this.activeGroupId = void 0;
19896
+ this.availabilityLoading = true;
19675
19897
  this.lastFocusedElement = document.activeElement instanceof HTMLElement ? document.activeElement : null;
19676
19898
  this.renderView("list");
19677
19899
  this.openHandlers.forEach((handler) => handler());
@@ -20073,7 +20295,11 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20073
20295
  }
20074
20296
  async refreshAvailability() {
20075
20297
  var _a2;
20076
- this.availability = await this.options.manager.getWalletAvailability();
20298
+ try {
20299
+ this.availability = await this.options.manager.getWalletAvailability();
20300
+ } finally {
20301
+ this.availabilityLoading = false;
20302
+ }
20077
20303
  if (((_a2 = this.root) == null ? void 0 : _a2.dataset.xwkView) !== "list")
20078
20304
  return;
20079
20305
  const grid = this.root.querySelector(".xwk-grid");
@@ -20403,7 +20629,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20403
20629
  this.bindChrome();
20404
20630
  }
20405
20631
  renderQrLoading() {
20406
- return `<span class="xwk-qr-loading" role="status" aria-live="polite"><span class="xwk-qr-loading-spinner"></span><span>${this.escapeHtml(this.messages().generatingQr)}</span></span>`;
20632
+ return `<span class="xwk-qr-loading xwk-qr-loading-skeleton" role="status" aria-live="polite"><span class="xwk-skeleton-qr xwk-qr-skeleton" aria-hidden="true"></span><span class="xwk-sr-only">${this.escapeHtml(this.messages().generatingQr)}</span></span>`;
20407
20633
  }
20408
20634
  renderQrCopyButtonContent() {
20409
20635
  const messages = this.messages();
@@ -20479,11 +20705,12 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20479
20705
  }
20480
20706
  ensureStyles(theme, layout, size2, textSize) {
20481
20707
  const styles2 = `${this.renderStyles(theme, layout, size2, textSize)}${this.renderMobileSheetOverrides(theme)}`;
20482
- ensureWalletStyle(getWalletStyleId("xwk-modal", styles2), styles2);
20708
+ ensureWalletStyle("xwk-modal", styles2);
20483
20709
  }
20484
20710
  renderMobileSheetOverrides(theme) {
20485
20711
  const inlineOverrides = `.xwk-inline{background:transparent!important;display:block!important;inset:auto!important;opacity:1!important;overflow:visible!important;padding:0!important;place-items:initial!important;position:relative!important;z-index:auto!important}.xwk-inline .xwk-modal{border:1px solid ${theme.border}!important;border-radius:${theme.radius}!important;box-shadow:none!important;max-height:none!important;max-width:none!important;opacity:1!important;transform:none!important;transition:none!important;width:100%!important}.xwk-inline .xwk-body{max-height:none!important}.xwk-inline .xwk-header-spacer{display:block;height:44px;width:44px}.xwk-inline[data-xwk-state="closing"] .xwk-modal{opacity:1!important;transform:none!important}`;
20486
- return `.xwk-modal:focus{outline:none}.xwk-sr-only{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.xwk-error-text,.xwk-connect-status.xwk-error-text,.xwk-qr-loading.xwk-error-text{color:${theme.error}!important}.xwk-close,.xwk-back{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;appearance:none;background:transparent!important;border:0!important;box-shadow:none!important;margin:0;outline:none!important}.xwk-close:focus-visible,.xwk-back:focus-visible{outline:2px solid ${theme.accent}!important;outline-offset:0}@media(max-width:640px){.xwk-overlay{padding:max(12px,env(safe-area-inset-top)) 0 0!important;place-items:end center!important}.xwk-modal{align-self:end!important;border-bottom:0!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important;border-left:0!important;border-right:0!important;border-top-left-radius:${theme.radius}!important;border-top-right-radius:${theme.radius}!important;height:auto!important;max-height:calc(100dvh - env(safe-area-inset-top))!important;max-width:none!important;width:100vw!important}.xwk-header{border-top-left-radius:${theme.radius};border-top-right-radius:${theme.radius}}.xwk-body{padding-bottom:max(6px,calc(6px + env(safe-area-inset-bottom)))!important}.xwk-overlay[data-xwk-view="list"] .xwk-body{padding-bottom:max(2px,calc(2px + env(safe-area-inset-bottom)))!important}.xwk-network-row{margin:-4px 0 8px!important}.xwk-overlay[data-xwk-view="list"] .xwk-footer{padding-top:6px!important}}${inlineOverrides}`;
20712
+ const skeletonOverrides = `.xwk-skeleton{animation:xwk-qr-skeleton-pulse 1.4s ease-in-out infinite;background:linear-gradient(90deg,${theme.surface} 25%,${theme.surfaceHover} 50%,${theme.surface} 75%);background-size:200% 100%;display:inline-block}.xwk-skeleton-circle{border-radius:999px}.xwk-skeleton-line{height:14px;border-radius:4px}.xwk-skeleton-pill{border-radius:999px}.xwk-skeleton-card,.xwk-skeleton-button{border-radius:${theme.walletRadius}}.xwk-skeleton-row{align-items:center;display:flex;gap:12px;width:100%}.xwk-qr-loading-skeleton{display:grid;height:100%;place-items:stretch;width:100%}.xwk-qr-skeleton{border-radius:10px;box-sizing:border-box;display:block;height:100%;overflow:hidden;position:relative;width:100%}.xwk-qr-skeleton:before{background-image:radial-gradient(circle,${theme.muted} 0 2px,transparent 2.8px);background-size:14px 14px;content:"";inset:0;opacity:.22;position:absolute}.xwk-qr-skeleton:after{animation:xwk-qr-shimmer 1.35s ease-in-out infinite;background:linear-gradient(90deg,transparent 0%,${theme.surfaceHover} 42%,rgba(255,255,255,.34) 50%,${theme.surfaceHover} 58%,transparent 100%);content:"";inset:0;opacity:.52;position:absolute;transform:translateX(-115%);will-change:transform}.xwk-wallet-badge-loading{color:transparent;min-width:72px;visibility:visible}.xwk-wallet-badge-loading:before{display:none}@keyframes xwk-qr-skeleton-pulse{0%{background-position:200% 0}100%{background-position:-200% 0}}@keyframes xwk-qr-shimmer{0%{transform:translateX(-115%)}100%{transform:translateX(115%)}}@media(prefers-reduced-motion:reduce){.xwk-skeleton,.xwk-qr-skeleton,.xwk-qr-skeleton:after{animation:none!important}.xwk-skeleton,.xwk-qr-skeleton{background:${theme.surfaceHover}!important}.xwk-qr-skeleton:after{display:none!important}}`;
20713
+ return `${skeletonOverrides}.xwk-modal:focus{outline:none}.xwk-sr-only{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.xwk-error-text,.xwk-connect-status.xwk-error-text,.xwk-qr-loading.xwk-error-text{color:${theme.error}!important}.xwk-close,.xwk-back{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;appearance:none;background:transparent!important;border:0!important;box-shadow:none!important;margin:0;outline:none!important}.xwk-close:focus-visible,.xwk-back:focus-visible{outline:2px solid ${theme.accent}!important;outline-offset:0}@media(max-width:640px){.xwk-overlay{padding:max(12px,env(safe-area-inset-top)) 0 0!important;place-items:end center!important}.xwk-modal{align-self:end!important;border-bottom:0!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important;border-left:0!important;border-right:0!important;border-top-left-radius:${theme.radius}!important;border-top-right-radius:${theme.radius}!important;height:auto!important;max-height:calc(100dvh - env(safe-area-inset-top))!important;max-width:none!important;width:100vw!important}.xwk-header{border-top-left-radius:${theme.radius};border-top-right-radius:${theme.radius}}.xwk-body{padding-bottom:max(6px,calc(6px + env(safe-area-inset-bottom)))!important}.xwk-overlay[data-xwk-view="list"] .xwk-body{padding-bottom:max(2px,calc(2px + env(safe-area-inset-bottom)))!important}.xwk-network-row{margin:-4px 0 8px!important}.xwk-overlay[data-xwk-view="list"] .xwk-footer{padding-top:6px!important}}${inlineOverrides}`;
20487
20714
  }
20488
20715
  renderWalletList(layout) {
20489
20716
  const groups = this.getGroups();
@@ -20521,8 +20748,12 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20521
20748
  if (wallet.recommended)
20522
20749
  badges.push(`<span class="xwk-wallet-badge xwk-recommended">${this.escapeHtml(messages.recommended || "Recommended")}</span>`);
20523
20750
  if (isExtensionLike) {
20524
- const className = this.availability[wallet.id] ? "xwk-wallet-badge xwk-installed" : "xwk-wallet-badge";
20525
- badges.push(`<span class="${className}">${this.escapeHtml(messages.installed || "Installed")}</span>`);
20751
+ if (this.availabilityLoading) {
20752
+ badges.push(`<span class="xwk-wallet-badge xwk-wallet-badge-loading xwk-skeleton xwk-skeleton-pill" aria-hidden="true"></span>`);
20753
+ } else {
20754
+ const className = this.availability[wallet.id] ? "xwk-wallet-badge xwk-installed" : "xwk-wallet-badge";
20755
+ badges.push(`<span class="${className}">${this.escapeHtml(messages.installed || "Installed")}</span>`);
20756
+ }
20526
20757
  }
20527
20758
  if (!badges.length)
20528
20759
  return "";
@@ -20821,10 +21052,11 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20821
21052
  this.balanceLoading = false;
20822
21053
  this.activationStatus = "unknown";
20823
21054
  this.balanceRequest = 0;
21055
+ this.balanceDebounceSession = null;
20824
21056
  this.balanceRefreshTimers = /* @__PURE__ */ new Set();
20825
21057
  this.panelOpen = false;
20826
21058
  this.addressQrOpen = false;
20827
- this.txSectionOpen = true;
21059
+ this.historyOpen = false;
20828
21060
  this.panelScrollLocked = false;
20829
21061
  this.connecting = false;
20830
21062
  this.copied = false;
@@ -20839,6 +21071,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20839
21071
  language: options.language,
20840
21072
  messages,
20841
21073
  label: messages.connectWallet,
21074
+ icon: { type: "default" },
20842
21075
  showAdapterIcon: true,
20843
21076
  showChevron: true,
20844
21077
  showWeb3Name: true,
@@ -20860,7 +21093,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20860
21093
  balanceResolver: options.balanceResolver ?? createXrpBalanceResolver(),
20861
21094
  explorerUrl: options.explorerUrl,
20862
21095
  formatAddress: options.formatAddress,
20863
- ...options
21096
+ ...compactButtonOptions(options)
20864
21097
  };
20865
21098
  this.offEvents.push(options.manager.on("connecting", () => {
20866
21099
  this.connecting = true;
@@ -20870,6 +21103,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20870
21103
  this.connecting = false;
20871
21104
  this.panelOpen = false;
20872
21105
  this.addressQrOpen = false;
21106
+ this.historyOpen = false;
20873
21107
  this.renderConnectedState(session ?? options.manager.getSession());
20874
21108
  void this.resolveBalance(session ?? options.manager.getSession());
20875
21109
  }));
@@ -20890,12 +21124,14 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20890
21124
  this.connecting = false;
20891
21125
  this.panelOpen = false;
20892
21126
  this.addressQrOpen = false;
21127
+ this.historyOpen = false;
20893
21128
  this.identityName = null;
20894
21129
  this.identityAvatar = null;
20895
21130
  this.identityRequest += 1;
20896
21131
  this.identityResolvingKey = void 0;
20897
21132
  this.clearIdentitySettleTimer();
20898
21133
  this.clearBalanceRefreshTimers();
21134
+ this.clearBalanceDebounce();
20899
21135
  this.balanceRequest += 1;
20900
21136
  this.balance = null;
20901
21137
  this.balanceLoading = false;
@@ -20908,7 +21144,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20908
21144
  }));
20909
21145
  this.offEvents.push(options.manager.on("tx_confirmed", () => {
20910
21146
  this.clearBalanceRefreshTimers();
20911
- void this.resolveBalance(options.manager.getSession());
21147
+ this.queueBalanceRefresh(options.manager.getSession());
20912
21148
  this.render();
20913
21149
  }));
20914
21150
  this.offEvents.push(options.manager.on("tx_failed", () => {
@@ -20918,13 +21154,13 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20918
21154
  this.clearBalanceRefreshTimers();
20919
21155
  const session = options.manager.getSession();
20920
21156
  this.renderConnectedState(session);
20921
- void this.resolveBalance(session);
21157
+ this.queueBalanceRefresh(session);
20922
21158
  }));
20923
21159
  this.offEvents.push(options.manager.on("networkChanged", () => {
20924
21160
  this.clearBalanceRefreshTimers();
20925
21161
  const session = options.manager.getSession();
20926
21162
  this.renderConnectedState(session);
20927
- void this.resolveBalance(session);
21163
+ this.queueBalanceRefresh(session);
20928
21164
  }));
20929
21165
  this.offEvents.push(options.manager.on("error", () => {
20930
21166
  this.connecting = false;
@@ -20975,6 +21211,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20975
21211
  this.identityRequest += 1;
20976
21212
  this.identityResolvingKey = void 0;
20977
21213
  this.clearBalanceRefreshTimers();
21214
+ this.clearBalanceDebounce();
20978
21215
  if (this.copyResetTimer)
20979
21216
  window.clearTimeout(this.copyResetTimer);
20980
21217
  if (this.identitySettleTimer)
@@ -20988,9 +21225,15 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20988
21225
  if (!this.target)
20989
21226
  return;
20990
21227
  this.target.innerHTML = "";
20991
- this.target.appendChild(this.createRoot());
20992
- this.syncAccountPanelPortal();
20993
- this.syncPanelListeners();
21228
+ try {
21229
+ this.target.appendChild(this.createRoot());
21230
+ this.syncAccountPanelPortal();
21231
+ this.syncPanelListeners();
21232
+ } catch (error) {
21233
+ this.removeAccountPanelPortal();
21234
+ this.syncPanelScrollLock(false);
21235
+ this.target.appendChild(this.createRenderFallback(error));
21236
+ }
20994
21237
  }
20995
21238
  createRoot() {
20996
21239
  var _a2;
@@ -21008,6 +21251,25 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21008
21251
  this.renderAddressQrIfNeeded(root);
21009
21252
  return root;
21010
21253
  }
21254
+ createRenderFallback(_error) {
21255
+ var _a2;
21256
+ const root = document.createElement("div");
21257
+ root.className = "xwk-button-root";
21258
+ try {
21259
+ this.ensureStyles();
21260
+ } catch {
21261
+ }
21262
+ root.innerHTML = `<button class="xwk-account-button" data-xwk-wallet-reset type="button"><span class="xwk-button-label">${this.escapeHtml("Reset wallet")}</span></button>`;
21263
+ (_a2 = root.querySelector("[data-xwk-wallet-reset]")) == null ? void 0 : _a2.addEventListener("click", (event) => {
21264
+ event.stopPropagation();
21265
+ this.connecting = false;
21266
+ this.panelOpen = false;
21267
+ this.addressQrOpen = false;
21268
+ this.historyOpen = false;
21269
+ void this.options.manager.disconnect();
21270
+ });
21271
+ return root;
21272
+ }
21011
21273
  onButtonClick() {
21012
21274
  const session = this.options.manager.getSession();
21013
21275
  if (!session) {
@@ -21022,6 +21284,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21022
21284
  closePanel() {
21023
21285
  this.panelOpen = false;
21024
21286
  this.addressQrOpen = false;
21287
+ this.historyOpen = false;
21025
21288
  this.render();
21026
21289
  }
21027
21290
  handleDocumentPointerDown(event) {
@@ -21034,6 +21297,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21034
21297
  return;
21035
21298
  this.panelOpen = false;
21036
21299
  this.addressQrOpen = false;
21300
+ this.historyOpen = false;
21037
21301
  this.render();
21038
21302
  }
21039
21303
  handleDocumentKeyDown(event) {
@@ -21042,6 +21306,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21042
21306
  if (event.key === "Escape") {
21043
21307
  this.panelOpen = false;
21044
21308
  this.addressQrOpen = false;
21309
+ this.historyOpen = false;
21045
21310
  this.render();
21046
21311
  return;
21047
21312
  }
@@ -21106,7 +21371,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21106
21371
  (_a2 = root.querySelector("[data-xwk-account-close]")) == null ? void 0 : _a2.addEventListener("click", () => this.closePanel());
21107
21372
  (_b = root.querySelector("[data-xwk-account-back]")) == null ? void 0 : _b.addEventListener("click", (event) => {
21108
21373
  event.stopPropagation();
21109
- this.closeAddressQr();
21374
+ this.closeSubView();
21110
21375
  });
21111
21376
  (_c = root.querySelector("[data-xwk-account-overlay]")) == null ? void 0 : _c.addEventListener("click", (event) => {
21112
21377
  if (event.target === event.currentTarget)
@@ -21120,10 +21385,9 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21120
21385
  event.stopPropagation();
21121
21386
  this.openAddressQr();
21122
21387
  });
21123
- (_f = root.querySelector("[data-xwk-tx-toggle]")) == null ? void 0 : _f.addEventListener("click", (event) => {
21388
+ (_f = root.querySelector("[data-xwk-tx-history]")) == null ? void 0 : _f.addEventListener("click", (event) => {
21124
21389
  event.stopPropagation();
21125
- this.txSectionOpen = !this.txSectionOpen;
21126
- this.render();
21390
+ this.openTransactionHistory();
21127
21391
  });
21128
21392
  (_g = root.querySelector("[data-xwk-disconnect]")) == null ? void 0 : _g.addEventListener("click", () => void this.disconnect());
21129
21393
  }
@@ -21132,10 +21396,20 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21132
21396
  return;
21133
21397
  this.panelOpen = true;
21134
21398
  this.addressQrOpen = true;
21399
+ this.historyOpen = false;
21135
21400
  this.render();
21136
21401
  }
21137
- closeAddressQr() {
21402
+ openTransactionHistory() {
21403
+ if (!this.options.manager.getSession())
21404
+ return;
21405
+ this.panelOpen = true;
21406
+ this.addressQrOpen = false;
21407
+ this.historyOpen = true;
21408
+ this.render();
21409
+ }
21410
+ closeSubView() {
21138
21411
  this.addressQrOpen = false;
21412
+ this.historyOpen = false;
21139
21413
  this.panelOpen = true;
21140
21414
  this.render();
21141
21415
  }
@@ -21357,9 +21631,13 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21357
21631
  const messages = this.messages();
21358
21632
  const session = this.options.manager.getSession();
21359
21633
  const connected = Boolean(session);
21634
+ if (this.connecting && !session) {
21635
+ const icon2 = this.options.showAdapterIcon ? `<span class="xwk-button-icon xwk-button-icon-loading" aria-hidden="true"><span class="xwk-skeleton xwk-skeleton-circle xwk-skeleton-button-icon"></span></span>` : "";
21636
+ return `<button class="xwk-account-button xwk-account-button-loading" data-xwk-wallet-button type="button" aria-busy="true" aria-label="${this.escapeHtml(messages.connecting)}">${icon2}<span class="xwk-button-label xwk-button-label-loading" aria-hidden="true"><span class="xwk-skeleton xwk-skeleton-line xwk-skeleton-button-label"></span></span></button>`;
21637
+ }
21360
21638
  const label = this.connecting ? messages.connecting : session ? this.getAccountLabel(session) : this.options.label;
21361
- const balance = session && this.options.showBalance && this.balanceLoading ? `<span class="xwk-button-balance xwk-button-balance-loading">${this.balanceSpinnerIcon()}</span>` : session && this.options.showBalance && this.activationStatus === "unfunded" ? `<span class="xwk-button-balance">(${this.escapeHtml(messages.notActivated)})</span>` : session && this.options.showBalance && ((_a2 = this.balance) == null ? void 0 : _a2.formatted) ? `<span class="xwk-button-balance">(${this.escapeHtml(this.balance.formatted)})</span>` : "";
21362
- const icon = this.options.showAdapterIcon ? this.renderWalletIcon(connected ? session == null ? void 0 : session.wallet : void 0) : "";
21639
+ const balance = session && this.options.showBalance && this.balanceLoading ? `<span class="xwk-button-balance xwk-button-balance-loading" aria-hidden="true"><span class="xwk-skeleton xwk-skeleton-button-balance"></span></span>` : session && this.options.showBalance && this.activationStatus === "unfunded" ? `<span class="xwk-button-balance">(${this.escapeHtml(messages.notActivated)})</span>` : session && this.options.showBalance && ((_a2 = this.balance) == null ? void 0 : _a2.formatted) ? `<span class="xwk-button-balance">(${this.escapeHtml(this.balance.formatted)})</span>` : "";
21640
+ const icon = this.options.showAdapterIcon ? connected ? this.renderWalletIcon(session == null ? void 0 : session.wallet) : this.renderPreConnectIcon() : "";
21363
21641
  const pendingDot = connected && this.options.showRecentTransactions && this.getPendingTransactionCount() > 0 ? `<span class="xwk-button-pending-dot" aria-hidden="true"></span>` : "";
21364
21642
  const chevron = connected && this.options.showChevron && this.options.accountPanel ? `<span class="xwk-button-chevron" aria-hidden="true">${this.chevronIcon()}</span>` : "";
21365
21643
  return `<button class="xwk-account-button" data-xwk-wallet-button type="button">${icon}${pendingDot}<span class="xwk-button-label">${this.escapeHtml(label)}${balance}</span>${chevron}</button>`;
@@ -21369,15 +21647,15 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21369
21647
  const session = this.options.manager.getSession();
21370
21648
  if (!session)
21371
21649
  return "";
21372
- const content = this.addressQrOpen ? this.renderAddressQrPanelContent(session) : this.renderPanelContent(session);
21373
- const title = this.addressQrOpen ? messages.addressQr : messages.connected;
21374
- const hasTransactions = !this.addressQrOpen && this.options.showRecentTransactions && this.getVisibleTransactions(session).length > 0;
21375
- const panelStateClass = `${this.addressQrOpen ? " xwk-account-panel-address-qr" : ""}${hasTransactions ? " xwk-account-panel-with-transactions" : ""}`;
21376
- const leading = this.addressQrOpen ? `<button class="xwk-account-back" type="button" data-xwk-account-back aria-label="${this.escapeHtml(messages.back)}">${this.backIcon()}</button>` : `<span></span>`;
21650
+ const content = this.addressQrOpen ? this.renderAddressQrPanelContent(session) : this.historyOpen ? this.renderTransactionHistoryPanelContent(session) : this.renderPanelContent(session);
21651
+ const title = this.addressQrOpen ? messages.addressQr : this.historyOpen ? messages.recentTransactions : messages.connected;
21652
+ const hasTransactions = !this.addressQrOpen && !this.historyOpen && this.options.showRecentTransactions && this.getVisibleTransactions(session).length > 0;
21653
+ const panelStateClass = `${this.addressQrOpen ? " xwk-account-panel-address-qr" : ""}${this.historyOpen ? " xwk-account-panel-history" : ""}${hasTransactions ? " xwk-account-panel-with-transactions" : ""}`;
21654
+ const leading = this.addressQrOpen || this.historyOpen ? `<button class="xwk-account-back" type="button" data-xwk-account-back aria-label="${this.escapeHtml(messages.back)}">${this.backIcon()}</button>` : `<span></span>`;
21377
21655
  if (this.options.accountPanelMode === "modal") {
21378
21656
  return `<div class="xwk-account-overlay" data-xwk-account-overlay role="presentation"><section class="xwk-account-panel xwk-account-panel-modal${panelStateClass}" role="dialog" aria-modal="true" aria-label="${this.escapeHtml(title)}" tabindex="-1"><div class="xwk-account-modal-header">${leading}<h2>${this.escapeHtml(title)}</h2><button class="xwk-account-close" type="button" data-xwk-account-close aria-label="${this.escapeHtml(messages.close)}">&times;</button></div><div class="xwk-account-modal-body">${content}</div></section></div>`;
21379
21657
  }
21380
- const dropdownBack = this.addressQrOpen ? `<div class="xwk-account-dropdown-header"><button class="xwk-account-back" type="button" data-xwk-account-back aria-label="${this.escapeHtml(messages.back)}">${this.backIcon()}</button><strong>${this.escapeHtml(title)}</strong></div>` : "";
21658
+ const dropdownBack = this.addressQrOpen || this.historyOpen ? `<div class="xwk-account-dropdown-header"><button class="xwk-account-back" type="button" data-xwk-account-back aria-label="${this.escapeHtml(messages.back)}">${this.backIcon()}</button><strong>${this.escapeHtml(title)}</strong></div>` : "";
21381
21659
  return `<div class="xwk-account-panel xwk-account-panel-dropdown${panelStateClass}" role="dialog" aria-label="${this.escapeHtml(title)}">${dropdownBack}${content}</div>`;
21382
21660
  }
21383
21661
  renderPanelContent(session) {
@@ -21394,15 +21672,17 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21394
21672
  const disconnect = this.options.disconnect ? `<button type="button" data-xwk-disconnect${this.copyInProgress || disconnectBusy ? " disabled" : ""}>${disconnectIcon}<span>${disconnectBusy ? this.escapeHtml(messages.disconnecting) : this.escapeHtml(messages.disconnect)}</span></button>` : "";
21395
21673
  const nativeAsset = getNativeAsset(session.account.network);
21396
21674
  const notActivated = this.options.showBalance && this.activationStatus === "unfunded" ? `<div class="xwk-account-warning">${this.escapeHtml(messages.accountNotActivated(nativeAsset))}</div>` : "";
21397
- const balance = this.options.showBalance && this.balanceLoading ? `<div class="xwk-account-balance xwk-account-balance-loading">${this.balanceSpinnerIcon()}<span>${this.escapeHtml(messages.connecting)}</span></div>` : this.options.showBalance && this.activationStatus !== "unfunded" && ((_a2 = this.balance) == null ? void 0 : _a2.formatted) ? `<div class="xwk-account-balance">${this.escapeHtml(this.balance.formatted)}</div>` : "";
21398
- const metaRow = balance ? `<div class="xwk-account-meta-row">${balance}</div>` : "";
21675
+ const balance = this.options.showBalance && this.balanceLoading ? `<span class="xwk-pill-balance xwk-account-balance-loading" role="status" aria-label="${this.escapeHtml(messages.connecting)}"><span class="xwk-skeleton xwk-skeleton-balance"></span></span>` : this.options.showBalance && this.activationStatus !== "unfunded" && ((_a2 = this.balance) == null ? void 0 : _a2.formatted) ? `<span class="xwk-pill-balance">${this.escapeHtml(this.balance.formatted)}</span>` : "";
21399
21676
  const addressQrButton = this.renderAddressQrButton(address);
21677
+ const identityResolving = this.isIdentityResolving(session);
21400
21678
  const hasIdentity = this.shouldShowWeb3Name() && this.identityName;
21401
- const addressLabel = hasIdentity && address ? `<div class="xwk-account-address">${this.escapeHtml(this.formatAddress(address))}${addressQrButton}</div>` : "";
21679
+ const addressLabel = address ? `<span class="xwk-pill-address">${this.escapeHtml(this.formatAddress(address))}</span>` : "";
21680
+ const divider = addressLabel && balance ? `<span class="xwk-pill-divider" aria-hidden="true"></span>` : "";
21681
+ const metaPill = addressLabel || balance || addressQrButton ? `<div class="xwk-account-meta-pill">${addressLabel}${divider}${balance}${addressQrButton}</div>` : "";
21402
21682
  const actions = `<div class="xwk-account-panel-actions">${copy}${explorer}${disconnect}</div>`;
21403
- const accountName = !hasIdentity && addressQrButton && this.options.fallbackToAddress ? `<div class="xwk-account-name xwk-account-name-with-qr xwk-account-name-address"><span>${this.escapeHtml(label)}</span>${addressQrButton}</div>` : `<div class="xwk-account-name">${this.escapeHtml(label)}</div>`;
21683
+ const accountName = identityResolving ? `<div class="xwk-account-name xwk-account-name-skeleton" role="status" aria-label="${this.escapeHtml(messages.connecting)}"><span class="xwk-skeleton xwk-skeleton-name"></span></div>` : hasIdentity ? `<div class="xwk-account-name">${this.escapeHtml(label)}</div>` : "";
21404
21684
  const transactions2 = this.renderTransactionHistory(session);
21405
- return `<div class="xwk-account-hero">${this.renderAccountAvatar(session)}</div>${accountName}${addressLabel}${metaRow}${notActivated}${transactions2}${actions}`;
21685
+ return `<div class="xwk-account-hero">${this.renderAccountAvatar(session, identityResolving)}</div>${accountName}${metaPill}${notActivated}${transactions2}${actions}`;
21406
21686
  }
21407
21687
  renderAddressQrPanelContent(session) {
21408
21688
  const messages = this.messages();
@@ -21422,15 +21702,22 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21422
21702
  renderTransactionHistory(session) {
21423
21703
  if (!this.options.showRecentTransactions)
21424
21704
  return "";
21425
- const transactions2 = this.getVisibleTransactions(session);
21426
- if (!transactions2.length)
21705
+ const allTransactions = this.getVisibleTransactions(session);
21706
+ if (!allTransactions.length)
21427
21707
  return "";
21708
+ const transactions2 = allTransactions.slice(0, Math.min(3, allTransactions.length));
21709
+ const messages = this.messages();
21710
+ const count = allTransactions.length > 9 ? "9+" : String(allTransactions.length);
21711
+ const historyAction = allTransactions.length > transactions2.length ? `<button class="xwk-tx-header-link" type="button" data-xwk-tx-history>${this.escapeHtml(messages.view)}${this.chevronRightIcon()}</button>` : "";
21712
+ const list = `<div class="xwk-tx-list" role="list"><div class="xwk-tx-list-inner">${transactions2.map((transaction2) => this.renderTransactionRow(transaction2)).join("")}</div></div>`;
21713
+ return `<section class="xwk-tx-section" aria-label="${this.escapeHtml(messages.recentTransactions)}"><div class="xwk-tx-header"><span>${this.escapeHtml(messages.recentTransactions)}</span><span class="xwk-tx-count">${this.escapeHtml(count)}</span>${historyAction}</div>${list}</section>`;
21714
+ }
21715
+ renderTransactionHistoryPanelContent(session) {
21428
21716
  const messages = this.messages();
21429
- const count = transactions2.length > 9 ? "9+" : String(transactions2.length);
21430
- const chevronClass = this.txSectionOpen ? "open" : "closed";
21431
- const listClass = this.txSectionOpen ? "open" : "closed";
21432
- const list = `<div class="xwk-tx-list ${listClass}" role="list" aria-hidden="${this.txSectionOpen ? "false" : "true"}"><div class="xwk-tx-list-inner">${transactions2.map((transaction2) => this.renderTransactionRow(transaction2)).join("")}</div></div>`;
21433
- return `<section class="xwk-tx-section" aria-label="${this.escapeHtml(messages.recentTransactions)}"><button class="xwk-tx-header" type="button" data-xwk-tx-toggle aria-expanded="${this.txSectionOpen ? "true" : "false"}"><span>${this.escapeHtml(messages.recentTransactions)}</span><span class="xwk-tx-count">${this.escapeHtml(count)}</span><span class="xwk-tx-chevron ${chevronClass}" aria-hidden="true">${this.chevronUpIcon()}</span></button>${list}</section>`;
21717
+ const transactions2 = this.getVisibleTransactions(session, Math.max(10, this.options.maxVisibleTransactions));
21718
+ if (!transactions2.length)
21719
+ return `<div class="xwk-tx-empty">${this.escapeHtml(messages.noRecentTransactions)}</div>`;
21720
+ return `<section class="xwk-tx-history-view" aria-label="${this.escapeHtml(messages.recentTransactions)}"><div class="xwk-tx-list" role="list"><div class="xwk-tx-list-inner">${transactions2.map((transaction2) => this.renderTransactionRow(transaction2)).join("")}</div></div></section>`;
21434
21721
  }
21435
21722
  renderTransactionRow(transaction2) {
21436
21723
  const messages = this.messages();
@@ -21458,9 +21745,9 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21458
21745
  return this.questionIcon();
21459
21746
  return `<span class="xwk-tx-spinner" aria-hidden="true"></span>`;
21460
21747
  }
21461
- getVisibleTransactions(session) {
21748
+ getVisibleTransactions(session, limit = this.options.maxVisibleTransactions) {
21462
21749
  const address = this.getSessionAddress(session);
21463
- const max = Math.max(1, Math.floor(this.options.maxVisibleTransactions));
21750
+ const max = Math.max(1, Math.floor(limit));
21464
21751
  return this.getRecentTransactions(session).filter((transaction2) => {
21465
21752
  var _a2;
21466
21753
  return !address || !((_a2 = transaction2.account) == null ? void 0 : _a2.address) || transaction2.account.address === address;
@@ -21517,7 +21804,10 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21517
21804
  const address = this.getSessionAddress(session);
21518
21805
  return address ? (this.options.formatAddress ?? this.formatAddress)(address) : ((_b = session.wallet) == null ? void 0 : _b.name) ?? session.adapterId;
21519
21806
  }
21520
- renderAccountAvatar(session) {
21807
+ renderAccountAvatar(session, identityResolving = false) {
21808
+ if (identityResolving) {
21809
+ return `<div class="xwk-account-art xwk-account-avatar-skeleton" role="status" aria-label="${this.escapeHtml(this.messages().connecting)}"><span class="xwk-skeleton xwk-skeleton-circle"></span></div>`;
21810
+ }
21521
21811
  if (this.identityAvatar) {
21522
21812
  return `<img class="xwk-account-avatar" src="${this.escapeHtml(this.identityAvatar)}" alt="">`;
21523
21813
  }
@@ -21548,6 +21838,14 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21548
21838
  return address;
21549
21839
  return typeof (account == null ? void 0 : account.classicAddress) === "string" ? account.classicAddress : "";
21550
21840
  }
21841
+ isIdentityResolving(session) {
21842
+ if (!session || !this.shouldShowWeb3Name() || this.identityName)
21843
+ return false;
21844
+ const address = this.getSessionAddress(session);
21845
+ if (!address || !this.options.identityResolver)
21846
+ return false;
21847
+ return this.identityResolvingKey === this.identityCacheKey(session);
21848
+ }
21551
21849
  shouldShowWeb3Name() {
21552
21850
  return this.options.showWeb3Name ?? true;
21553
21851
  }
@@ -21563,6 +21861,20 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21563
21861
  const label = wallet.name.slice(0, 1).toUpperCase();
21564
21862
  return `<span class="xwk-button-icon xwk-button-icon-fallback xwk-button-icon-initial" aria-hidden="true">${this.escapeHtml(label)}</span>`;
21565
21863
  }
21864
+ renderPreConnectIcon() {
21865
+ const icon = this.options.icon;
21866
+ if (!icon || icon.type === "default")
21867
+ return this.renderWalletIcon(void 0);
21868
+ if (icon.type === "image") {
21869
+ const aria = icon.alt ? ` role="img" aria-label="${this.escapeHtml(icon.alt)}"` : ` aria-hidden="true"`;
21870
+ return `<span class="xwk-button-icon xwk-button-icon-custom xwk-button-icon-custom-image"${aria}><img src="${this.escapeHtml(icon.src)}" alt="" decoding="async"></span>`;
21871
+ }
21872
+ return this.renderCustomHtmlIcon(icon);
21873
+ }
21874
+ renderCustomHtmlIcon(icon) {
21875
+ const aria = icon.ariaLabel ? ` role="img" aria-label="${this.escapeHtml(icon.ariaLabel)}"` : ` aria-hidden="true"`;
21876
+ return `<span class="xwk-button-icon xwk-button-icon-custom xwk-button-icon-custom-html"${aria}>${icon.html}</span>`;
21877
+ }
21566
21878
  repairFallbackIcon(root) {
21567
21879
  root.querySelectorAll(".xwk-button-icon-svg-fallback").forEach((icon) => {
21568
21880
  if (icon.querySelector("svg"))
@@ -21665,7 +21977,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21665
21977
  let timer = 0;
21666
21978
  timer = window.setTimeout(() => {
21667
21979
  this.balanceRefreshTimers.delete(timer);
21668
- void this.resolveBalance(this.options.manager.getSession());
21980
+ this.queueBalanceRefresh(this.options.manager.getSession(), 0);
21669
21981
  }, delay2);
21670
21982
  this.balanceRefreshTimers.add(timer);
21671
21983
  });
@@ -21674,11 +21986,33 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21674
21986
  this.balanceRefreshTimers.forEach((timer) => window.clearTimeout(timer));
21675
21987
  this.balanceRefreshTimers.clear();
21676
21988
  }
21989
+ queueBalanceRefresh(session, delay2 = 300) {
21990
+ if (!this.options.showBalance || !this.options.balanceResolver)
21991
+ return;
21992
+ this.balanceDebounceSession = session;
21993
+ this.clearBalanceDebounce();
21994
+ if (typeof window === "undefined") {
21995
+ void this.resolveBalance(this.balanceDebounceSession);
21996
+ return;
21997
+ }
21998
+ this.balanceDebounceTimer = window.setTimeout(() => {
21999
+ this.balanceDebounceTimer = void 0;
22000
+ const nextSession = this.balanceDebounceSession;
22001
+ this.balanceDebounceSession = null;
22002
+ void this.resolveBalance(nextSession);
22003
+ }, delay2);
22004
+ }
22005
+ clearBalanceDebounce() {
22006
+ if (this.balanceDebounceTimer && typeof window !== "undefined") {
22007
+ window.clearTimeout(this.balanceDebounceTimer);
22008
+ }
22009
+ this.balanceDebounceTimer = void 0;
22010
+ }
21677
22011
  chevronIcon() {
21678
22012
  return `<svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="m6 9 6 6 6-6" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
21679
22013
  }
21680
- chevronUpIcon() {
21681
- return `<svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="m18 15-6-6-6 6" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
22014
+ chevronRightIcon() {
22015
+ return `<svg width="13" height="13" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="m9 6 6 6-6 6" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
21682
22016
  }
21683
22017
  checkIcon() {
21684
22018
  return `<svg width="15" height="15" viewBox="0 0 24 24" fill="none"><path d="m5 12.5 4.2 4.2L19 7" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
@@ -21709,7 +22043,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21709
22043
  }
21710
22044
  ensureStyles() {
21711
22045
  const styles2 = this.renderStyles();
21712
- ensureWalletStyle(getWalletStyleId("xwk-button", styles2), styles2);
22046
+ ensureWalletStyle("xwk-button", styles2);
21713
22047
  }
21714
22048
  renderStyles() {
21715
22049
  const theme = this.resolveTheme();
@@ -21724,7 +22058,11 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21724
22058
  const fallbackIconBackground = theme.fallbackIconBackground;
21725
22059
  const fallbackIconColor = theme.fallbackIconColor;
21726
22060
  const overlayBlur = theme.overlayBlur > 0 ? `blur(${theme.overlayBlur}px)` : "none";
21727
- return `.xwk-button-root{display:inline-block;max-width:100%;position:relative;font-family:${theme.fontFamily};font-size:14px}.xwk-account-button{align-items:center;background:${background};border:1px solid ${border};border-radius:${radius};box-shadow:none;box-sizing:border-box;color:${theme.foreground};cursor:pointer;display:inline-flex;gap:8px;font:inherit;font-weight:560;max-width:100%;min-height:${height};overflow:hidden;padding:0 12px 0 10px;touch-action:manipulation;transition:background-color .16s ease,border-color .16s ease;white-space:nowrap;-webkit-tap-highlight-color:transparent;transform:none}.xwk-account-button:hover{background:${hoverBackground};box-shadow:none;opacity:1;transform:none}.xwk-account-button:active{background:${hoverBackground};opacity:1;transform:none}.xwk-account-button:focus-visible,.xwk-button-chevron:focus-visible,.xwk-account-panel-actions button:focus-visible,.xwk-account-panel-actions a:focus-visible,.xwk-address-qr-trigger:focus-visible,.xwk-tx-header:focus-visible,.xwk-tx-link:focus-visible{outline:2px solid ${theme.accent};outline-offset:2px;text-decoration:none}.xwk-button-icon{background:${theme.background};border:1px solid ${iconBorder};border-radius:10px;box-sizing:border-box;display:inline-flex;flex:0 0 28px;height:28px;isolation:isolate;line-height:0;max-width:28px;min-width:28px;object-fit:contain;overflow:hidden;position:relative;width:28px}.xwk-button-icon-fallback{align-items:center;background:${fallbackIconBackground};color:${fallbackIconColor};justify-content:center}.xwk-button-icon-initial{font-size:12px;line-height:1}.xwk-button-icon-svg-fallback{font-size:0}.xwk-button-icon-svg-fallback svg{display:block;flex:0 0 17px;height:17px;max-height:17px;max-width:17px;min-height:17px;min-width:17px;width:17px}.xwk-button-pending-dot{background:${theme.accent};border:2px solid ${background};border-radius:999px;box-sizing:border-box;flex:0 0 9px;height:9px;margin-left:-13px;margin-right:4px;position:relative;width:9px;z-index:1}.xwk-button-label{display:inline-block;flex:1 1 0;font-size:13px;font-weight:560;line-height:1.1;max-width:220px;min-width:0;overflow:hidden;padding-right:2px;text-overflow:ellipsis;white-space:nowrap}.xwk-button-balance{color:${theme.muted};font-weight:500;margin-left:4px}.xwk-button-balance-loading{display:inline-flex;vertical-align:-2px}.xwk-balance-spinner{animation:xwk-action-spin .8s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.muted};border-radius:999px;box-sizing:border-box;display:inline-block;flex:0 0 13px;height:13px;width:13px}.xwk-button-chevron{align-items:center;background:${theme.background};border:1px solid ${iconBorder};border-radius:999px;color:${theme.muted};display:inline-flex;flex:0 0 26px;height:26px;justify-content:center;line-height:1;touch-action:manipulation;width:26px}.xwk-button-chevron:hover{background:${theme.surfaceHover};color:${theme.foreground}}.xwk-account-overlay{align-items:center;background:${theme.overlay};-webkit-backdrop-filter:${overlayBlur};backdrop-filter:${overlayBlur};display:flex;inset:0;justify-content:center;overscroll-behavior:contain;padding:max(24px,env(safe-area-inset-top)) max(24px,env(safe-area-inset-right)) max(24px,env(safe-area-inset-bottom)) max(24px,env(safe-area-inset-left));position:fixed;z-index:2147483647}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-overlay{animation:xwk-account-overlay-in .18s ease-out}.xwk-account-panel{background:${theme.background};border:1px solid ${theme.border};border-radius:${theme.radius};box-shadow:${theme.shadow};box-sizing:border-box;color:${theme.foreground};display:grid;gap:12px;overflow:hidden;z-index:2147483647}.xwk-account-panel:focus{outline:none}.xwk-account-panel-dropdown{box-shadow:none;justify-items:center;margin-top:10px;min-width:320px;padding:18px;position:absolute;right:0;top:100%;width:min(360px,calc(100vw - 32px))}.xwk-account-dropdown-header{align-items:center;display:grid;grid-template-columns:44px minmax(0,1fr) 44px;margin:-4px 0 0;width:100%}.xwk-account-dropdown-header strong{font-size:14px;font-weight:600;line-height:1.2;min-width:0;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-account-panel-modal{gap:0;grid-template-rows:auto minmax(0,1fr);height:min(527px,calc(100dvh - 48px - env(safe-area-inset-top) - env(safe-area-inset-bottom)));max-width:520px;position:relative;transform-origin:center bottom;width:min(520px,100%)}.xwk-account-panel-modal.xwk-account-panel-with-transactions{height:min(650px,calc(100dvh - 48px - env(safe-area-inset-top) - env(safe-area-inset-bottom)))}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-panel-modal{animation:xwk-account-panel-in .22s cubic-bezier(.22,1,.36,1)}.xwk-account-modal-header{align-items:center;background:${theme.headerBackground};border-bottom:1px solid ${theme.border};display:grid;grid-template-columns:44px minmax(0,1fr) 44px;column-gap:8px;padding:8px 18px}.xwk-account-modal-header h2{color:${theme.foreground};font-size:16px;font-weight:500;line-height:1.2;margin:0;min-width:0;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-account-modal-body{-webkit-overflow-scrolling:touch;align-items:center;display:flex;flex-direction:column;gap:12px;min-height:0;overflow:hidden;overscroll-behavior:contain;padding:22px 28px 28px}.xwk-account-panel-with-transactions .xwk-account-modal-body{overflow:auto;padding-top:14px}.xwk-account-modal-body>.xwk-account-hero,.xwk-account-modal-body>.xwk-account-name,.xwk-account-modal-body>.xwk-account-address,.xwk-account-modal-body>.xwk-account-meta-row,.xwk-account-modal-body>.xwk-account-warning,.xwk-account-modal-body>.xwk-tx-section,.xwk-account-modal-body>.xwk-account-panel-actions{flex-shrink:0}.xwk-account-close,.xwk-account-back{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:transparent!important;border:0!important;border-radius:999px;box-shadow:none!important;color:${theme.muted};cursor:pointer;display:inline-flex;font:inherit;font-size:26px;font-weight:500;height:44px;justify-content:center;line-height:1;margin:0;min-height:0;outline:none!important;padding:0;touch-action:manipulation;transform:none;width:44px}.xwk-account-back{font-size:0;justify-self:start}.xwk-account-close{justify-self:end}.xwk-account-close:hover,.xwk-account-back:hover{background:${theme.surfaceHover}!important;box-shadow:none!important;color:${theme.foreground};transform:none}.xwk-account-close:focus-visible,.xwk-account-back:focus-visible{outline:2px solid ${theme.accent}!important;outline-offset:0}.xwk-account-hero{height:154px;margin-top:4px;position:relative;width:180px}.xwk-account-panel-with-transactions .xwk-account-hero{height:126px;margin-bottom:0}.xwk-account-panel-with-transactions .xwk-account-art,.xwk-account-panel-with-transactions .xwk-account-avatar{top:0}.xwk-account-panel-dropdown .xwk-account-hero{height:132px;width:160px}.xwk-account-art,.xwk-account-avatar{border-radius:999px;height:118px;left:31px;position:absolute;top:8px;width:118px}.xwk-account-panel-dropdown .xwk-account-art,.xwk-account-panel-dropdown .xwk-account-avatar{height:104px;left:28px;width:104px}.xwk-account-art{align-items:center;background:radial-gradient(circle at 58% 38%,var(--xwk-avatar-spot),transparent 0 22%,transparent 23%),linear-gradient(160deg,var(--xwk-avatar-from),var(--xwk-avatar-to));display:flex;justify-content:center}.xwk-account-art span{background:rgba(255,255,255,.18);border-radius:999px;height:50px;width:50px}.xwk-account-panel-dropdown .xwk-account-art span{height:42px;width:42px}.xwk-account-avatar{background:${theme.surface};border:1px solid ${iconBorder};box-sizing:border-box;display:block;object-fit:cover;overflow:hidden}.xwk-account-panel-with-transactions .xwk-account-name{position:relative;z-index:1}.xwk-account-name{color:${theme.foreground};font-size:21px;font-weight:650;line-height:1.2;max-width:100%;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-account-panel-dropdown .xwk-account-name{font-size:18px}.xwk-account-name-with-qr,.xwk-account-address{align-items:center;display:inline-flex;gap:6px;justify-content:center}.xwk-account-name-with-qr span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-account-name-address{background:${theme.surface};border:1px solid ${theme.border};border-radius:14px;color:${theme.muted};font-size:16px;font-weight:600;line-height:1.2;max-width:min(260px,100%);padding:7px 6px 7px 14px}.xwk-account-address{background:${theme.surface};border:1px solid ${theme.border};border-radius:12px;color:${theme.muted};font-size:14px;font-weight:520;line-height:1.25;max-width:100%;overflow:hidden;padding:8px 8px 8px 12px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-address-qr-trigger{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:transparent;border:0;border-radius:10px;box-shadow:none;color:currentColor;cursor:pointer;display:inline-flex;flex:0 0 40px;height:40px;justify-content:center;margin:-7px -6px -7px 0;min-height:40px;outline:none;overflow:visible;padding:0;touch-action:manipulation;transform:none;width:40px}.xwk-address-qr-trigger svg{display:block;height:17px;overflow:visible;width:17px}.xwk-address-qr-trigger:hover{background:${theme.surfaceHover};box-shadow:none;transform:none}.xwk-account-meta-row{align-items:center;display:flex;gap:8px;justify-content:center;max-width:100%;min-height:42px}.xwk-account-balance{align-items:center;background:${theme.surface};border:1px solid ${actionBorder};border-radius:999px;box-sizing:border-box;color:${theme.muted};display:inline-flex;font-size:13px;font-weight:560;height:42px;justify-content:center;letter-spacing:0;line-height:1;padding:0 14px;text-align:center}.xwk-account-balance-loading{align-items:center;display:inline-flex;gap:6px}.xwk-account-warning{align-items:center;background:${theme.surface};border:1px solid ${actionBorder};border-radius:12px;box-sizing:border-box;color:${theme.muted};display:flex;font-size:13px;font-weight:520;justify-content:center;line-height:1.25;min-height:54px;padding:0 14px;text-align:center;width:100%}.xwk-address-qr-content{align-content:center;display:grid;gap:14px;justify-items:center;min-height:100%;width:100%}.xwk-address-qr-code{aspect-ratio:1/1;background:${theme.surface};border:1px solid ${theme.border};border-radius:14px;box-sizing:border-box;display:grid;max-width:304px;padding:12px;place-items:center;width:min(304px,100%)}.xwk-address-qr-code svg,.xwk-address-qr-code canvas,.xwk-address-qr-code img{aspect-ratio:1/1;display:block;height:auto;max-width:100%;width:100%}.xwk-address-qr-chip{background:${theme.surface};border:1px solid ${theme.border};border-radius:12px;box-sizing:border-box;color:${theme.muted};font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;font-weight:520;line-height:1.45;max-width:100%;overflow-wrap:anywhere;padding:9px 11px;text-align:center;width:100%}.xwk-address-qr-fallback{color:${theme.muted};font-size:12px;line-height:1.45;overflow-wrap:anywhere}.xwk-tx-section{background:${theme.surface};border:1px solid ${actionBorder};border-radius:${theme.walletRadius};box-sizing:border-box;display:grid;overflow:hidden;width:100%}.xwk-tx-header{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:${theme.surface}!important;border:0!important;box-shadow:none!important;color:${theme.muted};cursor:pointer;display:flex;font:inherit;font-size:10px;font-weight:650;gap:6px;letter-spacing:.07em;line-height:1.2;margin:0;min-height:34px;outline:none;padding:0 12px;text-align:left;text-transform:uppercase;touch-action:manipulation;transform:none;transition:background-color .16s ease,color .16s ease;width:100%}.xwk-tx-header:hover,.xwk-tx-header:active{background:${theme.surfaceHover}!important;border:0!important;box-shadow:none!important;color:${theme.foreground};opacity:1;text-decoration:none;transform:none}.xwk-tx-count{align-items:center;background:${theme.background};border:1px solid ${actionBorder};border-radius:999px;box-sizing:border-box;color:${theme.muted};display:inline-flex;font-size:10px;font-weight:650;height:16px;justify-content:center;letter-spacing:0;line-height:1;min-width:18px;padding:0 5px;text-transform:none}.xwk-tx-chevron{align-items:center;color:${theme.muted};display:inline-flex;flex:0 0 16px;height:16px;justify-content:center;margin-left:auto;transition:transform .18s ease;width:16px}.xwk-tx-chevron.closed{transform:rotate(-90deg)}.xwk-tx-chevron svg{display:block;height:12px;width:12px}.xwk-tx-list{display:grid;grid-template-rows:1fr;overflow:hidden;transition:grid-template-rows .18s ease}.xwk-tx-list.closed{grid-template-rows:0fr}.xwk-tx-list-inner{min-height:0;overflow:hidden}.xwk-tx-row{align-items:center;background:${theme.surface};border-top:1px solid ${actionBorder};box-sizing:border-box;display:grid;gap:8px;grid-template-columns:24px minmax(0,1fr) auto;min-height:42px;padding:7px 10px;transition:background-color .16s ease}.xwk-tx-row:hover{background:${theme.surface};box-shadow:none;transform:none}.xwk-tx-row:first-child{border-top:0}.xwk-tx-status{align-items:center;background:${theme.background};border-radius:999px;color:${theme.accent};display:inline-flex;height:24px;justify-content:center;width:24px}.xwk-tx-row-confirmed .xwk-tx-status{color:${theme.success}}.xwk-tx-row-failed .xwk-tx-status{color:${theme.error}}.xwk-tx-row-unknown .xwk-tx-status{color:${theme.muted}}.xwk-tx-main{display:grid;gap:2px;min-width:0}.xwk-tx-label{color:${theme.foreground};font-size:12px;font-weight:600;line-height:1.15;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-tx-hash{color:${theme.muted};font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.15;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-tx-link{align-items:center;border-radius:9px;color:${theme.accent};display:inline-flex;font:inherit;font-size:12px;font-weight:650;gap:3px;line-height:1.2;min-height:28px;padding:0 6px;text-decoration:none}.xwk-tx-link:hover{background:${theme.surfaceHover};box-shadow:none;text-decoration:none;transform:none}.xwk-tx-link svg{height:12px;width:12px}.xwk-tx-empty{background:${theme.surface};border:1px solid ${actionBorder};border-radius:${theme.walletRadius};box-sizing:border-box;color:${theme.muted};font-size:13px;line-height:1.35;padding:14px;text-align:center;width:100%}.xwk-tx-spinner{animation:xwk-action-spin .8s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.accent};border-radius:999px;box-sizing:border-box;display:block;height:14px;width:14px}.xwk-account-panel-actions{display:grid;gap:10px;grid-template-columns:1fr;width:100%}.xwk-account-modal-body .xwk-account-panel-actions{margin-top:auto}.xwk-account-panel-with-transactions .xwk-account-modal-body .xwk-account-panel-actions{margin-top:0}.xwk-account-panel-actions button,.xwk-account-panel-actions a{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:${theme.surface};border:1px solid ${actionBorder};border-radius:${theme.walletRadius};box-shadow:none;box-sizing:border-box;color:${theme.foreground};cursor:pointer;display:flex;font:inherit;font-size:14px;font-weight:560;gap:8px;justify-content:center;line-height:1.2;min-height:46px;min-width:0;outline:none;overflow:hidden;padding:0 12px;text-decoration:none;touch-action:manipulation;transform:none;transition:background-color .16s ease,border-color .16s ease;width:100%}.xwk-account-panel-actions button:disabled{cursor:wait;opacity:1}.xwk-account-panel-actions svg{flex:0 0 auto;opacity:.58}.xwk-account-panel-actions span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-account-panel-actions button:hover,.xwk-account-panel-actions a:hover{background:${theme.surfaceHover};border-color:${actionBorder};box-shadow:none;text-decoration:none;transform:none}.xwk-account-panel-actions button:active,.xwk-account-panel-actions a:active{background:${theme.surfaceHover};opacity:1;text-decoration:none;transform:none}.xwk-copied-icon{color:${theme.success};opacity:1!important}.xwk-action-spinner{animation:xwk-action-spin .8s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.muted};border-radius:999px;box-sizing:border-box;display:inline-block;height:17px;width:17px}@keyframes xwk-action-spin{to{transform:rotate(360deg)}}@keyframes xwk-account-overlay-in{from{opacity:0}to{opacity:1}}@keyframes xwk-account-panel-in{from{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media(prefers-reduced-motion:reduce){.xwk-account-button,.xwk-tx-list,.xwk-tx-chevron,.xwk-account-panel-actions button,.xwk-account-panel-actions a{transition:none}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-overlay,.xwk-account-portal[data-xwk-entering="true"] .xwk-account-panel-modal{animation-duration:1ms!important}.xwk-action-spinner,.xwk-balance-spinner,.xwk-tx-spinner{animation:none}}@media(max-width:520px){.xwk-account-panel-dropdown{bottom:0;left:0;margin-top:0;min-width:0;position:fixed;right:0;top:auto;width:100vw}.xwk-account-overlay{align-items:flex-end;padding:max(12px,env(safe-area-inset-top)) 0 0}.xwk-account-panel-modal{align-self:flex-end;border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-left:0;border-right:0;border-top-left-radius:${theme.radius};border-top-right-radius:${theme.radius};height:min(527px,calc(100dvh - env(safe-area-inset-top)));max-width:none;width:100vw}.xwk-account-panel-modal.xwk-account-panel-with-transactions{height:min(650px,calc(100dvh - env(safe-area-inset-top)))}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-panel-modal{animation:xwk-account-sheet-in .28s cubic-bezier(.32,.72,0,1)}.xwk-account-modal-header{border-top-left-radius:${theme.radius};border-top-right-radius:${theme.radius};grid-template-columns:44px minmax(0,1fr) 44px;padding:10px 16px}.xwk-account-modal-body{min-height:0;padding:18px 20px max(22px,calc(22px + env(safe-area-inset-bottom)))}.xwk-button-label{max-width:min(150px,calc(100vw - 140px))}}@keyframes xwk-account-sheet-in{from{opacity:1;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}`;
22061
+ const baseStyles = `.xwk-button-root{display:inline-block;max-width:100%;position:relative;font-family:${theme.fontFamily};font-size:14px}.xwk-account-button{align-items:center;background:${background};border:1px solid ${border};border-radius:${radius};box-shadow:none;box-sizing:border-box;color:${theme.foreground};cursor:pointer;display:inline-flex;gap:8px;font:inherit;font-weight:560;max-width:100%;min-height:${height};overflow:hidden;padding:0 12px 0 10px;touch-action:manipulation;transition:background-color .16s ease,border-color .16s ease;white-space:nowrap;-webkit-tap-highlight-color:transparent;transform:none}.xwk-account-button:hover{background:${hoverBackground};box-shadow:none;opacity:1;transform:none}.xwk-account-button:active{background:${hoverBackground};opacity:1;transform:none}.xwk-account-button:focus-visible,.xwk-button-chevron:focus-visible,.xwk-account-panel-actions button:focus-visible,.xwk-account-panel-actions a:focus-visible,.xwk-address-qr-trigger:focus-visible,.xwk-tx-header-link:focus-visible,.xwk-tx-link:focus-visible{outline:2px solid ${theme.accent};outline-offset:2px;text-decoration:none}.xwk-button-icon{background:${theme.background};border:1px solid ${iconBorder};border-radius:10px;box-sizing:border-box;display:inline-flex;flex:0 0 28px;height:28px;isolation:isolate;line-height:0;max-width:28px;min-width:28px;object-fit:contain;overflow:hidden;position:relative;width:28px}.xwk-button-icon-fallback{align-items:center;background:${fallbackIconBackground};color:${fallbackIconColor};justify-content:center}.xwk-button-icon-initial{font-size:12px;line-height:1}.xwk-button-icon-svg-fallback{font-size:0}.xwk-button-icon-svg-fallback svg{display:block;flex:0 0 17px;height:17px;max-height:17px;max-width:17px;min-height:17px;min-width:17px;width:17px}.xwk-button-icon-custom{align-items:center;justify-content:center}.xwk-button-icon-custom img,.xwk-button-icon-custom svg{display:block;max-height:18px;max-width:18px}.xwk-button-icon-custom img{height:18px;object-fit:contain;width:18px}.xwk-button-icon-custom-html>*{max-height:18px;max-width:18px}.xwk-skeleton{animation:xwk-skeleton-pulse 1.4s ease-in-out infinite;background:linear-gradient(90deg,${theme.surface} 25%,${theme.surfaceHover} 50%,${theme.surface} 75%);background-size:200% 100%;border-radius:999px;display:inline-block}.xwk-skeleton-button-balance{height:12px;width:44px}.xwk-skeleton-balance{height:14px;width:70px}.xwk-skeleton-name{height:24px;width:132px}.xwk-account-name-skeleton{align-items:center;display:flex;justify-content:center;min-height:26px}.xwk-button-pending-dot{background:${theme.accent};border:2px solid ${background};border-radius:999px;box-sizing:border-box;flex:0 0 9px;height:9px;margin-left:-13px;margin-right:4px;position:relative;width:9px;z-index:1}.xwk-button-label{display:inline-block;flex:1 1 0;font-size:13px;font-weight:560;line-height:1.1;max-width:220px;min-width:0;overflow:hidden;padding-right:2px;text-overflow:ellipsis;white-space:nowrap}.xwk-button-balance{color:${theme.muted};font-weight:500;margin-left:4px}.xwk-button-balance-loading{display:inline-flex;vertical-align:-2px}.xwk-balance-spinner{animation:xwk-action-spin .8s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.muted};border-radius:999px;box-sizing:border-box;display:inline-block;flex:0 0 13px;height:13px;width:13px}.xwk-button-chevron{align-items:center;background:${theme.background};border:1px solid ${iconBorder};border-radius:999px;color:${theme.muted};display:inline-flex;flex:0 0 26px;height:26px;justify-content:center;line-height:1;touch-action:manipulation;width:26px}.xwk-button-chevron:hover{background:${theme.surfaceHover};color:${theme.foreground}}.xwk-account-overlay{align-items:center;background:${theme.overlay};-webkit-backdrop-filter:${overlayBlur};backdrop-filter:${overlayBlur};display:flex;inset:0;justify-content:center;overscroll-behavior:contain;padding:max(24px,env(safe-area-inset-top)) max(24px,env(safe-area-inset-right)) max(24px,env(safe-area-inset-bottom)) max(24px,env(safe-area-inset-left));position:fixed;z-index:2147483647}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-overlay{animation:xwk-account-overlay-in .18s ease-out}.xwk-account-panel{background:${theme.background};border:1px solid ${theme.border};border-radius:${theme.radius};box-shadow:${theme.shadow};box-sizing:border-box;color:${theme.foreground};display:grid;gap:12px;overflow:hidden;z-index:2147483647}.xwk-account-panel:focus{outline:none}.xwk-account-panel-dropdown{box-shadow:none;justify-items:center;margin-top:10px;min-width:320px;padding:18px;position:absolute;right:0;top:100%;width:min(360px,calc(100vw - 32px))}.xwk-account-dropdown-header{align-items:center;display:grid;grid-template-columns:44px minmax(0,1fr) 44px;margin:-4px 0 0;width:100%}.xwk-account-dropdown-header strong{font-size:14px;font-weight:600;line-height:1.2;min-width:0;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-account-panel-modal{gap:0;grid-template-rows:auto minmax(0,1fr);height:min(527px,calc(100dvh - 48px - env(safe-area-inset-top) - env(safe-area-inset-bottom)));max-width:520px;position:relative;transform-origin:center bottom;width:min(520px,100%)}.xwk-account-panel-modal.xwk-account-panel-with-transactions,.xwk-account-panel-modal.xwk-account-panel-history{height:min(650px,calc(100dvh - 48px - env(safe-area-inset-top) - env(safe-area-inset-bottom)))}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-panel-modal{animation:xwk-account-panel-in .22s cubic-bezier(.22,1,.36,1)}.xwk-account-modal-header{align-items:center;background:${theme.headerBackground};border-bottom:1px solid ${theme.border};display:grid;grid-template-columns:44px minmax(0,1fr) 44px;column-gap:8px;padding:8px 18px}.xwk-account-modal-header h2{color:${theme.foreground};font-size:16px;font-weight:500;line-height:1.2;margin:0;min-width:0;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-account-modal-body{-webkit-overflow-scrolling:touch;align-items:center;display:flex;flex-direction:column;gap:12px;min-height:0;overflow:hidden;overscroll-behavior:contain;padding:22px 28px 28px}.xwk-account-panel-with-transactions .xwk-account-modal-body,.xwk-account-panel-history .xwk-account-modal-body{overflow:auto;padding-top:14px}.xwk-account-modal-body>.xwk-account-hero,.xwk-account-modal-body>.xwk-account-name,.xwk-account-modal-body>.xwk-account-meta-pill,.xwk-account-modal-body>.xwk-account-warning,.xwk-account-modal-body>.xwk-tx-section,.xwk-account-modal-body>.xwk-tx-history-view,.xwk-account-modal-body>.xwk-account-panel-actions{flex-shrink:0}.xwk-account-close,.xwk-account-back{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:transparent!important;border:0!important;border-radius:999px;box-shadow:none!important;color:${theme.muted};cursor:pointer;display:inline-flex;font:inherit;font-size:26px;font-weight:500;height:44px;justify-content:center;line-height:1;margin:0;min-height:0;outline:none!important;padding:0;touch-action:manipulation;transform:none;width:44px}.xwk-account-back{font-size:0;justify-self:start}.xwk-account-close{justify-self:end}.xwk-account-close:hover,.xwk-account-back:hover{background:${theme.surfaceHover}!important;box-shadow:none!important;color:${theme.foreground};transform:none}.xwk-account-close:focus-visible,.xwk-account-back:focus-visible{outline:2px solid ${theme.accent}!important;outline-offset:0}.xwk-account-hero{height:154px;margin-top:4px;position:relative;width:180px}.xwk-account-panel-with-transactions .xwk-account-hero{height:126px;margin-bottom:0}.xwk-account-panel-with-transactions .xwk-account-art,.xwk-account-panel-with-transactions .xwk-account-avatar{top:0}.xwk-account-panel-dropdown .xwk-account-hero{height:132px;width:160px}.xwk-account-art,.xwk-account-avatar{border-radius:999px;height:118px;left:31px;position:absolute;top:8px;width:118px}.xwk-account-panel-dropdown .xwk-account-art,.xwk-account-panel-dropdown .xwk-account-avatar{height:104px;left:28px;width:104px}.xwk-account-art{align-items:center;background:radial-gradient(circle at 58% 38%,var(--xwk-avatar-spot),transparent 0 22%,transparent 23%),linear-gradient(160deg,var(--xwk-avatar-from),var(--xwk-avatar-to));display:flex;justify-content:center}.xwk-account-art span{background:rgba(255,255,255,.18);border-radius:999px;height:50px;width:50px}.xwk-account-panel-dropdown .xwk-account-art span{height:42px;width:42px}.xwk-account-avatar{background:${theme.surface};border:1px solid ${iconBorder};box-sizing:border-box;display:block;object-fit:cover;overflow:hidden}.xwk-account-panel-with-transactions .xwk-account-name{position:relative;z-index:1}.xwk-account-name{color:${theme.foreground};font-size:21px;font-weight:650;line-height:1.2;max-width:100%;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-account-panel-dropdown .xwk-account-name{font-size:18px}.xwk-account-meta-pill{align-items:center;background:${theme.surface};border:1px solid ${actionBorder};border-radius:14px;box-sizing:border-box;color:${theme.muted};display:inline-flex;font-size:13px;font-weight:560;gap:8px;justify-content:center;line-height:1.2;max-width:100%;min-height:44px;overflow:hidden;padding:2px 4px 2px 12px}.xwk-pill-address{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-pill-divider{background:${actionBorder};display:inline-block;flex:0 0 1px;height:18px;opacity:.8}.xwk-pill-balance{color:${theme.foreground};white-space:nowrap}.xwk-account-name-with-qr,.xwk-account-address{align-items:center;display:inline-flex;gap:6px;justify-content:center}.xwk-account-name-with-qr span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-account-name-address{background:${theme.surface};border:1px solid ${theme.border};border-radius:14px;color:${theme.muted};font-size:16px;font-weight:600;line-height:1.2;max-width:min(260px,100%);padding:7px 6px 7px 14px}.xwk-account-address{background:${theme.surface};border:1px solid ${theme.border};border-radius:12px;color:${theme.muted};font-size:14px;font-weight:520;line-height:1.25;max-width:100%;overflow:hidden;padding:8px 8px 8px 12px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-address-qr-trigger{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:transparent;border:0;border-radius:10px;box-shadow:none;color:currentColor;cursor:pointer;display:inline-flex;flex:0 0 40px;height:40px;justify-content:center;margin:0 -2px 0 0;min-height:40px;outline:none;overflow:visible;padding:0;touch-action:manipulation;transform:none;width:40px}.xwk-address-qr-trigger svg{display:block;height:17px;overflow:visible;width:17px}.xwk-address-qr-trigger:hover{background:${theme.surfaceHover};box-shadow:none;transform:none}.xwk-account-meta-row{align-items:center;display:flex;gap:8px;justify-content:center;max-width:100%;min-height:42px}.xwk-account-balance{align-items:center;background:${theme.surface};border:1px solid ${actionBorder};border-radius:999px;box-sizing:border-box;color:${theme.muted};display:inline-flex;font-size:13px;font-weight:560;height:42px;justify-content:center;letter-spacing:0;line-height:1;padding:0 14px;text-align:center}.xwk-account-balance-loading{align-items:center;display:inline-flex;gap:6px}.xwk-account-warning{align-items:center;background:${theme.surface};border:1px solid ${actionBorder};border-radius:12px;box-sizing:border-box;color:${theme.muted};display:flex;font-size:13px;font-weight:520;justify-content:center;line-height:1.25;min-height:54px;padding:0 14px;text-align:center;width:100%}.xwk-address-qr-content{align-content:center;display:grid;gap:14px;justify-items:center;min-height:100%;width:100%}.xwk-address-qr-code{aspect-ratio:1/1;background:${theme.surface};border:1px solid ${theme.border};border-radius:14px;box-sizing:border-box;display:grid;max-width:304px;padding:12px;place-items:center;width:min(304px,100%)}.xwk-address-qr-code svg,.xwk-address-qr-code canvas,.xwk-address-qr-code img{aspect-ratio:1/1;display:block;height:auto;max-width:100%;width:100%}.xwk-address-qr-chip{background:${theme.surface};border:1px solid ${theme.border};border-radius:12px;box-sizing:border-box;color:${theme.muted};font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;font-weight:520;line-height:1.45;max-width:100%;overflow-wrap:anywhere;padding:9px 11px;text-align:center;width:100%}.xwk-address-qr-fallback{color:${theme.muted};font-size:12px;line-height:1.45;overflow-wrap:anywhere}.xwk-tx-section{background:${theme.surface};border:1px solid ${actionBorder};border-radius:${theme.walletRadius};box-sizing:border-box;display:grid;overflow:hidden;width:100%}.xwk-tx-header{-webkit-tap-highlight-color:transparent;align-items:center;background:${theme.surface};border:0;box-shadow:none;color:${theme.muted};display:flex;font:inherit;font-size:10px;font-weight:650;gap:6px;letter-spacing:.07em;line-height:1.2;margin:0;min-height:34px;outline:none;padding:0 12px;text-align:left;text-transform:uppercase;transform:none;width:100%}.xwk-tx-header-link{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:transparent;border:0;border-radius:9px;box-shadow:none;color:${theme.accent};cursor:pointer;display:inline-flex;font:inherit;font-size:11px;font-weight:650;gap:2px;line-height:1;margin-left:auto;min-height:28px;padding:0 6px;text-decoration:none;text-transform:none;touch-action:manipulation;transform:none}.xwk-tx-header-link:hover,.xwk-tx-header-link:active{background:${theme.surfaceHover};box-shadow:none;color:${theme.accent};opacity:1;text-decoration:none;transform:none}.xwk-tx-header-link svg{display:block;height:13px;width:13px}.xwk-tx-count{align-items:center;background:${theme.background};border:1px solid ${actionBorder};border-radius:999px;box-sizing:border-box;color:${theme.muted};display:inline-flex;font-size:10px;font-weight:650;height:16px;justify-content:center;letter-spacing:0;line-height:1;min-width:18px;padding:0 5px;text-transform:none}.xwk-tx-list{display:grid;overflow:hidden}.xwk-tx-list-inner{min-height:0;overflow:hidden}.xwk-tx-history-view{background:${theme.surface};border:1px solid ${actionBorder};border-radius:${theme.walletRadius};box-sizing:border-box;display:grid;overflow:hidden;width:100%}.xwk-tx-history-view .xwk-tx-list-inner{max-height:468px;overflow:auto}.xwk-tx-row{align-items:center;background:${theme.surface};border-top:1px solid ${actionBorder};box-sizing:border-box;display:grid;gap:8px;grid-template-columns:24px minmax(0,1fr) auto;min-height:42px;padding:7px 10px;transition:background-color .16s ease}.xwk-tx-row:hover{background:${theme.surface};box-shadow:none;transform:none}.xwk-tx-row:first-child{border-top:0}.xwk-tx-status{align-items:center;background:${theme.background};border-radius:999px;color:${theme.accent};display:inline-flex;height:24px;justify-content:center;position:relative;width:24px}.xwk-tx-row-submitted .xwk-tx-status:before{animation:xwk-pulse-ring 1.4s ease-out infinite;border:1px solid currentColor;border-radius:999px;content:"";inset:2px;opacity:.42;position:absolute}.xwk-tx-row-confirmed .xwk-tx-status{color:${theme.success}}.xwk-tx-row-failed .xwk-tx-status{color:${theme.error}}.xwk-tx-row-unknown .xwk-tx-status{color:${theme.muted}}.xwk-tx-main{display:grid;gap:2px;min-width:0}.xwk-tx-label{color:${theme.foreground};font-size:12px;font-weight:600;line-height:1.15;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-tx-hash{color:${theme.muted};font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.15;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-tx-link{align-items:center;border-radius:9px;color:${theme.accent};display:inline-flex;font:inherit;font-size:12px;font-weight:650;gap:3px;line-height:1.2;min-height:28px;padding:0 6px;text-decoration:none}.xwk-tx-link:hover{background:${theme.surfaceHover};box-shadow:none;text-decoration:none;transform:none}.xwk-tx-link svg{height:12px;width:12px}.xwk-tx-empty{background:${theme.surface};border:1px solid ${actionBorder};border-radius:${theme.walletRadius};box-sizing:border-box;color:${theme.muted};font-size:13px;line-height:1.35;padding:14px;text-align:center;width:100%}.xwk-tx-spinner{animation:xwk-action-spin .8s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.accent};border-radius:999px;box-sizing:border-box;display:block;height:14px;width:14px}.xwk-account-panel-actions{display:grid;gap:10px;grid-template-columns:1fr;width:100%}.xwk-account-modal-body .xwk-account-panel-actions{margin-top:auto}.xwk-account-panel-with-transactions .xwk-account-modal-body .xwk-account-panel-actions{margin-top:0}.xwk-account-panel-actions button,.xwk-account-panel-actions a{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:${theme.surface};border:1px solid ${actionBorder};border-radius:${theme.walletRadius};box-shadow:none;box-sizing:border-box;color:${theme.foreground};cursor:pointer;display:flex;font:inherit;font-size:14px;font-weight:560;gap:8px;justify-content:center;line-height:1.2;min-height:46px;min-width:0;outline:none;overflow:hidden;padding:0 12px;text-decoration:none;touch-action:manipulation;transform:none;transition:background-color .16s ease,border-color .16s ease;width:100%}.xwk-account-panel-actions button:disabled{cursor:wait;opacity:1}.xwk-account-panel-actions svg{flex:0 0 auto;opacity:.58}.xwk-account-panel-actions span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-account-panel-actions button:hover,.xwk-account-panel-actions a:hover{background:${theme.surfaceHover};border-color:${actionBorder};box-shadow:none;text-decoration:none;transform:none}.xwk-account-panel-actions button:active,.xwk-account-panel-actions a:active{background:${theme.surfaceHover};opacity:1;text-decoration:none;transform:none}.xwk-copied-icon{color:${theme.success};opacity:1!important}.xwk-action-spinner{animation:xwk-action-spin .8s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.muted};border-radius:999px;box-sizing:border-box;display:inline-block;height:17px;width:17px}@keyframes xwk-action-spin{to{transform:rotate(360deg)}}@keyframes xwk-skeleton-pulse{0%{background-position:200% 0}100%{background-position:-200% 0}}@keyframes xwk-pulse-ring{0%{opacity:.42;transform:scale(.8)}80%,100%{opacity:0;transform:scale(1.45)}}@keyframes xwk-account-overlay-in{from{opacity:0}to{opacity:1}}@keyframes xwk-account-panel-in{from{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media(prefers-reduced-motion:reduce){.xwk-account-button,.xwk-tx-header-link,.xwk-account-panel-actions button,.xwk-account-panel-actions a{transition:none}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-overlay,.xwk-account-portal[data-xwk-entering="true"] .xwk-account-panel-modal{animation-duration:1ms!important}.xwk-action-spinner,.xwk-balance-spinner,.xwk-tx-spinner,.xwk-skeleton,.xwk-tx-row-submitted .xwk-tx-status:before{animation:none}}@media(max-width:520px){.xwk-account-panel-dropdown{bottom:0;left:0;margin-top:0;min-width:0;position:fixed;right:0;top:auto;width:100vw}.xwk-account-overlay{align-items:flex-end;padding:max(12px,env(safe-area-inset-top)) 0 0}.xwk-account-panel-modal{align-self:flex-end;border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-left:0;border-right:0;border-top-left-radius:${theme.radius};border-top-right-radius:${theme.radius};height:min(527px,calc(100dvh - env(safe-area-inset-top)));max-width:none;width:100vw}.xwk-account-panel-modal.xwk-account-panel-with-transactions,.xwk-account-panel-modal.xwk-account-panel-history{height:min(650px,calc(100dvh - env(safe-area-inset-top)))}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-panel-modal{animation:xwk-account-sheet-in .28s cubic-bezier(.32,.72,0,1)}.xwk-account-modal-header{border-top-left-radius:${theme.radius};border-top-right-radius:${theme.radius};grid-template-columns:44px minmax(0,1fr) 44px;padding:10px 16px}.xwk-account-modal-body{min-height:0;padding:18px 20px max(22px,calc(22px + env(safe-area-inset-bottom)))}.xwk-button-label{max-width:min(150px,calc(100vw - 140px))}}@keyframes xwk-account-sheet-in{from{opacity:1;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}`;
22062
+ return `${baseStyles}${this.renderSkeletonPrimitiveStyles(theme, iconBorder)}`;
22063
+ }
22064
+ renderSkeletonPrimitiveStyles(theme, iconBorder) {
22065
+ return `.xwk-skeleton-circle{border-radius:999px}.xwk-skeleton-line{height:14px;border-radius:4px}.xwk-skeleton-pill{border-radius:999px}.xwk-skeleton-card,.xwk-skeleton-button{border-radius:${theme.walletRadius}}.xwk-skeleton-row{align-items:center;display:flex;gap:12px;width:100%}.xwk-skeleton-button-icon{height:28px;width:28px}.xwk-skeleton-button-label{height:14px;width:92px}.xwk-account-button-loading .xwk-button-label{align-items:center;display:inline-flex}.xwk-button-icon-loading{background:transparent;border-color:${iconBorder};padding:0}.xwk-account-avatar-skeleton{background:${theme.surface};border:1px solid ${iconBorder};box-sizing:border-box;overflow:hidden}.xwk-account-avatar-skeleton>span{height:100%;width:100%}.xwk-tx-skeleton-row{grid-template-columns:24px minmax(0,1fr) auto}.xwk-tx-skeleton-main{display:grid;gap:6px;min-width:0}.xwk-tx-skeleton-label{height:13px;width:86px}.xwk-tx-skeleton-hash{height:11px;width:132px}@media(prefers-reduced-motion:reduce){.xwk-skeleton{animation:none!important;background:${theme.surfaceHover}!important}}`;
21728
22066
  }
21729
22067
  resolveTheme() {
21730
22068
  return resolveWalletTheme({
@@ -21869,6 +22207,9 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21869
22207
  return value;
21870
22208
  }
21871
22209
  }
22210
+ function compactButtonOptions(options) {
22211
+ return Object.fromEntries(Object.entries(options).filter(([, value]) => value !== void 0));
22212
+ }
21872
22213
  function createWalletButton(options) {
21873
22214
  const button = new WalletButtonController(options);
21874
22215
  if (options.target)
@@ -22003,7 +22344,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
22003
22344
  }
22004
22345
  ensureStyles() {
22005
22346
  const styles2 = this.renderStyles();
22006
- ensureWalletStyle(getWalletStyleId("xwk-toast", styles2), styles2);
22347
+ ensureWalletStyle("xwk-toast", styles2);
22007
22348
  }
22008
22349
  getExplorerUrl(hash2, network) {
22009
22350
  var _a2, _b;
@@ -22100,6 +22441,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
22100
22441
  if (modal && modalOptions.autoOpen) {
22101
22442
  modal.autoOpen();
22102
22443
  }
22444
+ const subscribe2 = createKitSubscriber(manager);
22103
22445
  return {
22104
22446
  manager,
22105
22447
  modal,
@@ -22112,11 +22454,52 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
22112
22454
  refreshBalance: () => button == null ? void 0 : button.refreshBalance(),
22113
22455
  refreshAccount: () => button == null ? void 0 : button.refreshAccount(),
22114
22456
  getSession: () => manager.getSession(),
22457
+ on: manager.on.bind(manager),
22458
+ off: manager.off.bind(manager),
22459
+ once: manager.once.bind(manager),
22460
+ subscribe: subscribe2,
22115
22461
  signAndSubmit: manager.signAndSubmit.bind(manager),
22116
22462
  signTransaction: manager.signTransaction.bind(manager),
22117
22463
  signMessage: manager.signMessage.bind(manager)
22118
22464
  };
22119
22465
  }
22466
+ function createKitSubscriber(manager) {
22467
+ function snapshot2(eventName, event) {
22468
+ const status = eventName === "connecting" ? "connecting" : manager.getSession() ? "connected" : "disconnected";
22469
+ return {
22470
+ status,
22471
+ session: manager.getSession(),
22472
+ account: manager.getAccount(),
22473
+ eventName,
22474
+ event
22475
+ };
22476
+ }
22477
+ function subscribe2(eventNameOrHandler, maybeHandler) {
22478
+ if (typeof eventNameOrHandler === "function") {
22479
+ const handler = eventNameOrHandler;
22480
+ const eventNames = [
22481
+ "connecting",
22482
+ "connected",
22483
+ "disconnected",
22484
+ "session_restored",
22485
+ "session_stale",
22486
+ "session_expired",
22487
+ "accountChanged",
22488
+ "networkChanged"
22489
+ ];
22490
+ const unsubs = eventNames.map((eventName) => manager.on(eventName, (event) => {
22491
+ handler(snapshot2(eventName, event));
22492
+ }));
22493
+ handler(snapshot2());
22494
+ return () => unsubs.forEach((unsubscribe) => unsubscribe());
22495
+ }
22496
+ if (!maybeHandler) {
22497
+ throw new TypeError("kit.subscribe(eventName, handler) requires a handler.");
22498
+ }
22499
+ return manager.on(eventNameOrHandler, maybeHandler);
22500
+ }
22501
+ return subscribe2;
22502
+ }
22120
22503
  function scheduleAutoReconnect(manager) {
22121
22504
  const run = () => {
22122
22505
  const requestFrame = typeof globalThis.requestAnimationFrame === "function" ? globalThis.requestAnimationFrame.bind(globalThis) : (callback) => globalThis.setTimeout(() => callback(Date.now()), 16);
@@ -22163,16 +22546,12 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
22163
22546
  adapters.push(createXrplSnapAdapter());
22164
22547
  if (options.walletConnectProjectId && shouldIncludeWalletConnect(ids)) {
22165
22548
  const walletConnectUiMode = getWalletConnectUiMode(options);
22549
+ const appMetadata = resolveAppMetadata(options);
22166
22550
  adapters.push(...createWalletConnectAdapters({
22167
22551
  projectId: options.walletConnectProjectId,
22168
22552
  mode: walletConnectUiMode === "default" ? "default" : "details",
22169
22553
  wallets: resolveWalletConnectWallets(ids),
22170
- metadata: createWalletConnectMetadata({
22171
- name: options.appName,
22172
- description: options.appDescription ?? `${options.appName} XRPL wallet connection`,
22173
- url: options.appUrl ?? getCurrentOrigin(),
22174
- icons: options.appIcons ?? []
22175
- }),
22554
+ metadata: createWalletConnectMetadata(appMetadata),
22176
22555
  onQr,
22177
22556
  signMessageDestination: options.walletConnectSignMessageDestination,
22178
22557
  useModal: walletConnectUiMode === "default" ? true : void 0,
@@ -22289,6 +22668,24 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
22289
22668
  function getCurrentOrigin() {
22290
22669
  return typeof window !== "undefined" ? window.location.origin : "https://xrpl.org";
22291
22670
  }
22671
+ function resolveAppMetadata(options) {
22672
+ var _a2, _b, _c, _d;
22673
+ const name = nonEmptyString((_a2 = options.metadata) == null ? void 0 : _a2.name) ?? nonEmptyString(options.appName) ?? "XRPL dApp";
22674
+ return {
22675
+ name,
22676
+ description: nonEmptyString((_b = options.metadata) == null ? void 0 : _b.description) ?? nonEmptyString(options.appDescription) ?? `${name} XRPL wallet connection`,
22677
+ url: nonEmptyString((_c = options.metadata) == null ? void 0 : _c.url) ?? nonEmptyString(options.appUrl) ?? getCurrentOrigin(),
22678
+ icons: normalizeIcons(((_d = options.metadata) == null ? void 0 : _d.icons) ?? options.appIcons)
22679
+ };
22680
+ }
22681
+ function nonEmptyString(value) {
22682
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
22683
+ }
22684
+ function normalizeIcons(icons) {
22685
+ if (!Array.isArray(icons))
22686
+ return [];
22687
+ return icons.filter((icon) => typeof icon === "string" && icon.trim().length > 0);
22688
+ }
22292
22689
  function withoutKitOnlyOptions(options) {
22293
22690
  const { adapters: _adapters, storage: _storage, walletConnectProjectId: _walletConnectProjectId, walletConnectSignMessageDestination: _walletConnectSignMessageDestination, xamanClientId: _xamanClientId, wallets: _wallets, ui: _ui, ...managerConfig } = options;
22294
22691
  return managerConfig;