优化:UI优化
This commit is contained in:
parent
9ec66ff163
commit
2b84e5f01e
@ -118,7 +118,6 @@
|
|||||||
<p class="crypto-info-text">{{ t('deposit.collectInlineHint') }}</p>
|
<p class="crypto-info-text">{{ t('deposit.collectInlineHint') }}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="crypto-qr-block">
|
<div class="crypto-qr-block">
|
||||||
<p class="crypto-qr-caption">{{ t('deposit.qrCaption') }}</p>
|
|
||||||
<div class="crypto-qr-frame">
|
<div class="crypto-qr-frame">
|
||||||
<img
|
<img
|
||||||
:key="`${String(modelValue)}-${depositAddress}-qr-${cryptoQrRetryNonce}`"
|
:key="`${String(modelValue)}-${depositAddress}-qr-${cryptoQrRetryNonce}`"
|
||||||
@ -213,7 +212,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
</v-card-text>
|
</v-card-text>
|
||||||
<!-- 加密货币:底部单一检查/归集;钱包入金:从钱包转入 + 归集并排 -->
|
<!-- 加密货币:底部检测与「同步余额」;钱包入金:从钱包转入 + 同步余额并排 -->
|
||||||
<v-card-actions v-if="step === 'crypto' || step === 'exchange'" class="deposit-footer-actions">
|
<v-card-actions v-if="step === 'crypto' || step === 'exchange'" class="deposit-footer-actions">
|
||||||
<div class="deposit-footer-inner">
|
<div class="deposit-footer-inner">
|
||||||
<template v-if="step === 'crypto'">
|
<template v-if="step === 'crypto'">
|
||||||
@ -1192,17 +1191,6 @@ onUnmounted(() => {
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 8px;
|
|
||||||
}
|
|
||||||
.crypto-qr-caption {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 0.75rem;
|
|
||||||
font-weight: 500;
|
|
||||||
color: #9ca3af;
|
|
||||||
text-align: center;
|
|
||||||
line-height: 1.35;
|
|
||||||
letter-spacing: normal;
|
|
||||||
width: 100%;
|
|
||||||
}
|
}
|
||||||
.crypto-qr-frame {
|
.crypto-qr-frame {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|||||||
@ -342,7 +342,7 @@
|
|||||||
"title": "Deposit",
|
"title": "Deposit",
|
||||||
"polymarketBalance": "Balance:",
|
"polymarketBalance": "Balance:",
|
||||||
"transferCrypto": "Transfer Crypto",
|
"transferCrypto": "Transfer Crypto",
|
||||||
"transferCryptoSub": "No limits • Fast • Sync to balance after deposit",
|
"transferCryptoSub": "No limits • Fast • Tap below to sync balance once it arrives",
|
||||||
"connectExchange": "Transfer with current wallet",
|
"connectExchange": "Transfer with current wallet",
|
||||||
"noLimit": "No limit",
|
"noLimit": "No limit",
|
||||||
"instant": "Instant",
|
"instant": "Instant",
|
||||||
@ -363,11 +363,10 @@
|
|||||||
"connectingWallet": "Connecting wallet…",
|
"connectingWallet": "Connecting wallet…",
|
||||||
"connectWalletHint": "Approve MetaMask to load your deposit address and send USDC.",
|
"connectWalletHint": "Approve MetaMask to load your deposit address and send USDC.",
|
||||||
"linkMetaMask": "Connect MetaMask",
|
"linkMetaMask": "Connect MetaMask",
|
||||||
"collectInlineHint": "After sending USDC on-chain to this address, use “Collect” at the bottom to collect and sync USDC to your balance.",
|
"collectInlineHint": "After your USDC transfer to this address has arrived, tap \"Sync balance\" at the bottom to credit it to your trading account.",
|
||||||
"collectInlineHintExchange": "After sending USDC on-chain to this address, use “Collect” at the bottom to collect and sync USDC to your balance.",
|
"collectInlineHintExchange": "After your USDC transfer to this address has arrived, tap \"Sync balance\" at the bottom to credit it to your trading account.",
|
||||||
"qrCaption": "Scan to fill the address (optional)",
|
|
||||||
"qrLoadFailed": "Could not load QR code",
|
"qrLoadFailed": "Could not load QR code",
|
||||||
"checkStatus": "Collect",
|
"checkStatus": "Sync balance",
|
||||||
"checking": "Checking...",
|
"checking": "Checking...",
|
||||||
"checkingStatus": "Checking deposit status...",
|
"checkingStatus": "Checking deposit status...",
|
||||||
"nextCheckIn": "Next check in: {seconds}s",
|
"nextCheckIn": "Next check in: {seconds}s",
|
||||||
@ -384,7 +383,7 @@
|
|||||||
"amountUsdcHint": "Send USDC from this wallet to the deposit address. Keep native gas on this network.",
|
"amountUsdcHint": "Send USDC from this wallet to the deposit address. Keep native gas on this network.",
|
||||||
"sendViaMetaMask": "Send with MetaMask",
|
"sendViaMetaMask": "Send with MetaMask",
|
||||||
"depositFromWallet": "Deposit from wallet",
|
"depositFromWallet": "Deposit from wallet",
|
||||||
"collect": "Collect",
|
"collect": "Sync balance",
|
||||||
"sendSuccess": "Transfer confirmed on-chain",
|
"sendSuccess": "Transfer confirmed on-chain",
|
||||||
"sendFailed": "Transfer failed",
|
"sendFailed": "Transfer failed",
|
||||||
"invalidAmount": "Enter a valid amount greater than zero",
|
"invalidAmount": "Enter a valid amount greater than zero",
|
||||||
|
|||||||
@ -342,7 +342,7 @@
|
|||||||
"title": "入金",
|
"title": "入金",
|
||||||
"polymarketBalance": "残高:",
|
"polymarketBalance": "残高:",
|
||||||
"transferCrypto": "暗号資産を送金",
|
"transferCrypto": "暗号資産を送金",
|
||||||
"transferCryptoSub": "制限なし • 即時 • 着金後に下部でコレクト",
|
"transferCryptoSub": "制限なし • 即時 • 着金後、下のボタンで残高に反映",
|
||||||
"connectExchange": "現在のウォレットで送金",
|
"connectExchange": "現在のウォレットで送金",
|
||||||
"noLimit": "制限なし",
|
"noLimit": "制限なし",
|
||||||
"instant": "即時",
|
"instant": "即時",
|
||||||
@ -363,11 +363,10 @@
|
|||||||
"connectingWallet": "ウォレットに接続しています…",
|
"connectingWallet": "ウォレットに接続しています…",
|
||||||
"connectWalletHint": "入金アドレスの表示と送金のために MetaMask の承認が必要です。",
|
"connectWalletHint": "入金アドレスの表示と送金のために MetaMask の承認が必要です。",
|
||||||
"linkMetaMask": "MetaMask を接続",
|
"linkMetaMask": "MetaMask を接続",
|
||||||
"collectInlineHint": "このアドレスへオンチェーンで USDC を送金したら、画面下の「回収」でコレクトし、残高に反映してください。",
|
"collectInlineHint": "このアドレスへの USDC 送金が完了したら、画面下の「残高を反映」で取引用の残高に計上してください。",
|
||||||
"collectInlineHintExchange": "このアドレスへオンチェーンで USDC を送金したら、画面下の「回収」でコレクトし、残高に反映してください。",
|
"collectInlineHintExchange": "このアドレスへの USDC 送金が完了したら、画面下の「残高を反映」で取引用の残高に計上してください。",
|
||||||
"qrCaption": "アドレス入力用 QR(任意)",
|
|
||||||
"qrLoadFailed": "QR の読み込みに失敗しました",
|
"qrLoadFailed": "QR の読み込みに失敗しました",
|
||||||
"checkStatus": "回収",
|
"checkStatus": "残高を反映",
|
||||||
"checking": "確認中...",
|
"checking": "確認中...",
|
||||||
"checkingStatus": "入金状況を確認しています...",
|
"checkingStatus": "入金状況を確認しています...",
|
||||||
"nextCheckIn": "次の確認: {seconds}秒",
|
"nextCheckIn": "次の確認: {seconds}秒",
|
||||||
@ -384,7 +383,7 @@
|
|||||||
"amountUsdcHint": "このウォレットから入金先へ USDC を送ります。ガス用にネイティブトークンを残してください。",
|
"amountUsdcHint": "このウォレットから入金先へ USDC を送ります。ガス用にネイティブトークンを残してください。",
|
||||||
"sendViaMetaMask": "MetaMask で送金",
|
"sendViaMetaMask": "MetaMask で送金",
|
||||||
"depositFromWallet": "ウォレットから入金",
|
"depositFromWallet": "ウォレットから入金",
|
||||||
"collect": "回収",
|
"collect": "残高を反映",
|
||||||
"sendSuccess": "チェーン上で送金が確定しました",
|
"sendSuccess": "チェーン上で送金が確定しました",
|
||||||
"sendFailed": "送金に失敗しました",
|
"sendFailed": "送金に失敗しました",
|
||||||
"invalidAmount": "0 より大きい有効な金額を入力してください",
|
"invalidAmount": "0 より大きい有効な金額を入力してください",
|
||||||
|
|||||||
@ -342,7 +342,7 @@
|
|||||||
"title": "입금",
|
"title": "입금",
|
||||||
"polymarketBalance": "잔액:",
|
"polymarketBalance": "잔액:",
|
||||||
"transferCrypto": "암호화폐 전송",
|
"transferCrypto": "암호화폐 전송",
|
||||||
"transferCryptoSub": "제한 없음 • 즉시 • 입금 후 하단에서 수집",
|
"transferCryptoSub": "제한 없음 • 즉시 • 입금 확인 후 하단에서 잔액 동기화",
|
||||||
"connectExchange": "현재 지갑으로 송금",
|
"connectExchange": "현재 지갑으로 송금",
|
||||||
"noLimit": "제한 없음",
|
"noLimit": "제한 없음",
|
||||||
"instant": "즉시",
|
"instant": "즉시",
|
||||||
@ -363,11 +363,10 @@
|
|||||||
"connectingWallet": "지갑 연결 중…",
|
"connectingWallet": "지갑 연결 중…",
|
||||||
"connectWalletHint": "입금 주소를 불러오고 전송하려면 MetaMask 승인이 필요합니다.",
|
"connectWalletHint": "입금 주소를 불러오고 전송하려면 MetaMask 승인이 필요합니다.",
|
||||||
"linkMetaMask": "MetaMask 연결",
|
"linkMetaMask": "MetaMask 연결",
|
||||||
"collectInlineHint": "이 주소로 온체인 USDC 전송을 마친 뒤, 화면 맨 아래「수집」으로 수집해 잔액에 반영하세요.",
|
"collectInlineHint": "이 주소로 USDC 이체가 입금 확인되면, 화면 아래「잔액 동기화」를 눌러 거래 잔액에 반영하세요.",
|
||||||
"collectInlineHintExchange": "이 주소로 온체인 USDC 전송을 마친 뒤, 화면 맨 아래「수집」으로 수집해 잔액에 반영하세요.",
|
"collectInlineHintExchange": "이 주소로 USDC 이체가 입금 확인되면, 화면 아래「잔액 동기화」를 눌러 거래 잔액에 반영하세요.",
|
||||||
"qrCaption": "주소 입력용 QR (선택)",
|
|
||||||
"qrLoadFailed": "QR 코드를 불러오지 못했습니다",
|
"qrLoadFailed": "QR 코드를 불러오지 못했습니다",
|
||||||
"checkStatus": "수집",
|
"checkStatus": "잔액 동기화",
|
||||||
"checking": "확인 중...",
|
"checking": "확인 중...",
|
||||||
"checkingStatus": "입금 상태 확인 중...",
|
"checkingStatus": "입금 상태 확인 중...",
|
||||||
"nextCheckIn": "다음 확인: {seconds}초",
|
"nextCheckIn": "다음 확인: {seconds}초",
|
||||||
@ -384,7 +383,7 @@
|
|||||||
"amountUsdcHint": "현재 지갑에서 입금 주소로 USDC를 보냅니다. 가스비용 네이티브 토큰을 남겨 두세요.",
|
"amountUsdcHint": "현재 지갑에서 입금 주소로 USDC를 보냅니다. 가스비용 네이티브 토큰을 남겨 두세요.",
|
||||||
"sendViaMetaMask": "MetaMask로 전송",
|
"sendViaMetaMask": "MetaMask로 전송",
|
||||||
"depositFromWallet": "지갑에서 입금",
|
"depositFromWallet": "지갑에서 입금",
|
||||||
"collect": "수집",
|
"collect": "잔액 동기화",
|
||||||
"sendSuccess": "전송이 온체인에서 확인되었습니다",
|
"sendSuccess": "전송이 온체인에서 확인되었습니다",
|
||||||
"sendFailed": "전송 실패",
|
"sendFailed": "전송 실패",
|
||||||
"invalidAmount": "0보다 큰 유효한 금액을 입력하세요",
|
"invalidAmount": "0보다 큰 유효한 금액을 입력하세요",
|
||||||
|
|||||||
@ -342,7 +342,7 @@
|
|||||||
"title": "入金",
|
"title": "入金",
|
||||||
"polymarketBalance": "余额:",
|
"polymarketBalance": "余额:",
|
||||||
"transferCrypto": "转账加密货币",
|
"transferCrypto": "转账加密货币",
|
||||||
"transferCryptoSub": "无限制 • 即时 • 到账后可在底部一键归集",
|
"transferCryptoSub": "无限制 • 即时 • 到账后可在底部一键同步余额",
|
||||||
"connectExchange": "使用当前钱包转账",
|
"connectExchange": "使用当前钱包转账",
|
||||||
"noLimit": "无限制",
|
"noLimit": "无限制",
|
||||||
"instant": "即时到账",
|
"instant": "即时到账",
|
||||||
@ -363,11 +363,10 @@
|
|||||||
"connectingWallet": "正在连接钱包…",
|
"connectingWallet": "正在连接钱包…",
|
||||||
"connectWalletHint": "需要授权 MetaMask 后才能显示充值地址并转账。",
|
"connectWalletHint": "需要授权 MetaMask 后才能显示充值地址并转账。",
|
||||||
"linkMetaMask": "连接 MetaMask",
|
"linkMetaMask": "连接 MetaMask",
|
||||||
"collectInlineHint": "向该地址完成链上转账后,请点击底部「归集」,将 USDC 同步到账户余额。",
|
"collectInlineHint": "向该地址转完 USDC 并到账后,请点击底部「同步余额」,把资金记入您的交易账户。",
|
||||||
"collectInlineHintExchange": "向该地址完成链上转账后,请点击底部「归集」,将 USDC 同步到账户余额。",
|
"collectInlineHintExchange": "向该地址转完 USDC 并到账后,请点击底部「同步余额」,把资金记入您的交易账户。",
|
||||||
"qrCaption": "扫码填入收款地址(可选)",
|
|
||||||
"qrLoadFailed": "二维码加载失败",
|
"qrLoadFailed": "二维码加载失败",
|
||||||
"checkStatus": "归集",
|
"checkStatus": "同步余额",
|
||||||
"checking": "正在检测...",
|
"checking": "正在检测...",
|
||||||
"checkingStatus": "正在检测充值状态...",
|
"checkingStatus": "正在检测充值状态...",
|
||||||
"nextCheckIn": "下次检测: {seconds}秒",
|
"nextCheckIn": "下次检测: {seconds}秒",
|
||||||
@ -384,7 +383,7 @@
|
|||||||
"amountUsdcHint": "从当前钱包将 USDC 转到入账地址,请预留主网币作为 Gas",
|
"amountUsdcHint": "从当前钱包将 USDC 转到入账地址,请预留主网币作为 Gas",
|
||||||
"sendViaMetaMask": "在 MetaMask 中转账",
|
"sendViaMetaMask": "在 MetaMask 中转账",
|
||||||
"depositFromWallet": "从钱包转入",
|
"depositFromWallet": "从钱包转入",
|
||||||
"collect": "归集",
|
"collect": "同步余额",
|
||||||
"sendSuccess": "转账已成功上链",
|
"sendSuccess": "转账已成功上链",
|
||||||
"sendFailed": "转账失败",
|
"sendFailed": "转账失败",
|
||||||
"invalidAmount": "请输入大于 0 的有效金额",
|
"invalidAmount": "请输入大于 0 的有效金额",
|
||||||
|
|||||||
@ -342,7 +342,7 @@
|
|||||||
"title": "入金",
|
"title": "入金",
|
||||||
"polymarketBalance": "餘額:",
|
"polymarketBalance": "餘額:",
|
||||||
"transferCrypto": "轉帳加密貨幣",
|
"transferCrypto": "轉帳加密貨幣",
|
||||||
"transferCryptoSub": "無限制 • 即時 • 到帳後可在底部一鍵歸集",
|
"transferCryptoSub": "無限制 • 即時 • 到帳後可在底部一鍵同步餘額",
|
||||||
"connectExchange": "使用當前錢包轉帳",
|
"connectExchange": "使用當前錢包轉帳",
|
||||||
"noLimit": "無限制",
|
"noLimit": "無限制",
|
||||||
"instant": "即時到帳",
|
"instant": "即時到帳",
|
||||||
@ -363,11 +363,10 @@
|
|||||||
"connectingWallet": "正在連接錢包…",
|
"connectingWallet": "正在連接錢包…",
|
||||||
"connectWalletHint": "請先授權 MetaMask,才能顯示充值地址並轉帳。",
|
"connectWalletHint": "請先授權 MetaMask,才能顯示充值地址並轉帳。",
|
||||||
"linkMetaMask": "連接 MetaMask",
|
"linkMetaMask": "連接 MetaMask",
|
||||||
"collectInlineHint": "向該地址完成鏈上轉帳後,請點擊底部「歸集」,將 USDC 同步至帳戶餘額。",
|
"collectInlineHint": "向該地址轉完 USDC 並到帳後,請點擊底部「同步餘額」,把資金記入您的交易帳戶。",
|
||||||
"collectInlineHintExchange": "向該地址完成鏈上轉帳後,請點擊底部「歸集」,將 USDC 同步至帳戶餘額。",
|
"collectInlineHintExchange": "向該地址轉完 USDC 並到帳後,請點擊底部「同步餘額」,把資金記入您的交易帳戶。",
|
||||||
"qrCaption": "掃碼填入收款地址(可選)",
|
|
||||||
"qrLoadFailed": "二維碼載入失敗",
|
"qrLoadFailed": "二維碼載入失敗",
|
||||||
"checkStatus": "歸集",
|
"checkStatus": "同步餘額",
|
||||||
"checking": "正在檢測...",
|
"checking": "正在檢測...",
|
||||||
"checkingStatus": "正在檢測充值狀態...",
|
"checkingStatus": "正在檢測充值狀態...",
|
||||||
"nextCheckIn": "下次檢測: {seconds}秒",
|
"nextCheckIn": "下次檢測: {seconds}秒",
|
||||||
@ -384,7 +383,7 @@
|
|||||||
"amountUsdcHint": "從目前錢包將 USDC 轉到入帳地址,請預留主網幣作為 Gas",
|
"amountUsdcHint": "從目前錢包將 USDC 轉到入帳地址,請預留主網幣作為 Gas",
|
||||||
"sendViaMetaMask": "在 MetaMask 中轉帳",
|
"sendViaMetaMask": "在 MetaMask 中轉帳",
|
||||||
"depositFromWallet": "從錢包轉入",
|
"depositFromWallet": "從錢包轉入",
|
||||||
"collect": "歸集",
|
"collect": "同步餘額",
|
||||||
"sendSuccess": "轉帳已成功上鏈",
|
"sendSuccess": "轉帳已成功上鏈",
|
||||||
"sendFailed": "轉帳失敗",
|
"sendFailed": "轉帳失敗",
|
||||||
"invalidAmount": "請輸入大於 0 的有效金額",
|
"invalidAmount": "請輸入大於 0 的有效金額",
|
||||||
|
|||||||
@ -116,39 +116,53 @@
|
|||||||
</v-card>
|
</v-card>
|
||||||
</v-dialog>
|
</v-dialog>
|
||||||
|
|
||||||
<v-dialog v-model="editNameDialogOpen" max-width="420">
|
<v-dialog v-model="editNameDialogOpen" max-width="480" content-class="name-dialog">
|
||||||
<v-card class="name-dialog-card" rounded="xl" elevation="0">
|
<v-card class="name-dialog-card" elevation="0">
|
||||||
<div class="name-dialog-title">{{ t('profile.editNameTitle') }}</div>
|
<div class="name-dialog-header">
|
||||||
<v-text-field
|
<h2 class="name-dialog-title">{{ t('profile.editNameTitle') }}</h2>
|
||||||
v-model="editingName"
|
<v-btn
|
||||||
:label="t('profile.newUserName')"
|
icon
|
||||||
variant="outlined"
|
variant="text"
|
||||||
density="comfortable"
|
class="name-dialog-close-btn"
|
||||||
hide-details="auto"
|
:aria-label="t('deposit.close')"
|
||||||
:error-messages="nameError ? [nameError] : []"
|
|
||||||
:hint="t('profile.nameFormatHint')"
|
|
||||||
persistent-hint
|
|
||||||
/>
|
|
||||||
<div class="name-dialog-actions">
|
|
||||||
<button
|
|
||||||
class="name-dialog-cancel-btn"
|
|
||||||
type="button"
|
|
||||||
:disabled="isSaving"
|
|
||||||
@click="closeEditNameDialog"
|
@click="closeEditNameDialog"
|
||||||
>
|
>
|
||||||
{{ t('profile.cancel') }}
|
<v-icon size="18">mdi-close</v-icon>
|
||||||
</button>
|
</v-btn>
|
||||||
<button class="name-dialog-save-btn" type="button" :disabled="isSaving" @click="saveName">
|
|
||||||
<v-progress-circular
|
|
||||||
v-if="isSaving"
|
|
||||||
indeterminate
|
|
||||||
size="18"
|
|
||||||
width="2"
|
|
||||||
class="save-btn-spinner"
|
|
||||||
/>
|
|
||||||
<span v-else>{{ t('profile.save') }}</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
|
<v-card-text class="name-dialog-body">
|
||||||
|
<v-text-field
|
||||||
|
v-model="editingName"
|
||||||
|
:label="t('profile.newUserName')"
|
||||||
|
variant="outlined"
|
||||||
|
density="comfortable"
|
||||||
|
hide-details="auto"
|
||||||
|
:error-messages="nameError ? [nameError] : []"
|
||||||
|
:hint="t('profile.nameFormatHint')"
|
||||||
|
persistent-hint
|
||||||
|
class="name-dialog-field"
|
||||||
|
/>
|
||||||
|
<div class="name-dialog-actions">
|
||||||
|
<button
|
||||||
|
class="name-dialog-cancel-btn"
|
||||||
|
type="button"
|
||||||
|
:disabled="isSaving"
|
||||||
|
@click="closeEditNameDialog"
|
||||||
|
>
|
||||||
|
{{ t('profile.cancel') }}
|
||||||
|
</button>
|
||||||
|
<button class="name-dialog-save-btn" type="button" :disabled="isSaving" @click="saveName">
|
||||||
|
<v-progress-circular
|
||||||
|
v-if="isSaving"
|
||||||
|
indeterminate
|
||||||
|
size="18"
|
||||||
|
width="2"
|
||||||
|
class="save-btn-spinner"
|
||||||
|
/>
|
||||||
|
<span v-else>{{ t('profile.save') }}</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</v-card-text>
|
||||||
</v-card>
|
</v-card>
|
||||||
</v-dialog>
|
</v-dialog>
|
||||||
</div>
|
</div>
|
||||||
@ -851,26 +865,55 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.name-dialog-card {
|
.name-dialog-card {
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
background: #ffffff;
|
|
||||||
padding: 14px;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 10px;
|
overflow: hidden;
|
||||||
|
border-radius: 12px !important;
|
||||||
|
border: 1px solid #f3f4f6;
|
||||||
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.06);
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.name-dialog-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 16px 24px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.name-dialog-title {
|
.name-dialog-title {
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: 600;
|
||||||
color: #111827;
|
color: #111827;
|
||||||
font-size: 15px;
|
margin: 0;
|
||||||
font-weight: 700;
|
text-align: left;
|
||||||
padding: 2px 2px 0;
|
line-height: 1.2;
|
||||||
|
letter-spacing: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.name-dialog-close-btn {
|
||||||
|
flex-shrink: 0;
|
||||||
|
align-self: center;
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.name-dialog-body {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
min-height: 0;
|
||||||
|
padding: 16px 24px 24px;
|
||||||
|
letter-spacing: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.name-dialog-field :deep(.v-field) {
|
||||||
|
border-radius: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.name-dialog-actions {
|
.name-dialog-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
padding-top: 2px;
|
padding-top: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.name-dialog-cancel-btn {
|
.name-dialog-cancel-btn {
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
<v-col cols="12" class="chart-col">
|
<v-col cols="12" class="chart-col">
|
||||||
<!-- 分时图卡片(Polymarket 样式) -->
|
<!-- 分时图卡片(Polymarket 样式) -->
|
||||||
<v-card class="chart-card polymarket-chart" elevation="0" rounded="lg">
|
<v-card class="chart-card polymarket-chart" elevation="0" rounded="lg">
|
||||||
<!-- 顶部:标题、当前概率、Past / 日期 -->
|
<!-- 顶部:标题、当前概率、日期与图表模式 -->
|
||||||
<div class="chart-header">
|
<div class="chart-header">
|
||||||
<h1 class="chart-title">
|
<h1 class="chart-title">
|
||||||
{{ detailLoading && !eventDetail ? t('common.loading') : marketTitle }}
|
{{ detailLoading && !eventDetail ? t('common.loading') : marketTitle }}
|
||||||
|
|||||||
@ -85,12 +85,16 @@
|
|||||||
<div class="design-pos-top">
|
<div class="design-pos-top">
|
||||||
<div class="design-pos-left">
|
<div class="design-pos-left">
|
||||||
<div class="position-icon" :class="pos.iconClass">
|
<div class="position-icon" :class="pos.iconClass">
|
||||||
<img
|
<template v-if="pos.imageUrl">
|
||||||
v-if="pos.imageUrl"
|
<img
|
||||||
:src="pos.imageUrl"
|
v-if="isWalletRemoteIconOk(`p-${pos.id}`)"
|
||||||
alt=""
|
:src="pos.imageUrl"
|
||||||
class="position-icon-img"
|
alt=""
|
||||||
/>
|
class="position-icon-img"
|
||||||
|
@error="markWalletRemoteIconFailed(`p-${pos.id}`)"
|
||||||
|
/>
|
||||||
|
<v-icon v-else size="20" class="position-icon-svg">mdi-currency-usd</v-icon>
|
||||||
|
</template>
|
||||||
<v-icon v-else-if="pos.icon" size="20" class="position-icon-svg">{{
|
<v-icon v-else-if="pos.icon" size="20" class="position-icon-svg">{{
|
||||||
pos.icon
|
pos.icon
|
||||||
}}</v-icon>
|
}}</v-icon>
|
||||||
@ -164,7 +168,16 @@
|
|||||||
>
|
>
|
||||||
<div class="design-order-top">
|
<div class="design-order-top">
|
||||||
<div class="order-mobile-icon" :class="ord.iconClass">
|
<div class="order-mobile-icon" :class="ord.iconClass">
|
||||||
<img v-if="ord.imageUrl" :src="ord.imageUrl" alt="" class="position-icon-img" />
|
<template v-if="ord.imageUrl">
|
||||||
|
<img
|
||||||
|
v-if="isWalletRemoteIconOk(`o-${ord.id}`)"
|
||||||
|
:src="ord.imageUrl"
|
||||||
|
alt=""
|
||||||
|
class="position-icon-img"
|
||||||
|
@error="markWalletRemoteIconFailed(`o-${ord.id}`)"
|
||||||
|
/>
|
||||||
|
<v-icon v-else size="20" class="position-icon-svg">mdi-currency-usd</v-icon>
|
||||||
|
</template>
|
||||||
<span v-else class="position-icon-char">{{ ord.iconChar || '•' }}</span>
|
<span v-else class="position-icon-char">{{ ord.iconChar || '•' }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="order-mobile-main design-order-title-col">
|
<div class="order-mobile-main design-order-title-col">
|
||||||
@ -243,7 +256,16 @@
|
|||||||
<div class="design-history-top">
|
<div class="design-history-top">
|
||||||
<div class="design-history-left">
|
<div class="design-history-left">
|
||||||
<div class="history-mobile-icon" :class="h.iconClass">
|
<div class="history-mobile-icon" :class="h.iconClass">
|
||||||
<img v-if="h.imageUrl" :src="h.imageUrl" alt="" class="position-icon-img" />
|
<template v-if="h.imageUrl">
|
||||||
|
<img
|
||||||
|
v-if="isWalletRemoteIconOk(`h-${h.id}`)"
|
||||||
|
:src="h.imageUrl"
|
||||||
|
alt=""
|
||||||
|
class="position-icon-img"
|
||||||
|
@error="markWalletRemoteIconFailed(`h-${h.id}`)"
|
||||||
|
/>
|
||||||
|
<v-icon v-else size="20" class="position-icon-svg">mdi-currency-usd</v-icon>
|
||||||
|
</template>
|
||||||
<span v-else class="position-icon-char">{{ h.iconChar || '•' }}</span>
|
<span v-else class="position-icon-char">{{ h.iconChar || '•' }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="history-mobile-main">
|
<div class="history-mobile-main">
|
||||||
@ -271,9 +293,10 @@
|
|||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="design-funding-left">
|
<div class="design-funding-left">
|
||||||
<div class="history-mobile-icon" :class="getFundingIconClass(h)">
|
<div class="history-mobile-icon funding-icon-shell">
|
||||||
<img v-if="h.imageUrl" :src="h.imageUrl" alt="" class="position-icon-img" />
|
<div class="funding-icon-disc">
|
||||||
<span v-else class="position-icon-char">{{ getFundingIconText(h) }}</span>
|
<v-icon size="20" class="funding-icon-usd">mdi-currency-usd</v-icon>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="history-mobile-main">
|
<div class="history-mobile-main">
|
||||||
<MarqueeTitle
|
<MarqueeTitle
|
||||||
@ -428,12 +451,16 @@
|
|||||||
<v-card-text class="sell-dialog-body">
|
<v-card-text class="sell-dialog-body">
|
||||||
<div class="sell-dialog-icon-wrap">
|
<div class="sell-dialog-icon-wrap">
|
||||||
<div class="position-icon" :class="sellPositionItem.iconClass">
|
<div class="position-icon" :class="sellPositionItem.iconClass">
|
||||||
<img
|
<template v-if="sellPositionItem.imageUrl">
|
||||||
v-if="sellPositionItem.imageUrl"
|
<img
|
||||||
:src="sellPositionItem.imageUrl"
|
v-if="isWalletRemoteIconOk(`s-${sellPositionItem.id}`)"
|
||||||
alt=""
|
:src="sellPositionItem.imageUrl"
|
||||||
class="position-icon-img"
|
alt=""
|
||||||
/>
|
class="position-icon-img"
|
||||||
|
@error="markWalletRemoteIconFailed(`s-${sellPositionItem.id}`)"
|
||||||
|
/>
|
||||||
|
<v-icon v-else size="20" class="position-icon-svg">mdi-currency-usd</v-icon>
|
||||||
|
</template>
|
||||||
<v-icon v-else-if="sellPositionItem.icon" size="20" class="position-icon-svg">{{
|
<v-icon v-else-if="sellPositionItem.icon" size="20" class="position-icon-svg">{{
|
||||||
sellPositionItem.icon
|
sellPositionItem.icon
|
||||||
}}</v-icon>
|
}}</v-icon>
|
||||||
@ -513,6 +540,20 @@ import { USE_MOCK_WALLET } from '../config/mock'
|
|||||||
import { CrossChainUSDTAuth } from '../../sdk/approve'
|
import { CrossChainUSDTAuth } from '../../sdk/approve'
|
||||||
import { useToastStore } from '../stores/toast'
|
import { useToastStore } from '../stores/toast'
|
||||||
|
|
||||||
|
/** 远程 iconUrl 加载失败时改显示 MDI 矢量图标,与全局 Vuetify 图标体系一致 */
|
||||||
|
const walletRemoteIconFailed = ref<Set<string>>(new Set())
|
||||||
|
|
||||||
|
function isWalletRemoteIconOk(key: string): boolean {
|
||||||
|
return !walletRemoteIconFailed.value.has(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
function markWalletRemoteIconFailed(key: string) {
|
||||||
|
if (walletRemoteIconFailed.value.has(key)) return
|
||||||
|
const next = new Set(walletRemoteIconFailed.value)
|
||||||
|
next.add(key)
|
||||||
|
walletRemoteIconFailed.value = next
|
||||||
|
}
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const { mobile } = useDisplay()
|
const { mobile } = useDisplay()
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
@ -800,14 +841,6 @@ function getFundingTitle(h: HistoryItem): string {
|
|||||||
: t('wallet.usdtDepositHistoryLabel')
|
: t('wallet.usdtDepositHistoryLabel')
|
||||||
}
|
}
|
||||||
|
|
||||||
function getFundingIconText(h: HistoryItem): string {
|
|
||||||
return isWithdrawalHistory(h) ? t('wallet.withdrawIconText') : t('wallet.depositIconText')
|
|
||||||
}
|
|
||||||
|
|
||||||
function getFundingIconClass(h: HistoryItem): string {
|
|
||||||
return isWithdrawalHistory(h) ? 'funding-icon-withdraw' : 'funding-icon-deposit'
|
|
||||||
}
|
|
||||||
|
|
||||||
function getHistoryTagLabel(h: HistoryItem): string {
|
function getHistoryTagLabel(h: HistoryItem): string {
|
||||||
if (!h.recordType) {
|
if (!h.recordType) {
|
||||||
return h.profitLossNegative ? t('wallet.historySideBuy') : t('wallet.historySideSell')
|
return h.profitLossNegative ? t('wallet.historySideBuy') : t('wallet.historySideSell')
|
||||||
@ -1375,8 +1408,7 @@ function initPlChart() {
|
|||||||
handleScale: false,
|
handleScale: false,
|
||||||
crosshair: { vertLine: { labelVisible: false }, horzLine: { labelVisible: true } },
|
crosshair: { vertLine: { labelVisible: false }, horzLine: { labelVisible: true } },
|
||||||
})
|
})
|
||||||
const lastVal = last != null ? last[1] : 0
|
const color = '#4b5563'
|
||||||
const color = lastVal >= 0 ? '#059669' : '#dc2626'
|
|
||||||
plChartSeries = plChartInstance.addSeries(AreaSeries, {
|
plChartSeries = plChartInstance.addSeries(AreaSeries, {
|
||||||
topColor: color + '40',
|
topColor: color + '40',
|
||||||
bottomColor: color + '08',
|
bottomColor: color + '08',
|
||||||
@ -1545,8 +1577,8 @@ async function submitAuthorize() {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 4px;
|
gap: 4px;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #059669;
|
color: #374151;
|
||||||
background-color: #d1fae5;
|
background-color: #f3f4f6;
|
||||||
padding: 4px 8px;
|
padding: 4px 8px;
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
}
|
}
|
||||||
@ -1864,12 +1896,9 @@ async function submitAuthorize() {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.order-value-primary {
|
.order-value-primary,
|
||||||
color: #5b5bd6;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-value-secondary {
|
.order-value-secondary {
|
||||||
color: #6b7280;
|
color: #111827;
|
||||||
}
|
}
|
||||||
|
|
||||||
.design-pos-stats,
|
.design-pos-stats,
|
||||||
@ -1935,26 +1964,17 @@ async function submitAuthorize() {
|
|||||||
padding: 0 10px;
|
padding: 0 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.side-buy {
|
.side-buy,
|
||||||
color: #2563eb;
|
|
||||||
border: 1.5px solid #2563eb;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.side-sell {
|
.side-sell {
|
||||||
color: #dc2626;
|
color: #374151;
|
||||||
border: 1.5px solid #dc2626;
|
border: 1.5px solid #e5e7eb;
|
||||||
background: transparent;
|
background: #f9fafb;
|
||||||
}
|
|
||||||
|
|
||||||
.outcome-yes {
|
|
||||||
color: #16a34a;
|
|
||||||
background: #dcfce7;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.outcome-yes,
|
||||||
.outcome-no {
|
.outcome-no {
|
||||||
color: #dc2626;
|
color: #374151;
|
||||||
background: #fee2e2;
|
background: #f3f4f6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.design-history-bottom {
|
.design-history-bottom {
|
||||||
@ -2008,32 +2028,38 @@ async function submitAuthorize() {
|
|||||||
gap: 12px;
|
gap: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.history-tag-sell {
|
.history-tag-sell,
|
||||||
color: #2563eb;
|
.history-tag-buy,
|
||||||
border: 1.5px solid #2563eb;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.history-tag-buy {
|
|
||||||
color: #dc2626;
|
|
||||||
border: 1.5px solid #dc2626;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.history-tag-type {
|
.history-tag-type {
|
||||||
color: #6d28d9;
|
color: #374151;
|
||||||
border: 1.5px solid #7c3aed;
|
border: 1.5px solid #e5e7eb;
|
||||||
background: rgba(124, 58, 237, 0.06);
|
background: #f9fafb;
|
||||||
}
|
}
|
||||||
|
|
||||||
.funding-icon-deposit {
|
/* 资金流水:淡蓝底 + 蓝色圆 + 白色 $(与产品参考一致) */
|
||||||
background: #dcfce7;
|
.history-mobile-card.design-funding-card .history-mobile-icon.funding-icon-shell {
|
||||||
color: #16a34a;
|
background: #edf2ff;
|
||||||
|
padding: 8px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.funding-icon-withdraw {
|
.funding-icon-disc {
|
||||||
background: #fee2e2;
|
width: 28px;
|
||||||
color: #dc2626;
|
height: 28px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: #2b66ff;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
overflow: hidden;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.funding-icon-usd {
|
||||||
|
color: #ffffff !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.design-history-meta {
|
.design-history-meta {
|
||||||
@ -2169,14 +2195,10 @@ async function submitAuthorize() {
|
|||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pill-down {
|
.pill-down,
|
||||||
background-color: #fee2e2;
|
|
||||||
color: #dc2626;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pill-yes {
|
.pill-yes {
|
||||||
background-color: #dcfce7;
|
background-color: #f3f4f6;
|
||||||
color: #059669;
|
color: #374151;
|
||||||
}
|
}
|
||||||
|
|
||||||
.position-shares {
|
.position-shares {
|
||||||
@ -2202,12 +2224,9 @@ async function submitAuthorize() {
|
|||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.value-loss {
|
.value-loss,
|
||||||
color: #dc2626;
|
|
||||||
}
|
|
||||||
|
|
||||||
.value-gain {
|
.value-gain {
|
||||||
color: #059669;
|
color: #6b7280;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cell-actions {
|
.cell-actions {
|
||||||
@ -2452,7 +2471,7 @@ async function submitAuthorize() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.filter-btn-cancel {
|
.filter-btn-cancel {
|
||||||
color: #dc2626;
|
color: #6b7280;
|
||||||
}
|
}
|
||||||
|
|
||||||
.filter-btn-cancel .v-icon {
|
.filter-btn-cancel .v-icon {
|
||||||
@ -2540,12 +2559,9 @@ async function submitAuthorize() {
|
|||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pl-gain {
|
.pl-gain,
|
||||||
color: #059669;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pl-loss {
|
.pl-loss {
|
||||||
color: #dc2626;
|
color: #111827;
|
||||||
}
|
}
|
||||||
|
|
||||||
.history-mobile-time {
|
.history-mobile-time {
|
||||||
@ -2593,13 +2609,9 @@ async function submitAuthorize() {
|
|||||||
color: #6b7280;
|
color: #6b7280;
|
||||||
}
|
}
|
||||||
|
|
||||||
.side-yes {
|
.side-yes,
|
||||||
color: #059669;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.side-no {
|
.side-no {
|
||||||
color: #dc2626;
|
color: #374151;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2650,7 +2662,7 @@ async function submitAuthorize() {
|
|||||||
}
|
}
|
||||||
.withdrawal-mobile-reason {
|
.withdrawal-mobile-reason {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #dc2626;
|
color: #6b7280;
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
}
|
}
|
||||||
.withdrawal-status-pill {
|
.withdrawal-status-pill {
|
||||||
@ -2660,21 +2672,12 @@ async function submitAuthorize() {
|
|||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
.withdrawal-status-pill.status-pending {
|
.withdrawal-status-pill.status-pending,
|
||||||
background: #fef3c7;
|
.withdrawal-status-pill.status-success,
|
||||||
color: #b45309;
|
.withdrawal-status-pill.status-rejected,
|
||||||
}
|
|
||||||
.withdrawal-status-pill.status-success {
|
|
||||||
background: #dcfce7;
|
|
||||||
color: #166534;
|
|
||||||
}
|
|
||||||
.withdrawal-status-pill.status-rejected {
|
|
||||||
background: #fee2e2;
|
|
||||||
color: #991b1b;
|
|
||||||
}
|
|
||||||
.withdrawal-status-pill.status-failed {
|
.withdrawal-status-pill.status-failed {
|
||||||
background: #fee2e2;
|
background: #f3f4f6;
|
||||||
color: #991b1b;
|
color: #374151;
|
||||||
}
|
}
|
||||||
.withdrawal-reason {
|
.withdrawal-reason {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
@ -2849,7 +2852,7 @@ async function submitAuthorize() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.sell-receive-box {
|
.sell-receive-box {
|
||||||
background-color: #dcfce7;
|
background-color: #f3f4f6;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
@ -2865,13 +2868,13 @@ async function submitAuthorize() {
|
|||||||
gap: 8px;
|
gap: 8px;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
color: #166534;
|
color: #374151;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sell-receive-value {
|
.sell-receive-value {
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #166534;
|
color: #111827;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sell-dialog-actions {
|
.sell-dialog-actions {
|
||||||
@ -2887,7 +2890,7 @@ async function submitAuthorize() {
|
|||||||
|
|
||||||
.sell-edit-link {
|
.sell-edit-link {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #2563eb;
|
color: #374151;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user