@lukso/up-connector 0.8.3 → 0.8.5-dev.2df3eae
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.
- package/dist/account-modal.cjs +3 -3
- package/dist/account-modal.js +2 -2
- package/dist/auto-setup.cjs +2 -3
- package/dist/auto-setup.cjs.map +1 -1
- package/dist/auto-setup.d.cts +1 -1
- package/dist/auto-setup.d.ts +1 -1
- package/dist/auto-setup.js +1 -2
- package/dist/backup-modal.cjs +3 -3
- package/dist/backup-modal.js +2 -2
- package/dist/chunk-3AIZSSEE.cjs +31 -0
- package/dist/chunk-3AIZSSEE.cjs.map +1 -0
- package/dist/{chunk-6W7FRKLF.js → chunk-43E6AVSP.js} +5 -4
- package/dist/chunk-43E6AVSP.js.map +1 -0
- package/dist/{chunk-4E7SPZWU.js → chunk-D7RI2CWB.js} +5 -4
- package/dist/chunk-D7RI2CWB.js.map +1 -0
- package/dist/{chunk-BLDF6KQ6.js → chunk-LXK6OUTM.js} +4 -7
- package/dist/chunk-LXK6OUTM.js.map +1 -0
- package/dist/{chunk-KSO3XK5R.cjs → chunk-PHRCQCEN.cjs} +5 -4
- package/dist/chunk-PHRCQCEN.cjs.map +1 -0
- package/dist/{chunk-2HIZGOPY.cjs → chunk-PPONAIJF.cjs} +5 -8
- package/dist/chunk-PPONAIJF.cjs.map +1 -0
- package/dist/{chunk-ODKUPDLA.cjs → chunk-UJDGQG6P.cjs} +5 -4
- package/dist/chunk-UJDGQG6P.cjs.map +1 -0
- package/dist/{chunk-2GXVRHI5.cjs → chunk-XCX7QWLC.cjs} +5 -4
- package/dist/chunk-XCX7QWLC.cjs.map +1 -0
- package/dist/chunk-XEZEZ62E.js +31 -0
- package/dist/chunk-XEZEZ62E.js.map +1 -0
- package/dist/{chunk-HYTGLJAK.js → chunk-XKSB6TPG.js} +5 -4
- package/dist/chunk-XKSB6TPG.js.map +1 -0
- package/dist/index.cjs +21 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +29 -19
- package/dist/index.js.map +1 -1
- package/dist/restore-modal.cjs +3 -3
- package/dist/restore-modal.js +2 -2
- package/package.json +13 -18
- package/src/account-modal.ts +3 -2
- package/src/auto-setup.ts +3 -2
- package/src/backup-modal.ts +3 -2
- package/src/connector.ts +7 -4
- package/src/index.ts +19 -19
- package/src/restore-modal.ts +3 -2
- package/dist/chunk-2GXVRHI5.cjs.map +0 -1
- package/dist/chunk-2HIZGOPY.cjs.map +0 -1
- package/dist/chunk-4E7SPZWU.js.map +0 -1
- package/dist/chunk-6W7FRKLF.js.map +0 -1
- package/dist/chunk-AE2OVY26.js +0 -1186
- package/dist/chunk-AE2OVY26.js.map +0 -1
- package/dist/chunk-BLDF6KQ6.js.map +0 -1
- package/dist/chunk-GUAUME2K.js +0 -31
- package/dist/chunk-GUAUME2K.js.map +0 -1
- package/dist/chunk-HYTGLJAK.js.map +0 -1
- package/dist/chunk-IBS6LDIM.cjs +0 -31
- package/dist/chunk-IBS6LDIM.cjs.map +0 -1
- package/dist/chunk-KSO3XK5R.cjs.map +0 -1
- package/dist/chunk-ODKUPDLA.cjs.map +0 -1
- package/dist/chunk-R4L3CREG.cjs +0 -1186
- package/dist/chunk-R4L3CREG.cjs.map +0 -1
- package/dist/connect-modal/index.cjs +0 -22
- package/dist/connect-modal/index.cjs.map +0 -1
- package/dist/connect-modal/index.d.cts +0 -3
- package/dist/connect-modal/index.d.ts +0 -3
- package/dist/connect-modal/index.js +0 -22
- package/dist/connect-modal/index.js.map +0 -1
- package/dist/index-DZolGZOk.d.cts +0 -413
- package/dist/index-DZolGZOk.d.ts +0 -413
- package/src/connect-modal/components/connection-view.ts +0 -418
- package/src/connect-modal/components/eoa-connection-view.ts +0 -418
- package/src/connect-modal/components/qr-code-view.ts +0 -86
- package/src/connect-modal/connect-modal.base.ts +0 -18
- package/src/connect-modal/connect-modal.config.ts +0 -27
- package/src/connect-modal/connect-modal.templates.ts +0 -22
- package/src/connect-modal/connect-modal.ts +0 -227
- package/src/connect-modal/connect-modal.types.ts +0 -108
- package/src/connect-modal/images/up-cube-glass.png +0 -0
- package/src/connect-modal/index.ts +0 -25
- package/src/connect-modal/services/wagmi.ts +0 -377
- package/src/connect-modal/styles/styles.css +0 -1
- package/src/connect-modal/utils/chainParams.ts +0 -32
- package/src/connect-modal/utils/walletConnectDeepLinkUrl.ts +0 -43
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 { 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
|
+
{"version":3,"sources":["../src/index.ts","../src/connector.ts","../src/popup-instance.ts"],"sourcesContent":["/**\n * @lukso/up-connector\n * Universal Profile connector with draggable avatar and connection modal\n */\n\n// Wagmi Adapter\nexport {\n fromWagmiConnector,\n fromWagmiConnectors,\n} from '@lukso/up-modal'\nexport type {\n ConnectionModalView,\n ConnectModalSetup,\n ConnectModalTheme,\n WagmiConnection,\n WagmiConnector,\n WalletConnector,\n} from '@lukso/up-modal/connect-modal'\nexport {\n ConnectModal,\n disconnect,\n getConnection,\n getWagmiSetup,\n setupConnectModal,\n wagmi,\n watchConnection,\n} from '@lukso/up-modal/connect-modal'\n// Backup & Restore Modals (Lit Components)\nexport { AccountModal } from './account-modal.js'\n// Auto-setup for LUKSO products\nexport type { LuksoConnectorConfig } from './auto-setup.js'\nexport {\n EMBEDDED_WALLET_ID,\n EMBEDDED_WALLET_URL_DEV,\n EMBEDDED_WALLET_URL_PROD,\n setupLuksoConnector,\n UP_EXTENSION_ID,\n} from './auto-setup.js'\nexport { createAvatar, DraggableAvatar } from './avatar.js'\nexport { BackupModal } from './backup-modal.js'\n// Main exports\n// Default export\nexport {\n createConnector,\n createConnector as default,\n UPConnector,\n} from './connector.js'\n// Enhanced popup system\nexport {\n ModalPopupInstance,\n WindowPopupInstance,\n} from './popup-instance.js'\nexport { RestoreModal } from './restore-modal.js'\n// Types\nexport type {\n AddressData,\n AvatarOptions,\n ConnectionState,\n ConnectorConfig,\n PopupInstance,\n PopupRequest,\n UIDelegate,\n WalletProvider,\n} from './types.js'\n// Release update\n// build 2\n","/**\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 '@lukso/up-modal/connect-modal' // 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 {\n ConnectModal,\n WalletConnector,\n} from '@lukso/up-modal/connect-modal'\nimport {\n disconnect,\n getConnection,\n watchConnection,\n} from '@lukso/up-modal/connect-modal'\nimport type { AccountModal } from './account-modal.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":["disconnect","getConnection","watchConnection","connection"]}
|
package/dist/restore-modal.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
3
|
+
var _chunkPHRCQCENcjs = require('./chunk-PHRCQCEN.cjs');
|
|
4
|
+
require('./chunk-3AIZSSEE.cjs');
|
|
5
5
|
require('./chunk-ZBDE64SD.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
exports.RestoreModal =
|
|
8
|
+
exports.RestoreModal = _chunkPHRCQCENcjs.RestoreModal;
|
|
9
9
|
//# sourceMappingURL=restore-modal.cjs.map
|
package/dist/restore-modal.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lukso/up-connector",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.5-dev.2df3eae",
|
|
4
4
|
"description": "Universal Profile connector with draggable avatar and connection modal",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -42,11 +42,6 @@
|
|
|
42
42
|
"import": "./dist/restore-modal.js",
|
|
43
43
|
"require": "./dist/restore-modal.cjs"
|
|
44
44
|
},
|
|
45
|
-
"./connect-modal": {
|
|
46
|
-
"types": "./dist/connect-modal/index.d.ts",
|
|
47
|
-
"import": "./dist/connect-modal/index.js",
|
|
48
|
-
"require": "./dist/connect-modal/index.cjs"
|
|
49
|
-
},
|
|
50
45
|
"./auto-setup": {
|
|
51
46
|
"types": "./dist/auto-setup.d.ts",
|
|
52
47
|
"import": "./dist/auto-setup.js",
|
|
@@ -80,15 +75,16 @@
|
|
|
80
75
|
"dependencies": {
|
|
81
76
|
"@lit/task": "^1.0.3",
|
|
82
77
|
"@lukso/up-provider": "0.3.7",
|
|
83
|
-
"@lukso/web-components": "^1.
|
|
78
|
+
"@lukso/web-components": "^1.179.0",
|
|
84
79
|
"debug": "^4.4.3",
|
|
85
|
-
"lit": "3.3.
|
|
80
|
+
"lit": "3.3.2",
|
|
86
81
|
"ws": "^8.19.0",
|
|
87
82
|
"zxcvbn": "^4.4.2",
|
|
88
|
-
"@lukso/core": "1.2.
|
|
89
|
-
"@lukso/passkey-auth": "1.2.
|
|
90
|
-
"@lukso/transaction-view-core": "0.6.
|
|
91
|
-
"@lukso/transaction-view-headless": "0.4.
|
|
83
|
+
"@lukso/core": "1.2.12-dev.2df3eae",
|
|
84
|
+
"@lukso/passkey-auth": "1.2.7-dev.2df3eae",
|
|
85
|
+
"@lukso/transaction-view-core": "0.6.10-dev.2df3eae",
|
|
86
|
+
"@lukso/transaction-view-headless": "0.4.8-dev.2df3eae",
|
|
87
|
+
"@lukso/up-modal": "0.8.5-dev.2df3eae"
|
|
92
88
|
},
|
|
93
89
|
"peerDependencies": {
|
|
94
90
|
"@wagmi/connectors": "^7.0.0",
|
|
@@ -110,16 +106,16 @@
|
|
|
110
106
|
"@tailwindcss/typography": "^0.5.19",
|
|
111
107
|
"@types/debug": "^4.1.12",
|
|
112
108
|
"@types/zxcvbn": "^4.4.5",
|
|
113
|
-
"@wagmi/connectors": "^7.0
|
|
114
|
-
"@wagmi/core": "^3.
|
|
115
|
-
"autoprefixer": "^10.4.
|
|
109
|
+
"@wagmi/connectors": "^7.2.0",
|
|
110
|
+
"@wagmi/core": "^3.3.4",
|
|
111
|
+
"autoprefixer": "^10.4.24",
|
|
116
112
|
"postcss": "^8.5.6",
|
|
117
113
|
"postcss-import": "^16.1.1",
|
|
118
114
|
"tailwindcss": "^3.4.19",
|
|
119
115
|
"tsup": "^8.5.1",
|
|
120
116
|
"typescript": "^5.9.3",
|
|
121
|
-
"viem": "^2.
|
|
122
|
-
"vitest": "^4.0.
|
|
117
|
+
"viem": "^2.46.1",
|
|
118
|
+
"vitest": "^4.0.18"
|
|
123
119
|
},
|
|
124
120
|
"tsup": {
|
|
125
121
|
"entry": [
|
|
@@ -130,7 +126,6 @@
|
|
|
130
126
|
"src/modal.ts",
|
|
131
127
|
"src/backup-modal.ts",
|
|
132
128
|
"src/restore-modal.ts",
|
|
133
|
-
"src/connect-modal/index.ts",
|
|
134
129
|
"src/wagmi-adapter.ts",
|
|
135
130
|
"src/auto-setup.ts"
|
|
136
131
|
],
|
package/src/account-modal.ts
CHANGED
|
@@ -5,15 +5,16 @@
|
|
|
5
5
|
* Uses lukso-modal from @lukso/web-components for consistent UI.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { safeCustomElement } from '@lukso/transaction-view-core/shared'
|
|
8
9
|
import { html } from 'lit'
|
|
9
|
-
import {
|
|
10
|
+
import { property } from 'lit/decorators.js'
|
|
10
11
|
import { CoreLitElement } from './styles'
|
|
11
12
|
|
|
12
13
|
// Import lukso web components
|
|
13
14
|
import '@lukso/web-components/dist/components/lukso-modal'
|
|
14
15
|
import '@lukso/web-components/dist/components/lukso-button'
|
|
15
16
|
|
|
16
|
-
@
|
|
17
|
+
@safeCustomElement('account-modal')
|
|
17
18
|
export class AccountModal extends CoreLitElement {
|
|
18
19
|
// Public properties
|
|
19
20
|
@property({ type: Boolean, reflect: true }) open = false
|
package/src/auto-setup.ts
CHANGED
|
@@ -7,15 +7,16 @@
|
|
|
7
7
|
* - UP Mobile (WalletConnect)
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import { setupConnectModal } from '@lukso/up-modal/connect-modal'
|
|
10
11
|
import type { Config } from '@wagmi/core'
|
|
11
|
-
import { setupConnectModal } from './connect-modal/index.js'
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Embedded wallet constants
|
|
15
15
|
*/
|
|
16
16
|
export const EMBEDDED_WALLET_ID = 'dev.lukso.auth'
|
|
17
17
|
export const EMBEDDED_WALLET_URL_DEV = 'http://localhost:9100'
|
|
18
|
-
export const EMBEDDED_WALLET_URL_PROD =
|
|
18
|
+
export const EMBEDDED_WALLET_URL_PROD =
|
|
19
|
+
'https://feed.api.universalprofile.cloud'
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* UP Extension ID
|
package/src/backup-modal.ts
CHANGED
|
@@ -7,8 +7,9 @@
|
|
|
7
7
|
|
|
8
8
|
import type { BackupFile } from '@lukso/passkey-auth'
|
|
9
9
|
import { downloadBackup } from '@lukso/passkey-auth'
|
|
10
|
+
import { safeCustomElement } from '@lukso/transaction-view-core/shared'
|
|
10
11
|
import { html, nothing } from 'lit'
|
|
11
|
-
import {
|
|
12
|
+
import { property, state } from 'lit/decorators.js'
|
|
12
13
|
import zxcvbn from 'zxcvbn'
|
|
13
14
|
import { CoreLitElement } from './styles'
|
|
14
15
|
|
|
@@ -33,7 +34,7 @@ interface PasswordStrength {
|
|
|
33
34
|
crackTime: string | number
|
|
34
35
|
}
|
|
35
36
|
|
|
36
|
-
@
|
|
37
|
+
@safeCustomElement('backup-modal')
|
|
37
38
|
export class BackupModal extends CoreLitElement {
|
|
38
39
|
// Public properties
|
|
39
40
|
@property({ type: Boolean, reflect: true }) open = false
|
package/src/connector.ts
CHANGED
|
@@ -21,16 +21,19 @@
|
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
23
|
import { DraggableAvatar } from './avatar.js'
|
|
24
|
-
import '
|
|
24
|
+
import '@lukso/up-modal/connect-modal' // Import for side-effect (registers custom element)
|
|
25
25
|
import './account-modal.js' // Import for side-effect (registers custom element)
|
|
26
26
|
import { setLuksoConfig } from '@lukso/transaction-view-headless'
|
|
27
|
-
import type {
|
|
28
|
-
|
|
27
|
+
import type {
|
|
28
|
+
ConnectModal,
|
|
29
|
+
WalletConnector,
|
|
30
|
+
} from '@lukso/up-modal/connect-modal'
|
|
29
31
|
import {
|
|
30
32
|
disconnect,
|
|
31
33
|
getConnection,
|
|
32
34
|
watchConnection,
|
|
33
|
-
} from '
|
|
35
|
+
} from '@lukso/up-modal/connect-modal'
|
|
36
|
+
import type { AccountModal } from './account-modal.js'
|
|
34
37
|
import type { ConnectionState, ConnectorConfig } from './types.js'
|
|
35
38
|
|
|
36
39
|
const DEFAULT_CONFIG: Required<
|
package/src/index.ts
CHANGED
|
@@ -3,27 +3,19 @@
|
|
|
3
3
|
* Universal Profile connector with draggable avatar and connection modal
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
//
|
|
7
|
-
export { AccountModal } from './account-modal.js'
|
|
8
|
-
// Auto-setup for LUKSO products
|
|
9
|
-
export type { LuksoConnectorConfig } from './auto-setup.js'
|
|
6
|
+
// Wagmi Adapter
|
|
10
7
|
export {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
setupLuksoConnector,
|
|
15
|
-
UP_EXTENSION_ID,
|
|
16
|
-
} from './auto-setup.js'
|
|
17
|
-
export { createAvatar, DraggableAvatar } from './avatar.js'
|
|
18
|
-
export { BackupModal } from './backup-modal.js'
|
|
19
|
-
export type { WagmiConnector } from './connect-modal'
|
|
8
|
+
fromWagmiConnector,
|
|
9
|
+
fromWagmiConnectors,
|
|
10
|
+
} from '@lukso/up-modal'
|
|
20
11
|
export type {
|
|
21
12
|
ConnectionModalView,
|
|
22
13
|
ConnectModalSetup,
|
|
23
14
|
ConnectModalTheme,
|
|
24
15
|
WagmiConnection,
|
|
16
|
+
WagmiConnector,
|
|
25
17
|
WalletConnector,
|
|
26
|
-
} from '
|
|
18
|
+
} from '@lukso/up-modal/connect-modal'
|
|
27
19
|
export {
|
|
28
20
|
ConnectModal,
|
|
29
21
|
disconnect,
|
|
@@ -32,12 +24,20 @@ export {
|
|
|
32
24
|
setupConnectModal,
|
|
33
25
|
wagmi,
|
|
34
26
|
watchConnection,
|
|
35
|
-
} from '
|
|
36
|
-
//
|
|
27
|
+
} from '@lukso/up-modal/connect-modal'
|
|
28
|
+
// Backup & Restore Modals (Lit Components)
|
|
29
|
+
export { AccountModal } from './account-modal.js'
|
|
30
|
+
// Auto-setup for LUKSO products
|
|
31
|
+
export type { LuksoConnectorConfig } from './auto-setup.js'
|
|
37
32
|
export {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
33
|
+
EMBEDDED_WALLET_ID,
|
|
34
|
+
EMBEDDED_WALLET_URL_DEV,
|
|
35
|
+
EMBEDDED_WALLET_URL_PROD,
|
|
36
|
+
setupLuksoConnector,
|
|
37
|
+
UP_EXTENSION_ID,
|
|
38
|
+
} from './auto-setup.js'
|
|
39
|
+
export { createAvatar, DraggableAvatar } from './avatar.js'
|
|
40
|
+
export { BackupModal } from './backup-modal.js'
|
|
41
41
|
// Main exports
|
|
42
42
|
// Default export
|
|
43
43
|
export {
|
package/src/restore-modal.ts
CHANGED
|
@@ -11,8 +11,9 @@ import type {
|
|
|
11
11
|
WalletData,
|
|
12
12
|
} from '@lukso/passkey-auth'
|
|
13
13
|
import { readBackupFile } from '@lukso/passkey-auth'
|
|
14
|
+
import { safeCustomElement } from '@lukso/transaction-view-core/shared'
|
|
14
15
|
import { html, nothing } from 'lit'
|
|
15
|
-
import {
|
|
16
|
+
import { property, state } from 'lit/decorators.js'
|
|
16
17
|
import { CoreLitElement } from './styles'
|
|
17
18
|
|
|
18
19
|
// Import lukso web components
|
|
@@ -27,7 +28,7 @@ enum Step {
|
|
|
27
28
|
SUCCESS = 4,
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
@
|
|
31
|
+
@safeCustomElement('restore-modal')
|
|
31
32
|
export class RestoreModal extends CoreLitElement {
|
|
32
33
|
// Public properties
|
|
33
34
|
@property({ type: Boolean, reflect: true }) isOpen = false
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/up-connector/dist/chunk-2GXVRHI5.cjs","../src/backup-modal.ts"],"names":[],"mappings":"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","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/up-connector/dist/chunk-2GXVRHI5.cjs","sourcesContent":[null,"/**\n * Backup Modal - Lit Component\n *\n * Framework-agnostic backup modal for wallet data export.\n * Uses lukso-modal from @lukso/web-components for consistent UI.\n */\n\nimport type { BackupFile } from '@lukso/passkey-auth'\nimport { downloadBackup } from '@lukso/passkey-auth'\nimport { html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport zxcvbn from 'zxcvbn'\nimport { CoreLitElement } from './styles'\n\n// Import lukso web components\nimport '@lukso/web-components/dist/components/lukso-modal'\nimport '@lukso/web-components/dist/components/lukso-button'\nimport '@lukso/web-components/dist/components/lukso-input'\n\nenum Step {\n CHOICE = 1,\n PASSWORD = 2,\n DOWNLOAD = 3,\n}\n\ninterface PasswordStrength {\n level: string\n label: string\n color: string\n bgColor: string\n width: number\n feedback: string\n crackTime: string | number\n}\n\n@customElement('backup-modal')\nexport class BackupModal extends CoreLitElement {\n // Public properties\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: String }) theme: 'light' | 'dark' | 'auto' = 'auto'\n\n // Private state - wizard flow\n @state() private currentStep: Step = Step.CHOICE\n @state() private useEncryption = true\n @state() private password = ''\n @state() private passwordConfirm = ''\n @state() private passwordErrors: string[] = []\n @state() private isCreatingBackup = false\n @state() private generatedBackup: BackupFile | null = null\n\n /**\n * Public method for parent to set backup result\n * Called after parent handles the 'create' event\n */\n public setBackupResult(\n backupFile: BackupFile | null,\n options?: {\n error?: string\n }\n ) {\n this.isCreatingBackup = false\n\n if (options?.error) {\n this.passwordErrors = [options.error]\n this.generatedBackup = null\n } else if (backupFile) {\n this.generatedBackup = backupFile\n this.currentStep = Step.DOWNLOAD\n }\n }\n\n render() {\n return html`\n <lukso-modal\n ?is-open=${this.open}\n size=\"medium\"\n @on-backdrop-click=${this.close}\n >\n <div class=\"p-6\">\n <!-- Header -->\n <h2 class=\"m-0 mb-6 text-neutral-20 dark:text-white heading-inter-21-semi-bold\">\n ${this.getStepTitle()}\n </h2>\n\n <!-- Step content -->\n ${this.renderStep()}\n </div>\n </lukso-modal>\n `\n }\n\n private renderStep() {\n switch (this.currentStep) {\n case Step.CHOICE:\n return this.renderChoiceStep()\n case Step.PASSWORD:\n return this.renderPasswordStep()\n case Step.DOWNLOAD:\n return this.renderDownloadStep()\n default:\n return nothing\n }\n }\n\n private renderChoiceStep() {\n return html`\n <div class=\"flex flex-col gap-3 mb-6\">\n <!-- Encrypted option (recommended) -->\n <div\n class=\"border-2 border-neutral-90 dark:border-neutral-70 rounded-lg p-4 cursor-pointer transition-all hover:border-neutral-60 dark:hover:border-neutral-60\"\n @click=${() => this.selectBackupType(true)}\n >\n <div class=\"flex items-center gap-3 mb-2\">\n <span class=\"text-neutral-10 dark:text-white heading-inter-16-semi-bold flex-1\">\n Encrypt backup file\n </span>\n <span class=\"text-xs text-neutral-50 dark:text-neutral-60 uppercase tracking-wide\">\n Recommended\n </span>\n </div>\n <p class=\"m-0 text-neutral-40 dark:text-neutral-50 paragraph-inter-14-regular\">\n Uses password-based encryption to protect the secrets in this file.\n </p>\n </div>\n\n <!-- Unencrypted option -->\n <div\n class=\"border-2 border-neutral-90 dark:border-neutral-70 rounded-lg p-4 cursor-pointer transition-all hover:border-neutral-60 dark:hover:border-neutral-60\"\n @click=${() => this.selectBackupType(false)}\n >\n <div class=\"flex items-center gap-3 mb-2\">\n <span class=\"text-neutral-10 dark:text-white heading-inter-16-semi-bold flex-1\">\n Plain text backup\n </span>\n <span class=\"text-xs text-neutral-50 dark:text-neutral-60 uppercase tracking-wide\">\n For development only\n </span>\n </div>\n <p class=\"m-0 text-neutral-40 dark:text-neutral-50 paragraph-inter-14-regular\">\n Secrets will be stored in plain text.\n </p>\n </div>\n </div>\n\n <div class=\"flex justify-between gap-3\">\n <lukso-button variant=\"text\" @click=${this.close}>\n Cancel\n </lukso-button>\n </div>\n `\n }\n\n private renderPasswordStep() {\n const passwordStrength = this.password\n ? this.calculatePasswordStrength()\n : null\n const passwordsMatch =\n this.password &&\n this.passwordConfirm &&\n this.password === this.passwordConfirm\n const canProceed = this.password && this.passwordConfirm && passwordsMatch\n\n return html`\n <p class=\"mb-6 text-neutral-40 dark:text-neutral-50 paragraph-inter-16-regular\">\n Choose a strong password to encrypt your backup. You'll need this password to restore your wallet.\n </p>\n\n <div class=\"space-y-4\">\n <lukso-input\n type=\"password\"\n label=\"Password\"\n placeholder=\"Enter a strong password\"\n .value=${this.password}\n @on-input=${(e: CustomEvent) => {\n this.password = e.detail.value\n }}\n is-full-width\n autofocus\n ></lukso-input>\n\n ${this.passwordErrors.map(\n (error) => html`\n <div class=\"mt-1 text-red-55 paragraph-inter-13-regular\">${error}</div>\n `\n )}\n\n ${\n passwordStrength\n ? html`\n <div class=\"mt-3\">\n <div class=\"flex items-center justify-between mb-1\">\n <span class=\"paragraph-inter-13-regular text-neutral-40\">Password strength:</span>\n <span class=\"paragraph-inter-13-semi-bold ${passwordStrength.color}\">${passwordStrength.label}</span>\n </div>\n <div class=\"h-1.5 bg-neutral-90 dark:bg-neutral-70 rounded-full overflow-hidden\">\n <div\n class=\"h-full ${passwordStrength.bgColor} transition-all duration-300\"\n style=\"width: ${passwordStrength.width}%\"\n ></div>\n </div>\n <p class=\"mt-1 mb-0 text-neutral-40 paragraph-inter-12-regular\">\n Time to crack: ${passwordStrength.crackTime}\n </p>\n ${\n passwordStrength.feedback\n ? html`\n <p class=\"mt-2 mb-0 text-neutral-40 paragraph-inter-12-regular\">${passwordStrength.feedback}</p>\n `\n : nothing\n }\n </div>\n `\n : nothing\n }\n\n <lukso-input\n type=\"password\"\n label=\"Confirm Password\"\n placeholder=\"Re-enter your password\"\n .value=${this.passwordConfirm}\n @on-input=${(e: CustomEvent) => {\n this.passwordConfirm = e.detail.value\n }}\n is-full-width\n ></lukso-input>\n\n ${\n this.passwordConfirm\n ? html`\n <div class=\"flex items-center justify-between mt-2\">\n <span class=\"paragraph-inter-13-regular text-neutral-40\">Passwords match:</span>\n <span class=\"paragraph-inter-13-semi-bold ${passwordsMatch ? 'text-green-54' : 'text-red-55'}\">\n ${passwordsMatch ? 'Yes' : 'No'}\n </span>\n </div>\n `\n : nothing\n }\n </div>\n\n <div class=\"flex justify-between gap-3 mt-6\">\n <div class=\"flex gap-3\">\n <lukso-button variant=\"text\" @click=${this.close}>\n Cancel\n </lukso-button>\n <lukso-button variant=\"secondary\" @click=${this.goBack}>\n Back\n </lukso-button>\n </div>\n <lukso-button\n variant=\"primary\"\n ?disabled=${!canProceed || this.isCreatingBackup}\n ?is-loading=${this.isCreatingBackup}\n @click=${this.createBackup}\n >\n Create Backup\n </lukso-button>\n </div>\n `\n }\n\n private renderDownloadStep() {\n return html`\n <p class=\"mb-6 text-neutral-40 dark:text-neutral-50 paragraph-inter-16-regular\">\n Your backup has been created${this.useEncryption ? ' and encrypted' : ''}. Download it and keep it in a safe place.\n </p>\n\n ${\n !this.useEncryption\n ? html`\n <p class=\"mb-6 text-neutral-40 dark:text-neutral-50 paragraph-inter-14-regular\">\n This unencrypted backup is intended for development purposes. Use it when creating dapps that need access to the profile for testing.\n </p>\n `\n : nothing\n }\n\n <div class=\"flex justify-end gap-3\">\n <lukso-button variant=\"primary\" @click=${this.handleDownload}>\n Download Backup\n </lukso-button>\n </div>\n `\n }\n\n private getStepTitle(): string {\n switch (this.currentStep) {\n case Step.CHOICE:\n return 'Backup Wallet'\n case Step.PASSWORD:\n return 'Set Password'\n case Step.DOWNLOAD:\n return 'Download Backup'\n default:\n return 'Backup Wallet'\n }\n }\n\n private selectBackupType(encrypted: boolean) {\n this.useEncryption = encrypted\n if (encrypted) {\n this.currentStep = Step.PASSWORD\n } else {\n // Unencrypted backup - create immediately\n this.createBackup()\n }\n }\n\n private async createBackup() {\n this.isCreatingBackup = true\n this.passwordErrors = []\n\n // Emit create event with password (if encrypted)\n // Parent should handle backup creation\n const createEvent = new CustomEvent('create', {\n detail: {\n password: this.useEncryption ? this.password : undefined,\n encrypted: this.useEncryption,\n },\n bubbles: true,\n composed: true,\n cancelable: true,\n })\n\n this.dispatchEvent(createEvent)\n\n // If parent didn't prevent default, show error\n if (!createEvent.defaultPrevented) {\n this.passwordErrors = [\n 'No backup handler configured. Please handle the \"create\" event.',\n ]\n this.isCreatingBackup = false\n }\n // Otherwise, parent will call setBackupResult()\n }\n\n private handleDownload() {\n if (this.generatedBackup) {\n downloadBackup(this.generatedBackup)\n\n // Dispatch download event\n this.dispatchEvent(\n new CustomEvent('download', {\n detail: this.generatedBackup,\n bubbles: true,\n composed: true,\n })\n )\n\n // Close modal after download\n setTimeout(() => {\n this.close()\n }, 100)\n }\n }\n\n private goBack() {\n if (this.currentStep === Step.PASSWORD) {\n this.currentStep = Step.CHOICE\n this.password = ''\n this.passwordConfirm = ''\n this.passwordErrors = []\n }\n }\n\n private close() {\n this.open = false\n this.dispatchEvent(\n new CustomEvent('close', { bubbles: true, composed: true })\n )\n\n // Reset state after animation\n setTimeout(() => {\n this.currentStep = Step.CHOICE\n this.useEncryption = true\n this.password = ''\n this.passwordConfirm = ''\n this.passwordErrors = []\n this.isCreatingBackup = false\n this.generatedBackup = null\n }, 300)\n }\n\n private calculatePasswordStrength(): PasswordStrength {\n const result = zxcvbn(this.password)\n\n const strengthMap = [\n {\n level: 'very-weak',\n label: 'Very Weak',\n color: 'text-red-55',\n bgColor: 'bg-red-55',\n width: 20,\n },\n {\n level: 'weak',\n label: 'Weak',\n color: 'text-red-65',\n bgColor: 'bg-red-65',\n width: 40,\n },\n {\n level: 'fair',\n label: 'Fair',\n color: 'text-yellow-55',\n bgColor: 'bg-yellow-55',\n width: 60,\n },\n {\n level: 'good',\n label: 'Good',\n color: 'text-green-54',\n bgColor: 'bg-green-54',\n width: 80,\n },\n {\n level: 'strong',\n label: 'Strong',\n color: 'text-green-45',\n bgColor: 'bg-green-45',\n width: 100,\n },\n ]\n\n const strength = strengthMap[result.score]\n const feedback =\n result.feedback.suggestions.join(' ') || result.feedback.warning || ''\n const crackTime =\n result.crack_times_display.offline_slow_hashing_1e4_per_second\n\n return {\n ...strength,\n feedback,\n crackTime,\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'backup-modal': BackupModal\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/up-connector/dist/chunk-2HIZGOPY.cjs","../src/auto-setup.ts"],"names":[],"mappings":"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","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/up-connector/dist/chunk-2HIZGOPY.cjs","sourcesContent":[null,"/**\n * Auto-setup utilities for LUKSO products\n *\n * Provides zero-config setup for:\n * - Embedded Wallet (passkey-based)\n * - UP Extension (browser extension)\n * - UP Mobile (WalletConnect)\n */\n\nimport type { Config } from '@wagmi/core'\nimport { setupConnectModal } from './connect-modal/index.js'\n\n/**\n * Embedded wallet constants\n */\nexport const EMBEDDED_WALLET_ID = 'dev.lukso.auth'\nexport const EMBEDDED_WALLET_URL_DEV = 'http://localhost:9100'\nexport const EMBEDDED_WALLET_URL_PROD = 'https://auth-simple.pages.dev'\n\n/**\n * UP Extension ID\n */\nexport const UP_EXTENSION_ID = 'cloud.universalprofile'\n\n/**\n * Get default wallet URL based on environment\n */\nfunction getDefaultWalletUrl(): string {\n // Check for environment variable (CI builds)\n if (typeof process !== 'undefined' && process.env?.WALLET_URL) {\n return process.env.WALLET_URL\n }\n\n // Check if we're in production (browser)\n if (typeof window !== 'undefined') {\n const isLocalhost =\n window.location.hostname === 'localhost' ||\n window.location.hostname === '127.0.0.1'\n return isLocalhost ? EMBEDDED_WALLET_URL_DEV : EMBEDDED_WALLET_URL_PROD\n }\n\n // Default to dev\n return EMBEDDED_WALLET_URL_DEV\n}\n\nexport interface LuksoConnectorConfig {\n /**\n * Embedded wallet configuration\n */\n embeddedWallet?: {\n /**\n * Enable embedded wallet option (default: true)\n */\n enabled?: boolean\n\n /**\n * URL to the wallet service\n * @default 'http://localhost:9100'\n */\n url?: string\n\n /**\n * Storage key for UP Provider state\n * @default 'up-provider'\n */\n storageKey?: string\n\n /**\n * Display name for the wallet\n * @default 'Create Passkey Wallet'\n */\n name?: string\n }\n\n /**\n * WalletConnect configuration for mobile app\n */\n walletConnect?: {\n /**\n * Enable WalletConnect (default: true)\n */\n enabled?: boolean\n\n /**\n * WalletConnect Project ID\n * @default LUKSO's default project ID\n */\n projectId?: string\n\n /**\n * Show QR code modal on mobile devices (default: false)\n */\n showQrModal?: boolean\n }\n\n /**\n * Chain configuration\n */\n chains?: {\n /**\n * Default chain ID\n * @default 42 (LUKSO mainnet)\n */\n defaultChainId?: number\n\n /**\n * Enable testnet (default: true)\n */\n enableTestnet?: boolean\n }\n\n /**\n * Storage configuration\n */\n storage?: {\n /**\n * Storage key prefix for wagmi state\n * @default 'up-wagmi'\n */\n key?: string\n }\n\n /**\n * Pass an existing wagmi config instead of auto-creating one\n */\n wagmiConfig?: any\n}\n\nconst DEFAULT_CONFIG: Required<LuksoConnectorConfig> = {\n embeddedWallet: {\n enabled: true,\n url: getDefaultWalletUrl(),\n storageKey: 'up-provider',\n name: 'UE Embedded Wallet',\n },\n walletConnect: {\n enabled: true,\n projectId: '7d1af65dc2722192d9914b5d6eaeb421', // LUKSO's default\n showQrModal: false,\n },\n chains: {\n defaultChainId: 42, // LUKSO mainnet\n enableTestnet: true,\n },\n storage: {\n key: 'up-wagmi',\n },\n wagmiConfig: undefined,\n}\n\n/**\n * Auto-setup LUKSO connector with sensible defaults\n *\n * This function creates a wagmi config and sets up the connect modal\n * with support for:\n * - Embedded Wallet (passkey-based)\n * - UP Extension (auto-detected via EIP-6963)\n * - UP Mobile (WalletConnect)\n *\n * @example\n * ```typescript\n * // Zero config - uses all defaults\n * setupLuksoConnector()\n *\n * // Custom configuration\n * setupLuksoConnector({\n * embeddedWallet: {\n * url: 'https://wallet.example.com'\n * },\n * chains: {\n * defaultChainId: 4201 // LUKSO Testnet\n * }\n * })\n * ```\n */\nexport async function setupLuksoConnector(\n config: LuksoConnectorConfig = {}\n): Promise<{ wagmiConfig: Config }> {\n const cfg = {\n embeddedWallet: {\n ...DEFAULT_CONFIG.embeddedWallet,\n ...config.embeddedWallet,\n } as Required<typeof DEFAULT_CONFIG.embeddedWallet>,\n walletConnect: {\n ...DEFAULT_CONFIG.walletConnect,\n ...config.walletConnect,\n } as Required<typeof DEFAULT_CONFIG.walletConnect>,\n chains: {\n ...DEFAULT_CONFIG.chains,\n ...config.chains,\n } as Required<typeof DEFAULT_CONFIG.chains>,\n storage: {\n ...DEFAULT_CONFIG.storage,\n ...config.storage,\n } as Required<typeof DEFAULT_CONFIG.storage>,\n wagmiConfig: config.wagmiConfig,\n }\n\n // IMPORTANT: Create UP Provider BEFORE wagmi config\n // The UP Provider registers via EIP-6963, and wagmi's injected() will detect it\n // This matches the order in demo-app: UP Provider first, then wagmi config\n\n // Step 1: Create UP Provider (if enabled)\n if (cfg.embeddedWallet?.enabled) {\n await createUPProvider(cfg.embeddedWallet)\n }\n\n // Step 2: Create or use provided wagmi config\n const wagmiConfig = cfg.wagmiConfig || (await createWagmiConfig(cfg))\n\n // Note: Wagmi will auto-reconnect in the background\n // The connector's watchWagmiAccount will detect the connection when it completes\n\n // Step 3: Setup connect modal\n // The UP Provider is already registered via EIP-6963 and will appear in wagmi connectors\n // Use the embedded wallet ID to identify it in the connector list\n setupConnectModal({\n wagmiConfig,\n chainId: cfg.chains.defaultChainId,\n embeddedWalletId: cfg.embeddedWallet.enabled\n ? EMBEDDED_WALLET_ID\n : undefined,\n })\n\n return { wagmiConfig }\n}\n\n/**\n * Create wagmi config with LUKSO chains and connectors\n */\nasync function createWagmiConfig(cfg: any): Promise<any> {\n try {\n // Dynamic imports to keep dependencies optional\n const [\n { createConfig, createStorage, injected },\n { walletConnect },\n { createClient, http },\n { lukso, luksoTestnet },\n ] = await Promise.all([\n import('@wagmi/core'),\n import('@wagmi/connectors'),\n import('viem'),\n import('viem/chains'),\n ])\n\n // Create storage adapter\n const storage = createStorage({\n key: cfg.storage.key,\n storage: getDefaultStorage(),\n })\n\n // Build chains array\n const chains = cfg.chains.enableTestnet\n ? ([luksoTestnet, lukso] as const)\n : ([lukso] as const)\n\n // Build connectors array\n const connectors = []\n\n // Add WalletConnect if enabled\n if (cfg.walletConnect.enabled) {\n connectors.push(\n walletConnect({\n projectId: cfg.walletConnect.projectId,\n showQrModal: cfg.walletConnect.showQrModal,\n })\n )\n }\n\n // Add injected (for UP Extension and other EIP-6963 wallets)\n connectors.push(injected())\n\n // Create wagmi config\n return createConfig({\n storage,\n multiInjectedProviderDiscovery: true, // Enable EIP-6963\n connectors,\n chains,\n client({ chain }: any) {\n return createClient({ chain, transport: http() })\n },\n })\n } catch (error) {\n console.error('Failed to create wagmi config:', error)\n throw new Error(\n 'Failed to create wagmi config. Make sure @wagmi/core, @wagmi/connectors, and viem are installed.'\n )\n }\n}\n\n/**\n * Create UP Provider (registers via EIP-6963)\n */\nasync function createUPProvider(config: {\n url: string\n storageKey: string\n name: string\n}): Promise<void> {\n // Validate URL - throw error if explicitly set to empty string\n if (config.url != null && config.url.trim() === '') {\n throw new Error(\n 'UP Provider URL is defined but empty. Please set WALLET_URL environment variable to a valid URL or leave it undefined.'\n )\n }\n\n try {\n const { createClientUPProvider } = await import('@lukso/up-provider')\n\n // Create UP Provider - it automatically registers via EIP-6963\n createClientUPProvider({\n url: config.url,\n mode: 'iframe',\n get: async () => {\n const stored = localStorage.getItem(config.storageKey)\n return stored ? JSON.parse(stored) : {}\n },\n set: async (value: Record<string, unknown>) => {\n localStorage.setItem(config.storageKey, JSON.stringify(value))\n },\n name: config.name,\n })\n\n // Wait for EIP-6963 registration\n await new Promise((resolve) => setTimeout(resolve, 100))\n } catch (error) {\n console.warn('⚠️ Failed to create UP Provider:', error)\n throw error\n }\n}\n\n/**\n * Default storage adapter (localStorage with error handling)\n */\nfunction getDefaultStorage() {\n const storage = (() => {\n if (typeof window !== 'undefined' && window.localStorage) {\n return window.localStorage\n }\n return {\n getItem: () => null,\n setItem: () => {},\n removeItem: () => {},\n }\n })()\n\n return {\n getItem(key: string) {\n return storage.getItem(key)\n },\n removeItem(key: string) {\n storage.removeItem(key)\n },\n setItem(key: string, value: string) {\n try {\n storage.setItem(key, value)\n } catch {\n // Silence QuotaExceededError, SecurityError, etc.\n }\n },\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/account-modal.ts"],"sourcesContent":["/**\n * Account Modal - Lit Component\n *\n * Framework-agnostic account management modal showing connected wallet details.\n * Uses lukso-modal from @lukso/web-components for consistent UI.\n */\n\nimport { html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { CoreLitElement } from './styles'\n\n// Import lukso web components\nimport '@lukso/web-components/dist/components/lukso-modal'\nimport '@lukso/web-components/dist/components/lukso-button'\n\n@customElement('account-modal')\nexport class AccountModal extends CoreLitElement {\n // Public properties\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: String }) theme: 'light' | 'dark' | 'auto' = 'auto'\n @property({ type: String }) address = ''\n @property({ type: Number }) chainId?: number\n @property({ type: String }) connectorName = ''\n\n private close() {\n this.open = false\n this.dispatchEvent(new CustomEvent('close'))\n }\n\n private handleDisconnect() {\n this.dispatchEvent(new CustomEvent('disconnect'))\n this.close()\n }\n\n private getChainName(): string {\n switch (this.chainId) {\n case 42:\n return 'LUKSO Mainnet'\n case 4201:\n return 'LUKSO Testnet'\n default:\n return this.chainId ? `Chain ${this.chainId}` : 'Unknown Network'\n }\n }\n\n render() {\n return html`\n <lukso-modal\n ?is-open=${this.open}\n size=\"small\"\n @on-backdrop-click=${this.close}\n >\n <div class=\"p-6\">\n <!-- Header with close button -->\n <div class=\"flex justify-between items-center mb-6\">\n <h2 class=\"text-xl font-semibold\">Connected Account</h2>\n <button\n @click=${this.close}\n class=\"text-neutral-50 hover:text-neutral-20 transition-colors\"\n aria-label=\"Close\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n\n <!-- Connection Status -->\n <div class=\"flex items-center gap-2 mb-5\">\n <div\n class=\"w-2 h-2 rounded-full\"\n style=\"background: #10b981;\"\n ></div>\n <span class=\"text-sm font-semibold\" style=\"color: #10b981;\">\n Connected\n </span>\n </div>\n\n <!-- Address -->\n <div\n class=\"mb-4 p-3 rounded-lg bg-neutral-98 border border-neutral-90\"\n >\n <div\n class=\"text-xs font-semibold text-neutral-50 mb-1.5 uppercase\"\n >\n Address\n </div>\n <div\n class=\"text-xs font-mono text-neutral-20 break-all leading-relaxed\"\n >\n ${this.address}\n </div>\n </div>\n\n <!-- Network & Connector Info -->\n <div class=\"grid grid-cols-2 gap-3 mb-5\">\n <div class=\"p-3 rounded-lg bg-neutral-98 border border-neutral-90\">\n <div\n class=\"text-xs font-semibold text-neutral-50 mb-1.5 uppercase\"\n >\n Network\n </div>\n <div class=\"text-sm font-semibold text-neutral-20\">\n ${this.getChainName()}\n </div>\n </div>\n\n <div class=\"p-3 rounded-lg bg-neutral-98 border border-neutral-90\">\n <div\n class=\"text-xs font-semibold text-neutral-50 mb-1.5 uppercase\"\n >\n Connector\n </div>\n <div class=\"text-sm font-semibold text-neutral-20\">\n ${this.connectorName || 'Unknown'}\n </div>\n </div>\n </div>\n\n <!-- Disconnect Button -->\n <lukso-button\n variant=\"danger\"\n is-full-width\n @click=${this.handleDisconnect}\n >\n Disconnect\n </lukso-button>\n </div>\n </lukso-modal>\n `\n }\n}\n"],"mappings":";;;;;;;;AAOA,SAAS,YAAY;AACrB,SAAS,eAAe,gBAAgB;AAIxC,OAAO;AACP,OAAO;AAGA,IAAM,eAAN,cAA2B,eAAe;AAAA,EAA1C;AAAA;AAEuC,gBAAO;AACvB,iBAAmC;AACnC,mBAAU;AAEV,yBAAgB;AAAA;AAAA,EAEpC,QAAQ;AACd,SAAK,OAAO;AACZ,SAAK,cAAc,IAAI,YAAY,OAAO,CAAC;AAAA,EAC7C;AAAA,EAEQ,mBAAmB;AACzB,SAAK,cAAc,IAAI,YAAY,YAAY,CAAC;AAChD,SAAK,MAAM;AAAA,EACb;AAAA,EAEQ,eAAuB;AAC7B,YAAQ,KAAK,SAAS;AAAA,MACpB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO,KAAK,UAAU,SAAS,KAAK,OAAO,KAAK;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAO;AAAA;AAAA,mBAEQ,KAAK,IAAI;AAAA;AAAA,6BAEC,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAOhB,KAAK,KAAK;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,gBA2CjB,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAaV,KAAK,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAWnB,KAAK,iBAAiB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAS5B,KAAK,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxC;AACF;AA3H8C;AAAA,EAA3C,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAF/B,aAEiC;AAChB;AAAA,EAA3B,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,aAGiB;AACA;AAAA,EAA3B,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAJf,aAIiB;AACA;AAAA,EAA3B,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GALf,aAKiB;AACA;AAAA,EAA3B,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GANf,aAMiB;AANjB,eAAN;AAAA,EADN,cAAc,eAAe;AAAA,GACjB;","names":[]}
|