@lukso/up-connector 0.6.0 → 0.7.0-dev.360c7b1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/account-modal.cjs +3 -3
  2. package/dist/account-modal.js +2 -2
  3. package/dist/auto-setup.cjs +3 -3
  4. package/dist/auto-setup.js +2 -2
  5. package/dist/{avatar-CmUCtW_w.d.cts → avatar-CQkubMTK.d.cts} +0 -1
  6. package/dist/{avatar-CmUCtW_w.d.ts → avatar-CQkubMTK.d.ts} +0 -1
  7. package/dist/avatar.cjs +2 -2
  8. package/dist/avatar.d.cts +1 -1
  9. package/dist/avatar.d.ts +1 -1
  10. package/dist/avatar.js +1 -1
  11. package/dist/backup-modal.cjs +3 -3
  12. package/dist/backup-modal.js +2 -2
  13. package/dist/{chunk-W7QI6BTA.cjs → chunk-4YK3Q32C.cjs} +3 -3
  14. package/dist/chunk-4YK3Q32C.cjs.map +1 -0
  15. package/dist/{chunk-ORJK2YGG.cjs → chunk-7LQ5EB2X.cjs} +22 -24
  16. package/dist/chunk-7LQ5EB2X.cjs.map +1 -0
  17. package/dist/{chunk-KMCCANMJ.js → chunk-DI4MT7EC.js} +2 -2
  18. package/dist/chunk-DI4MT7EC.js.map +1 -0
  19. package/dist/{chunk-IAKQFHFD.cjs → chunk-E34NRQRA.cjs} +8 -12
  20. package/dist/chunk-E34NRQRA.cjs.map +1 -0
  21. package/dist/{chunk-6N35TCFT.js → chunk-GKAVIDXP.js} +21 -23
  22. package/dist/chunk-GKAVIDXP.js.map +1 -0
  23. package/dist/{chunk-NWCNJSG3.js → chunk-I5I6SZZ5.js} +8 -4
  24. package/dist/chunk-I5I6SZZ5.js.map +1 -0
  25. package/dist/{chunk-YIWSPI4I.js → chunk-LIHQISFN.js} +2 -2
  26. package/dist/{chunk-GFVUWAG4.cjs → chunk-MEEN5QJZ.cjs} +3 -3
  27. package/dist/{chunk-GFVUWAG4.cjs.map → chunk-MEEN5QJZ.cjs.map} +1 -1
  28. package/dist/{chunk-SAQWNAQ6.js → chunk-NIMT2B6H.js} +51 -80
  29. package/dist/{chunk-SAQWNAQ6.js.map → chunk-NIMT2B6H.js.map} +1 -1
  30. package/dist/{chunk-GCYDV7FB.cjs → chunk-QIKRPHWT.cjs} +47 -76
  31. package/dist/chunk-QIKRPHWT.cjs.map +1 -0
  32. package/dist/{chunk-3SGSPHOZ.js → chunk-RCCGJ3DC.js} +7 -11
  33. package/dist/chunk-RCCGJ3DC.js.map +1 -0
  34. package/dist/{chunk-XGIT7YUY.js → chunk-UPWE4L5Z.js} +2 -2
  35. package/dist/{chunk-XGIT7YUY.js.map → chunk-UPWE4L5Z.js.map} +1 -1
  36. package/dist/{chunk-7ETKG6KR.cjs → chunk-UQZN2AKN.cjs} +9 -5
  37. package/dist/chunk-UQZN2AKN.cjs.map +1 -0
  38. package/dist/{chunk-XOKG3KIL.cjs → chunk-ZWXGWUXQ.cjs} +2 -2
  39. package/dist/{chunk-XOKG3KIL.cjs.map → chunk-ZWXGWUXQ.cjs.map} +1 -1
  40. package/dist/connect-modal/index.cjs +2 -2
  41. package/dist/connect-modal/index.d.cts +1 -1
  42. package/dist/connect-modal/index.d.ts +1 -1
  43. package/dist/connect-modal/index.js +1 -1
  44. package/dist/index.cjs +23 -24
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.cts +5 -5
  47. package/dist/index.d.ts +5 -5
  48. package/dist/index.js +13 -14
  49. package/dist/index.js.map +1 -1
  50. package/dist/restore-modal.cjs +3 -3
  51. package/dist/restore-modal.d.cts +2 -2
  52. package/dist/restore-modal.d.ts +2 -2
  53. package/dist/restore-modal.js +2 -2
  54. package/dist/{wagmi-DgjkdmGk.d.cts → wagmi-84MPgN9w.d.cts} +0 -15
  55. package/dist/{wagmi-DgjkdmGk.d.ts → wagmi-84MPgN9w.d.ts} +0 -15
  56. package/package.json +7 -7
  57. package/src/auto-setup.ts +0 -1
  58. package/src/avatar.ts +20 -23
  59. package/src/backup-modal.ts +6 -2
  60. package/src/connect-modal/components/connection-view.ts +16 -9
  61. package/src/connect-modal/components/eoa-connection-view.ts +9 -5
  62. package/src/connect-modal/components/qr-code-view.ts +4 -4
  63. package/src/connect-modal/connect-modal.templates.ts +7 -6
  64. package/src/connect-modal/connect-modal.ts +17 -60
  65. package/src/connect-modal/styles/styles.css +1 -1
  66. package/src/connector.ts +4 -8
  67. package/src/popup-instance.ts +3 -4
  68. package/src/restore-modal.ts +5 -3
  69. package/src/styles/styles.css +1 -1
  70. package/dist/chunk-3SGSPHOZ.js.map +0 -1
  71. package/dist/chunk-6N35TCFT.js.map +0 -1
  72. package/dist/chunk-7ETKG6KR.cjs.map +0 -1
  73. package/dist/chunk-GCYDV7FB.cjs.map +0 -1
  74. package/dist/chunk-IAKQFHFD.cjs.map +0 -1
  75. package/dist/chunk-KMCCANMJ.js.map +0 -1
  76. package/dist/chunk-NWCNJSG3.js.map +0 -1
  77. package/dist/chunk-ORJK2YGG.cjs.map +0 -1
  78. package/dist/chunk-W7QI6BTA.cjs.map +0 -1
  79. /package/dist/{chunk-YIWSPI4I.js.map → chunk-LIHQISFN.js.map} +0 -0
package/dist/index.js CHANGED
@@ -1,24 +1,24 @@
1
1
  import {
2
2
  AccountModal
3
- } from "./chunk-YIWSPI4I.js";
3
+ } from "./chunk-LIHQISFN.js";
4
4
  import {
5
5
  EMBEDDED_WALLET_ID,
6
6
  EMBEDDED_WALLET_URL_DEV,
7
7
  EMBEDDED_WALLET_URL_PROD,
8
8
  UP_EXTENSION_ID,
9
9
  setupLuksoConnector
10
- } from "./chunk-KMCCANMJ.js";
10
+ } from "./chunk-DI4MT7EC.js";
11
11
  import {
12
12
  DraggableAvatar,
13
13
  createAvatar
14
- } from "./chunk-6N35TCFT.js";
14
+ } from "./chunk-GKAVIDXP.js";
15
15
  import {
16
16
  BackupModal
17
- } from "./chunk-NWCNJSG3.js";
17
+ } from "./chunk-I5I6SZZ5.js";
18
18
  import {
19
19
  RestoreModal
20
- } from "./chunk-3SGSPHOZ.js";
21
- import "./chunk-XGIT7YUY.js";
20
+ } from "./chunk-RCCGJ3DC.js";
21
+ import "./chunk-UPWE4L5Z.js";
22
22
  import {
23
23
  ConnectModal,
24
24
  disconnect,
@@ -29,7 +29,7 @@ import {
29
29
  setupWagmi,
30
30
  wagmiService,
31
31
  watchConnection
32
- } from "./chunk-SAQWNAQ6.js";
32
+ } from "./chunk-NIMT2B6H.js";
33
33
  import "./chunk-EUXUH3YW.js";
34
34
 
35
35
  // src/connector.ts
@@ -44,8 +44,8 @@ var DEFAULT_CONFIG = {
44
44
  };
