@lukso/up-connector 0.4.0-dev.a8c9315

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +280 -0
  3. package/dist/account-modal.cjs +9 -0
  4. package/dist/account-modal.cjs.map +1 -0
  5. package/dist/account-modal.d.cts +16 -0
  6. package/dist/account-modal.d.ts +16 -0
  7. package/dist/account-modal.js +9 -0
  8. package/dist/account-modal.js.map +1 -0
  9. package/dist/auto-setup.cjs +17 -0
  10. package/dist/auto-setup.cjs.map +1 -0
  11. package/dist/auto-setup.d.cts +123 -0
  12. package/dist/auto-setup.d.ts +123 -0
  13. package/dist/auto-setup.js +17 -0
  14. package/dist/auto-setup.js.map +1 -0
  15. package/dist/avatar-CmUCtW_w.d.cts +205 -0
  16. package/dist/avatar-CmUCtW_w.d.ts +205 -0
  17. package/dist/avatar.cjs +12 -0
  18. package/dist/avatar.cjs.map +1 -0
  19. package/dist/avatar.d.cts +1 -0
  20. package/dist/avatar.d.ts +1 -0
  21. package/dist/avatar.js +12 -0
  22. package/dist/avatar.js.map +1 -0
  23. package/dist/backup-modal.cjs +9 -0
  24. package/dist/backup-modal.cjs.map +1 -0
  25. package/dist/backup-modal.d.cts +41 -0
  26. package/dist/backup-modal.d.ts +41 -0
  27. package/dist/backup-modal.js +9 -0
  28. package/dist/backup-modal.js.map +1 -0
  29. package/dist/chunk-3SGSPHOZ.js +595 -0
  30. package/dist/chunk-3SGSPHOZ.js.map +1 -0
  31. package/dist/chunk-6AYZOIFY.js +181 -0
  32. package/dist/chunk-6AYZOIFY.js.map +1 -0
  33. package/dist/chunk-6N35TCFT.js +852 -0
  34. package/dist/chunk-6N35TCFT.js.map +1 -0
  35. package/dist/chunk-7ETKG6KR.cjs +387 -0
  36. package/dist/chunk-7ETKG6KR.cjs.map +1 -0
  37. package/dist/chunk-EUXUH3YW.js +15 -0
  38. package/dist/chunk-EUXUH3YW.js.map +1 -0
  39. package/dist/chunk-GFVUWAG4.cjs +158 -0
  40. package/dist/chunk-GFVUWAG4.cjs.map +1 -0
  41. package/dist/chunk-IAKQFHFD.cjs +595 -0
  42. package/dist/chunk-IAKQFHFD.cjs.map +1 -0
  43. package/dist/chunk-MH7MP7XK.cjs +181 -0
  44. package/dist/chunk-MH7MP7XK.cjs.map +1 -0
  45. package/dist/chunk-NWCNJSG3.js +387 -0
  46. package/dist/chunk-NWCNJSG3.js.map +1 -0
  47. package/dist/chunk-NXU2DQAV.js +1128 -0
  48. package/dist/chunk-NXU2DQAV.js.map +1 -0
  49. package/dist/chunk-ORJK2YGG.cjs +852 -0
  50. package/dist/chunk-ORJK2YGG.cjs.map +1 -0
  51. package/dist/chunk-RFA6SEIS.cjs +1128 -0
  52. package/dist/chunk-RFA6SEIS.cjs.map +1 -0
  53. package/dist/chunk-XGIT7YUY.js +31 -0
  54. package/dist/chunk-XGIT7YUY.js.map +1 -0
  55. package/dist/chunk-XOKG3KIL.cjs +31 -0
  56. package/dist/chunk-XOKG3KIL.cjs.map +1 -0
  57. package/dist/chunk-YIWSPI4I.js +158 -0
  58. package/dist/chunk-YIWSPI4I.js.map +1 -0
  59. package/dist/chunk-ZBDE64SD.cjs +15 -0
  60. package/dist/chunk-ZBDE64SD.cjs.map +1 -0
  61. package/dist/connect-modal/index.cjs +20 -0
  62. package/dist/connect-modal/index.cjs.map +1 -0
  63. package/dist/connect-modal/index.d.cts +9 -0
  64. package/dist/connect-modal/index.d.ts +9 -0
  65. package/dist/connect-modal/index.js +20 -0
  66. package/dist/connect-modal/index.js.map +1 -0
  67. package/dist/index-D2orHGFi.d.cts +8 -0
  68. package/dist/index-D2orHGFi.d.ts +8 -0
  69. package/dist/index.cjs +793 -0
  70. package/dist/index.cjs.map +1 -0
  71. package/dist/index.d.cts +189 -0
  72. package/dist/index.d.ts +189 -0
  73. package/dist/index.js +793 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/restore-modal.cjs +9 -0
  76. package/dist/restore-modal.cjs.map +1 -0
  77. package/dist/restore-modal.d.cts +68 -0
  78. package/dist/restore-modal.d.ts +68 -0
  79. package/dist/restore-modal.js +9 -0
  80. package/dist/restore-modal.js.map +1 -0
  81. package/dist/wagmi-CVuDs_0h.d.cts +386 -0
  82. package/dist/wagmi-CVuDs_0h.d.ts +386 -0
  83. package/package.json +158 -0
  84. package/src/account-modal.ts +142 -0
  85. package/src/auto-setup.ts +362 -0
  86. package/src/avatar.ts +1135 -0
  87. package/src/backup-modal.ts +439 -0
  88. package/src/connect-modal/components/connection-view.ts +398 -0
  89. package/src/connect-modal/components/eoa-connection-view.ts +408 -0
  90. package/src/connect-modal/components/qr-code-view.ts +71 -0
  91. package/src/connect-modal/connect-modal.base.ts +18 -0
  92. package/src/connect-modal/connect-modal.config.ts +27 -0
  93. package/src/connect-modal/connect-modal.templates.ts +21 -0
  94. package/src/connect-modal/connect-modal.ts +270 -0
  95. package/src/connect-modal/connect-modal.types.ts +104 -0
  96. package/src/connect-modal/images/up-cube-glass.png +0 -0
  97. package/src/connect-modal/index.ts +23 -0
  98. package/src/connect-modal/services/wagmi.ts +266 -0
  99. package/src/connect-modal/styles/styles.css +1 -0
  100. package/src/connect-modal/utils/walletConnectDeepLinkUrl.ts +43 -0
  101. package/src/connector.ts +544 -0
  102. package/src/index.ts +62 -0
  103. package/src/popup-instance.ts +537 -0
  104. package/src/restore-modal.ts +702 -0
  105. package/src/styles/index.ts +28 -0
  106. package/src/styles/styles.css +1 -0
  107. package/src/types/css-raw.d.ts +4 -0
  108. package/src/types/images.d.ts +4 -0
  109. package/src/types.ts +168 -0
