@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
@@ -0,0 +1,408 @@
1
+ /**
2
+ * EOA Connection View - Lit Component
3
+ *
4
+ * Displays available EOA (Externally Owned Account) wallets for connection.
5
+ */
6
+
7
+ import { Task } from '@lit/task'
8
+ import { withDeviceService, withIntlService } from '@lukso/core/mixins'
9
+ import debug from 'debug'
10
+ import { html, nothing, type TemplateResult } from 'lit'
11
+ import { property, state } from 'lit/decorators.js'
12
+ import { keyed } from 'lit/directives/keyed.js'
13
+
14
+ import { ConnectModalBase } from '../connect-modal.base'
15
+ import {
16
+ REOWN_PROJECT_ID,
17
+ SUPPORTED_WALLET_IDS_DESKTOP,
18
+ SUPPORTED_WALLET_IDS_MOBILE,
19
+ WALLETS_API_URL,
20
+ } from '../connect-modal.config'
21
+ import {
22
+ renderBackButton,
23
+ renderCloseButton,
24
+ renderLogo,
25
+ renderPlaceholder,
26
+ renderTitle,
27
+ } from '../connect-modal.templates'
28
+ import type {
29
+ Wallet,
30
+ WalletAppType,
31
+ WalletConnector,
32
+ WalletResponse,
33
+ } from '../connect-modal.types'
34
+
35
+ // Import lukso web components
36
+ import '@lukso/web-components/dist/components/lukso-button'
37
+ import '@lukso/web-components/dist/components/lukso-icon'
38
+ import '@lukso/web-components/dist/components/lukso-tag'
39
+
40
+ const logInfo = debug('connect-modal:info')
41
+
42
+ export class EoaConnectionView extends withIntlService(
43
+ withDeviceService(ConnectModalBase)
44
+ ) {
45
+ @property({ type: Array }) connectors: WalletConnector[] = []
46
+
47
+ @state() private isConnecting = false
48
+ @state() private connectingRdns: string | undefined = undefined
49
+
50
+ /**
51
+ * Get WalletConnect connector
52
+ */
53
+ private get walletConnectConnector(): WalletConnector | undefined {
54
+ return this.connectors.find((connector) => connector.type === 'mobile')
55
+ }
56
+
57
+ /**
58
+ * Get EOA connectors
59
+ */
60
+ private get eoaConnectors(): WalletConnector[] {
61
+ return this.connectors.filter(
62
+ (connector) =>
63
+ connector.type !== 'embedded' &&
64
+ connector.type !== 'extension' &&
65
+ connector.type !== 'mobile' &&
66
+ connector.rdns !== 'io.lukso.up-extension' &&
67
+ connector.slug !== 'injected'
68
+ )
69
+ }
70
+
71
+ /**
72
+ * Get supported wallet IDs based on device type
73
+ *
74
+ * @returns
75
+ */
76
+ private supportedWalletIds(): string[] {
77
+ return this.device?.isMobile
78
+ ? SUPPORTED_WALLET_IDS_MOBILE
79
+ : SUPPORTED_WALLET_IDS_DESKTOP
80
+ }
81
+
82
+ /**
83
+ * Task to fetch EOA wallets - handles loading/error states automatically
84
+ */
85
+ private walletsTask = new Task(this as any, {
86
+ task: async ([_isMobile], { signal }): Promise<Wallet[]> => {
87
+ const walletIds: string[] = this.supportedWalletIds()
88
+ const url = `${WALLETS_API_URL}?projectId=${REOWN_PROJECT_ID}&ids=${walletIds.join(',')}`
89
+
90
+ const response = await fetch(url, { signal })
91
+
92
+ if (!response.ok) {
93
+ throw new Error('Failed to fetch wallets')
94
+ }
95
+
96
+ const data = (await response.json()) as WalletResponse
97
+
98
+ return (
99
+ Object.entries(data.listings || {})
100
+ // map to attach installed status and connector
101
+ .map(([, wallet]) => {
102
+ const connector = this.eoaConnectors.find(
103
+ (connector: WalletConnector) => connector.rdns === wallet.rdns
104
+ )
105
+
106
+ return {
107
+ ...wallet,
108
+ isInstalled: connector?.rdns === wallet.rdns,
109
+ connector,
110
+ }
111
+ })
112
+ // sort by installed wallets first
113
+ .sort((a: Wallet, b: Wallet) =>
114
+ a.isInstalled === b.isInstalled ? 0 : a.isInstalled ? -1 : 1
115
+ )
116
+ )
117
+ },
118
+ args: () => [this.device?.isMobile],
119
+ })
120
+
121
+ /**
122
+ * Get device type
123
+ */
124
+ private deviceType(): WalletAppType {
125
+ if (this.device?.isMobile || this.device?.isTablet) {
126
+ if (this.device?.isIOS) {
127
+ return 'ios'
128
+ }
129
+
130
+ return 'android'
131
+ }
132
+
133
+ if (this.device?.isChrome) {
134
+ return 'chrome'
135
+ }
136
+
137
+ if (this.device?.isFirefox) {
138
+ return 'firefox'
139
+ }
140
+
141
+ if (this.device?.isSafari) {
142
+ return 'safari'
143
+ }
144
+
145
+ if (this.device?.isEdge) {
146
+ return 'edge'
147
+ }
148
+
149
+ if (this.device?.isOpera) {
150
+ return 'opera'
151
+ }
152
+
153
+ return 'browser'
154
+ }
155
+
156
+ /**
157
+ * Close modal
158
+ */
159
+ private handleClose(): void {
160
+ this.dispatchEvent(
161
+ new CustomEvent('on-close', { bubbles: true, composed: true })
162
+ )
163
+ }
164
+
165
+ /**
166
+ * Back to initial screen
167
+ */
168
+ private handleBack(): void {
169
+ this.dispatchEvent(
170
+ new CustomEvent('on-back', { bubbles: true, composed: true })
171
+ )
172
+ }
173
+
174
+ /**
175
+ * Handle wallet connect click
176
+ *
177
+ * @param wallet
178
+ */
179
+ private handleConnect(wallet: Wallet, event: CustomEvent): void {
180
+ event.stopPropagation() // Prevent event bubbling
181
+ this.connectingRdns = wallet.rdns
182
+
183
+ if (this.device?.isMobile) {
184
+ this.connectMobile(wallet)
185
+ return
186
+ }
187
+
188
+ this.connectDesktop(wallet)
189
+ }
190
+
191
+ /**
192
+ * Connect to wallet on desktop using selected connector
193
+ *
194
+ * @param wallet
195
+ */
196
+ private async connectDesktop(wallet: Wallet): Promise<void> {
197
+ // Open wallet app store link if wallet is not installed
198
+ if (!wallet.isInstalled) {
199
+ window.open(wallet.app[this.deviceType()], '_blank')
200
+ return
201
+ }
202
+
203
+ const connector = wallet.connector
204
+
205
+ if (connector) {
206
+ try {
207
+ logInfo('Connecting via connector:', connector)
208
+ this.isConnecting = true
209
+
210
+ await connector.connect()
211
+
212
+ // Dispatch connect event
213
+ this.dispatchEvent(
214
+ new CustomEvent('on-connect', {
215
+ detail: { connector },
216
+ bubbles: true,
217
+ composed: true,
218
+ })
219
+ )
220
+ } catch (error) {
221
+ // Dispatch error event
222
+ this.dispatchEvent(
223
+ new CustomEvent('on-error', {
224
+ detail: { error },
225
+ bubbles: true,
226
+ composed: true,
227
+ })
228
+ )
229
+ } finally {
230
+ this.isConnecting = false
231
+ }
232
+ }
233
+ }
234
+
235
+ /**
236
+ * Connect to wallet on mobile using WalletConnect
237
+ */
238
+ private async connectMobile(wallet: Wallet): Promise<void> {
239
+ const connector = this.walletConnectConnector
240
+
241
+ if (connector) {
242
+ try {
243
+ logInfo('Connecting via WalletConnect connector:', connector)
244
+ this.isConnecting = true
245
+
246
+ // Start the connection - this initiates the WalletConnect flow
247
+ // The promise will resolve when wallet approves or reject when user rejects
248
+ const connectPromise = connector.connect()
249
+
250
+ // Get the provider to listen for the display_uri event
251
+ const provider = await connector.getProvider?.()
252
+
253
+ // Listen for the display_uri event which is emitted after connect
254
+ if (provider) {
255
+ const handleDisplayUri = (displayUri: string) => {
256
+ logInfo('WalletConnect URI received:', displayUri)
257
+
258
+ const encodedUri = encodeURIComponent(displayUri)
259
+
260
+ // Use native deep link if available
261
+ if (wallet.mobile?.native) {
262
+ window.location.href = `${wallet.mobile.native}wc?uri=${encodedUri}`
263
+ } else if (wallet.rdns === 'com.coinbase.wallet') {
264
+ // Coinbase has no native deep link provided, use custom scheme
265
+ window.location.href = `cbwallet://wc?uri=${encodedUri}`
266
+ } else {
267
+ // For other wallets, use universal wc: scheme
268
+ window.location.href = displayUri
269
+ }
270
+
271
+ // Clean up listener
272
+ provider.off('display_uri', handleDisplayUri)
273
+ }
274
+
275
+ provider.on('display_uri', handleDisplayUri)
276
+ }
277
+
278
+ // Wait for the connection to complete
279
+ // This will throw if the user rejects the connection
280
+ await connectPromise
281
+
282
+ // Dispatch connect event only if connection succeeded
283
+ this.dispatchEvent(
284
+ new CustomEvent('on-connect', {
285
+ detail: { connector },
286
+ bubbles: true,
287
+ composed: true,
288
+ })
289
+ )
290
+ } catch (error) {
291
+ // Dispatch error event
292
+ this.dispatchEvent(
293
+ new CustomEvent('on-error', {
294
+ detail: { error },
295
+ bubbles: true,
296
+ composed: true,
297
+ })
298
+ )
299
+ } finally {
300
+ this.isConnecting = false
301
+ }
302
+ }
303
+ }
304
+
305
+ /**
306
+ * Render the list of EOA wallets
307
+ */
308
+ private renderWalletsList(): TemplateResult<1> | undefined {
309
+ return this.walletsTask.render({
310
+ // Success state
311
+ complete: (wallets: any) =>
312
+ html`${wallets.map((wallet: any) => {
313
+ const isLoading =
314
+ this.isConnecting && this.connectingRdns === wallet.rdns
315
+ const isInstalled = this.eoaConnectors.some(
316
+ (connector: WalletConnector) => connector.rdns === wallet.rdns
317
+ )
318
+ const logo = wallet.image_url?.sm
319
+ ? html`<img src="${wallet.image_url.sm}" alt="${wallet.name} logo" class="h-8 rounded-full mr-2" />`
320
+ : nothing
321
+
322
+ return keyed(
323
+ wallet.slug,
324
+ html`<lukso-button
325
+ variant="secondary"
326
+ size=${this.device?.isMobile ? 'medium' : 'large'}
327
+ is-full-width
328
+ ?disabled=${this.isConnecting}
329
+ ?is-loading=${isLoading}
330
+ loading-text=${wallet.name}
331
+ @click=${(event: CustomEvent) => this.handleConnect(wallet, event)}
332
+ >
333
+ <div
334
+ class="grid w-full grid-cols-[max-content,auto,max-content] items-center gap-3 text-left animate-fade-in"
335
+ >
336
+ ${logo}
337
+ <div class="truncate">${wallet.name}</div>
338
+ <div class="flex items-center">
339
+ ${
340
+ isInstalled
341
+ ? html`<lukso-tag
342
+ size="x-small"
343
+ text-color="green-45"
344
+ background-color="green-85"
345
+ >
346
+ ${this.formatMessage('connect_modal_installed')}
347
+ </lukso-tag>`
348
+ : nothing
349
+ }
350
+ </div>
351
+ </div>
352
+ </lukso-button>`
353
+ )
354
+ })}`,
355
+ // Loading state
356
+ pending: () =>
357
+ html`${this.supportedWalletIds().map(() =>
358
+ renderPlaceholder(
359
+ `w-full ${this.device?.isMobile ? 'h-10 !rounded-10' : 'h-12 !rounded-12'}`
360
+ )
361
+ )}`,
362
+ // Error state
363
+ error: (_error: unknown) => {
364
+ return html`<div class="flex flex-col justify-center items-center py-10">
365
+ <div class="mb-4">${this.formatMessage('connect_modal_failed_to_load')}</div>
366
+ <lukso-button size="medium" variant="secondary" @click=${() => this.walletsTask.run()}>${this.formatMessage('connect_modal_try_again')}</lukso-button>
367
+ </div>`
368
+ },
369
+ })
370
+ }
371
+
372
+ /**
373
+ * Main render method
374
+ */
375
+ render(): TemplateResult<1> {
376
+ return html`
377
+ <div class="flex justify-between">
378
+ <button
379
+ @click=${this.handleBack}
380
+ >
381
+ ${renderBackButton()}
382
+ </button>
383
+
384
+ <button
385
+ @click=${this.handleClose}
386
+ >
387
+ ${renderCloseButton()}
388
+ </button>
389
+ </div>
390
+ <div class="flex flex-col items-center text-center">
391
+ ${renderLogo()}
392
+ ${renderTitle(this.formatMessage('connect_modal_eoa_title'))}
393
+ <div class="mt-2 flex w-full flex-col gap-2">
394
+ ${this.renderWalletsList()}
395
+ </div>
396
+ </div>
397
+ `
398
+ }
399
+ }
400
+
401
+ // Register custom element
402
+ customElements.define('eoa-connection-view', EoaConnectionView as any)
403
+
404
+ declare global {
405
+ interface HTMLElementTagNameMap {
406
+ 'eoa-connection-view': EoaConnectionView
407
+ }
408
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * QR Code View - Lit Component
3
+ *
4
+ * Displays Wallet Connect QR code for mobile connection.
5
+ */
6
+
7
+ import { html, type TemplateResult } from 'lit'
8
+
9
+ import { ConnectModalBase } from '../connect-modal.base'
10
+
11
+ // Import lukso web components
12
+ import '@lukso/web-components/dist/components/lukso-qr-code'
13
+ import { withIntlService } from '@lukso/core/mixins'
14
+ import { property } from 'lit/decorators.js'
15
+ import { renderBackButton, renderCloseButton } from '../connect-modal.templates'
16
+ import cubeGlassImage from '../images/up-cube-glass.png'
17
+
18
+ export class QrCodeView extends withIntlService(ConnectModalBase) {
19
+ @property({ type: String }) data: string | undefined = undefined
20
+
21
+ /**
22
+ * Back to initial screen
23
+ */
24
+ private handleBack(): void {
25
+ this.dispatchEvent(
26
+ new CustomEvent('on-back', { bubbles: true, composed: true })
27
+ )
28
+ }
29
+
30
+ /**
31
+ * Close modal
32
+ */
33
+ private handleClose(): void {
34
+ this.dispatchEvent(
35
+ new CustomEvent('on-close', { bubbles: true, composed: true })
36
+ )
37
+ }
38
+
39
+ render(): TemplateResult<1> {
40
+ return html`<div class="flex justify-between">
41
+ <button
42
+ @click=${this.handleBack}
43
+ >
44
+ ${renderBackButton()}
45
+ </button>
46
+
47
+ <button
48
+ @click=${this.handleClose}
49
+ >
50
+ ${renderCloseButton()}
51
+ </button>
52
+ </div>
53
+ <div class="flex flex-col items-center text-center">
54
+ <div class="heading-inter-21-semi-bold mb-4">
55
+ ${this.formatMessage('connect_modal_qr_code_title')}
56
+ </div>
57
+ <div class="paragraph-inter-16-regular mb-6">
58
+ ${this.formatMessage('connect_modal_qr_code_description')}
59
+ </div>
60
+ <lukso-qr-code size="340" .value="${this.data}" image="${cubeGlassImage}"></lukso-qr-code></div>`
61
+ }
62
+ }
63
+
64
+ // Register custom element
65
+ customElements.define('qr-code-view', QrCodeView as any)
66
+
67
+ declare global {
68
+ interface HTMLElementTagNameMap {
69
+ 'qr-code-view': QrCodeView
70
+ }
71
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Connect Modal Base - Lit Component
3
+ *
4
+ * Base component for Connect Modal. Provides shared styles for all components.
5
+ */
6
+
7
+ import { css, LitElement, unsafeCSS } from 'lit'
8
+ import output from './styles/styles.css?raw'
9
+
10
+ const style = css`
11
+ ${unsafeCSS(output)}
12
+ `
13
+
14
+ export class ConnectModalBase extends LitElement {
15
+ static styles = [style]
16
+ }
17
+
18
+ export default style
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Supported wallet IDs (from Reown) for mobile
3
+ */
4
+ export const SUPPORTED_WALLET_IDS_MOBILE = [
5
+ 'c57ca95b47569778a828d19178114f4db188b89b763c899ba0be274e97267d96', // MetaMask
6
+ ]
7
+
8
+ /**
9
+ * Supported wallet IDs (from Reown) for desktop
10
+ */
11
+ export const SUPPORTED_WALLET_IDS_DESKTOP = [
12
+ 'c57ca95b47569778a828d19178114f4db188b89b763c899ba0be274e97267d96', // MetaMask
13
+ 'ecc4036f814562b41a5268adc86270fba1365471402006302e70169465b7ac18', // Zerion
14
+ 'fd20dc426fb37566d803205b19bbc1d4096b248ac04548e3cfb6b3a38bd033aa', // Coinbase
15
+ // '1ae92b26df02f0abca6304df07debccd18262fdf5fe82daa81593582dac9a369', // Rainbow - temporary hide due to issue in Wagmi detection of this wallet
16
+ ]
17
+
18
+ // Wallets api from https://walletguide.walletconnect.network/
19
+ export const WALLETS_API_URL =
20
+ 'https://explorer-api.walletconnect.com/v3/wallets'
21
+
22
+ // Reown project id
23
+ export const REOWN_PROJECT_ID = '68cee9cbecf1293488f207237e89f337'
24
+
25
+ // deep link prefix used by Mobile App
26
+ export const MOBILE_APP_DEEP_LINK_PREFIX =
27
+ 'io.universaleverything.universalprofiles'
@@ -0,0 +1,21 @@
1
+ import { cn } from '@lukso/web-components/tools'
2
+ import { html } from 'lit'
3
+ import cubeGlassImage from './images/up-cube-glass.png'
4
+
5
+ export const renderCloseButton = () =>
6
+ html`<lukso-icon name="close-lg"
7
+ class="cursor-pointer transition-opacity hover:opacity-60"></lukso-icon>`
8
+
9
+ export const renderBackButton = () =>
10
+ html`<lukso-icon name="arrow-left-lg" class="cursor-pointer transition-opacity hover:opacity-60"></lukso-icon>`
11
+
12
+ export const renderLogo = () =>
13
+ html`<img src="${cubeGlassImage}" alt="" class="mb-5 w-14 animate-bounce2" />`
14
+
15
+ export const renderTitle = (title: string) =>
16
+ html`<h2 class="m-0 mb-4 text-neutral-20 dark:text-white heading-inter-21-semi-bold">
17
+ ${title}
18
+ </h2>`
19
+
20
+ export const renderPlaceholder = (style: string) =>
21
+ html`<div class="${cn('bg-neutral-90 dark:bg-neutral-80 rounded-4 animate-pulse', style)}"></div>`