@taskon/widget-react 0.0.1-beta.6 → 0.0.1-beta.7

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 (32) hide show
  1. package/README.md +48 -43
  2. package/dist/EligibilityInfo.css +2 -33
  3. package/dist/TaskOnProvider.css +287 -0
  4. package/dist/ThemeProvider.css +227 -0
  5. package/dist/UserCenterWidget2.css +32 -290
  6. package/dist/WidgetShell.css +0 -227
  7. package/dist/chunks/{CommunityTaskList-Hde2OKHH.js → CommunityTaskList-D0uVD8wD.js} +37 -58
  8. package/dist/chunks/{EligibilityInfo-BV0Z2TgY.js → EligibilityInfo-Cf6hx9-a.js} +17 -209
  9. package/dist/chunks/{LeaderboardWidget-BNGRD5Bu.js → LeaderboardWidget-DyoiiNS6.js} +10 -9
  10. package/dist/chunks/{PageBuilder-C5DSHiW9.js → PageBuilder-DoAFPm6-.js} +5 -5
  11. package/dist/chunks/{Quest-DG9zfXJo.js → Quest-ySZlYd4u.js} +6 -11
  12. package/dist/chunks/TaskOnProvider-CxtFIs3n.js +2072 -0
  13. package/dist/chunks/{WidgetShell-D7yC894Y.js → ThemeProvider-CulHkqqY.js} +1354 -617
  14. package/dist/chunks/UserCenterWidget-BJsc_GSZ.js +3246 -0
  15. package/dist/chunks/{UserCenterWidget-D5ttw4hO.js → UserCenterWidget-STq8kpV4.js} +162 -365
  16. package/dist/chunks/WidgetShell-8xn-Jivw.js +659 -0
  17. package/dist/chunks/useIsMobile-D6Ybur-6.js +30 -0
  18. package/dist/chunks/useToast-BGJhd3BX.js +93 -0
  19. package/dist/community-task.js +1 -1
  20. package/dist/core.d.ts +9 -15
  21. package/dist/core.js +3 -3
  22. package/dist/index.d.ts +64 -15
  23. package/dist/index.js +15 -10
  24. package/dist/leaderboard.js +1 -1
  25. package/dist/page-builder.js +1 -1
  26. package/dist/quest.js +1 -1
  27. package/dist/user-center.js +1 -1
  28. package/package.json +1 -1
  29. package/dist/chunks/TaskOnProvider-BhamHIyY.js +0 -1260
  30. package/dist/chunks/ThemeProvider-mXLdLSkq.js +0 -1397
  31. package/dist/chunks/UserCenterWidget-jDO5zTN1.js +0 -3297
  32. package/dist/chunks/useToast-CaRkylKe.js +0 -304
