@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.
- package/README.md +48 -43
- package/dist/EligibilityInfo.css +2 -33
- package/dist/TaskOnProvider.css +287 -0
- package/dist/ThemeProvider.css +227 -0
- package/dist/UserCenterWidget2.css +32 -290
- package/dist/WidgetShell.css +0 -227
- package/dist/chunks/{CommunityTaskList-Hde2OKHH.js → CommunityTaskList-D0uVD8wD.js} +37 -58
- package/dist/chunks/{EligibilityInfo-BV0Z2TgY.js → EligibilityInfo-Cf6hx9-a.js} +17 -209
- package/dist/chunks/{LeaderboardWidget-BNGRD5Bu.js → LeaderboardWidget-DyoiiNS6.js} +10 -9
- package/dist/chunks/{PageBuilder-C5DSHiW9.js → PageBuilder-DoAFPm6-.js} +5 -5
- package/dist/chunks/{Quest-DG9zfXJo.js → Quest-ySZlYd4u.js} +6 -11
- package/dist/chunks/TaskOnProvider-CxtFIs3n.js +2072 -0
- package/dist/chunks/{WidgetShell-D7yC894Y.js → ThemeProvider-CulHkqqY.js} +1354 -617
- package/dist/chunks/UserCenterWidget-BJsc_GSZ.js +3246 -0
- package/dist/chunks/{UserCenterWidget-D5ttw4hO.js → UserCenterWidget-STq8kpV4.js} +162 -365
- package/dist/chunks/WidgetShell-8xn-Jivw.js +659 -0
- package/dist/chunks/useIsMobile-D6Ybur-6.js +30 -0
- package/dist/chunks/useToast-BGJhd3BX.js +93 -0
- package/dist/community-task.js +1 -1
- package/dist/core.d.ts +9 -15
- package/dist/core.js +3 -3
- package/dist/index.d.ts +64 -15
- package/dist/index.js +15 -10
- package/dist/leaderboard.js +1 -1
- package/dist/page-builder.js +1 -1
- package/dist/quest.js +1 -1
- package/dist/user-center.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/TaskOnProvider-BhamHIyY.js +0 -1260
- package/dist/chunks/ThemeProvider-mXLdLSkq.js +0 -1397
- package/dist/chunks/UserCenterWidget-jDO5zTN1.js +0 -3297
- 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
|
-
|
|
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
|
-
|
|
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: {
|
|
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 **
|
|
131
|
+
TaskOn uses **Client ID** authentication to verify that widget requests come from authorized projects.
|
|
132
132
|
|
|
133
|
-
### Step 1: Get
|
|
133
|
+
### Step 1: Get Client ID from TaskOn Dashboard
|
|
134
134
|
|
|
135
135
|
```
|
|
136
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
|
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:
|
|
181
|
-
|
|
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
|
-
|
|
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={{
|
|
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={{
|
|
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={{
|
|
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={{
|
|
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={{
|
|
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={{
|
|
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
|
|
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
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
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
|
|
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
|
|
660
|
-
<TaskOnProvider config={{
|
|
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
|
-
|
|
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
|
|
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={{
|
|
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
|
-
|
|
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** -
|
|
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
|
-
|
|
1095
|
+
clientId: "your-client-id",
|
|
1091
1096
|
walletConnectProjectId: "your-walletconnect-project-id",
|
|
1092
1097
|
}}
|
|
1093
1098
|
>
|
package/dist/EligibilityInfo.css
CHANGED
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* ConfirmNoticeDialog styles
|
|
3
3
|
*
|
|
4
4
|
* @description
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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);
|
package/dist/TaskOnProvider.css
CHANGED
|
@@ -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
|
+
}
|