优化:UI优化

This commit is contained in:
ivan 2026-04-01 23:17:05 +08:00
parent 9ec66ff163
commit 2b84e5f01e
9 changed files with 225 additions and 196 deletions

View File

@ -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;

View File

@ -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",

View File

@ -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 より大きい有効な金額を入力してください",

View File

@ -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보다 큰 유효한 금액을 입력하세요",

View File

@ -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 的有效金额",

View File

@ -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 的有效金額",

View File

@ -116,9 +116,21 @@
</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">
<h2 class="name-dialog-title">{{ t('profile.editNameTitle') }}</h2>
<v-btn
icon
variant="text"
class="name-dialog-close-btn"
:aria-label="t('deposit.close')"
@click="closeEditNameDialog"
>
<v-icon size="18">mdi-close</v-icon>
</v-btn>
</div>
<v-card-text class="name-dialog-body">
<v-text-field <v-text-field
v-model="editingName" v-model="editingName"
:label="t('profile.newUserName')" :label="t('profile.newUserName')"
@ -128,6 +140,7 @@
:error-messages="nameError ? [nameError] : []" :error-messages="nameError ? [nameError] : []"
:hint="t('profile.nameFormatHint')" :hint="t('profile.nameFormatHint')"
persistent-hint persistent-hint
class="name-dialog-field"
/> />
<div class="name-dialog-actions"> <div class="name-dialog-actions">
<button <button
@ -149,6 +162,7 @@
<span v-else>{{ t('profile.save') }}</span> <span v-else>{{ t('profile.save') }}</span>
</button> </button>
</div> </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 {

View File

@ -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 }}

View File

@ -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">
<template v-if="pos.imageUrl">
<img <img
v-if="pos.imageUrl" v-if="isWalletRemoteIconOk(`p-${pos.id}`)"
:src="pos.imageUrl" :src="pos.imageUrl"
alt="" alt=""
class="position-icon-img" 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">
<template v-if="sellPositionItem.imageUrl">
<img <img
v-if="sellPositionItem.imageUrl" v-if="isWalletRemoteIconOk(`s-${sellPositionItem.id}`)"
:src="sellPositionItem.imageUrl" :src="sellPositionItem.imageUrl"
alt="" alt=""
class="position-icon-img" 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;
} }