package/README.md CHANGED
@@ -23,7 +23,7 @@ import { QuestWidget } from "@taskon/widget-react/quest";
23
23
  const App = () => (
24
24
  <TaskOnProvider
25
25
  config={{
26
- apiKey: "your-api-key",
26
+ clientId: "your-client-id",
27
27
  }}
28
28
  >
29
29
  <YourApp />
@@ -62,7 +62,7 @@ import { QuestWidget } from "@taskon/widget-react/quest";
62
62
  const App = () => (
63
63
  <TaskOnProvider
64
64
  config={{
65
- apiKey: "your-api-key",
65
+ clientId: "your-client-id",
66
66
  }}
67
67
  >
68
68
  <YourApp />
@@ -103,7 +103,7 @@ const YourApp = () => {
103
103
 
104
104
  ```
105
105
  ┌─ TaskOnProvider ─────────────────────────────────────────┐
106
- │ config: { apiKey } │
106
+ │ config: { clientId } │
107
107
  │ Purpose: Authentication only │
108
108
  │ │
109
109
  │ ┌─ Mode A: Cloud Config ──────────────────────────────┐ │
@@ -128,12 +128,12 @@ const YourApp = () => {
128
128
 
129
129
  ## Security
130
130
 
131
- TaskOn uses **API Key** authentication to verify that widget requests come from authorized projects.
131
+ TaskOn uses **Client ID** authentication to verify that widget requests come from authorized projects.
132
132
 
133
- ### Step 1: Get API Key from TaskOn Dashboard
133
+ ### Step 1: Get Client ID from TaskOn Dashboard
134
134
 
135
135
  ```
136
- API Key: /KDiqEFNCaGTVTdTpCFrZOsUj5vDi5uGLSFmwyHeboE= (for X-API-Key header)
136
+ Client ID: /KDiqEFNCaGTVTdTpCFrZOsUj5vDi5uGLSFmwyHeboE= (for X-API-Key header)
137
137
  ```
138
138
 
139
139
  ### Step 2: Configure TaskOnProvider
@@ -141,7 +141,7 @@ API Key: /KDiqEFNCaGTVTdTpCFrZOsUj5vDi5uGLSFmwyHeboE= (for X-API-Key header)
141
141
  ```tsx
142
142
  <TaskOnProvider
143
143
  config={{
144
- apiKey: "your-api-key",
144
+ clientId: "your-client-id",
145
145
  }}
146
146
  >
147
147
  <YourApp />
@@ -153,13 +153,13 @@ API Key: /KDiqEFNCaGTVTdTpCFrZOsUj5vDi5uGLSFmwyHeboE= (for X-API-Key header)
153
153
  All API requests include:
154
154
 
155
155
  ```
156
- X-API-Key: your-api-key # Project authorization
156
+ X-API-Key: your-client-id # Project authorization
157
157
  Authorization: Bearer xxx # User authorization (after login)
158
158
  ```
159
159
 
160
160
  ### Security Best Practices
161
161
 
162
- 1. **Keep API Key secure** - Don't expose in public repositories
162
+ 1. **Keep Client ID secure** - Don't expose in public repositories
163
163
  2. **Use HTTPS** - All communication must be encrypted
164
164
 
165
165
  ## TaskOnProvider
@@ -177,8 +177,8 @@ The root provider component for authentication. Must wrap your application.
177
177
 
178
178
  ```typescript
179
179
  interface TaskOnProviderConfig {
180
- // Required: API Key for authentication (X-API-Key header)
181
- apiKey: string;
180
+ // Required: Client ID for authentication (X-API-Key header)
181
+ clientId: string;
182
182
 
183
183
  // Locale setting
184
184
  locale?: "en" | "ko" | "ja" | "ru" | "es"; // default: auto-detect
@@ -187,7 +187,6 @@ interface TaskOnProviderConfig {
187
187
  walletConfig?: {
188
188
  evmAdapter?: WalletAdapter; // Custom EVM wallet adapter
189
189
  solanaAdapter?: WalletAdapter; // Custom Solana wallet adapter
190
- disableAutoDetect?: boolean; // Disable auto-detection
191
190
  };
192
191
 
193
192
  // WalletConnect Project ID
@@ -220,7 +219,7 @@ interface TaskOnProviderConfig {
220
219
  ```tsx
221
220
  <TaskOnProvider
222
221
  config={{
223
- apiKey: "your-api-key",
222
+ clientId: "your-client-id",
224
223
  locale: "ko",
225
224
  }}
226
225
  >
@@ -237,7 +236,7 @@ const App = () => {
237
236
  const [locale, setLocale] = useState("en");
238
237
 
239
238
  return (
240
- <TaskOnProvider config={{ apiKey: "your-api-key", locale }}>
239
+ <TaskOnProvider config={{ clientId: "your-client-id", locale }}>
241
240
  <select value={locale} onChange={(e) => setLocale(e.target.value)}>
242
241
  <option value="en">English</option>
243
242
  <option value="ko">한국어</option>
@@ -383,7 +382,7 @@ light/dark.map > light/dark.seed (derived) > map > seed (derived) > default
383
382
  Nested ThemeProviders inherit from parent and can override specific values:
384
383
 
385
384
  ```tsx
386
- <TaskOnProvider config={{ apiKey: "your-api-key" }}>
385
+ <TaskOnProvider config={{ clientId: "your-client-id" }}>
387
386
  <ThemeProvider theme={{ mode: "light", seed: { colorPrimary: "#6366f1" } }}>
388
387
  <Header /> {/* light + primary #6366f1 */}
389
388
  <ThemeProvider theme={{ mode: "dark" }}>
@@ -525,13 +524,13 @@ Each widget documents its available parts in its own API reference.
525
524
 
526
525
  ```tsx
527
526
  // Example 1: Using cloud config (theme from Dashboard)
528
- <TaskOnProvider config={{ apiKey: 'your-api-key' }}>
527
+ <TaskOnProvider config={{ clientId: 'your-client-id' }}>
529
528
  <QuestWidget widgetId={123} />
530
529
  <TaskWidget widgetId={456} />
531
530
  </TaskOnProvider>
532
531
 
533
532
  // Example 2: Using local theme (no cloud config)
534
- <TaskOnProvider config={{ apiKey: 'your-api-key' }}>
533
+ <TaskOnProvider config={{ clientId: 'your-client-id' }}>
535
534
  <ThemeProvider theme={{ mode: 'dark', seed: { colorPrimary: '#6366f1' } }}>
536
535
  <QuestWidget />
537
536
  <TaskWidget />
@@ -539,7 +538,7 @@ Each widget documents its available parts in its own API reference.
539
538
  </TaskOnProvider>
540
539
 
541
540
  // Example 3: Different local themes for different areas
542
- <TaskOnProvider config={{ apiKey: 'your-api-key' }}>
541
+ <TaskOnProvider config={{ clientId: 'your-client-id' }}>
543
542
  <ThemeProvider theme={{ mode: 'light' }}>
544
543
  <TaskWidget />
545
544
  </ThemeProvider>
@@ -550,7 +549,7 @@ Each widget documents its available parts in its own API reference.
550
549
  </TaskOnProvider>
551
550
 
552
551
  // Example 4: Mixed - some with cloud config, some with local theme
553
- <TaskOnProvider config={{ apiKey: 'your-api-key' }}>
552
+ <TaskOnProvider config={{ clientId: 'your-client-id' }}>
554
553
  {/* Cloud config */}
555
554
  <QuestWidget widgetId={123} />
556
555
 
@@ -630,34 +629,44 @@ TaskOn provides flexible wallet integration options:
630
629
  | Setup | Behavior |
631
630
  | -------------- | ------------------------------------- |
632
631
  | Custom adapter | Uses your provided `WalletAdapter` |
633
- | Default | Uses built-in window.ethereum adapter |
632
+ | Default | Uses built-in wallet picker adapter |
634
633
 
635
634
  ### Custom Wallet Adapter (Recommended)
636
635
 
637
636
  If you want full control over wallet connection (e.g., using RainbowKit, Web3Modal), provide a custom adapter:
638
637
 
639
638
  ```tsx
639
+ import { useMemo } from "react";
640
640
  import { createWalletAdapter } from "./my-wallet-adapter";
641
641
 
642
- <TaskOnProvider
643
- config={{
644
- apiKey: "your-api-key",
645
- walletConfig: {
646
- evmAdapter: createWalletAdapter(),
647
- },
648
- }}
649
- >
650
- <App />
651
- </TaskOnProvider>;
642
+ const App = () => {
643
+ const evmAdapter = useMemo(() => createWalletAdapter(), []);
644
+
645
+ return (
646
+ <TaskOnProvider
647
+ config={{
648
+ clientId: "your-client-id",
649
+ walletConfig: {
650
+ evmAdapter,
651
+ },
652
+ }}
653
+ >
654
+ <MainContent />
655
+ </TaskOnProvider>
656
+ );
657
+ };
652
658
  ```
653
659
 
660
+ Note: keep `evmAdapter` reference stable (for example via `useMemo`) to avoid
661
+ re-creating adapters and resetting wallet state on every render.
662
+
654
663
  ### Built-in Wallet Support
655
664
 
656
- If no custom adapter is provided, TaskOn automatically uses `window.ethereum` to connect to browser wallets like MetaMask:
665
+ If no custom adapter is provided, TaskOn automatically uses built-in wallet picker flow:
657
666
 
658
667
  ```tsx
659
- // No wallet config needed - uses window.ethereum by default
660
- <TaskOnProvider config={{ apiKey: "your-api-key" }}>
668
+ // No wallet config needed
669
+ <TaskOnProvider config={{ clientId: "your-client-id" }}>
661
670
  <App />
662
671
  </TaskOnProvider>
663
672
  ```
@@ -668,7 +677,6 @@ When tasks require wallet binding (e.g., on-chain verification), TaskOn shows a
668
677
 
669
678
  **Desktop (without adapter):**
670
679
  - MetaMask
671
- - ONTO Wallet
672
680
  - Bitget Wallet
673
681
  - OKX Wallet
674
682
  - WalletConnect (uses SDK default project ID if not configured; not recommended for production)
@@ -687,7 +695,7 @@ To enable WalletConnect in the dialog:
687
695
  ```tsx
688
696
  <TaskOnProvider
689
697
  config={{
690
- apiKey: "your-api-key",
698
+ clientId: "your-client-id",
691
699
  walletConnectProjectId: "your-project-id", // Get from cloud.walletconnect.com
692
700
  }}
693
701
  >
@@ -697,10 +705,10 @@ To enable WalletConnect in the dialog:
697
705
 
698
706
  ### Built-in Wallet Management
699
707
 
700
- If no external provider is detected, the widget uses its built-in wallet management. No configuration needed:
708
+ If no external adapter is provided, the widget uses built-in wallet management. No configuration needed:
701
709
 
702
710
  ```tsx
703
- <TaskOnProvider config={{ apiKey: "your-api-key" }}>
711
+ <TaskOnProvider config={{ clientId: "your-client-id" }}>
704
712
  <App /> {/* Widget handles wallet connection internally */}
705
713
  </TaskOnProvider>
706
714
  ```
@@ -714,9 +722,6 @@ interface WalletConfig {
714
722
 
715
723
  // Solana wallet adapter (highest priority)
716
724
  solanaAdapter?: WalletAdapter;
717
-
718
- // Disable auto-detection of external providers
719
- disableAutoDetect?: boolean;
720
725
  }
721
726
  ```
722
727
 
@@ -755,7 +760,7 @@ const App = () => {
755
760
  return (
756
761
  <TaskOnProvider
757
762
  config={{
758
- apiKey: "your-api-key",
763
+ clientId: "your-client-id",
759
764
  walletConfig: { evmAdapter },
760
765
  }}
761
766
  >
@@ -770,7 +775,7 @@ const App = () => {
770
775
  When multiple options are available:
771
776
 
772
777
  1. **Custom Adapter** - `walletConfig.evmAdapter` / `solanaAdapter` (highest)
773
- 2. **Built-in Adapter** - window.ethereum adapter for EVM wallets (lowest)
778
+ 2. **Built-in Adapter** - SDK wallet picker adapter for EVM wallets (fallback)
774
779
 
775
780
  ## Hooks
776
781
 
@@ -1087,7 +1092,7 @@ Then configure your project ID:
1087
1092
  ```tsx
1088
1093
  <TaskOnProvider
1089
1094
  config={{
1090
- apiKey: "your-api-key",
1095
+ clientId: "your-client-id",
1091
1096
  walletConnectProjectId: "your-walletconnect-project-id",
1092
1097
  }}
1093
1098
  >
@@ -2,9 +2,8 @@
2
2
  * ConfirmNoticeDialog styles
3
3
  *
4
4
  * @description
5
- * Reproduces the visual rhythm of taskon-website ConfirmNotice:
6
- * icon -> title -> description -> actions,
7
- * while intentionally removing the glow background layer.
5
+ * Keep only content-specific layout/typography and rely on Dialog
6
+ * for container surface, radius and body spacing.
8
7
  */
9
8
 
10
9
  /*
@@ -20,24 +19,10 @@
20
19
  * 2) Keep viewport media query as fallback
21
20
  */
22
21
 
23
- /* Narrow the default dialog body padding for this notice layout */
24
-
25
- .taskon-confirm-notice-dialog .taskon-dialog-body {
26
- padding: 0;
27
- }
28
-
29
22
  /* ConfirmNotice content root */
30
23
 
31
24
  .taskon-confirm-notice {
32
- position: relative;
33
- width: auto;
34
- max-width: none;
35
- padding: var(--taskon-spacing-xl) var(--taskon-spacing-lg) var(--taskon-spacing-lg);
36
- background: var(--taskon-color-bg-floating);
37
- color: var(--taskon-color-text);
38
- border-radius: var(--taskon-border-radius-lg);
39
25
  text-align: center;
40
- box-sizing: border-box;
41
26
  }
42
27
 
43
28
  /* Status icon */
@@ -136,12 +121,6 @@
136
121
 
137
122
  @supports (container-type: inline-size) {
138
123
  @container (min-width: 751px) {
139
- .taskon-confirm-notice {
140
- width: 100%;
141
- max-width: 470px;
142
- padding: 40px 55px;
143
- }
144
-
145
124
  .taskon-confirm-notice-buttons {
146
125
  flex-direction: row;
147
126
  align-items: center;
@@ -156,12 +135,6 @@
156
135
 
157
136
  @supports not (container-type: inline-size) {
158
137
  @media (min-width: 751px) {
159
- .taskon-confirm-notice {
160
- width: 100%;
161
- max-width: 470px;
162
- padding: 40px 55px;
163
- }
164
-
165
138
  .taskon-confirm-notice-buttons {
166
139
  flex-direction: row;
167
140
  align-items: center;
@@ -804,10 +777,6 @@
804
777
  * 2) Keep viewport media query as fallback
805
778
  */
806
779
 
807
- .taskon-task-verify-failed-dialog .taskon-dialog-body {
808
- padding: 0;
809
- }
810
-
811
780
  .taskon-task-verify-failed-dialog-message {
812
781
  margin-top: var(--taskon-spacing-sm);
813
782
  font-size: var(--taskon-font-size-lg);
@@ -182,3 +182,290 @@
182
182
  max-width: calc(100vw - 40px);
183
183
  }
184
184
  }
185
+ /**
186
+ * WalletPickerDialog 组件样式
187
+ * 使用 taskon-bind-wallet-* 命名空间
188
+ * 与 taskon-website 保持一致
189
+ */
190
+
191
+ /*
192
+ * Responsive base styles
193
+ *
194
+ * Keep mobile breakpoints and fallback patterns centralized here.
195
+ * Components should reuse these mixins instead of duplicating query logic.
196
+ */
197
+
198
+ /*
199
+ * Desktop-up mixin:
200
+ * 1) Enable desktop enhancement in wider containers
201
+ * 2) Keep viewport media query as fallback
202
+ */
203
+
204
+ /* Ensure wallet picker always appears above other SDK dialogs */
205
+
206
+ .taskon-wallet-picker-overlay {
207
+ z-index: 10008;
208
+ }
209
+
210
+ .taskon-wallet-picker-content {
211
+ z-index: 10009;
212
+ }
213
+
214
+ /* ==================== 容器 ==================== */
215
+
216
+ .taskon-bind-wallet-dialog {
217
+ position: relative;
218
+ display: flex;
219
+ flex-direction: column;
220
+ }
221
+
222
+ /* ==================== 标题 ==================== */
223
+
224
+ .taskon-bind-wallet-dialog-title {
225
+ margin: 0;
226
+ font-size: 22px;
227
+ font-weight: 700;
228
+ line-height: 28px;
229
+ color: var(--taskon-color-text);
230
+ }
231
+
232
+ /* ==================== 链类型标签 ==================== */
233
+
234
+ .taskon-bind-wallet-dialog-chain-label {
235
+ margin-top: var(--taskon-spacing-md);
236
+ font-size: 16px;
237
+ font-weight: 500;
238
+ line-height: 20px;
239
+ color: var(--taskon-color-text);
240
+ }
241
+
242
+ /* ==================== 钱包网格 ==================== */
243
+
244
+ .taskon-bind-wallet-dialog-grid {
245
+ margin-top: var(--taskon-spacing-sm);
246
+ display: grid;
247
+ grid-template-columns: 1fr;
248
+ gap: var(--taskon-spacing-md);
249
+ }
250
+
251
+ /* ==================== 钱包项 ==================== */
252
+
253
+ .taskon-bind-wallet-item {
254
+ position: relative;
255
+ display: flex;
256
+ align-items: center;
257
+ justify-content: center;
258
+ height: 50px;
259
+ padding: 0 12px;
260
+
261
+ background: transparent;
262
+ border: 1px solid var(--taskon-color-border);
263
+ border-radius: 8px;
264
+ cursor: pointer;
265
+ transition: all 0.2s ease;
266
+ }
267
+
268
+ .taskon-bind-wallet-item:hover,
269
+ .taskon-bind-wallet-item:focus {
270
+ background: var(--taskon-color-bg-surface-strong);
271
+ }
272
+
273
+ .taskon-bind-wallet-item:active {
274
+ transform: scale(0.98);
275
+ }
276
+
277
+ /* 钱包图标 */
278
+
279
+ .taskon-bind-wallet-item-icon {
280
+ display: flex;
281
+ align-items: center;
282
+ justify-content: center;
283
+ width: 24px;
284
+ height: 24px;
285
+ flex-shrink: 0;
286
+ }
287
+
288
+ .taskon-bind-wallet-item-icon svg {
289
+ width: 24px;
290
+ height: 24px;
291
+ }
292
+
293
+ /* 钱包名称 */
294
+
295
+ .taskon-bind-wallet-item-name {
296
+ margin-left: 10px;
297
+ font-size: 18px;
298
+ font-weight: 600;
299
+ line-height: 20px;
300
+ color: var(--taskon-color-text);
301
+ }
302
+
303
+ /* 已安装标签 */
304
+
305
+ .taskon-bind-wallet-item-installed {
306
+ position: absolute;
307
+ right: 0;
308
+ bottom: 0;
309
+ padding: 4px 8px;
310
+ font-size: 10px;
311
+ line-height: 14px;
312
+ color: var(--taskon-color-secondary);
313
+ background: var(--taskon-color-secondary-bg);
314
+ border-radius: 8px 0;
315
+ transform-origin: bottom right;
316
+ }
317
+
318
+ /* ==================== 连接中状态 ==================== */
319
+
320
+ .taskon-bind-wallet-item--connecting {
321
+ opacity: 0.7;
322
+ cursor: wait;
323
+ }
324
+
325
+ .taskon-bind-wallet-item--connecting:hover,
326
+ .taskon-bind-wallet-item--connecting:focus {
327
+ background: transparent;
328
+ }
329
+
330
+ /* ==================== 禁用状态 ==================== */
331
+
332
+ .taskon-bind-wallet-item--disabled {
333
+ opacity: 0.5;
334
+ cursor: not-allowed;
335
+ }
336
+
337
+ .taskon-bind-wallet-item--disabled:hover,
338
+ .taskon-bind-wallet-item--disabled:focus {
339
+ background: transparent;
340
+ }
341
+
342
+ .taskon-bind-wallet-item--disabled:active {
343
+ transform: none;
344
+ }
345
+
346
+ /* 不可用标签 */
347
+
348
+ .taskon-bind-wallet-item-unavailable {
349
+ position: absolute;
350
+ right: 0;
351
+ bottom: 0;
352
+ padding: 4px 8px;
353
+ font-size: 10px;
354
+ line-height: 14px;
355
+ color: var(--taskon-color-text-tertiary);
356
+ background: var(--taskon-color-bg-surface-subtle);
357
+ border-radius: 8px 0;
358
+ }
359
+
360
+ /* 连接中 spinner */
361
+
362
+ .taskon-bind-wallet-item-connecting {
363
+ position: absolute;
364
+ right: 8px;
365
+ display: flex;
366
+ align-items: center;
367
+ justify-content: center;
368
+ }
369
+
370
+ .taskon-bind-wallet-spinner {
371
+ width: 16px;
372
+ height: 16px;
373
+ color: var(--taskon-color-primary);
374
+ animation: taskon-bind-wallet-spin 1s linear infinite;
375
+ }
376
+
377
+ @keyframes taskon-bind-wallet-spin {
378
+ from {
379
+ transform: rotate(0deg);
380
+ }
381
+ to {
382
+ transform: rotate(360deg);
383
+ }
384
+ }
385
+
386
+ /* ==================== 提示文字 ==================== */
387
+
388
+ .taskon-bind-wallet-dialog-tip {
389
+ margin: var(--taskon-spacing-md) 0 0;
390
+ font-size: 14px;
391
+ line-height: 1.5;
392
+ color: var(--taskon-color-text-tertiary);
393
+ text-align: center;
394
+ }
395
+
396
+ /* ==================== 连接中遮层 ==================== */
397
+
398
+ .taskon-bind-wallet-loading-overlay {
399
+ position: absolute;
400
+ /* 使用负值覆盖 Dialog body 的 padding */
401
+ inset: -20px;
402
+ display: flex;
403
+ flex-direction: column;
404
+ align-items: center;
405
+ justify-content: center;
406
+ background: var(--taskon-color-bg-mask);
407
+ backdrop-filter: blur(4px);
408
+ border-radius: 12px;
409
+ }
410
+
411
+ .taskon-bind-wallet-loading-spinner {
412
+ width: 40px;
413
+ height: 40px;
414
+ color: var(--taskon-color-text-secondary);
415
+ animation: taskon-bind-wallet-spin 1s linear infinite;
416
+ }
417
+
418
+ .taskon-bind-wallet-loading-text {
419
+ margin: 20px 0 0;
420
+ max-width: 60%;
421
+ font-size: 16px;
422
+ line-height: 20px;
423
+ color: var(--taskon-color-text-secondary);
424
+ text-align: center;
425
+ }
426
+
427
+ @supports (container-type: inline-size) {
428
+ @container (min-width: 751px) {
429
+ .taskon-bind-wallet-dialog-chain-label {
430
+ margin-top: 20px;
431
+ }
432
+
433
+ .taskon-bind-wallet-dialog-grid {
434
+ margin-top: 10px;
435
+ grid-template-columns: 1fr 1fr;
436
+ gap: 18px;
437
+ }
438
+
439
+ .taskon-bind-wallet-dialog-tip {
440
+ margin-top: 20px;
441
+ }
442
+
443
+ .taskon-bind-wallet-loading-overlay {
444
+ inset: -24px;
445
+ border-radius: 16px;
446
+ }
447
+ }
448
+ }
449
+
450
+ @supports not (container-type: inline-size) {
451
+ @media (min-width: 751px) {
452
+ .taskon-bind-wallet-dialog-chain-label {
453
+ margin-top: 20px;
454
+ }
455
+
456
+ .taskon-bind-wallet-dialog-grid {
457
+ margin-top: 10px;
458
+ grid-template-columns: 1fr 1fr;
459
+ gap: 18px;
460
+ }
461
+
462
+ .taskon-bind-wallet-dialog-tip {
463
+ margin-top: 20px;
464
+ }
465
+
466
+ .taskon-bind-wallet-loading-overlay {
467
+ inset: -24px;
468
+ border-radius: 16px;
469
+ }
470
+ }
471
+ }