package/dist/index.js ADDED
@@ -0,0 +1,793 @@
1
+ import {
2
+ AccountModal
3
+ } from "./chunk-YIWSPI4I.js";
4
+ import {
5
+ EMBEDDED_WALLET_ID,
6
+ EMBEDDED_WALLET_URL_DEV,
7
+ EMBEDDED_WALLET_URL_PROD,
8
+ UP_EXTENSION_ID,
9
+ setupLuksoConnector
10
+ } from "./chunk-6AYZOIFY.js";
11
+ import {
12
+ DraggableAvatar,
13
+ createAvatar
14
+ } from "./chunk-6N35TCFT.js";
15
+ import {
16
+ BackupModal
17
+ } from "./chunk-NWCNJSG3.js";
18
+ import {
19
+ RestoreModal
20
+ } from "./chunk-3SGSPHOZ.js";
21
+ import "./chunk-XGIT7YUY.js";
22
+ import {
23
+ ConnectModal,
24
+ disconnectWagmi,
25
+ fromWagmiConnector,
26
+ fromWagmiConnectors,
27
+ getWagmiAccount,
28
+ getWagmiSetup,
29
+ setupConnectModal,
30
+ watchWagmiAccount
31
+ } from "./chunk-NXU2DQAV.js";
32
+ import "./chunk-EUXUH3YW.js";
33
+
34
+ // src/connector.ts
35
+ import { setLuksoConfig } from "@lukso/transaction-view-headless";
36
+ var DEFAULT_CONFIG = {
37
+ autoConnect: false,
38
+ persistConnection: true,
39
+ storageKey: "up-connector-state",
40
+ chainId: 42,
41
+ // LUKSO mainnet
42
+ rpcUrl: "https://rpc.lukso.network"
43
+ };
44
+ var UPConnector = class {
45
+ constructor(config = {}) {
46
+ this.connectors = [];
47
+ this.connectionState = "disconnected";
48
+ this.config = { ...DEFAULT_CONFIG, ...config };
49
+ this.init();
50
+ }
51
+ async init() {
52
+ await this.createAvatar();
53
+ this.startWagmiSync();
54
+ if (this.config.autoConnect && this.config.persistConnection) {
55
+ await this.tryAutoConnect();
56
+ }
57
+ }
58
+ /**
59
+ * Start syncing with wagmi
60
+ * Checks current state and subscribes to changes
61
+ */
62
+ /**
63
+ * Update global Lukso config for address resolution
64
+ */
65
+ updateLuksoConfig(chainId) {
66
+ try {
67
+ if (chainId === 42) {
68
+ setLuksoConfig({
69
+ chainId: 42,
70
+ rpcUrl: "https://rpc.lukso.network"
71
+ });
72
+ } else if (chainId === 4201) {
73
+ setLuksoConfig({
74
+ chainId: 4201,
75
+ rpcUrl: "https://rpc.testnet.lukso.network"
76
+ });
77
+ } else {
78
+ setLuksoConfig({
79
+ chainId,
80
+ rpcUrl: this.config.rpcUrl
81
+ });
82
+ }
83
+ } catch (error) {
84
+ console.warn("\u26A0\uFE0F [Connector] Failed to update Lukso config:", error);
85
+ }
86
+ }
87
+ async startWagmiSync() {
88
+ try {
89
+ const account = await getWagmiAccount();
90
+ if (!account) {
91
+ return;
92
+ }
93
+ if (account.isConnected && account.address) {
94
+ this.handleConnection(
95
+ account.address,
96
+ account.connector,
97
+ account.chainId
98
+ );
99
+ }
100
+ this.wagmiUnsubscribe = await watchWagmiAccount((account2) => {
101
+ if (account2.isConnected && account2.address) {
102
+ if (this.connectedAddress !== account2.address || this.connectedChainId !== account2.chainId) {
103
+ this.handleConnection(
104
+ account2.address,
105
+ account2.connector,
106
+ account2.chainId
107
+ );
108
+ }
109
+ } else {
110
+ if (this.connectionState === "connected") {
111
+ this.handleDisconnection();
112
+ }
113
+ }
114
+ });
115
+ } catch (error) {
116
+ console.warn("\u26A0\uFE0F [Connector] Failed to sync with wagmi:", error);
117
+ }
118
+ }
119
+ async createAvatar() {
120
+ this.avatar = new DraggableAvatar({
121
+ // Default avatar options
122
+ avatarSize: "medium",
123
+ initialPosition: "top-right",
124
+ fallbackText: "\u{1F464}",
125
+ // Override with user config
126
+ ...this.config.avatar,
127
+ // Connection-specific callbacks
128
+ onClick: (event, data) => {
129
+ this.config.avatar?.onClick?.(event, data);
130
+ this.handleAvatarClick(event);
131
+ },
132
+ onAddressClick: (event) => {
133
+ this.config.avatar?.onAddressClick?.(event);
134
+ }
135
+ });
136
+ this.updateAvatarState();
137
+ }
138
+ // TODO: Replace with Lit-based account management modal
139
+ // Legacy createModal() method removed - was using deprecated ConnectorModal
140
+ handleAvatarClick(event) {
141
+ if (this.connectionState === "connected") {
142
+ this.showAccountModal();
143
+ } else {
144
+ this.showConnectionModal();
145
+ }
146
+ }
147
+ showConnectionModal() {
148
+ if (!this.connectModal) {
149
+ this.connectModal = document.querySelector(
150
+ "connect-modal"
151
+ );
152
+ }
153
+ if (!this.connectModal) {
154
+ this.connectModal = document.createElement(
155
+ "connect-modal"
156
+ );
157
+ document.body.appendChild(this.connectModal);
158
+ this.connectModal.addEventListener("connect", ((e) => {
159
+ const connector = e.detail.connector;
160
+ }));
161
+ this.connectModal.addEventListener("close", (() => {
162
+ }));
163
+ }
164
+ this.connectModal.open = true;
165
+ }
166
+ showAccountModal() {
167
+ if (!this.connectedAddress) return;
168
+ if (!this.accountModal) {
169
+ this.accountModal = document.querySelector(
170
+ "account-modal"
171
+ );
172
+ }
173
+ if (!this.accountModal) {
174
+ this.accountModal = document.createElement(
175
+ "account-modal"
176
+ );
177
+ document.body.appendChild(this.accountModal);
178
+ this.accountModal.addEventListener("disconnect", () => {
179
+ this.handleDisconnection();
180
+ });
181
+ }
182
+ this.accountModal.address = this.connectedAddress;
183
+ this.accountModal.chainId = this.connectedChainId;
184
+ this.accountModal.connectorName = this.connectedProvider?.name || "Unknown";
185
+ this.accountModal.open = true;
186
+ }
187
+ handleConnection(address, provider, chainId) {
188
+ this.connectedAddress = address;
189
+ this.connectedProvider = provider;
190
+ this.connectedChainId = chainId;
191
+ this.setConnectionState("connected");
192
+ if (chainId) {
193
+ this.updateLuksoConfig(chainId);
194
+ }
195
+ if (this.avatar) {
196
+ this.avatar.updateAddress(address, void 0, chainId);
197
+ this.avatar.setConnected(true);
198
+ }
199
+ if (this.config.persistConnection) {
200
+ this.saveConnectionState();
201
+ }
202
+ if (this.connectModal) {
203
+ this.connectModal.open = false;
204
+ }
205
+ }
206
+ async handleDisconnection() {
207
+ await disconnectWagmi();
208
+ this.connectedAddress = void 0;
209
+ this.connectedProvider = void 0;
210
+ this.connectedChainId = void 0;
211
+ this.setConnectionState("disconnected");
212
+ if (this.avatar) {
213
+ this.avatar.setConnected(false);
214
+ this.avatar.updateAddress("");
215
+ }
216
+ if (this.config.persistConnection) {
217
+ this.clearConnectionState();
218
+ }
219
+ if (this.connectModal) {
220
+ this.connectModal.open = false;
221
+ }
222
+ }
223
+ setConnectionState(state) {
224
+ const prevState = this.connectionState;
225
+ this.connectionState = state;
226
+ this.updateAvatarState();
227
+ if (prevState !== state) {
228
+ this.config.onConnectionChange?.(state, {
229
+ address: this.connectedAddress,
230
+ provider: this.connectedProvider,
231
+ chainId: this.connectedChainId
232
+ });
233
+ }
234
+ }
235
+ updateAvatarState() {
236
+ if (!this.avatar) return;
237
+ this.avatar.setConnected(this.connectionState === "connected");
238
+ if (this.connectionState === "connected" && this.connectedAddress) {
239
+ this.avatar.updateAddress(
240
+ this.connectedAddress,
241
+ void 0,
242
+ this.connectedChainId
243
+ );
244
+ }
245
+ }
246
+ async tryAutoConnect() {
247
+ const savedState = this.loadConnectionState();
248
+ if (!savedState?.address) return;
249
+ this.setConnectionState("connecting");
250
+ try {
251
+ setTimeout(() => {
252
+ if (savedState.address) {
253
+ this.handleConnection(savedState.address, savedState.provider);
254
+ } else {
255
+ this.setConnectionState("disconnected");
256
+ }
257
+ }, 1e3);
258
+ } catch (error) {
259
+ console.warn("Auto-connect failed:", error);
260
+ this.setConnectionState("disconnected");
261
+ }
262
+ }
263
+ saveConnectionState() {
264
+ if (typeof localStorage === "undefined") return;
265
+ try {
266
+ const state = {
267
+ address: this.connectedAddress,
268
+ provider: this.connectedProvider?.constructor?.name,
269
+ timestamp: Date.now()
270
+ };
271
+ localStorage.setItem(this.config.storageKey, JSON.stringify(state));
272
+ } catch (error) {
273
+ console.warn("Failed to save connection state:", error);
274
+ }
275
+ }
276
+ loadConnectionState() {
277
+ if (typeof localStorage === "undefined") return null;
278
+ try {
279
+ const saved = localStorage.getItem(this.config.storageKey);
280
+ if (!saved) return null;
281
+ const state = JSON.parse(saved);
282
+ const maxAge = 24 * 60 * 60 * 1e3;
283
+ if (Date.now() - state.timestamp > maxAge) {
284
+ this.clearConnectionState();
285
+ return null;
286
+ }
287
+ return state;
288
+ } catch (error) {
289
+ console.warn("Failed to load connection state:", error);
290
+ return null;
291
+ }
292
+ }
293
+ clearConnectionState() {
294
+ if (typeof localStorage === "undefined") return;
295
+ try {
296
+ localStorage.removeItem(this.config.storageKey);
297
+ } catch (error) {
298
+ console.warn("Failed to clear connection state:", error);
299
+ }
300
+ }
301
+ // Public API
302
+ getAvatar() {
303
+ return this.avatar;
304
+ }
305
+ /**
306
+ * @deprecated Legacy modal removed. Use getConnectModal() or create account modal
307
+ */
308
+ getModal() {
309
+ console.warn("getModal() is deprecated - legacy ConnectorModal removed");
310
+ return void 0;
311
+ }
312
+ getConnectModal() {
313
+ return this.connectModal;
314
+ }
315
+ /**
316
+ * @deprecated Use setupConnectModal() instead to configure wagmi connectors globally
317
+ */
318
+ setConnectors(connectors) {
319
+ this.connectors = connectors;
320
+ console.warn(
321
+ "setConnectors() is deprecated. Use setupConnectModal() instead."
322
+ );
323
+ }
324
+ async connect(providerId) {
325
+ this.setConnectionState("connecting");
326
+ if (providerId) {
327
+ } else {
328
+ this.showConnectionModal();
329
+ }
330
+ }
331
+ disconnect() {
332
+ this.handleDisconnection();
333
+ }
334
+ getConnectionState() {
335
+ return this.connectionState;
336
+ }
337
+ getConnectedAddress() {
338
+ return this.connectedAddress;
339
+ }
340
+ getConnectedProvider() {
341
+ return this.connectedProvider;
342
+ }
343
+ isConnected() {
344
+ return this.connectionState === "connected";
345
+ }
346
+ showModal() {
347
+ if (this.isConnected()) {
348
+ this.showAccountModal();
349
+ } else {
350
+ this.showConnectionModal();
351
+ }
352
+ }
353
+ hideModal() {
354
+ if (this.connectModal) {
355
+ this.connectModal.open = false;
356
+ }
357
+ }
358
+ updateConfig(config) {
359
+ this.config = { ...this.config, ...config };
360
+ if (config.avatar && this.avatar) {
361
+ }
362
+ }
363
+ destroy() {
364
+ if (this.wagmiUnsubscribe) {
365
+ this.wagmiUnsubscribe();
366
+ this.wagmiUnsubscribe = void 0;
367
+ }
368
+ this.avatar?.destroy();
369
+ if (this.connectModal) {
370
+ this.connectModal.open = false;
371
+ if (this.connectModal.parentNode) {
372
+ this.connectModal.parentNode.removeChild(this.connectModal);
373
+ }
374
+ }
375
+ this.avatar = void 0;
376
+ this.connectModal = void 0;
377
+ this.connectedAddress = void 0;
378
+ this.connectedProvider = void 0;
379
+ this.connectionState = "disconnected";
380
+ }
381
+ };
382
+ function createConnector(config = {}) {
383
+ return new UPConnector(config);
384
+ }
385
+
386
+ // src/popup-instance.ts
387
+ var PopupEventEmitter = class {
388
+ constructor() {
389
+ this.handlers = /* @__PURE__ */ new Map();
390
+ }
391
+ on(event, handler) {
392
+ if (!this.handlers.has(event)) {
393
+ this.handlers.set(event, /* @__PURE__ */ new Set());
394
+ }
395
+ this.handlers.get(event).add(handler);
396
+ }
397
+ off(event, handler) {
398
+ this.handlers.get(event)?.delete(handler);
399
+ }
400
+ emit(event, ...args) {
401
+ this.handlers.get(event)?.forEach((handler) => {
402
+ try {
403
+ handler(...args);
404
+ } catch (error) {
405
+ console.error("Error in popup event handler:", error);
406
+ }
407
+ });
408
+ }
409
+ clear() {
410
+ this.handlers.clear();
411
+ }
412
+ };
413
+ var BasePopupInstance = class {
414
+ constructor(request) {
415
+ this.request = request;
416
+ this.events = new PopupEventEmitter();
417
+ this.messageHandlers = /* @__PURE__ */ new Set();
418
+ this._isClosed = false;
419
+ this._isVisible = false;
420
+ }
421
+ get isVisible() {
422
+ return this._isVisible && !this._isClosed;
423
+ }
424
+ get isClosed() {
425
+ return this._isClosed;
426
+ }
427
+ postMessage(data) {
428
+ if (!this._isClosed && this.contentWindow) {
429
+ try {
430
+ this.contentWindow.postMessage(data, "*");
431
+ } catch (error) {
432
+ console.error("Failed to post message to popup:", error);
433
+ }
434
+ }
435
+ }
436
+ onMessage(handler) {
437
+ this.messageHandlers.add(handler);
438
+ }
439
+ removeMessageHandler(handler) {
440
+ this.messageHandlers.delete(handler);
441
+ }
442
+ handleMessage(data) {
443
+ this.messageHandlers.forEach((handler) => {
444
+ try {
445
+ handler(data);
446
+ } catch (error) {
447
+ console.error("Error in popup message handler:", error);
448
+ }
449
+ });
450
+ this.events.emit("message", data);
451
+ }
452
+ on(event, handler) {
453
+ this.events.on(event, handler);
454
+ }
455
+ off(event, handler) {
456
+ this.events.off(event, handler);
457
+ }
458
+ cleanup() {
459
+ this.messageHandlers.clear();
460
+ this.events.clear();
461
+ }
462
+ };
463
+ var ModalPopupInstance = class extends BasePopupInstance {
464
+ async show() {
465
+ if (this._isClosed) {
466
+ throw new Error("Popup is closed");
467
+ }
468
+ if (!this.modalElement) {
469
+ await this.createElement();
470
+ }
471
+ return new Promise((resolve) => {
472
+ if (!this.modalElement) {
473
+ resolve();
474
+ return;
475
+ }
476
+ if (!this.modalElement.parentNode) {
477
+ document.body.appendChild(this.modalElement);
478
+ }
479
+ this._isVisible = true;
480
+ this.modalElement.offsetHeight;
481
+ this.modalElement.classList.add("visible");
482
+ this.events.emit("show");
483
+ setTimeout(() => resolve(), 50);
484
+ });
485
+ }
486
+ hide() {
487
+ if (!this._isVisible || this._isClosed || !this.modalElement) return;
488
+ this._isVisible = false;
489
+ this.modalElement.classList.remove("visible");
490
+ this.events.emit("hide");
491
+ setTimeout(() => {
492
+ if (this.modalElement && this.modalElement.parentNode) {
493
+ this.modalElement.parentNode.removeChild(this.modalElement);
494
+ }
495
+ }, 300);
496
+ }
497
+ close() {
498
+ if (this._isClosed) return;
499
+ this._isClosed = true;
500
+ this._isVisible = false;
501
+ if (this.modalElement) {
502
+ this.modalElement.classList.remove("visible");
503
+ setTimeout(() => {
504
+ if (this.modalElement && this.modalElement.parentNode) {
505
+ this.modalElement.parentNode.removeChild(this.modalElement);
506
+ }
507
+ }, 300);
508
+ }
509
+ if (this.messageListener) {
510
+ window.removeEventListener("message", this.messageListener);
511
+ }
512
+ this.events.emit("close");
513
+ this.cleanup();
514
+ }
515
+ get contentWindow() {
516
+ return this.iframeElement?.contentWindow || void 0;
517
+ }
518
+ async createElement() {
519
+ if (typeof document === "undefined") return;
520
+ await this.createStyles();
521
+ this.modalElement = document.createElement("div");
522
+ this.modalElement.className = "up-popup-modal";
523
+ const { width = 480, height = 640 } = this.request.size || {};
524
+ this.modalElement.innerHTML = `
525
+ <div class="up-popup-modal-content" style="width: ${width}px; height: ${height}px;">
526
+ <button class="up-popup-close" type="button">
527
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor">
528
+ <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" />
529
+ </svg>
530
+ </button>
531
+ <iframe src="${this.request.url || "about:blank"}" allow="publickey-credentials-get; publickey-credentials-create"></iframe>
532
+ </div>
533
+ `;
534
+ const closeButton = this.modalElement.querySelector(
535
+ ".up-popup-close"
536
+ );
537
+ this.iframeElement = this.modalElement.querySelector(
538
+ "iframe"
539
+ );
540
+ closeButton.addEventListener("click", () => this.hide());
541
+ this.modalElement.addEventListener("click", (e) => {
542
+ if (e.target === this.modalElement) {
543
+ this.hide();
544
+ }
545
+ });
546
+ this.messageListener = (event) => {
547
+ if (event.source === this.iframeElement?.contentWindow) {
548
+ this.handleMessage(event.data);
549
+ }
550
+ };
551
+ window.addEventListener("message", this.messageListener);
552
+ }
553
+ async createStyles() {
554
+ if (typeof document === "undefined") return;
555
+ if (document.querySelector("#up-popup-modal-styles")) return;
556
+ const style = document.createElement("style");
557
+ style.id = "up-popup-modal-styles";
558
+ style.textContent = `
559
+ .up-popup-modal {
560
+ position: fixed;
561
+ top: 0;
562
+ left: 0;
563
+ width: 100vw;
564
+ height: 100vh;
565
+ background: rgba(0, 0, 0, 0.5);
566
+ backdrop-filter: blur(8px);
567
+ z-index: 10000;
568
+ display: flex;
569
+ align-items: center;
570
+ justify-content: center;
571
+ opacity: 0;
572
+ visibility: hidden;
573
+ transition: all 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
574
+ padding: 16px;
575
+ }
576
+
577
+ .up-popup-modal.visible {
578
+ opacity: 1;
579
+ visibility: visible;
580
+ }
581
+
582
+ .up-popup-modal-content {
583
+ background: white;
584
+ border-radius: 12px;
585
+ overflow: hidden;
586
+ position: relative;
587
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
588
+ transform: scale(0.95) translateY(20px);
589
+ transition: all 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
590
+ }
591
+
592
+ .up-popup-modal.visible .up-popup-modal-content {
593
+ transform: scale(1) translateY(0);
594
+ }
595
+
596
+ .up-popup-close {
597
+ position: absolute;
598
+ top: 12px;
599
+ right: 12px;
600
+ z-index: 10;
601
+ background: rgba(255, 255, 255, 0.9);
602
+ border: none;
603
+ border-radius: 50%;
604
+ width: 32px;
605
+ height: 32px;
606
+ cursor: pointer;
607
+ display: flex;
608
+ align-items: center;
609
+ justify-content: center;
610
+ color: #6b7280;
611
+ transition: all 0.2s ease;
612
+ }
613
+
614
+ .up-popup-close:hover {
615
+ background: rgba(255, 255, 255, 1);
616
+ color: #374151;
617
+ }
618
+
619
+ .up-popup-modal iframe {
620
+ width: 100%;
621
+ height: 100%;
622
+ border: none;
623
+ border-radius: 12px;
624
+ }
625
+
626
+ @media (max-width: 640px) {
627
+ .up-popup-modal {
628
+ padding: 0;
629
+ align-items: flex-end;
630
+ }
631
+
632
+ .up-popup-modal-content {
633
+ width: 100% !important;
634
+ height: 85vh !important;
635
+ border-radius: 12px 12px 0 0;
636
+ transform: translateY(100%);
637
+ }
638
+
639
+ .up-popup-modal.visible .up-popup-modal-content {
640
+ transform: translateY(0);
641
+ }
642
+
643
+ .up-popup-modal iframe {
644
+ border-radius: 12px 12px 0 0;
645
+ }
646
+ }
647
+
648
+ @media (max-width: 480px) {
649
+ .up-popup-modal {
650
+ align-items: stretch;
651
+ }
652
+
653
+ .up-popup-modal-content {
654
+ height: 100vh !important;
655
+ border-radius: 0;
656
+ }
657
+
658
+ .up-popup-modal iframe {
659
+ border-radius: 0;
660
+ }
661
+ }
662
+ `;
663
+ document.head.appendChild(style);
664
+ }
665
+ };
666
+ var WindowPopupInstance = class extends BasePopupInstance {
667
+ constructor() {
668
+ super(...arguments);
669
+ this.popupWindow = null;
670
+ }
671
+ async show() {
672
+ if (this._isClosed) {
673
+ throw new Error("Popup is closed");
674
+ }
675
+ if (!this.popupWindow || this.popupWindow.closed) {
676
+ await this.createPopupWindow();
677
+ }
678
+ if (this.popupWindow && !this.popupWindow.closed) {
679
+ this.popupWindow.focus();
680
+ this._isVisible = true;
681
+ this.events.emit("show");
682
+ }
683
+ }
684
+ hide() {
685
+ if (this.popupWindow && !this.popupWindow.closed) {
686
+ this.popupWindow.blur();
687
+ }
688
+ this._isVisible = false;
689
+ this.events.emit("hide");
690
+ }
691
+ close() {
692
+ if (this._isClosed) return;
693
+ this._isClosed = true;
694
+ this._isVisible = false;
695
+ if (this.popupWindow && !this.popupWindow.closed) {
696
+ this.popupWindow.close();
697
+ }
698
+ this.popupWindow = null;
699
+ if (this.messageListener) {
700
+ window.removeEventListener("message", this.messageListener);
701
+ }
702
+ this.events.emit("close");
703
+ this.cleanup();
704
+ }
705
+ get contentWindow() {
706
+ return this.popupWindow && !this.popupWindow.closed ? this.popupWindow : void 0;
707
+ }
708
+ get isVisible() {
709
+ return !this._isClosed && !!(this.popupWindow && !this.popupWindow.closed);
710
+ }
711
+ async createPopupWindow() {
712
+ if (!this.request.url) {
713
+ throw new Error("URL required for popup windows");
714
+ }
715
+ const { width = 400, height = 600 } = this.request.size || {};
716
+ const position = this.request.position || "center";
717
+ const features = [
718
+ `width=${width}`,
719
+ `height=${height}`,
720
+ ...this.getPositionFeatures(position, width, height),
721
+ "scrollbars=yes",
722
+ "resizable=yes",
723
+ "status=no",
724
+ "location=no",
725
+ "toolbar=no",
726
+ "menubar=no"
727
+ ].join(",");
728
+ this.popupWindow = window.open(this.request.url, "_blank", features);
729
+ if (!this.popupWindow) {
730
+ throw new Error("Popup blocked or failed to open");
731
+ }
732
+ this.messageListener = (event) => {
733
+ if (event.source === this.popupWindow) {
734
+ this.handleMessage(event.data);
735
+ }
736
+ };
737
+ window.addEventListener("message", this.messageListener);
738
+ const checkClosed = () => {
739
+ if (this.popupWindow?.closed && !this._isClosed) {
740
+ this.close();
741
+ } else if (!this._isClosed) {
742
+ setTimeout(checkClosed, 1e3);
743
+ }
744
+ };
745
+ setTimeout(checkClosed, 1e3);
746
+ }
747
+ getPositionFeatures(position, width, height) {
748
+ const screenLeft = window.screenLeft !== void 0 ? window.screenLeft : window.screenX;
749
+ const screenTop = window.screenTop !== void 0 ? window.screenTop : window.screenY;
750
+ const windowWidth = window.innerWidth || document.documentElement.clientWidth || screen.width;
751
+ const windowHeight = window.innerHeight || document.documentElement.clientHeight || screen.height;
752
+ let left;
753
+ let top;
754
+ switch (position) {
755
+ case "top-right":
756
+ left = screenLeft + windowWidth - width - 20;
757
+ top = screenTop + 20;
758
+ break;
759
+ case "center":
760
+ default:
761
+ left = screenLeft + (windowWidth - width) / 2;
762
+ top = screenTop + (windowHeight - height) / 2;
763
+ break;
764
+ }
765
+ return [`left=${Math.max(0, left)}`, `top=${Math.max(0, top)}`];
766
+ }
767
+ };
768
+ export {
769
+ AccountModal,
770
+ BackupModal,
771
+ ConnectModal,
772
+ DraggableAvatar,
773
+ EMBEDDED_WALLET_ID,
774
+ EMBEDDED_WALLET_URL_DEV,
775
+ EMBEDDED_WALLET_URL_PROD,
776
+ ModalPopupInstance,
777
+ RestoreModal,
778
+ UPConnector,
779
+ UP_EXTENSION_ID,
780
+ WindowPopupInstance,
781
+ createAvatar,
782
+ createConnector,
783
+ createConnector as default,
784
+ disconnectWagmi,
785
+ fromWagmiConnector,
786
+ fromWagmiConnectors,
787
+ getWagmiAccount,
788
+ getWagmiSetup,
789
+ setupConnectModal,
790
+ setupLuksoConnector,
791
+ watchWagmiAccount
792
+ };
793
+ //# sourceMappingURL=index.js.map