45
45
  var UPConnector = class {
46
46
  constructor(config = {}) {
47
- this.connectors = [];
48
47
  this.connectionState = "disconnected";
48
+ this.connectors = [];
49
49
  this.config = { ...DEFAULT_CONFIG, ...config };
50
50
  this.init();
51
51
  }
@@ -144,7 +144,7 @@ var UPConnector = class {
144
144
  }
145
145
  // TODO: Replace with Lit-based account management modal
146
146
  // Legacy createModal() method removed - was using deprecated ConnectorModal
147
- handleAvatarClick(event) {
147
+ handleAvatarClick(_event) {
148
148
  if (this.connectionState === "connected") {
149
149
  this.showAccountModal();
150
150
  } else {
@@ -163,7 +163,7 @@ var UPConnector = class {
163
163
  );
164
164
  document.body.appendChild(this.connectModal);
165
165
  this.connectModal.addEventListener("connect", ((e) => {
166
- const connector = e.detail.connector;
166
+ const _connector = e.detail.connector;
167
167
  }));
168
168
  this.connectModal.addEventListener("close", (() => {
169
169
  }));
@@ -399,7 +399,7 @@ var PopupEventEmitter = class {
399
399
  if (!this.handlers.has(event)) {
400
400
  this.handlers.set(event, /* @__PURE__ */ new Set());
401
401
  }
402
- this.handlers.get(event).add(handler);
402
+ this.handlers.get(event)?.add(handler);
403
403
  }
404
404
  off(event, handler) {
405
405
  this.handlers.get(event)?.delete(handler);
@@ -496,7 +496,7 @@ var ModalPopupInstance = class extends BasePopupInstance {
496
496
  this.modalElement.classList.remove("visible");
497
497
  this.events.emit("hide");
498
498
  setTimeout(() => {
499
- if (this.modalElement && this.modalElement.parentNode) {
499
+ if (this.modalElement?.parentNode) {
500
500
  this.modalElement.parentNode.removeChild(this.modalElement);
501
501
  }
502
502
  }, 300);
@@ -508,7 +508,7 @@ var ModalPopupInstance = class extends BasePopupInstance {
508
508
  if (this.modalElement) {
509
509
  this.modalElement.classList.remove("visible");
510
510
  setTimeout(() => {
511
- if (this.modalElement && this.modalElement.parentNode) {
511
+ if (this.modalElement?.parentNode) {
512
512
  this.modalElement.parentNode.removeChild(this.modalElement);
513
513
  }
514
514
  }, 300);
@@ -763,7 +763,6 @@ var WindowPopupInstance = class extends BasePopupInstance {
763
763
  left = screenLeft + windowWidth - width - 20;
764
764
  top = screenTop + 20;
765
765
  break;
766
- case "center":
767
766
  default:
768
767
  left = screenLeft + (windowWidth - width) / 2;
769
768
  top = screenTop + (windowHeight - height) / 2;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connector.ts","../src/popup-instance.ts"],"sourcesContent":["/**\n * UP Connector - Main class that orchestrates avatar and modal\n * Provides smooth avatar-to-modal animations and connection state management\n *\n * NOTE: This connector uses Lit-based modal components:\n * - <connect-modal> for wallet connection (configured via setupConnectModal())\n * - <account-modal> for account management (shows address, chain, disconnect)\n *\n * Current implementation status:\n * - ✅ Avatar integration (DraggableAvatar with IconView)\n * - ✅ Connection modal (Lit-based ConnectModal)\n * - ✅ Account management modal (Lit-based AccountModal)\n * - ✅ Wagmi synchronization\n *\n * The legacy ConnectorModal (vanilla JS) has been removed. The config.modal property\n * is deprecated and has no effect - use setupConnectModal() instead.\n *\n * Users can pre-place modal components in DOM for custom positioning:\n * - Place <connect-modal> or <account-modal> anywhere in your HTML\n * - The connector will find and reuse existing modals instead of creating new ones\n */\n\nimport { DraggableAvatar } from './avatar.js'\nimport './connect-modal/index.js' // Import for side-effect (registers custom element)\nimport './account-modal.js' // Import for side-effect (registers custom element)\nimport { setLuksoConfig } from '@lukso/transaction-view-headless'\nimport type { AccountModal } from './account-modal.js'\nimport type { ConnectModal, WalletConnector } from './connect-modal/index.js'\nimport {\n disconnect,\n getConnection,\n watchConnection,\n} from './connect-modal/index.js'\nimport type {\n ConnectionState,\n ConnectorConfig,\n WalletProvider,\n} from './types.js'\n\nconst DEFAULT_CONFIG: Required<\n Omit<ConnectorConfig, 'avatar' | 'modal' | 'onConnectionChange'>\n> = {\n autoConnect: false,\n persistConnection: true,\n storageKey: 'up-connector-state',\n chainId: 42, // LUKSO mainnet\n rpcUrl: 'https://rpc.lukso.network',\n}\n\nexport class UPConnector {\n private config: ConnectorConfig & typeof DEFAULT_CONFIG\n private avatar?: DraggableAvatar\n private connectModal?: ConnectModal\n private accountModal?: AccountModal\n private connectors: WalletConnector[] = []\n private connectionState: ConnectionState = 'disconnected'\n private connectedAddress?: string\n private connectedProvider?: any\n private connectedChainId?: number\n private wagmiUnsubscribe?: (() => void) | null\n\n constructor(config: ConnectorConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config }\n\n // Initialize components\n this.init()\n }\n\n private async init(): Promise<void> {\n // Create avatar immediately\n await this.createAvatar()\n\n // Start watching wagmi (handles both initial state and changes)\n // This is async but non-blocking - connector works immediately\n this.startWagmiSync()\n\n // Try auto-connect if enabled (for non-wagmi connections)\n if (this.config.autoConnect && this.config.persistConnection) {\n await this.tryAutoConnect()\n }\n }\n\n /**\n * Start syncing with wagmi\n * Checks current state and subscribes to changes\n */\n /**\n * Update global Lukso config for address resolution\n */\n private updateLuksoConfig(chainId: number): void {\n try {\n if (chainId === 42) {\n // LUKSO Mainnet\n setLuksoConfig({\n chainId: 42,\n rpcUrl: 'https://rpc.lukso.network',\n })\n } else if (chainId === 4201) {\n // LUKSO Testnet\n setLuksoConfig({\n chainId: 4201,\n rpcUrl: 'https://rpc.testnet.lukso.network',\n })\n } else {\n // Other networks - default to mainnet config but with custom chainId\n setLuksoConfig({\n chainId,\n rpcUrl: this.config.rpcUrl,\n })\n }\n } catch (error) {\n console.warn('⚠️ [Connector] Failed to update Lukso config:', error)\n }\n }\n\n private async startWagmiSync(): Promise<void> {\n try {\n // Check initial state first\n const connection = await getConnection()\n\n if (!connection) {\n return\n }\n\n if (connection.status === 'connected' && connection.address) {\n this.handleConnection(\n connection.address,\n connection.connector,\n connection.chainId\n )\n }\n\n // Subscribe to wagmi connection changes\n this.wagmiUnsubscribe = await watchConnection((connection) => {\n const account = {\n isConnected: connection.status === 'connected',\n address: connection.address,\n chainId: connection.chainId,\n connector: connection.connector,\n }\n if (account.isConnected && account.address) {\n // Connected\n if (\n this.connectedAddress !== account.address ||\n this.connectedChainId !== account.chainId\n ) {\n this.handleConnection(\n account.address,\n account.connector,\n account.chainId\n )\n }\n } else {\n // Disconnected\n if (this.connectionState === 'connected') {\n this.handleDisconnection()\n }\n }\n })\n } catch (error) {\n console.warn('⚠️ [Connector] Failed to sync with wagmi:', error)\n }\n }\n\n private async createAvatar(): Promise<void> {\n this.avatar = new DraggableAvatar({\n // Default avatar options\n avatarSize: 'medium',\n initialPosition: 'top-right',\n fallbackText: '👤',\n\n // Override with user config\n ...this.config.avatar,\n\n // Connection-specific callbacks\n onClick: (event, data) => {\n // Call user-defined onClick first\n this.config.avatar?.onClick?.(event, data)\n\n // Then handle connection logic\n this.handleAvatarClick(event)\n },\n\n onAddressClick: (event) => {\n // Call user-defined callback\n this.config.avatar?.onAddressClick?.(event)\n },\n })\n\n // Update avatar connected state\n this.updateAvatarState()\n }\n\n // TODO: Replace with Lit-based account management modal\n // Legacy createModal() method removed - was using deprecated ConnectorModal\n\n private handleAvatarClick(event: MouseEvent): void {\n if (this.connectionState === 'connected') {\n // Show account management modal\n this.showAccountModal()\n } else {\n // Show connection modal\n this.showConnectionModal()\n }\n }\n\n private showConnectionModal(): void {\n // First, check if user has placed a connect-modal in the DOM\n if (!this.connectModal) {\n this.connectModal = document.querySelector(\n 'connect-modal'\n ) as ConnectModal\n }\n\n // If still not found, create and append it\n if (!this.connectModal) {\n this.connectModal = document.createElement(\n 'connect-modal'\n ) as ConnectModal\n document.body.appendChild(this.connectModal as unknown as HTMLElement)\n\n // Handle connect event\n this.connectModal.addEventListener('connect', ((e: CustomEvent) => {\n const connector = e.detail.connector as WalletConnector\n // TODO: Handle actual connection logic\n // For now, this will be extended when wagmi/viem integration is added\n }) as EventListener)\n\n // Handle close event\n this.connectModal.addEventListener('close', (() => {\n // Modal closed\n }) as EventListener)\n }\n\n // Modal will load connectors automatically from global setup\n // Open the modal\n this.connectModal.open = true\n }\n\n private showAccountModal(): void {\n if (!this.connectedAddress) return\n\n // First, check if user has placed an account-modal in the DOM\n if (!this.accountModal) {\n this.accountModal = document.querySelector(\n 'account-modal'\n ) as AccountModal\n }\n\n // If still not found, create and append it\n if (!this.accountModal) {\n this.accountModal = document.createElement(\n 'account-modal'\n ) as AccountModal\n document.body.appendChild(this.accountModal)\n\n // Handle disconnect event\n this.accountModal.addEventListener('disconnect', () => {\n this.handleDisconnection()\n })\n }\n\n // Set properties and open\n this.accountModal.address = this.connectedAddress\n this.accountModal.chainId = this.connectedChainId\n this.accountModal.connectorName = this.connectedProvider?.name || 'Unknown'\n this.accountModal.open = true\n }\n\n private handleConnection(\n address: string,\n provider: any,\n chainId?: number\n ): void {\n this.connectedAddress = address\n this.connectedProvider = provider\n this.connectedChainId = chainId\n this.setConnectionState('connected')\n\n // Update global Lukso config for address resolution\n if (chainId) {\n this.updateLuksoConfig(chainId)\n }\n\n // Update avatar with connected address and chainId\n if (this.avatar) {\n this.avatar.updateAddress(address, undefined, chainId)\n this.avatar.setConnected(true)\n }\n\n // Persist connection if enabled\n if (this.config.persistConnection) {\n this.saveConnectionState()\n }\n\n // Hide connection modal if open\n if (this.connectModal) {\n this.connectModal.open = false\n }\n }\n\n private async handleDisconnection(): Promise<void> {\n // Disconnect from wagmi first to ensure state is clean\n await disconnect()\n\n this.connectedAddress = undefined\n this.connectedProvider = undefined\n this.connectedChainId = undefined\n this.setConnectionState('disconnected')\n\n // Update avatar - clear address and show disconnected state\n if (this.avatar) {\n this.avatar.setConnected(false)\n // Clear the address to show fallback/disconnected state\n this.avatar.updateAddress('')\n }\n\n // Clear persisted state\n if (this.config.persistConnection) {\n this.clearConnectionState()\n }\n\n // Hide connect modal if open\n if (this.connectModal) {\n this.connectModal.open = false\n }\n }\n\n private setConnectionState(state: ConnectionState): void {\n const prevState = this.connectionState\n this.connectionState = state\n\n // Update avatar state\n this.updateAvatarState()\n\n // Notify callback\n if (prevState !== state) {\n this.config.onConnectionChange?.(state, {\n address: this.connectedAddress,\n provider: this.connectedProvider,\n chainId: this.connectedChainId,\n })\n }\n }\n\n private updateAvatarState(): void {\n if (!this.avatar) return\n\n this.avatar.setConnected(this.connectionState === 'connected')\n\n // Update avatar address and chainId if connected\n if (this.connectionState === 'connected' && this.connectedAddress) {\n this.avatar.updateAddress(\n this.connectedAddress,\n undefined,\n this.connectedChainId\n )\n }\n }\n\n private async tryAutoConnect(): Promise<void> {\n const savedState = this.loadConnectionState()\n if (!savedState?.address) return\n\n this.setConnectionState('connecting')\n\n try {\n // Try to reconnect using saved provider info\n // This would typically involve checking if the provider is still available\n // and attempting to reconnect\n\n // For now, simulate auto-connection\n setTimeout(() => {\n if (savedState.address) {\n this.handleConnection(savedState.address, savedState.provider)\n } else {\n this.setConnectionState('disconnected')\n }\n }, 1000)\n } catch (error) {\n console.warn('Auto-connect failed:', error)\n this.setConnectionState('disconnected')\n }\n }\n\n private saveConnectionState(): void {\n if (typeof localStorage === 'undefined') return\n\n try {\n const state = {\n address: this.connectedAddress,\n provider: this.connectedProvider?.constructor?.name,\n timestamp: Date.now(),\n }\n localStorage.setItem(this.config.storageKey, JSON.stringify(state))\n } catch (error) {\n console.warn('Failed to save connection state:', error)\n }\n }\n\n private loadConnectionState(): any {\n if (typeof localStorage === 'undefined') return null\n\n try {\n const saved = localStorage.getItem(this.config.storageKey)\n if (!saved) return null\n\n const state = JSON.parse(saved)\n\n // Check if state is not too old (24 hours)\n const maxAge = 24 * 60 * 60 * 1000\n if (Date.now() - state.timestamp > maxAge) {\n this.clearConnectionState()\n return null\n }\n\n return state\n } catch (error) {\n console.warn('Failed to load connection state:', error)\n return null\n }\n }\n\n private clearConnectionState(): void {\n if (typeof localStorage === 'undefined') return\n\n try {\n localStorage.removeItem(this.config.storageKey)\n } catch (error) {\n console.warn('Failed to clear connection state:', error)\n }\n }\n\n // Public API\n public getAvatar(): DraggableAvatar | undefined {\n return this.avatar\n }\n\n /**\n * @deprecated Legacy modal removed. Use getConnectModal() or create account modal\n */\n public getModal(): undefined {\n console.warn('getModal() is deprecated - legacy ConnectorModal removed')\n return undefined\n }\n\n public getConnectModal(): ConnectModal | undefined {\n return this.connectModal\n }\n\n /**\n * @deprecated Use setupConnectModal() instead to configure wagmi connectors globally\n */\n public setConnectors(connectors: WalletConnector[]): void {\n this.connectors = connectors\n // Note: The ConnectModal now loads connectors automatically from global setup\n // Use setupConnectModal() to configure wagmi integration\n console.warn(\n 'setConnectors() is deprecated. Use setupConnectModal() instead.'\n )\n }\n\n public async connect(providerId?: string): Promise<void> {\n this.setConnectionState('connecting')\n\n if (providerId) {\n // Connect to specific provider\n // This would be implemented based on available providers\n } else {\n // Show connection modal\n this.showConnectionModal()\n }\n }\n\n public disconnect(): void {\n this.handleDisconnection()\n }\n\n public getConnectionState(): ConnectionState {\n return this.connectionState\n }\n\n public getConnectedAddress(): string | undefined {\n return this.connectedAddress\n }\n\n public getConnectedProvider(): any {\n return this.connectedProvider\n }\n\n public isConnected(): boolean {\n return this.connectionState === 'connected'\n }\n\n public showModal(): void {\n if (this.isConnected()) {\n this.showAccountModal()\n } else {\n this.showConnectionModal()\n }\n }\n\n public hideModal(): void {\n if (this.connectModal) {\n this.connectModal.open = false\n }\n }\n\n public updateConfig(config: Partial<ConnectorConfig>): void {\n this.config = { ...this.config, ...config }\n\n // Update avatar if config changed\n if (config.avatar && this.avatar) {\n // This would require implementing avatar config updates\n }\n }\n\n public destroy(): void {\n // Unsubscribe from wagmi changes\n if (this.wagmiUnsubscribe) {\n this.wagmiUnsubscribe()\n this.wagmiUnsubscribe = undefined\n }\n\n this.avatar?.destroy()\n\n // Clean up connect modal\n if (this.connectModal) {\n this.connectModal.open = false\n if (this.connectModal.parentNode) {\n this.connectModal.parentNode.removeChild(this.connectModal)\n }\n }\n\n this.avatar = undefined\n this.connectModal = undefined\n this.connectedAddress = undefined\n this.connectedProvider = undefined\n this.connectionState = 'disconnected'\n }\n}\n\n/**\n * Factory function for creating UP Connector instances\n */\nexport function createConnector(config: ConnectorConfig = {}): UPConnector {\n return new UPConnector(config)\n}\n\nexport default UPConnector\n","/**\n * Enhanced Popup System for UP Connector\n * Provides unified interface for both popup windows and modal dialogs\n */\n\nexport interface PopupRequest {\n mode: 'popup' | 'modal' // popup = window.open, modal = iframe in modal\n url?: string // If present = external, if not = local content\n size?: { width: number; height: number }\n position?: 'center' | 'top-right'\n allowedOrigins?: string[] // Security for message passing\n reuseExisting?: boolean // Whether to reuse existing popups (default: true)\n}\n\nexport interface PopupInstance {\n // Lifecycle Management\n show(): Promise<void> // Show the popup/modal - async for consistency\n hide(): void // Hide but preserve state\n close(): void // Actually destroy\n\n // Message Passing\n postMessage(data: any): void // Send to popup/iframe\n onMessage(handler: (data: any) => void): void // Receive from popup/iframe\n removeMessageHandler(handler: (data: any) => void): void // Remove handler\n\n // State Queries\n isVisible: boolean // Whether currently visible\n isClosed: boolean // Whether destroyed\n contentWindow?: Window // For advanced use\n\n // Events\n on(\n event: 'show' | 'hide' | 'close' | 'message',\n handler: (...args: any[]) => void\n ): void\n off(\n event: 'show' | 'hide' | 'close' | 'message',\n handler: (...args: any[]) => void\n ): void\n}\n\nexport interface UIDelegate {\n createPopup(request: PopupRequest): PopupInstance\n showPopup(request: PopupRequest): Promise<PopupInstance>\n closeAll(): void\n}\n\n// Internal event emitter for popup instances\nclass PopupEventEmitter {\n private handlers = new Map<string, Set<(...args: any[]) => void>>()\n\n on(event: string, handler: (...args: any[]) => void): void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set())\n }\n this.handlers.get(event)!.add(handler)\n }\n\n off(event: string, handler: (...args: any[]) => void): void {\n this.handlers.get(event)?.delete(handler)\n }\n\n emit(event: string, ...args: any[]): void {\n this.handlers.get(event)?.forEach((handler) => {\n try {\n handler(...args)\n } catch (error) {\n console.error('Error in popup event handler:', error)\n }\n })\n }\n\n clear(): void {\n this.handlers.clear()\n }\n}\n\n/**\n * Base class for popup instances\n */\nabstract class BasePopupInstance implements PopupInstance {\n protected events = new PopupEventEmitter()\n protected messageHandlers = new Set<(data: any) => void>()\n protected _isClosed = false\n protected _isVisible = false\n\n constructor(protected request: PopupRequest) {}\n\n abstract show(): Promise<void>\n abstract hide(): void\n abstract close(): void\n abstract get contentWindow(): Window | undefined\n\n get isVisible(): boolean {\n return this._isVisible && !this._isClosed\n }\n get isClosed(): boolean {\n return this._isClosed\n }\n\n postMessage(data: any): void {\n if (!this._isClosed && this.contentWindow) {\n try {\n this.contentWindow.postMessage(data, '*')\n } catch (error) {\n console.error('Failed to post message to popup:', error)\n }\n }\n }\n\n onMessage(handler: (data: any) => void): void {\n this.messageHandlers.add(handler)\n }\n\n removeMessageHandler(handler: (data: any) => void): void {\n this.messageHandlers.delete(handler)\n }\n\n protected handleMessage(data: any): void {\n this.messageHandlers.forEach((handler) => {\n try {\n handler(data)\n } catch (error) {\n console.error('Error in popup message handler:', error)\n }\n })\n this.events.emit('message', data)\n }\n\n on(\n event: 'show' | 'hide' | 'close' | 'message',\n handler: (...args: any[]) => void\n ): void {\n this.events.on(event, handler)\n }\n\n off(\n event: 'show' | 'hide' | 'close' | 'message',\n handler: (...args: any[]) => void\n ): void {\n this.events.off(event, handler)\n }\n\n protected cleanup(): void {\n this.messageHandlers.clear()\n this.events.clear()\n }\n}\n\n/**\n * Modal popup implementation (iframe in modal dialog)\n */\nexport class ModalPopupInstance extends BasePopupInstance {\n private modalElement?: HTMLDivElement\n private iframeElement?: HTMLIFrameElement\n private messageListener?: (event: MessageEvent) => void\n\n async show(): Promise<void> {\n if (this._isClosed) {\n throw new Error('Popup is closed')\n }\n\n if (!this.modalElement) {\n await this.createElement()\n }\n\n return new Promise((resolve) => {\n if (!this.modalElement) {\n resolve()\n return\n }\n\n // Add to DOM if not already present\n if (!this.modalElement.parentNode) {\n document.body.appendChild(this.modalElement)\n }\n\n this._isVisible = true\n\n // Force reflow before adding visible class\n this.modalElement.offsetHeight\n this.modalElement.classList.add('visible')\n\n this.events.emit('show')\n\n // Wait for animation\n setTimeout(() => resolve(), 50)\n })\n }\n\n hide(): void {\n if (!this._isVisible || this._isClosed || !this.modalElement) return\n\n this._isVisible = false\n this.modalElement.classList.remove('visible')\n this.events.emit('hide')\n\n // Remove from DOM after animation\n setTimeout(() => {\n if (this.modalElement && this.modalElement.parentNode) {\n this.modalElement.parentNode.removeChild(this.modalElement)\n }\n }, 300)\n }\n\n close(): void {\n if (this._isClosed) return\n\n this._isClosed = true\n this._isVisible = false\n\n if (this.modalElement) {\n this.modalElement.classList.remove('visible')\n setTimeout(() => {\n if (this.modalElement && this.modalElement.parentNode) {\n this.modalElement.parentNode.removeChild(this.modalElement)\n }\n }, 300)\n }\n\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener)\n }\n\n this.events.emit('close')\n this.cleanup()\n }\n\n get contentWindow(): Window | undefined {\n return this.iframeElement?.contentWindow || undefined\n }\n\n private async createElement(): Promise<void> {\n if (typeof document === 'undefined') return\n\n await this.createStyles()\n\n // Create modal structure\n this.modalElement = document.createElement('div')\n this.modalElement.className = 'up-popup-modal'\n\n const { width = 480, height = 640 } = this.request.size || {}\n\n this.modalElement.innerHTML = `\n <div class=\"up-popup-modal-content\" style=\"width: ${width}px; height: ${height}px;\">\n <button class=\"up-popup-close\" type=\"button\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n <iframe src=\"${this.request.url || 'about:blank'}\" allow=\"publickey-credentials-get; publickey-credentials-create\"></iframe>\n </div>\n `\n\n // Get references\n const closeButton = this.modalElement.querySelector(\n '.up-popup-close'\n ) as HTMLButtonElement\n this.iframeElement = this.modalElement.querySelector(\n 'iframe'\n ) as HTMLIFrameElement\n\n // Event listeners\n closeButton.addEventListener('click', () => this.hide())\n\n this.modalElement.addEventListener('click', (e) => {\n if (e.target === this.modalElement) {\n this.hide()\n }\n })\n\n // Message handling\n this.messageListener = (event: MessageEvent) => {\n // Only handle messages from our iframe\n if (event.source === this.iframeElement?.contentWindow) {\n this.handleMessage(event.data)\n }\n }\n window.addEventListener('message', this.messageListener)\n }\n\n private async createStyles(): Promise<void> {\n if (typeof document === 'undefined') return\n\n if (document.querySelector('#up-popup-modal-styles')) return\n\n const style = document.createElement('style')\n style.id = 'up-popup-modal-styles'\n style.textContent = `\n .up-popup-modal {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(8px);\n z-index: 10000;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n visibility: hidden;\n transition: all 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n padding: 16px;\n }\n\n .up-popup-modal.visible {\n opacity: 1;\n visibility: visible;\n }\n\n .up-popup-modal-content {\n background: white;\n border-radius: 12px;\n overflow: hidden;\n position: relative;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n transform: scale(0.95) translateY(20px);\n transition: all 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n }\n\n .up-popup-modal.visible .up-popup-modal-content {\n transform: scale(1) translateY(0);\n }\n\n .up-popup-close {\n position: absolute;\n top: 12px;\n right: 12px;\n z-index: 10;\n background: rgba(255, 255, 255, 0.9);\n border: none;\n border-radius: 50%;\n width: 32px;\n height: 32px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #6b7280;\n transition: all 0.2s ease;\n }\n\n .up-popup-close:hover {\n background: rgba(255, 255, 255, 1);\n color: #374151;\n }\n\n .up-popup-modal iframe {\n width: 100%;\n height: 100%;\n border: none;\n border-radius: 12px;\n }\n\n @media (max-width: 640px) {\n .up-popup-modal {\n padding: 0;\n align-items: flex-end;\n }\n\n .up-popup-modal-content {\n width: 100% !important;\n height: 85vh !important;\n border-radius: 12px 12px 0 0;\n transform: translateY(100%);\n }\n\n .up-popup-modal.visible .up-popup-modal-content {\n transform: translateY(0);\n }\n\n .up-popup-modal iframe {\n border-radius: 12px 12px 0 0;\n }\n }\n\n @media (max-width: 480px) {\n .up-popup-modal {\n align-items: stretch;\n }\n\n .up-popup-modal-content {\n height: 100vh !important;\n border-radius: 0;\n }\n\n .up-popup-modal iframe {\n border-radius: 0;\n }\n }\n `\n document.head.appendChild(style)\n }\n}\n\n/**\n * Window popup implementation (actual popup window)\n */\nexport class WindowPopupInstance extends BasePopupInstance {\n private popupWindow: Window | null = null\n private messageListener?: (event: MessageEvent) => void\n\n async show(): Promise<void> {\n if (this._isClosed) {\n throw new Error('Popup is closed')\n }\n\n if (!this.popupWindow || this.popupWindow.closed) {\n await this.createPopupWindow()\n }\n\n if (this.popupWindow && !this.popupWindow.closed) {\n this.popupWindow.focus()\n this._isVisible = true\n this.events.emit('show')\n }\n }\n\n hide(): void {\n // For popup windows, hide typically means minimize or move to background\n // Since we can't directly minimize, we just blur it\n if (this.popupWindow && !this.popupWindow.closed) {\n this.popupWindow.blur()\n }\n this._isVisible = false\n this.events.emit('hide')\n }\n\n close(): void {\n if (this._isClosed) return\n\n this._isClosed = true\n this._isVisible = false\n\n if (this.popupWindow && !this.popupWindow.closed) {\n this.popupWindow.close()\n }\n this.popupWindow = null\n\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener)\n }\n\n this.events.emit('close')\n this.cleanup()\n }\n\n get contentWindow(): Window | undefined {\n return this.popupWindow && !this.popupWindow.closed\n ? this.popupWindow\n : undefined\n }\n\n get isVisible(): boolean {\n return !this._isClosed && !!(this.popupWindow && !this.popupWindow.closed)\n }\n\n private async createPopupWindow(): Promise<void> {\n if (!this.request.url) {\n throw new Error('URL required for popup windows')\n }\n\n const { width = 400, height = 600 } = this.request.size || {}\n const position = this.request.position || 'center'\n const features = [\n `width=${width}`,\n `height=${height}`,\n ...this.getPositionFeatures(position, width, height),\n 'scrollbars=yes',\n 'resizable=yes',\n 'status=no',\n 'location=no',\n 'toolbar=no',\n 'menubar=no',\n ].join(',')\n\n this.popupWindow = window.open(this.request.url, '_blank', features)\n\n if (!this.popupWindow) {\n throw new Error('Popup blocked or failed to open')\n }\n\n // Setup message listener\n this.messageListener = (event: MessageEvent) => {\n if (event.source === this.popupWindow) {\n this.handleMessage(event.data)\n }\n }\n window.addEventListener('message', this.messageListener)\n\n // Monitor popup close\n const checkClosed = () => {\n if (this.popupWindow?.closed && !this._isClosed) {\n this.close()\n } else if (!this._isClosed) {\n setTimeout(checkClosed, 1000)\n }\n }\n setTimeout(checkClosed, 1000)\n }\n\n private getPositionFeatures(\n position: string,\n width: number,\n height: number\n ): string[] {\n const screenLeft =\n window.screenLeft !== undefined ? window.screenLeft : window.screenX\n const screenTop =\n window.screenTop !== undefined ? window.screenTop : window.screenY\n const windowWidth =\n window.innerWidth || document.documentElement.clientWidth || screen.width\n const windowHeight =\n window.innerHeight ||\n document.documentElement.clientHeight ||\n screen.height\n\n let left: number\n let top: number\n\n switch (position) {\n case 'top-right':\n left = screenLeft + windowWidth - width - 20\n top = screenTop + 20\n break\n case 'center':\n default:\n left = screenLeft + (windowWidth - width) / 2\n top = screenTop + (windowHeight - height) / 2\n break\n }\n\n return [`left=${Math.max(0, left)}`, `top=${Math.max(0, top)}`]\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,SAAS,sBAAsB;AAc/B,IAAM,iBAEF;AAAA,EACF,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,SAAS;AAAA;AAAA,EACT,QAAQ;AACV;AAEO,IAAM,cAAN,MAAkB;AAAA,EAYvB,YAAY,SAA0B,CAAC,GAAG;AAP1C,SAAQ,aAAgC,CAAC;AACzC,SAAQ,kBAAmC;AAOzC,SAAK,SAAS,EAAE,GAAG,gBAAgB,GAAG,OAAO;AAG7C,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,MAAc,OAAsB;AAElC,UAAM,KAAK,aAAa;AAIxB,SAAK,eAAe;AAGpB,QAAI,KAAK,OAAO,eAAe,KAAK,OAAO,mBAAmB;AAC5D,YAAM,KAAK,eAAe;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,kBAAkB,SAAuB;AAC/C,QAAI;AACF,UAAI,YAAY,IAAI;AAElB,uBAAe;AAAA,UACb,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,WAAW,YAAY,MAAM;AAE3B,uBAAe;AAAA,UACb,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AAEL,uBAAe;AAAA,UACb;AAAA,UACA,QAAQ,KAAK,OAAO;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,KAAK,2DAAiD,KAAK;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAc,iBAAgC;AAC5C,QAAI;AAEF,YAAM,aAAa,MAAM,cAAc;AAEvC,UAAI,CAAC,YAAY;AACf;AAAA,MACF;AAEA,UAAI,WAAW,WAAW,eAAe,WAAW,SAAS;AAC3D,aAAK;AAAA,UACH,WAAW;AAAA,UACX,WAAW;AAAA,UACX,WAAW;AAAA,QACb;AAAA,MACF;AAGA,WAAK,mBAAmB,MAAM,gBAAgB,CAACA,gBAAe;AAC5D,cAAM,UAAU;AAAA,UACd,aAAaA,YAAW,WAAW;AAAA,UACnC,SAASA,YAAW;AAAA,UACpB,SAASA,YAAW;AAAA,UACpB,WAAWA,YAAW;AAAA,QACxB;AACA,YAAI,QAAQ,eAAe,QAAQ,SAAS;AAE1C,cACE,KAAK,qBAAqB,QAAQ,WAClC,KAAK,qBAAqB,QAAQ,SAClC;AACA,iBAAK;AAAA,cACH,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,QAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF,OAAO;AAEL,cAAI,KAAK,oBAAoB,aAAa;AACxC,iBAAK,oBAAoB;AAAA,UAC3B;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,KAAK,uDAA6C,KAAK;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAc,eAA8B;AAC1C,SAAK,SAAS,IAAI,gBAAgB;AAAA;AAAA,MAEhC,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,cAAc;AAAA;AAAA,MAGd,GAAG,KAAK,OAAO;AAAA;AAAA,MAGf,SAAS,CAAC,OAAO,SAAS;AAExB,aAAK,OAAO,QAAQ,UAAU,OAAO,IAAI;AAGzC,aAAK,kBAAkB,KAAK;AAAA,MAC9B;AAAA,MAEA,gBAAgB,CAAC,UAAU;AAEzB,aAAK,OAAO,QAAQ,iBAAiB,KAAK;AAAA,MAC5C;AAAA,IACF,CAAC;AAGD,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA,EAKQ,kBAAkB,OAAyB;AACjD,QAAI,KAAK,oBAAoB,aAAa;AAExC,WAAK,iBAAiB;AAAA,IACxB,OAAO;AAEL,WAAK,oBAAoB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,sBAA4B;AAElC,QAAI,CAAC,KAAK,cAAc;AACtB,WAAK,eAAe,SAAS;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,cAAc;AACtB,WAAK,eAAe,SAAS;AAAA,QAC3B;AAAA,MACF;AACA,eAAS,KAAK,YAAY,KAAK,YAAsC;AAGrE,WAAK,aAAa,iBAAiB,YAAY,CAAC,MAAmB;AACjE,cAAM,YAAY,EAAE,OAAO;AAAA,MAG7B,EAAmB;AAGnB,WAAK,aAAa,iBAAiB,UAAU,MAAM;AAAA,MAEnD,EAAmB;AAAA,IACrB;AAIA,SAAK,aAAa,OAAO;AAAA,EAC3B;AAAA,EAEQ,mBAAyB;AAC/B,QAAI,CAAC,KAAK,iBAAkB;AAG5B,QAAI,CAAC,KAAK,cAAc;AACtB,WAAK,eAAe,SAAS;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,cAAc;AACtB,WAAK,eAAe,SAAS;AAAA,QAC3B;AAAA,MACF;AACA,eAAS,KAAK,YAAY,KAAK,YAAY;AAG3C,WAAK,aAAa,iBAAiB,cAAc,MAAM;AACrD,aAAK,oBAAoB;AAAA,MAC3B,CAAC;AAAA,IACH;AAGA,SAAK,aAAa,UAAU,KAAK;AACjC,SAAK,aAAa,UAAU,KAAK;AACjC,SAAK,aAAa,gBAAgB,KAAK,mBAAmB,QAAQ;AAClE,SAAK,aAAa,OAAO;AAAA,EAC3B;AAAA,EAEQ,iBACN,SACA,UACA,SACM;AACN,SAAK,mBAAmB;AACxB,SAAK,oBAAoB;AACzB,SAAK,mBAAmB;AACxB,SAAK,mBAAmB,WAAW;AAGnC,QAAI,SAAS;AACX,WAAK,kBAAkB,OAAO;AAAA,IAChC;AAGA,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,cAAc,SAAS,QAAW,OAAO;AACrD,WAAK,OAAO,aAAa,IAAI;AAAA,IAC/B;AAGA,QAAI,KAAK,OAAO,mBAAmB;AACjC,WAAK,oBAAoB;AAAA,IAC3B;AAGA,QAAI,KAAK,cAAc;AACrB,WAAK,aAAa,OAAO;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAc,sBAAqC;AAEjD,UAAM,WAAW;AAEjB,SAAK,mBAAmB;AACxB,SAAK,oBAAoB;AACzB,SAAK,mBAAmB;AACxB,SAAK,mBAAmB,cAAc;AAGtC,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,aAAa,KAAK;AAE9B,WAAK,OAAO,cAAc,EAAE;AAAA,IAC9B;AAGA,QAAI,KAAK,OAAO,mBAAmB;AACjC,WAAK,qBAAqB;AAAA,IAC5B;AAGA,QAAI,KAAK,cAAc;AACrB,WAAK,aAAa,OAAO;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,mBAAmB,OAA8B;AACvD,UAAM,YAAY,KAAK;AACvB,SAAK,kBAAkB;AAGvB,SAAK,kBAAkB;AAGvB,QAAI,cAAc,OAAO;AACvB,WAAK,OAAO,qBAAqB,OAAO;AAAA,QACtC,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,oBAA0B;AAChC,QAAI,CAAC,KAAK,OAAQ;AAElB,SAAK,OAAO,aAAa,KAAK,oBAAoB,WAAW;AAG7D,QAAI,KAAK,oBAAoB,eAAe,KAAK,kBAAkB;AACjE,WAAK,OAAO;AAAA,QACV,KAAK;AAAA,QACL;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBAAgC;AAC5C,UAAM,aAAa,KAAK,oBAAoB;AAC5C,QAAI,CAAC,YAAY,QAAS;AAE1B,SAAK,mBAAmB,YAAY;AAEpC,QAAI;AAMF,iBAAW,MAAM;AACf,YAAI,WAAW,SAAS;AACtB,eAAK,iBAAiB,WAAW,SAAS,WAAW,QAAQ;AAAA,QAC/D,OAAO;AACL,eAAK,mBAAmB,cAAc;AAAA,QACxC;AAAA,MACF,GAAG,GAAI;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,KAAK,wBAAwB,KAAK;AAC1C,WAAK,mBAAmB,cAAc;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,sBAA4B;AAClC,QAAI,OAAO,iBAAiB,YAAa;AAEzC,QAAI;AACF,YAAM,QAAQ;AAAA,QACZ,SAAS,KAAK;AAAA,QACd,UAAU,KAAK,mBAAmB,aAAa;AAAA,QAC/C,WAAW,KAAK,IAAI;AAAA,MACtB;AACA,mBAAa,QAAQ,KAAK,OAAO,YAAY,KAAK,UAAU,KAAK,CAAC;AAAA,IACpE,SAAS,OAAO;AACd,cAAQ,KAAK,oCAAoC,KAAK;AAAA,IACxD;AAAA,EACF;AAAA,EAEQ,sBAA2B;AACjC,QAAI,OAAO,iBAAiB,YAAa,QAAO;AAEhD,QAAI;AACF,YAAM,QAAQ,aAAa,QAAQ,KAAK,OAAO,UAAU;AACzD,UAAI,CAAC,MAAO,QAAO;AAEnB,YAAM,QAAQ,KAAK,MAAM,KAAK;AAG9B,YAAM,SAAS,KAAK,KAAK,KAAK;AAC9B,UAAI,KAAK,IAAI,IAAI,MAAM,YAAY,QAAQ;AACzC,aAAK,qBAAqB;AAC1B,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,KAAK,oCAAoC,KAAK;AACtD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,uBAA6B;AACnC,QAAI,OAAO,iBAAiB,YAAa;AAEzC,QAAI;AACF,mBAAa,WAAW,KAAK,OAAO,UAAU;AAAA,IAChD,SAAS,OAAO;AACd,cAAQ,KAAK,qCAAqC,KAAK;AAAA,IACzD;AAAA,EACF;AAAA;AAAA,EAGO,YAAyC;AAC9C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,WAAsB;AAC3B,YAAQ,KAAK,0DAA0D;AACvE,WAAO;AAAA,EACT;AAAA,EAEO,kBAA4C;AACjD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,cAAc,YAAqC;AACxD,SAAK,aAAa;AAGlB,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,QAAQ,YAAoC;AACvD,SAAK,mBAAmB,YAAY;AAEpC,QAAI,YAAY;AAAA,IAGhB,OAAO;AAEL,WAAK,oBAAoB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEO,aAAmB;AACxB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEO,qBAAsC;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,sBAA0C;AAC/C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,uBAA4B;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,cAAuB;AAC5B,WAAO,KAAK,oBAAoB;AAAA,EAClC;AAAA,EAEO,YAAkB;AACvB,QAAI,KAAK,YAAY,GAAG;AACtB,WAAK,iBAAiB;AAAA,IACxB,OAAO;AACL,WAAK,oBAAoB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEO,YAAkB;AACvB,QAAI,KAAK,cAAc;AACrB,WAAK,aAAa,OAAO;AAAA,IAC3B;AAAA,EACF;AAAA,EAEO,aAAa,QAAwC;AAC1D,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,OAAO;AAG1C,QAAI,OAAO,UAAU,KAAK,QAAQ;AAAA,IAElC;AAAA,EACF;AAAA,EAEO,UAAgB;AAErB,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB;AACtB,WAAK,mBAAmB;AAAA,IAC1B;AAEA,SAAK,QAAQ,QAAQ;AAGrB,QAAI,KAAK,cAAc;AACrB,WAAK,aAAa,OAAO;AACzB,UAAI,KAAK,aAAa,YAAY;AAChC,aAAK,aAAa,WAAW,YAAY,KAAK,YAAY;AAAA,MAC5D;AAAA,IACF;AAEA,SAAK,SAAS;AACd,SAAK,eAAe;AACpB,SAAK,mBAAmB;AACxB,SAAK,oBAAoB;AACzB,SAAK,kBAAkB;AAAA,EACzB;AACF;AAKO,SAAS,gBAAgB,SAA0B,CAAC,GAAgB;AACzE,SAAO,IAAI,YAAY,MAAM;AAC/B;;;ACnfA,IAAM,oBAAN,MAAwB;AAAA,EAAxB;AACE,SAAQ,WAAW,oBAAI,IAA2C;AAAA;AAAA,EAElE,GAAG,OAAe,SAAyC;AACzD,QAAI,CAAC,KAAK,SAAS,IAAI,KAAK,GAAG;AAC7B,WAAK,SAAS,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,IACpC;AACA,SAAK,SAAS,IAAI,KAAK,EAAG,IAAI,OAAO;AAAA,EACvC;AAAA,EAEA,IAAI,OAAe,SAAyC;AAC1D,SAAK,SAAS,IAAI,KAAK,GAAG,OAAO,OAAO;AAAA,EAC1C;AAAA,EAEA,KAAK,UAAkB,MAAmB;AACxC,SAAK,SAAS,IAAI,KAAK,GAAG,QAAQ,CAAC,YAAY;AAC7C,UAAI;AACF,gBAAQ,GAAG,IAAI;AAAA,MACjB,SAAS,OAAO;AACd,gBAAQ,MAAM,iCAAiC,KAAK;AAAA,MACtD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS,MAAM;AAAA,EACtB;AACF;AAKA,IAAe,oBAAf,MAA0D;AAAA,EAMxD,YAAsB,SAAuB;AAAvB;AALtB,SAAU,SAAS,IAAI,kBAAkB;AACzC,SAAU,kBAAkB,oBAAI,IAAyB;AACzD,SAAU,YAAY;AACtB,SAAU,aAAa;AAAA,EAEuB;AAAA,EAO9C,IAAI,YAAqB;AACvB,WAAO,KAAK,cAAc,CAAC,KAAK;AAAA,EAClC;AAAA,EACA,IAAI,WAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAY,MAAiB;AAC3B,QAAI,CAAC,KAAK,aAAa,KAAK,eAAe;AACzC,UAAI;AACF,aAAK,cAAc,YAAY,MAAM,GAAG;AAAA,MAC1C,SAAS,OAAO;AACd,gBAAQ,MAAM,oCAAoC,KAAK;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,SAAoC;AAC5C,SAAK,gBAAgB,IAAI,OAAO;AAAA,EAClC;AAAA,EAEA,qBAAqB,SAAoC;AACvD,SAAK,gBAAgB,OAAO,OAAO;AAAA,EACrC;AAAA,EAEU,cAAc,MAAiB;AACvC,SAAK,gBAAgB,QAAQ,CAAC,YAAY;AACxC,UAAI;AACF,gBAAQ,IAAI;AAAA,MACd,SAAS,OAAO;AACd,gBAAQ,MAAM,mCAAmC,KAAK;AAAA,MACxD;AAAA,IACF,CAAC;AACD,SAAK,OAAO,KAAK,WAAW,IAAI;AAAA,EAClC;AAAA,EAEA,GACE,OACA,SACM;AACN,SAAK,OAAO,GAAG,OAAO,OAAO;AAAA,EAC/B;AAAA,EAEA,IACE,OACA,SACM;AACN,SAAK,OAAO,IAAI,OAAO,OAAO;AAAA,EAChC;AAAA,EAEU,UAAgB;AACxB,SAAK,gBAAgB,MAAM;AAC3B,SAAK,OAAO,MAAM;AAAA,EACpB;AACF;AAKO,IAAM,qBAAN,cAAiC,kBAAkB;AAAA,EAKxD,MAAM,OAAsB;AAC1B,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,cAAc;AAAA,IAC3B;AAEA,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAI,CAAC,KAAK,cAAc;AACtB,gBAAQ;AACR;AAAA,MACF;AAGA,UAAI,CAAC,KAAK,aAAa,YAAY;AACjC,iBAAS,KAAK,YAAY,KAAK,YAAY;AAAA,MAC7C;AAEA,WAAK,aAAa;AAGlB,WAAK,aAAa;AAClB,WAAK,aAAa,UAAU,IAAI,SAAS;AAEzC,WAAK,OAAO,KAAK,MAAM;AAGvB,iBAAW,MAAM,QAAQ,GAAG,EAAE;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,OAAa;AACX,QAAI,CAAC,KAAK,cAAc,KAAK,aAAa,CAAC,KAAK,aAAc;AAE9D,SAAK,aAAa;AAClB,SAAK,aAAa,UAAU,OAAO,SAAS;AAC5C,SAAK,OAAO,KAAK,MAAM;AAGvB,eAAW,MAAM;AACf,UAAI,KAAK,gBAAgB,KAAK,aAAa,YAAY;AACrD,aAAK,aAAa,WAAW,YAAY,KAAK,YAAY;AAAA,MAC5D;AAAA,IACF,GAAG,GAAG;AAAA,EACR;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,UAAW;AAEpB,SAAK,YAAY;AACjB,SAAK,aAAa;AAElB,QAAI,KAAK,cAAc;AACrB,WAAK,aAAa,UAAU,OAAO,SAAS;AAC5C,iBAAW,MAAM;AACf,YAAI,KAAK,gBAAgB,KAAK,aAAa,YAAY;AACrD,eAAK,aAAa,WAAW,YAAY,KAAK,YAAY;AAAA,QAC5D;AAAA,MACF,GAAG,GAAG;AAAA,IACR;AAEA,QAAI,KAAK,iBAAiB;AACxB,aAAO,oBAAoB,WAAW,KAAK,eAAe;AAAA,IAC5D;AAEA,SAAK,OAAO,KAAK,OAAO;AACxB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,IAAI,gBAAoC;AACtC,WAAO,KAAK,eAAe,iBAAiB;AAAA,EAC9C;AAAA,EAEA,MAAc,gBAA+B;AAC3C,QAAI,OAAO,aAAa,YAAa;AAErC,UAAM,KAAK,aAAa;AAGxB,SAAK,eAAe,SAAS,cAAc,KAAK;AAChD,SAAK,aAAa,YAAY;AAE9B,UAAM,EAAE,QAAQ,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,QAAQ,CAAC;AAE5D,SAAK,aAAa,YAAY;AAAA,0DACwB,KAAK,eAAe,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAM7D,KAAK,QAAQ,OAAO,aAAa;AAAA;AAAA;AAKpD,UAAM,cAAc,KAAK,aAAa;AAAA,MACpC;AAAA,IACF;AACA,SAAK,gBAAgB,KAAK,aAAa;AAAA,MACrC;AAAA,IACF;AAGA,gBAAY,iBAAiB,SAAS,MAAM,KAAK,KAAK,CAAC;AAEvD,SAAK,aAAa,iBAAiB,SAAS,CAAC,MAAM;AACjD,UAAI,EAAE,WAAW,KAAK,cAAc;AAClC,aAAK,KAAK;AAAA,MACZ;AAAA,IACF,CAAC;AAGD,SAAK,kBAAkB,CAAC,UAAwB;AAE9C,UAAI,MAAM,WAAW,KAAK,eAAe,eAAe;AACtD,aAAK,cAAc,MAAM,IAAI;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,KAAK,eAAe;AAAA,EACzD;AAAA,EAEA,MAAc,eAA8B;AAC1C,QAAI,OAAO,aAAa,YAAa;AAErC,QAAI,SAAS,cAAc,wBAAwB,EAAG;AAEtD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,KAAK;AACX,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyGpB,aAAS,KAAK,YAAY,KAAK;AAAA,EACjC;AACF;AAKO,IAAM,sBAAN,cAAkC,kBAAkB;AAAA,EAApD;AAAA;AACL,SAAQ,cAA6B;AAAA;AAAA,EAGrC,MAAM,OAAsB;AAC1B,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AAEA,QAAI,CAAC,KAAK,eAAe,KAAK,YAAY,QAAQ;AAChD,YAAM,KAAK,kBAAkB;AAAA,IAC/B;AAEA,QAAI,KAAK,eAAe,CAAC,KAAK,YAAY,QAAQ;AAChD,WAAK,YAAY,MAAM;AACvB,WAAK,aAAa;AAClB,WAAK,OAAO,KAAK,MAAM;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAa;AAGX,QAAI,KAAK,eAAe,CAAC,KAAK,YAAY,QAAQ;AAChD,WAAK,YAAY,KAAK;AAAA,IACxB;AACA,SAAK,aAAa;AAClB,SAAK,OAAO,KAAK,MAAM;AAAA,EACzB;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,UAAW;AAEpB,SAAK,YAAY;AACjB,SAAK,aAAa;AAElB,QAAI,KAAK,eAAe,CAAC,KAAK,YAAY,QAAQ;AAChD,WAAK,YAAY,MAAM;AAAA,IACzB;AACA,SAAK,cAAc;AAEnB,QAAI,KAAK,iBAAiB;AACxB,aAAO,oBAAoB,WAAW,KAAK,eAAe;AAAA,IAC5D;AAEA,SAAK,OAAO,KAAK,OAAO;AACxB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,IAAI,gBAAoC;AACtC,WAAO,KAAK,eAAe,CAAC,KAAK,YAAY,SACzC,KAAK,cACL;AAAA,EACN;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,CAAC,KAAK,aAAa,CAAC,EAAE,KAAK,eAAe,CAAC,KAAK,YAAY;AAAA,EACrE;AAAA,EAEA,MAAc,oBAAmC;AAC/C,QAAI,CAAC,KAAK,QAAQ,KAAK;AACrB,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,EAAE,QAAQ,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,QAAQ,CAAC;AAC5D,UAAM,WAAW,KAAK,QAAQ,YAAY;AAC1C,UAAM,WAAW;AAAA,MACf,SAAS,KAAK;AAAA,MACd,UAAU,MAAM;AAAA,MAChB,GAAG,KAAK,oBAAoB,UAAU,OAAO,MAAM;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AAEV,SAAK,cAAc,OAAO,KAAK,KAAK,QAAQ,KAAK,UAAU,QAAQ;AAEnE,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAGA,SAAK,kBAAkB,CAAC,UAAwB;AAC9C,UAAI,MAAM,WAAW,KAAK,aAAa;AACrC,aAAK,cAAc,MAAM,IAAI;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,KAAK,eAAe;AAGvD,UAAM,cAAc,MAAM;AACxB,UAAI,KAAK,aAAa,UAAU,CAAC,KAAK,WAAW;AAC/C,aAAK,MAAM;AAAA,MACb,WAAW,CAAC,KAAK,WAAW;AAC1B,mBAAW,aAAa,GAAI;AAAA,MAC9B;AAAA,IACF;AACA,eAAW,aAAa,GAAI;AAAA,EAC9B;AAAA,EAEQ,oBACN,UACA,OACA,QACU;AACV,UAAM,aACJ,OAAO,eAAe,SAAY,OAAO,aAAa,OAAO;AAC/D,UAAM,YACJ,OAAO,cAAc,SAAY,OAAO,YAAY,OAAO;AAC7D,UAAM,cACJ,OAAO,cAAc,SAAS,gBAAgB,eAAe,OAAO;AACtE,UAAM,eACJ,OAAO,eACP,SAAS,gBAAgB,gBACzB,OAAO;AAET,QAAI;AACJ,QAAI;AAEJ,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,eAAO,aAAa,cAAc,QAAQ;AAC1C,cAAM,YAAY;AAClB;AAAA,MACF,KAAK;AAAA,MACL;AACE,eAAO,cAAc,cAAc,SAAS;AAC5C,cAAM,aAAa,eAAe,UAAU;AAC5C;AAAA,IACJ;AAEA,WAAO,CAAC,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI,OAAO,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE;AAAA,EAChE;AACF;","names":["connection"]}
1
+ {"version":3,"sources":["../src/connector.ts","../src/popup-instance.ts"],"sourcesContent":["/**\n * UP Connector - Main class that orchestrates avatar and modal\n * Provides smooth avatar-to-modal animations and connection state management\n *\n * NOTE: This connector uses Lit-based modal components:\n * - <connect-modal> for wallet connection (configured via setupConnectModal())\n * - <account-modal> for account management (shows address, chain, disconnect)\n *\n * Current implementation status:\n * - ✅ Avatar integration (DraggableAvatar with IconView)\n * - ✅ Connection modal (Lit-based ConnectModal)\n * - ✅ Account management modal (Lit-based AccountModal)\n * - ✅ Wagmi synchronization\n *\n * The legacy ConnectorModal (vanilla JS) has been removed. The config.modal property\n * is deprecated and has no effect - use setupConnectModal() instead.\n *\n * Users can pre-place modal components in DOM for custom positioning:\n * - Place <connect-modal> or <account-modal> anywhere in your HTML\n * - The connector will find and reuse existing modals instead of creating new ones\n */\n\nimport { DraggableAvatar } from './avatar.js'\nimport './connect-modal/index.js' // Import for side-effect (registers custom element)\nimport './account-modal.js' // Import for side-effect (registers custom element)\nimport { setLuksoConfig } from '@lukso/transaction-view-headless'\nimport type { AccountModal } from './account-modal.js'\nimport type { ConnectModal, WalletConnector } from './connect-modal/index.js'\nimport {\n disconnect,\n getConnection,\n watchConnection,\n} from './connect-modal/index.js'\nimport type { ConnectionState, ConnectorConfig } from './types.js'\n\nconst DEFAULT_CONFIG: Required<\n Omit<ConnectorConfig, 'avatar' | 'modal' | 'onConnectionChange'>\n> = {\n autoConnect: false,\n persistConnection: true,\n storageKey: 'up-connector-state',\n chainId: 42, // LUKSO mainnet\n rpcUrl: 'https://rpc.lukso.network',\n}\n\nexport class UPConnector {\n private config: ConnectorConfig & typeof DEFAULT_CONFIG\n private avatar?: DraggableAvatar\n private connectModal?: ConnectModal\n private accountModal?: AccountModal\n private connectionState: ConnectionState = 'disconnected'\n private connectedAddress?: string\n private connectedProvider?: any\n private connectedChainId?: number\n private wagmiUnsubscribe?: (() => void) | null\n connectors: WalletConnector[] = []\n\n constructor(config: ConnectorConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config }\n\n // Initialize components\n this.init()\n }\n\n private async init(): Promise<void> {\n // Create avatar immediately\n await this.createAvatar()\n\n // Start watching wagmi (handles both initial state and changes)\n // This is async but non-blocking - connector works immediately\n this.startWagmiSync()\n\n // Try auto-connect if enabled (for non-wagmi connections)\n if (this.config.autoConnect && this.config.persistConnection) {\n await this.tryAutoConnect()\n }\n }\n\n /**\n * Start syncing with wagmi\n * Checks current state and subscribes to changes\n */\n /**\n * Update global Lukso config for address resolution\n */\n private updateLuksoConfig(chainId: number): void {\n try {\n if (chainId === 42) {\n // LUKSO Mainnet\n setLuksoConfig({\n chainId: 42,\n rpcUrl: 'https://rpc.lukso.network',\n })\n } else if (chainId === 4201) {\n // LUKSO Testnet\n setLuksoConfig({\n chainId: 4201,\n rpcUrl: 'https://rpc.testnet.lukso.network',\n })\n } else {\n // Other networks - default to mainnet config but with custom chainId\n setLuksoConfig({\n chainId,\n rpcUrl: this.config.rpcUrl,\n })\n }\n } catch (error) {\n console.warn('⚠️ [Connector] Failed to update Lukso config:', error)\n }\n }\n\n private async startWagmiSync(): Promise<void> {\n try {\n // Check initial state first\n const connection = await getConnection()\n\n if (!connection) {\n return\n }\n\n if (connection.status === 'connected' && connection.address) {\n this.handleConnection(\n connection.address,\n connection.connector,\n connection.chainId\n )\n }\n\n // Subscribe to wagmi connection changes\n this.wagmiUnsubscribe = await watchConnection((connection) => {\n const account = {\n isConnected: connection.status === 'connected',\n address: connection.address,\n chainId: connection.chainId,\n connector: connection.connector,\n }\n if (account.isConnected && account.address) {\n // Connected\n if (\n this.connectedAddress !== account.address ||\n this.connectedChainId !== account.chainId\n ) {\n this.handleConnection(\n account.address,\n account.connector,\n account.chainId\n )\n }\n } else {\n // Disconnected\n if (this.connectionState === 'connected') {\n this.handleDisconnection()\n }\n }\n })\n } catch (error) {\n console.warn('⚠️ [Connector] Failed to sync with wagmi:', error)\n }\n }\n\n private async createAvatar(): Promise<void> {\n this.avatar = new DraggableAvatar({\n // Default avatar options\n avatarSize: 'medium',\n initialPosition: 'top-right',\n fallbackText: '👤',\n\n // Override with user config\n ...this.config.avatar,\n\n // Connection-specific callbacks\n onClick: (event, data) => {\n // Call user-defined onClick first\n this.config.avatar?.onClick?.(event, data)\n\n // Then handle connection logic\n this.handleAvatarClick(event)\n },\n\n onAddressClick: (event) => {\n // Call user-defined callback\n this.config.avatar?.onAddressClick?.(event)\n },\n })\n\n // Update avatar connected state\n this.updateAvatarState()\n }\n\n // TODO: Replace with Lit-based account management modal\n // Legacy createModal() method removed - was using deprecated ConnectorModal\n\n private handleAvatarClick(_event: MouseEvent): void {\n if (this.connectionState === 'connected') {\n // Show account management modal\n this.showAccountModal()\n } else {\n // Show connection modal\n this.showConnectionModal()\n }\n }\n\n private showConnectionModal(): void {\n // First, check if user has placed a connect-modal in the DOM\n if (!this.connectModal) {\n this.connectModal = document.querySelector(\n 'connect-modal'\n ) as ConnectModal\n }\n\n // If still not found, create and append it\n if (!this.connectModal) {\n this.connectModal = document.createElement(\n 'connect-modal'\n ) as ConnectModal\n document.body.appendChild(this.connectModal as unknown as HTMLElement)\n\n // Handle connect event\n this.connectModal.addEventListener('connect', ((e: CustomEvent) => {\n const _connector = e.detail.connector as WalletConnector\n // TODO: Handle actual connection logic\n // For now, this will be extended when wagmi/viem integration is added\n }) as EventListener)\n\n // Handle close event\n this.connectModal.addEventListener('close', (() => {\n // Modal closed\n }) as EventListener)\n }\n\n // Modal will load connectors automatically from global setup\n // Open the modal\n this.connectModal.open = true\n }\n\n private showAccountModal(): void {\n if (!this.connectedAddress) return\n\n // First, check if user has placed an account-modal in the DOM\n if (!this.accountModal) {\n this.accountModal = document.querySelector(\n 'account-modal'\n ) as AccountModal\n }\n\n // If still not found, create and append it\n if (!this.accountModal) {\n this.accountModal = document.createElement(\n 'account-modal'\n ) as AccountModal\n document.body.appendChild(this.accountModal)\n\n // Handle disconnect event\n this.accountModal.addEventListener('disconnect', () => {\n this.handleDisconnection()\n })\n }\n\n // Set properties and open\n this.accountModal.address = this.connectedAddress\n this.accountModal.chainId = this.connectedChainId\n this.accountModal.connectorName = this.connectedProvider?.name || 'Unknown'\n this.accountModal.open = true\n }\n\n private handleConnection(\n address: string,\n provider: any,\n chainId?: number\n ): void {\n this.connectedAddress = address\n this.connectedProvider = provider\n this.connectedChainId = chainId\n this.setConnectionState('connected')\n\n // Update global Lukso config for address resolution\n if (chainId) {\n this.updateLuksoConfig(chainId)\n }\n\n // Update avatar with connected address and chainId\n if (this.avatar) {\n this.avatar.updateAddress(address, undefined, chainId)\n this.avatar.setConnected(true)\n }\n\n // Persist connection if enabled\n if (this.config.persistConnection) {\n this.saveConnectionState()\n }\n\n // Hide connection modal if open\n if (this.connectModal) {\n this.connectModal.open = false\n }\n }\n\n private async handleDisconnection(): Promise<void> {\n // Disconnect from wagmi first to ensure state is clean\n await disconnect()\n\n this.connectedAddress = undefined\n this.connectedProvider = undefined\n this.connectedChainId = undefined\n this.setConnectionState('disconnected')\n\n // Update avatar - clear address and show disconnected state\n if (this.avatar) {\n this.avatar.setConnected(false)\n // Clear the address to show fallback/disconnected state\n this.avatar.updateAddress('')\n }\n\n // Clear persisted state\n if (this.config.persistConnection) {\n this.clearConnectionState()\n }\n\n // Hide connect modal if open\n if (this.connectModal) {\n this.connectModal.open = false\n }\n }\n\n private setConnectionState(state: ConnectionState): void {\n const prevState = this.connectionState\n this.connectionState = state\n\n // Update avatar state\n this.updateAvatarState()\n\n // Notify callback\n if (prevState !== state) {\n this.config.onConnectionChange?.(state, {\n address: this.connectedAddress,\n provider: this.connectedProvider,\n chainId: this.connectedChainId,\n })\n }\n }\n\n private updateAvatarState(): void {\n if (!this.avatar) return\n\n this.avatar.setConnected(this.connectionState === 'connected')\n\n // Update avatar address and chainId if connected\n if (this.connectionState === 'connected' && this.connectedAddress) {\n this.avatar.updateAddress(\n this.connectedAddress,\n undefined,\n this.connectedChainId\n )\n }\n }\n\n private async tryAutoConnect(): Promise<void> {\n const savedState = this.loadConnectionState()\n if (!savedState?.address) return\n\n this.setConnectionState('connecting')\n\n try {\n // Try to reconnect using saved provider info\n // This would typically involve checking if the provider is still available\n // and attempting to reconnect\n\n // For now, simulate auto-connection\n setTimeout(() => {\n if (savedState.address) {\n this.handleConnection(savedState.address, savedState.provider)\n } else {\n this.setConnectionState('disconnected')\n }\n }, 1000)\n } catch (error) {\n console.warn('Auto-connect failed:', error)\n this.setConnectionState('disconnected')\n }\n }\n\n private saveConnectionState(): void {\n if (typeof localStorage === 'undefined') return\n\n try {\n const state = {\n address: this.connectedAddress,\n provider: this.connectedProvider?.constructor?.name,\n timestamp: Date.now(),\n }\n localStorage.setItem(this.config.storageKey, JSON.stringify(state))\n } catch (error) {\n console.warn('Failed to save connection state:', error)\n }\n }\n\n private loadConnectionState(): any {\n if (typeof localStorage === 'undefined') return null\n\n try {\n const saved = localStorage.getItem(this.config.storageKey)\n if (!saved) return null\n\n const state = JSON.parse(saved)\n\n // Check if state is not too old (24 hours)\n const maxAge = 24 * 60 * 60 * 1000\n if (Date.now() - state.timestamp > maxAge) {\n this.clearConnectionState()\n return null\n }\n\n return state\n } catch (error) {\n console.warn('Failed to load connection state:', error)\n return null\n }\n }\n\n private clearConnectionState(): void {\n if (typeof localStorage === 'undefined') return\n\n try {\n localStorage.removeItem(this.config.storageKey)\n } catch (error) {\n console.warn('Failed to clear connection state:', error)\n }\n }\n\n // Public API\n public getAvatar(): DraggableAvatar | undefined {\n return this.avatar\n }\n\n /**\n * @deprecated Legacy modal removed. Use getConnectModal() or create account modal\n */\n public getModal(): undefined {\n console.warn('getModal() is deprecated - legacy ConnectorModal removed')\n return undefined\n }\n\n public getConnectModal(): ConnectModal | undefined {\n return this.connectModal\n }\n\n /**\n * @deprecated Use setupConnectModal() instead to configure wagmi connectors globally\n */\n public setConnectors(connectors: WalletConnector[]): void {\n this.connectors = connectors\n // Note: The ConnectModal now loads connectors automatically from global setup\n // Use setupConnectModal() to configure wagmi integration\n console.warn(\n 'setConnectors() is deprecated. Use setupConnectModal() instead.'\n )\n }\n\n public async connect(providerId?: string): Promise<void> {\n this.setConnectionState('connecting')\n\n if (providerId) {\n // Connect to specific provider\n // This would be implemented based on available providers\n } else {\n // Show connection modal\n this.showConnectionModal()\n }\n }\n\n public disconnect(): void {\n this.handleDisconnection()\n }\n\n public getConnectionState(): ConnectionState {\n return this.connectionState\n }\n\n public getConnectedAddress(): string | undefined {\n return this.connectedAddress\n }\n\n public getConnectedProvider(): any {\n return this.connectedProvider\n }\n\n public isConnected(): boolean {\n return this.connectionState === 'connected'\n }\n\n public showModal(): void {\n if (this.isConnected()) {\n this.showAccountModal()\n } else {\n this.showConnectionModal()\n }\n }\n\n public hideModal(): void {\n if (this.connectModal) {\n this.connectModal.open = false\n }\n }\n\n public updateConfig(config: Partial<ConnectorConfig>): void {\n this.config = { ...this.config, ...config }\n\n // Update avatar if config changed\n if (config.avatar && this.avatar) {\n // This would require implementing avatar config updates\n }\n }\n\n public destroy(): void {\n // Unsubscribe from wagmi changes\n if (this.wagmiUnsubscribe) {\n this.wagmiUnsubscribe()\n this.wagmiUnsubscribe = undefined\n }\n\n this.avatar?.destroy()\n\n // Clean up connect modal\n if (this.connectModal) {\n this.connectModal.open = false\n if (this.connectModal.parentNode) {\n this.connectModal.parentNode.removeChild(this.connectModal)\n }\n }\n\n this.avatar = undefined\n this.connectModal = undefined\n this.connectedAddress = undefined\n this.connectedProvider = undefined\n this.connectionState = 'disconnected'\n }\n}\n\n/**\n * Factory function for creating UP Connector instances\n */\nexport function createConnector(config: ConnectorConfig = {}): UPConnector {\n return new UPConnector(config)\n}\n\nexport default UPConnector\n","/**\n * Enhanced Popup System for UP Connector\n * Provides unified interface for both popup windows and modal dialogs\n */\n\nexport interface PopupRequest {\n mode: 'popup' | 'modal' // popup = window.open, modal = iframe in modal\n url?: string // If present = external, if not = local content\n size?: { width: number; height: number }\n position?: 'center' | 'top-right'\n allowedOrigins?: string[] // Security for message passing\n reuseExisting?: boolean // Whether to reuse existing popups (default: true)\n}\n\nexport interface PopupInstance {\n // Lifecycle Management\n show(): Promise<void> // Show the popup/modal - async for consistency\n hide(): void // Hide but preserve state\n close(): void // Actually destroy\n\n // Message Passing\n postMessage(data: any): void // Send to popup/iframe\n onMessage(handler: (data: any) => void): void // Receive from popup/iframe\n removeMessageHandler(handler: (data: any) => void): void // Remove handler\n\n // State Queries\n isVisible: boolean // Whether currently visible\n isClosed: boolean // Whether destroyed\n contentWindow?: Window // For advanced use\n\n // Events\n on(\n event: 'show' | 'hide' | 'close' | 'message',\n handler: (...args: any[]) => void\n ): void\n off(\n event: 'show' | 'hide' | 'close' | 'message',\n handler: (...args: any[]) => void\n ): void\n}\n\nexport interface UIDelegate {\n createPopup(request: PopupRequest): PopupInstance\n showPopup(request: PopupRequest): Promise<PopupInstance>\n closeAll(): void\n}\n\n// Internal event emitter for popup instances\nclass PopupEventEmitter {\n private handlers = new Map<string, Set<(...args: any[]) => void>>()\n\n on(event: string, handler: (...args: any[]) => void): void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set())\n }\n this.handlers.get(event)?.add(handler)\n }\n\n off(event: string, handler: (...args: any[]) => void): void {\n this.handlers.get(event)?.delete(handler)\n }\n\n emit(event: string, ...args: any[]): void {\n this.handlers.get(event)?.forEach((handler) => {\n try {\n handler(...args)\n } catch (error) {\n console.error('Error in popup event handler:', error)\n }\n })\n }\n\n clear(): void {\n this.handlers.clear()\n }\n}\n\n/**\n * Base class for popup instances\n */\nabstract class BasePopupInstance implements PopupInstance {\n protected events = new PopupEventEmitter()\n protected messageHandlers = new Set<(data: any) => void>()\n protected _isClosed = false\n protected _isVisible = false\n\n constructor(protected request: PopupRequest) {}\n\n abstract show(): Promise<void>\n abstract hide(): void\n abstract close(): void\n abstract get contentWindow(): Window | undefined\n\n get isVisible(): boolean {\n return this._isVisible && !this._isClosed\n }\n get isClosed(): boolean {\n return this._isClosed\n }\n\n postMessage(data: any): void {\n if (!this._isClosed && this.contentWindow) {\n try {\n this.contentWindow.postMessage(data, '*')\n } catch (error) {\n console.error('Failed to post message to popup:', error)\n }\n }\n }\n\n onMessage(handler: (data: any) => void): void {\n this.messageHandlers.add(handler)\n }\n\n removeMessageHandler(handler: (data: any) => void): void {\n this.messageHandlers.delete(handler)\n }\n\n protected handleMessage(data: any): void {\n this.messageHandlers.forEach((handler) => {\n try {\n handler(data)\n } catch (error) {\n console.error('Error in popup message handler:', error)\n }\n })\n this.events.emit('message', data)\n }\n\n on(\n event: 'show' | 'hide' | 'close' | 'message',\n handler: (...args: any[]) => void\n ): void {\n this.events.on(event, handler)\n }\n\n off(\n event: 'show' | 'hide' | 'close' | 'message',\n handler: (...args: any[]) => void\n ): void {\n this.events.off(event, handler)\n }\n\n protected cleanup(): void {\n this.messageHandlers.clear()\n this.events.clear()\n }\n}\n\n/**\n * Modal popup implementation (iframe in modal dialog)\n */\nexport class ModalPopupInstance extends BasePopupInstance {\n private modalElement?: HTMLDivElement\n private iframeElement?: HTMLIFrameElement\n private messageListener?: (event: MessageEvent) => void\n\n async show(): Promise<void> {\n if (this._isClosed) {\n throw new Error('Popup is closed')\n }\n\n if (!this.modalElement) {\n await this.createElement()\n }\n\n return new Promise((resolve) => {\n if (!this.modalElement) {\n resolve()\n return\n }\n\n // Add to DOM if not already present\n if (!this.modalElement.parentNode) {\n document.body.appendChild(this.modalElement)\n }\n\n this._isVisible = true\n\n // Force reflow before adding visible class\n this.modalElement.offsetHeight\n this.modalElement.classList.add('visible')\n\n this.events.emit('show')\n\n // Wait for animation\n setTimeout(() => resolve(), 50)\n })\n }\n\n hide(): void {\n if (!this._isVisible || this._isClosed || !this.modalElement) return\n\n this._isVisible = false\n this.modalElement.classList.remove('visible')\n this.events.emit('hide')\n\n // Remove from DOM after animation\n setTimeout(() => {\n if (this.modalElement?.parentNode) {\n this.modalElement.parentNode.removeChild(this.modalElement)\n }\n }, 300)\n }\n\n close(): void {\n if (this._isClosed) return\n\n this._isClosed = true\n this._isVisible = false\n\n if (this.modalElement) {\n this.modalElement.classList.remove('visible')\n setTimeout(() => {\n if (this.modalElement?.parentNode) {\n this.modalElement.parentNode.removeChild(this.modalElement)\n }\n }, 300)\n }\n\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener)\n }\n\n this.events.emit('close')\n this.cleanup()\n }\n\n get contentWindow(): Window | undefined {\n return this.iframeElement?.contentWindow || undefined\n }\n\n private async createElement(): Promise<void> {\n if (typeof document === 'undefined') return\n\n await this.createStyles()\n\n // Create modal structure\n this.modalElement = document.createElement('div')\n this.modalElement.className = 'up-popup-modal'\n\n const { width = 480, height = 640 } = this.request.size || {}\n\n this.modalElement.innerHTML = `\n <div class=\"up-popup-modal-content\" style=\"width: ${width}px; height: ${height}px;\">\n <button class=\"up-popup-close\" type=\"button\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n <iframe src=\"${this.request.url || 'about:blank'}\" allow=\"publickey-credentials-get; publickey-credentials-create\"></iframe>\n </div>\n `\n\n // Get references\n const closeButton = this.modalElement.querySelector(\n '.up-popup-close'\n ) as HTMLButtonElement\n this.iframeElement = this.modalElement.querySelector(\n 'iframe'\n ) as HTMLIFrameElement\n\n // Event listeners\n closeButton.addEventListener('click', () => this.hide())\n\n this.modalElement.addEventListener('click', (e) => {\n if (e.target === this.modalElement) {\n this.hide()\n }\n })\n\n // Message handling\n this.messageListener = (event: MessageEvent) => {\n // Only handle messages from our iframe\n if (event.source === this.iframeElement?.contentWindow) {\n this.handleMessage(event.data)\n }\n }\n window.addEventListener('message', this.messageListener)\n }\n\n private async createStyles(): Promise<void> {\n if (typeof document === 'undefined') return\n\n if (document.querySelector('#up-popup-modal-styles')) return\n\n const style = document.createElement('style')\n style.id = 'up-popup-modal-styles'\n style.textContent = `\n .up-popup-modal {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(8px);\n z-index: 10000;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n visibility: hidden;\n transition: all 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n padding: 16px;\n }\n\n .up-popup-modal.visible {\n opacity: 1;\n visibility: visible;\n }\n\n .up-popup-modal-content {\n background: white;\n border-radius: 12px;\n overflow: hidden;\n position: relative;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n transform: scale(0.95) translateY(20px);\n transition: all 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n }\n\n .up-popup-modal.visible .up-popup-modal-content {\n transform: scale(1) translateY(0);\n }\n\n .up-popup-close {\n position: absolute;\n top: 12px;\n right: 12px;\n z-index: 10;\n background: rgba(255, 255, 255, 0.9);\n border: none;\n border-radius: 50%;\n width: 32px;\n height: 32px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #6b7280;\n transition: all 0.2s ease;\n }\n\n .up-popup-close:hover {\n background: rgba(255, 255, 255, 1);\n color: #374151;\n }\n\n .up-popup-modal iframe {\n width: 100%;\n height: 100%;\n border: none;\n border-radius: 12px;\n }\n\n @media (max-width: 640px) {\n .up-popup-modal {\n padding: 0;\n align-items: flex-end;\n }\n\n .up-popup-modal-content {\n width: 100% !important;\n height: 85vh !important;\n border-radius: 12px 12px 0 0;\n transform: translateY(100%);\n }\n\n .up-popup-modal.visible .up-popup-modal-content {\n transform: translateY(0);\n }\n\n .up-popup-modal iframe {\n border-radius: 12px 12px 0 0;\n }\n }\n\n @media (max-width: 480px) {\n .up-popup-modal {\n align-items: stretch;\n }\n\n .up-popup-modal-content {\n height: 100vh !important;\n border-radius: 0;\n }\n\n .up-popup-modal iframe {\n border-radius: 0;\n }\n }\n `\n document.head.appendChild(style)\n }\n}\n\n/**\n * Window popup implementation (actual popup window)\n */\nexport class WindowPopupInstance extends BasePopupInstance {\n private popupWindow: Window | null = null\n private messageListener?: (event: MessageEvent) => void\n\n async show(): Promise<void> {\n if (this._isClosed) {\n throw new Error('Popup is closed')\n }\n\n if (!this.popupWindow || this.popupWindow.closed) {\n await this.createPopupWindow()\n }\n\n if (this.popupWindow && !this.popupWindow.closed) {\n this.popupWindow.focus()\n this._isVisible = true\n this.events.emit('show')\n }\n }\n\n hide(): void {\n // For popup windows, hide typically means minimize or move to background\n // Since we can't directly minimize, we just blur it\n if (this.popupWindow && !this.popupWindow.closed) {\n this.popupWindow.blur()\n }\n this._isVisible = false\n this.events.emit('hide')\n }\n\n close(): void {\n if (this._isClosed) return\n\n this._isClosed = true\n this._isVisible = false\n\n if (this.popupWindow && !this.popupWindow.closed) {\n this.popupWindow.close()\n }\n this.popupWindow = null\n\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener)\n }\n\n this.events.emit('close')\n this.cleanup()\n }\n\n get contentWindow(): Window | undefined {\n return this.popupWindow && !this.popupWindow.closed\n ? this.popupWindow\n : undefined\n }\n\n get isVisible(): boolean {\n return !this._isClosed && !!(this.popupWindow && !this.popupWindow.closed)\n }\n\n private async createPopupWindow(): Promise<void> {\n if (!this.request.url) {\n throw new Error('URL required for popup windows')\n }\n\n const { width = 400, height = 600 } = this.request.size || {}\n const position = this.request.position || 'center'\n const features = [\n `width=${width}`,\n `height=${height}`,\n ...this.getPositionFeatures(position, width, height),\n 'scrollbars=yes',\n 'resizable=yes',\n 'status=no',\n 'location=no',\n 'toolbar=no',\n 'menubar=no',\n ].join(',')\n\n this.popupWindow = window.open(this.request.url, '_blank', features)\n\n if (!this.popupWindow) {\n throw new Error('Popup blocked or failed to open')\n }\n\n // Setup message listener\n this.messageListener = (event: MessageEvent) => {\n if (event.source === this.popupWindow) {\n this.handleMessage(event.data)\n }\n }\n window.addEventListener('message', this.messageListener)\n\n // Monitor popup close\n const checkClosed = () => {\n if (this.popupWindow?.closed && !this._isClosed) {\n this.close()\n } else if (!this._isClosed) {\n setTimeout(checkClosed, 1000)\n }\n }\n setTimeout(checkClosed, 1000)\n }\n\n private getPositionFeatures(\n position: string,\n width: number,\n height: number\n ): string[] {\n const screenLeft =\n window.screenLeft !== undefined ? window.screenLeft : window.screenX\n const screenTop =\n window.screenTop !== undefined ? window.screenTop : window.screenY\n const windowWidth =\n window.innerWidth || document.documentElement.clientWidth || screen.width\n const windowHeight =\n window.innerHeight ||\n document.documentElement.clientHeight ||\n screen.height\n\n let left: number\n let top: number\n\n switch (position) {\n case 'top-right':\n left = screenLeft + windowWidth - width - 20\n top = screenTop + 20\n break\n default:\n left = screenLeft + (windowWidth - width) / 2\n top = screenTop + (windowHeight - height) / 2\n break\n }\n\n return [`left=${Math.max(0, left)}`, `top=${Math.max(0, top)}`]\n }\n}\n"],"mappings":"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","names":["connection"]}
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkIAKQFHFDcjs = require('./chunk-IAKQFHFD.cjs');
4
- require('./chunk-XOKG3KIL.cjs');
3
+ var _chunkE34NRQRAcjs = require('./chunk-E34NRQRA.cjs');
4
+ require('./chunk-ZWXGWUXQ.cjs');
5
5
  require('./chunk-ZBDE64SD.cjs');
6
6
 
7
7
 
8
- exports.RestoreModal = _chunkIAKQFHFDcjs.RestoreModal;
8
+ exports.RestoreModal = _chunkE34NRQRAcjs.RestoreModal;
9
9
  //# sourceMappingURL=restore-modal.cjs.map
@@ -14,11 +14,11 @@ declare class RestoreModal extends CoreLitElement {
14
14
  private password;
15
15
  private passwordErrors;
16
16
  private isRestoring;
17
- private walletData;
18
17
  private validationWarnings;
19
- private validationInfo;
20
18
  private controllers;
21
19
  private restoredAddresses;
20
+ validationInfo: string[];
21
+ walletData: WalletData | null;
22
22
  /**
23
23
  * Public method for parent to set preview result
24
24
  * Called after parent handles the 'preview' event
@@ -14,11 +14,11 @@ declare class RestoreModal extends CoreLitElement {
14
14
  private password;
15
15
  private passwordErrors;
16
16
  private isRestoring;
17
- private walletData;
18
17
  private validationWarnings;
19
- private validationInfo;
20
18
  private controllers;
21
19
  private restoredAddresses;
20
+ validationInfo: string[];
21
+ walletData: WalletData | null;
22
22
  /**
23
23
  * Public method for parent to set preview result
24
24
  * Called after parent handles the 'preview' event
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  RestoreModal
3
- } from "./chunk-3SGSPHOZ.js";
4
- import "./chunk-XGIT7YUY.js";
3
+ } from "./chunk-RCCGJ3DC.js";
4
+ import "./chunk-UPWE4L5Z.js";
5
5
  import "./chunk-EUXUH3YW.js";
6
6
  export {
7
7
  RestoreModal
@@ -264,29 +264,14 @@ declare global {
264
264
  declare const ConnectModal_base: any;
265
265
  declare class ConnectModal extends ConnectModal_base {
266
266
  open: boolean;
267
- theme: ConnectModalTheme;
268
267
  private connectors;
269
- private isDark;
270
268
  private modalView;
271
269
  private qrCodeData;
272
- private mediaQueryList;
273
270
  updated(changedProperties: Map<string, any>): void;
274
- connectedCallback(): void;
275
- disconnectedCallback(): void;
276
- /**
277
- * Handle system theme changes
278
- *
279
- * @param event
280
- */
281
- private handleMediaQueryChange;
282
271
  /**
283
272
  * Close modal
284
273
  */
285
274
  handleClose(): void;
286
- /**
287
- * Update isDark state based on theme property
288
- */
289
- private updateTheme;
290
275
  private loadConnectors;
291
276
  /**
292
277
  * Successful connection handler
@@ -264,29 +264,14 @@ declare global {
264
264
  declare const ConnectModal_base: any;
265
265
  declare class ConnectModal extends ConnectModal_base {
266
266
  open: boolean;
267
- theme: ConnectModalTheme;
268
267
  private connectors;
269
- private isDark;
270
268
  private modalView;
271
269
  private qrCodeData;
272
- private mediaQueryList;
273
270
  updated(changedProperties: Map<string, any>): void;
274
- connectedCallback(): void;
275
- disconnectedCallback(): void;
276
- /**
277
- * Handle system theme changes
278
- *
279
- * @param event
280
- */
281
- private handleMediaQueryChange;
282
271
  /**
283
272
  * Close modal
284
273
  */
285
274
  handleClose(): void;
286
- /**
287
- * Update isDark state based on theme property
288
- */
289
- private updateTheme;
290
275
  private loadConnectors;
291
276
  /**
292
277
  * Successful connection handler
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lukso/up-connector",
3
- "version": "0.6.0",
3
+ "version": "0.7.0-dev.360c7b1",
4
4
  "description": "Universal Profile connector with draggable avatar and connection modal",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -76,16 +76,16 @@
76
76
  },
77
77
  "dependencies": {
78
78
  "@lit/task": "^1.0.3",
79
- "@lukso/up-provider": "npm:@lukso-network/up-provider@0.3.5-main.c50af46",
79
+ "@lukso/up-provider": "0.3.7",
80
80
  "@lukso/web-components": "^1.171.2",
81
81
  "debug": "^4.4.3",
82
82
  "lit": "^3.3.1",
83
83
  "ws": "^8.18.3",
84
84
  "zxcvbn": "^4.4.2",
85
- "@lukso/core": "1.1.0",
86
- "@lukso/passkey-auth": "1.2.0",
87
- "@lukso/transaction-view-core": "0.5.0",
88
- "@lukso/transaction-view-headless": "0.4.0"
85
+ "@lukso/core": "1.2.0-dev.360c7b1",
86
+ "@lukso/passkey-auth": "1.2.1-dev.360c7b1",
87
+ "@lukso/transaction-view-core": "0.6.0-dev.360c7b1",
88
+ "@lukso/transaction-view-headless": "0.4.1-dev.360c7b1"
89
89
  },
90
90
  "peerDependencies": {
91
91
  "@wagmi/connectors": "^7.0.0",
@@ -154,6 +154,6 @@
154
154
  "deploy:prepare": "./deploy.sh",
155
155
  "test": "vitest",
156
156
  "test:run": "vitest run",
157
- "check": "tsc --noEmit"
157
+ "typecheck": "tsc --noEmit"
158
158
  }
159
159
  }
package/src/auto-setup.ts CHANGED
@@ -8,7 +8,6 @@
8
8
  */
9
9
 
10
10
  import type { Config } from '@wagmi/core'
11
- import type { ConnectModalSetup } from './connect-modal/index.js'
12
11
  import { setupConnectModal } from './connect-modal/index.js'
13
12
 
14
13
  /**
package/src/avatar.ts CHANGED
@@ -129,7 +129,6 @@ export class DraggableAvatar {
129
129
 
130
130
  // Animation state
131
131
  private isThrobbing = false
132
- private throbAnimation?: Animation
133
132
 
134
133
  constructor(options: AvatarOptions = {}) {
135
134
  this.options = { ...DEFAULT_AVATAR_OPTIONS, ...options }
@@ -212,7 +211,7 @@ export class DraggableAvatar {
212
211
 
213
212
  // Calculate sizes before template literal
214
213
  const avatarPixelSize = this.getPixelSize(this.options.avatarSize)
215
- const overhang = this.getIdenticonOverhang(this.options.avatarSize)
214
+ const _overhang = this.getIdenticonOverhang(this.options.avatarSize)
216
215
 
217
216
  // Debug: Log our calculations
218
217
 
@@ -620,9 +619,7 @@ export class DraggableAvatar {
620
619
  let minDistance = Infinity
621
620
 
622
621
  positions.forEach((pos) => {
623
- const distance = Math.sqrt(
624
- Math.pow(x - pos.x, 2) + Math.pow(y - pos.y, 2)
625
- )
622
+ const distance = Math.sqrt((x - pos.x) ** 2 + (y - pos.y) ** 2)
626
623
  if (distance < minDistance) {
627
624
  minDistance = distance
628
625
  closest = pos
@@ -652,19 +649,19 @@ export class DraggableAvatar {
652
649
  this.element.classList.add('hidden-left')
653
650
  this.element.style.left = `-${this.options.hideOffset}px`
654
651
  this.element.style.right = 'auto'
655
- this.element.style.top = position.y + 'px'
652
+ this.element.style.top = `${position.y}px`
656
653
  this.options.onHide?.()
657
654
  } else if (position.side === 'right') {
658
655
  this.element.classList.add('hidden-right')
659
656
  this.element.style.right = `-${this.options.hideOffset}px`
660
657
  this.element.style.left = 'auto'
661
- this.element.style.top = position.y + 'px'
658
+ this.element.style.top = `${position.y}px`
662
659
  this.options.onHide?.()
663
660
  }
664
661
  } else {
665
- this.element.style.left = position.x + 'px'
662
+ this.element.style.left = `${position.x}px`
666
663
  this.element.style.right = 'auto'
667
- this.element.style.top = position.y + 'px'
664
+ this.element.style.top = `${position.y}px`
668
665
  if (this.isHidden) {
669
666
  this.options.onShow?.()
670
667
  }
@@ -683,8 +680,8 @@ export class DraggableAvatar {
683
680
  if (!this.snapPreviews.has(pos.name)) {
684
681
  const preview = document.createElement('div')
685
682
  preview.className = 'up-avatar-preview'
686
- preview.style.left = pos.x + 'px'
687
- preview.style.top = pos.y + 'px'
683
+ preview.style.left = `${pos.x}px`
684
+ preview.style.top = `${pos.y}px`
688
685
  this.overlay.appendChild(preview)
689
686
  this.snapPreviews.set(pos.name, preview)
690
687
  }
@@ -698,7 +695,7 @@ export class DraggableAvatar {
698
695
  if (typeof document === 'undefined') return
699
696
 
700
697
  // Determine the active position key
701
- let activeKey = activePosition.name
698
+ const activeKey = activePosition.name
702
699
 
703
700
  // Update all previews
704
701
  this.snapPreviews.forEach((preview, key) => {
@@ -711,16 +708,16 @@ export class DraggableAvatar {
711
708
  if (activePosition.side === 'left') {
712
709
  preview.style.left = `-${this.options.hideOffset}px`
713
710
  preview.style.right = 'auto'
714
- preview.style.top = activePosition.y + 'px'
711
+ preview.style.top = `${activePosition.y}px`
715
712
  } else if (activePosition.side === 'right') {
716
713
  preview.style.right = `-${this.options.hideOffset}px`
717
714
  preview.style.left = 'auto'
718
- preview.style.top = activePosition.y + 'px'
715
+ preview.style.top = `${activePosition.y}px`
719
716
  }
720
717
  } else {
721
- preview.style.left = activePosition.x + 'px'
718
+ preview.style.left = `${activePosition.x}px`
722
719
  preview.style.right = 'auto'
723
- preview.style.top = activePosition.y + 'px'
720
+ preview.style.top = `${activePosition.y}px`
724
721
  }
725
722
  } else {
726
723
  // Dim the others
@@ -729,9 +726,9 @@ export class DraggableAvatar {
729
726
  // Reset to normal position (not hidden)
730
727
  const pos = this.getSnapPositions().find((p) => p.name === key)
731
728
  if (pos) {
732
- preview.style.left = pos.x + 'px'
729
+ preview.style.left = `${pos.x}px`
733
730
  preview.style.right = 'auto'
734
- preview.style.top = pos.y + 'px'
731
+ preview.style.top = `${pos.y}px`
735
732
  }
736
733
  }
737
734
  })
@@ -786,9 +783,9 @@ export class DraggableAvatar {
786
783
 
787
784
  // Always update position while dragging (for visual feedback)
788
785
  this.element.className = 'up-avatar dragging'
789
- this.element.style.left = currentX + 'px'
786
+ this.element.style.left = `${currentX}px`
790
787
  this.element.style.right = 'auto'
791
- this.element.style.top = currentY + 'px'
788
+ this.element.style.top = `${currentY}px`
792
789
 
793
790
  const closestPosition = this.findClosestSnapPosition(currentX, currentY)
794
791
  const shouldHideLeft = currentX < -this.options.hideThreshold
@@ -877,9 +874,9 @@ export class DraggableAvatar {
877
874
 
878
875
  // Always update position while dragging (for visual feedback)
879
876
  this.element.className = 'up-avatar dragging'
880
- this.element.style.left = currentX + 'px'
877
+ this.element.style.left = `${currentX}px`
881
878
  this.element.style.right = 'auto'
882
- this.element.style.top = currentY + 'px'
879
+ this.element.style.top = `${currentY}px`
883
880
 
884
881
  const closestPosition = this.findClosestSnapPosition(currentX, currentY)
885
882
  const shouldHideLeft = currentX < -this.options.hideThreshold
@@ -952,7 +949,7 @@ export class DraggableAvatar {
952
949
  if (this.currentPosition) {
953
950
  const positions = this.getSnapPositions()
954
951
  const newPosition =
955
- positions.find((p) => p.name === this.currentPosition!.name) ||
952
+ positions.find((p) => p.name === this.currentPosition?.name) ||
956
953
  positions[0]
957
954
  this.snapToPosition(newPosition, this.isHidden)
958
955
  }
@@ -171,7 +171,9 @@ export class BackupModal extends CoreLitElement {
171
171
  label="Password"
172
172
  placeholder="Enter a strong password"
173
173
  .value=${this.password}
174
- @on-input=${(e: CustomEvent) => (this.password = e.detail.value)}
174
+ @on-input=${(e: CustomEvent) => {
175
+ this.password = e.detail.value
176
+ }}
175
177
  is-full-width
176
178
  autofocus
177
179
  ></lukso-input>
@@ -216,7 +218,9 @@ export class BackupModal extends CoreLitElement {
216
218
  label="Confirm Password"
217
219
  placeholder="Re-enter your password"
218
220
  .value=${this.passwordConfirm}
219
- @on-input=${(e: CustomEvent) => (this.passwordConfirm = e.detail.value)}
221
+ @on-input=${(e: CustomEvent) => {
222
+ this.passwordConfirm = e.detail.value
223
+ }}
220
224
  is-full-width
221
225
  ></lukso-input>
222
226