|
|
@@ -9,23 +9,36 @@
|
|
|
:style="{ transform: `translateX(${(index - currentIndex) * 100 + offsetX}%)` }"
|
|
|
>
|
|
|
<div class="card-info" @click.stop="(e: MouseEvent) => toggleCardNo(card.id, e)" :class="{ flipping: isFlipping[card.id] }">
|
|
|
- <img src="@/assets/images/logo.png" alt="" srcset="" />
|
|
|
- <div class="number" v-if="showCardNo[card.id]">
|
|
|
- {{ card?.cardNo}}
|
|
|
- </div>
|
|
|
- <div class="number" v-else>
|
|
|
- {{ card?.cardNo?.replace(/(\d{4})\d+(\d{4})/, '$1 **** **** $2') }}
|
|
|
- </div>
|
|
|
- <div class="card-b">
|
|
|
- <div class="valid">
|
|
|
- <span class="lable">{{ t('cards.p13') }}</span>
|
|
|
- <span>{{ card.firstName }} {{ card.lastName }}</span>
|
|
|
+ <p class="card-name">Virtual</p>
|
|
|
+ <img class="card-type" src="@/assets/images/c-type.png" alt="" srcset="" />
|
|
|
+ <img class="logo" src="@/assets/images/logo1.png" alt="" srcset="" />
|
|
|
+ <template v-if="showCardNo[card.id]">
|
|
|
+ <div class="number">
|
|
|
+ {{ card?.cardNo }}
|
|
|
+ <span class="copy" @click.stop="cardCopy(card.cardNo, 'cardNo')"><icon name="copy" :size="23" color="" /></span>
|
|
|
</div>
|
|
|
- <div class="valid">
|
|
|
- <span class="lable">{{ t('cards.p14') }}</span>
|
|
|
- <span>{{ card.expire }}</span>
|
|
|
+ <div class="card-b">
|
|
|
+ <div class="valid">
|
|
|
+ <span class="lable">{{ t('cards.p13') }}</span>
|
|
|
+ <span>{{ card.firstName }} {{ card.lastName }}</span>
|
|
|
+ </div>
|
|
|
+ <div class="valid">
|
|
|
+ <span class="lable">{{ t('cards.p14') }}</span>
|
|
|
+ <span>{{ card.expire }}</span>
|
|
|
+ </div>
|
|
|
+ <div class="valid">
|
|
|
+ <span class="lable">CVV</span>
|
|
|
+ <div class="cvv">
|
|
|
+ {{ card.cvv }}
|
|
|
+ <span class="copy" @click.stop="cardCopy(card.cvv, 'cvv')"><icon name="copy" :size="23" color="" /></span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <div class="zw">**** 7549</div>
|
|
|
+ </template>
|
|
|
+
|
|
|
<img
|
|
|
v-if="card.status != 1"
|
|
|
src="https://upload.wikimedia.org/wikipedia/commons/a/a4/Flag_of_the_United_States.svg"
|
|
|
@@ -65,7 +78,7 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<template v-if="!currentCard.isOk">
|
|
|
- <div class="balance-content">{{ t('apply-record-detail.p1') }}</div>
|
|
|
+ <div class="balance-content1">{{ t('apply-record-detail.p1') }}</div>
|
|
|
<div class="g">
|
|
|
<img src="../assets/images/apply-record-1.png" alt="" />
|
|
|
<div class="g-l">
|
|
|
@@ -76,7 +89,7 @@
|
|
|
<div class="label">{{ t('apply-record-detail.p2') }}</div>
|
|
|
<div :class="statusClass(currentCard.kycStatus)">{{ statusMap[currentCard.kycStatus] }}</div>
|
|
|
</div>
|
|
|
- <div class="g-item" v-if="currentCard.applyStatus === 0 || currentCard.applyStatus === 1">
|
|
|
+ <div class="g-item" v-if="currentCard.kycStatus == 2 && (currentCard.applyStatus === 0 || currentCard.applyStatus === 1)">
|
|
|
<div class="label">{{ t('apply-record-detail.p7') }}</div>
|
|
|
<div :class="statusClass1(currentCard.applyStatus)">{{ applyStatusMap[currentCard.applyStatus] }}</div>
|
|
|
</div>
|
|
|
@@ -84,25 +97,31 @@
|
|
|
</div>
|
|
|
|
|
|
<div class="cwg-button cwg-btn">
|
|
|
- <van-button type="primary" block v-if="currentCard.kycStatus === 2 && currentCard.applyStatus === null" @click="handleApply(2, currentCard)">{{
|
|
|
- t('cards.p6')
|
|
|
- }}</van-button>
|
|
|
- <van-button type="primary" block v-if="[null, -1, 1, 3].includes(currentCard.kycStatus)" @click="handleApply(3, currentCard)">{{
|
|
|
- t('cards.p7')
|
|
|
- }}</van-button>
|
|
|
- </div>
|
|
|
+ <van-button
|
|
|
+ type="primary"
|
|
|
+ block
|
|
|
+ v-if="currentCard.kycStatus === 2 && currentCard.applyStatus === null"
|
|
|
+ @click="handleApply(2, currentCard)"
|
|
|
+ >{{ t('cards.p6') }}</van-button
|
|
|
+ >
|
|
|
+ <van-button type="primary" block v-if="[null, -1, 1, 3].includes(currentCard.kycStatus)" @click="handleApply(3, currentCard)">{{
|
|
|
+ t('cards.p7')
|
|
|
+ }}</van-button>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
<template v-if="currentCard.isOk">
|
|
|
<div class="balance-wrap" v-if="balance.length > 0">
|
|
|
<div class="balance-content">{{ t('cards.currency') }}</div>
|
|
|
- <div class="balance-title">{{ t('cards.balance') }}</div>
|
|
|
</div>
|
|
|
- <div class="balance-wrap" v-for="item in balance" :key="item.currency">
|
|
|
- <div class="currency">
|
|
|
- <img :src="imageSrc(item.currency)" class="flag" />
|
|
|
- <span>{{ item.currency }}</span>
|
|
|
+ <div class="balance-wrap">
|
|
|
+ <div class="global-con-l" @click="setModelValue">
|
|
|
+ <img :src="imageSrc(currency)" alt="" srcset="" />
|
|
|
+ <div class="r">
|
|
|
+ <p>{{ currency }}</p>
|
|
|
+ </div>
|
|
|
+ <icon name="icon_dropdown" :size="24" />
|
|
|
</div>
|
|
|
- <div class="balance">{{ item.amount }}</div>
|
|
|
+ <div class="balance">{{ amount }}</div>
|
|
|
</div>
|
|
|
<div class="trans-header">
|
|
|
<div class="trans-title">{{ t('cards.transactions') }}</div>
|
|
|
@@ -122,25 +141,53 @@
|
|
|
@confirm="onConfirmStart"
|
|
|
/>
|
|
|
</div>
|
|
|
- <div class="transactions" v-if="transactions.length > 0">
|
|
|
- <div v-for="t in transactions" :key="t.id" class="transaction" @click="goToTransactionDetail(t)">
|
|
|
- <div class="trans-icon">
|
|
|
- <div class="trans-icon-inner">
|
|
|
- <i class="i-mdi-cart-outline"></i>
|
|
|
+
|
|
|
+ <div class="tab">
|
|
|
+ <div class="item" :class="{ active: jiluIndex === 0 }" @click="jiluIndex = 0">{{ t('cards.rechargeB1') }}</div>
|
|
|
+ <div class="item" :class="{ active: jiluIndex === 1 }" @click="jiluIndex = 1">{{ t('cards.transferB2') }}</div>
|
|
|
+ </div>
|
|
|
+ <template v-if="jiluIndex === 0">
|
|
|
+ <div class="recharge" v-if="recharge.length > 0">
|
|
|
+ <div v-for="i in recharge" :key="i.id" class="transaction" @click="goToTransactionDetail1(i)">
|
|
|
+ <div class="trans-icon">
|
|
|
+ <div class="trans-icon-inner">$</div>
|
|
|
+ </div>
|
|
|
+ <div class="trans-left">
|
|
|
+ <div class="trans-type">{{ i.typeDesc }}</div>
|
|
|
+ <div class="trans-desc">{{ statusRechargeMap[i.status] }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="trans-right">
|
|
|
+ <div class="trans-amount">{{ i.amount }} {{ i.currency }}</div>
|
|
|
+ <div class="trans-date">{{ i.time }}</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="trans-left">
|
|
|
- <div class="trans-type">{{ t.tradeTypeStr }}</div>
|
|
|
- <div class="trans-desc">{{ t.remark }}</div>
|
|
|
- </div>
|
|
|
- <div class="trans-right">
|
|
|
- <div class="trans-amount">{{ t.amount }} {{ t.currencyTxn }}</div>
|
|
|
- <div class="trans-date">{{ t.businessDate }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="recharge" v-else>
|
|
|
+ <EmptyState :title="t('empty-state.t2')" :text="t('empty-state.c2')" />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <div class="transactions" v-if="transactions.length > 0">
|
|
|
+ <div v-for="t in transactions" :key="t.id" class="transaction" @click="goToTransactionDetail(t)">
|
|
|
+ <div class="trans-icon">
|
|
|
+ <div class="trans-icon-inner">
|
|
|
+ <i class="i-mdi-cart-outline"></i>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="trans-left">
|
|
|
+ <div class="trans-type">{{ t.tradeTypeStr }}</div>
|
|
|
+ <div class="trans-desc">{{ t.remark }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="trans-right">
|
|
|
+ <div class="trans-amount">{{ t.amount }} {{ t.currencyTxn }}</div>
|
|
|
+ <div class="trans-date">{{ t.businessDate }}</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- <EmptyState :title="t('empty-state.t1')" :text="t('empty-state.c1')"
|
|
|
- /></template>
|
|
|
+ <EmptyState v-if="transactions.length == 0" :title="t('empty-state.t1')" :text="t('empty-state.c1')" />
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ <CurrencySelect :showSearch="true" :options="balance" v-model="modelValue" @select="changeSelect" />
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
@@ -156,10 +203,16 @@ const router = useRouter()
|
|
|
import useUserStore from '@/stores/use-user-store'
|
|
|
const userStore = useUserStore()
|
|
|
const cardList = computed(() => userStore.userCard)
|
|
|
+const userInfo = computed(() => userStore.userInfo)
|
|
|
const { t } = useI18n()
|
|
|
const currentCard = ref<CardInfo | null>({})
|
|
|
-const balance = ref<{ balance: number; currency: string }[]>([])
|
|
|
-const globalStore = useGlobalStore()
|
|
|
+const balance = ref<{ amount: number; currency: string; value: string }[]>([
|
|
|
+ {
|
|
|
+ amount: 0,
|
|
|
+ currency: 'USD',
|
|
|
+ value: 'USD',
|
|
|
+ },
|
|
|
+])
|
|
|
const transactions = ref<TransactionInfo[]>([])
|
|
|
const showCardNo = ref<{ [key: string]: boolean }>({})
|
|
|
const isFlipping = ref<{ [key: string]: boolean }>({})
|
|
|
@@ -169,8 +222,71 @@ const offsetX = ref(0)
|
|
|
const isDragging = ref(false)
|
|
|
const images = import.meta.glob('@/assets/images/currency/*.png', { eager: true })
|
|
|
|
|
|
-const imageSrc = (currency:string) => {
|
|
|
- return images[`/src/assets/images/currency/${currency}.png`]?.default || fallbackImg
|
|
|
+const imageSrc = (currency: string) => {
|
|
|
+ return images[`/src/assets/images/currency/${currency}.png`]?.default || fallbackImg
|
|
|
+}
|
|
|
+const jiluIndex = ref(0)
|
|
|
+
|
|
|
+import copyIcon from '@/assets/images/success.png'
|
|
|
+import errorIcon from '@/assets/images/error.png'
|
|
|
+const cardCopy = (content, type) => {
|
|
|
+ let message
|
|
|
+ if (type == 'cardNo') {
|
|
|
+ message = t('common.copy1')
|
|
|
+ } else if (type == 'cvv') {
|
|
|
+ message = t('common.copy2')
|
|
|
+ }
|
|
|
+ if (navigator.clipboard && window.isSecureContext) {
|
|
|
+ navigator.clipboard
|
|
|
+ .writeText(content)
|
|
|
+ .then(() => {
|
|
|
+ showToast({
|
|
|
+ message,
|
|
|
+ icon: copyIcon,
|
|
|
+ className: 'custom-toast',
|
|
|
+ })
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ showToast({
|
|
|
+ message: t('common.copy3'),
|
|
|
+ icon: errorIcon,
|
|
|
+ className: 'custom-toast',
|
|
|
+ })
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ const textarea = document.createElement('textarea')
|
|
|
+ textarea.value = content
|
|
|
+ textarea.setAttribute('readonly', '')
|
|
|
+ textarea.style.position = 'absolute'
|
|
|
+ textarea.style.left = '-9999px'
|
|
|
+ document.body.appendChild(textarea)
|
|
|
+ textarea.select()
|
|
|
+ try {
|
|
|
+ document.execCommand('copy')
|
|
|
+ showToast({
|
|
|
+ message,
|
|
|
+ icon: copyIcon,
|
|
|
+ className: 'custom-toast',
|
|
|
+ })
|
|
|
+ } catch (err) {
|
|
|
+ showToast({
|
|
|
+ message: t('common.copy3'),
|
|
|
+ icon: errorIcon,
|
|
|
+ className: 'custom-toast',
|
|
|
+ })
|
|
|
+ }
|
|
|
+ document.body.removeChild(textarea)
|
|
|
+ }
|
|
|
+}
|
|
|
+const currency = ref('USD')
|
|
|
+const amount = ref(0)
|
|
|
+const modelValue = ref(false)
|
|
|
+const setModelValue = () => {
|
|
|
+ modelValue.value = true
|
|
|
+}
|
|
|
+const changeSelect = (e) => {
|
|
|
+ amount.value = e.amount
|
|
|
+ currency.value = e.currency
|
|
|
}
|
|
|
const showDatePicker = ref(false)
|
|
|
const dateRange = ref<[string, string] | undefined>(undefined)
|
|
|
@@ -206,6 +322,40 @@ const ucardActivate = async (id: string) => {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+const recharge = ref<Transaction[]>([])
|
|
|
+
|
|
|
+// 获取充值记录
|
|
|
+async function getRechargeList() {
|
|
|
+ try {
|
|
|
+ recharge.value = []
|
|
|
+ if (!currentCard.value?.cardNo) return
|
|
|
+ const res = await ucardApi.rechargeList({
|
|
|
+ cardNo: currentCard.value?.cardNo,
|
|
|
+ page: { current: 1, row: 4 },
|
|
|
+ })
|
|
|
+ if (res.code === 200 && res.data) {
|
|
|
+ recharge.value = res.data
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ recharge.value = []
|
|
|
+ showToast(error as string)
|
|
|
+ }
|
|
|
+}
|
|
|
+const statusRechargeMap = {
|
|
|
+ '1': t('card-recharge.rechargeSuccess'),
|
|
|
+ '2': t('card-recharge.rechargeFailed'),
|
|
|
+ '3': t('card-recharge.rechargePending'),
|
|
|
+}
|
|
|
+
|
|
|
+const goToTransactionDetail1 = (i: TransactionInfo) => {
|
|
|
+ router.push({
|
|
|
+ path: '/recharge/record/detail',
|
|
|
+ query: {
|
|
|
+ orderNo: i.orderNo,
|
|
|
+ },
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
// 获取交易记录
|
|
|
const getTransactions = async () => {
|
|
|
try {
|
|
|
@@ -228,24 +378,55 @@ const getTransactions = async () => {
|
|
|
}
|
|
|
|
|
|
const getBalance = async () => {
|
|
|
- globalStore.setFullScreenLoading(true)
|
|
|
try {
|
|
|
- balance.value = []
|
|
|
+ balance.value = [
|
|
|
+ {
|
|
|
+ amount: 0,
|
|
|
+ currency: 'USD',
|
|
|
+ value: 'USD',
|
|
|
+ },
|
|
|
+ ]
|
|
|
if (!currentCard.value?.cardNo) return
|
|
|
const res = await ucardApi.ucardBalance({
|
|
|
cardNo: currentCard.value?.cardNo,
|
|
|
uniqueId: currentCard.value?.uniqueId,
|
|
|
})
|
|
|
+ res.data.map((item: any) => {
|
|
|
+ item.value = item.currency
|
|
|
+ })
|
|
|
+
|
|
|
if (res.code == 200) {
|
|
|
+ res.data.push({
|
|
|
+ amount: 0,
|
|
|
+ currency: 'EUR',
|
|
|
+ value: 'EUR',
|
|
|
+ })
|
|
|
balance.value = res.data
|
|
|
+ if (balance.value.length > 0) {
|
|
|
+ currency.value = balance.value[0].currency
|
|
|
+ amount.value = balance.value[0].amount
|
|
|
+ } else {
|
|
|
+ currency.value = 'USD'
|
|
|
+ amount.value = 0
|
|
|
+ }
|
|
|
} else {
|
|
|
- balance.value = []
|
|
|
+ balance.value = [
|
|
|
+ {
|
|
|
+ amount: 0,
|
|
|
+ currency: 'USD',
|
|
|
+ value: 'USD',
|
|
|
+ },
|
|
|
+ ]
|
|
|
}
|
|
|
} catch (error: any) {
|
|
|
showToast(error?.message || String(error))
|
|
|
- balance.value = []
|
|
|
- } finally {
|
|
|
- globalStore.setFullScreenLoading(false)
|
|
|
+ balance.value = [
|
|
|
+ {
|
|
|
+ amount: 0,
|
|
|
+ currency: 'USD',
|
|
|
+ value: 'USD',
|
|
|
+ },
|
|
|
+ ]
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -299,12 +480,22 @@ const handleApply = (type: number, item: any) => {
|
|
|
path: '/kyc',
|
|
|
query: {
|
|
|
cardTypeId: item.cardTypeId,
|
|
|
- type: 0,
|
|
|
+ type: 3,
|
|
|
},
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+const ucardApply = async (item: any) => {
|
|
|
+ const res = await ucardApi.ucardApply({
|
|
|
+ cardTypeId: item.cardTypeId,
|
|
|
+ uniqueId: userInfo.value.customInfo.uniqueId,
|
|
|
+ })
|
|
|
+ if (res.code === 200) {
|
|
|
+ showToast(t('kyc.kycSuccess2'))
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
watch(
|
|
|
currentIndex,
|
|
|
(newIndex) => {
|
|
|
@@ -312,14 +503,30 @@ watch(
|
|
|
currentCard.value = cardList.value[newIndex]
|
|
|
if (cardList.value[newIndex].isOk) {
|
|
|
getTransactions()
|
|
|
+ getRechargeList()
|
|
|
getBalance()
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
{ immediate: true },
|
|
|
)
|
|
|
+watch(
|
|
|
+ jiluIndex,
|
|
|
+ (newIndex) => {
|
|
|
+ console.log('jiluIndex changed:', newIndex)
|
|
|
+ if (newIndex === 0) {
|
|
|
+ getRechargeList()
|
|
|
+ } else {
|
|
|
+ getTransactions()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // { immediate: true },
|
|
|
+)
|
|
|
|
|
|
const toggleCardNo = (cardId: string, event: MouseEvent) => {
|
|
|
+ if (!cardId) {
|
|
|
+ return
|
|
|
+ }
|
|
|
event.stopPropagation()
|
|
|
isFlipping.value[cardId] = !isFlipping.value[cardId]
|
|
|
showCardNo.value[cardId] = !showCardNo.value[cardId]
|
|
|
@@ -396,8 +603,8 @@ async function goToFreezeCard() {
|
|
|
case 1:
|
|
|
let res = await ucardApi.ucardFreeze({ cardNo: currentCard.value?.cardNo, uniqueId: currentCard.value?.uniqueId })
|
|
|
if (res.code === 200) {
|
|
|
+ currentCard.value.freezeStatus = 2
|
|
|
showToast('冻结成功')
|
|
|
- getCardList()
|
|
|
} else {
|
|
|
showToast(res.msg)
|
|
|
}
|
|
|
@@ -405,15 +612,15 @@ async function goToFreezeCard() {
|
|
|
case 2:
|
|
|
let res1 = await ucardApi.ucardUnfreeze({ cardNo: currentCard.value?.cardNo, uniqueId: currentCard.value?.uniqueId })
|
|
|
if (res1.code === 200) {
|
|
|
+ currentCard.value.freezeStatus = 1
|
|
|
showToast('解冻成功')
|
|
|
- getCardList()
|
|
|
} else {
|
|
|
showToast(res1.msg)
|
|
|
}
|
|
|
break
|
|
|
}
|
|
|
} catch (error) {
|
|
|
- showToast(error || String(error))
|
|
|
+ showToast(t('common.error'))
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -435,7 +642,7 @@ onMounted(async () => {
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
.page {
|
|
|
- padding: 0 16px;
|
|
|
+ padding: 0 16px 70px 16px;
|
|
|
}
|
|
|
.card-wrapper {
|
|
|
position: absolute;
|
|
|
@@ -446,32 +653,66 @@ onMounted(async () => {
|
|
|
}
|
|
|
|
|
|
.card-info {
|
|
|
- background: url(/src/assets/images/visa.png) no-repeat center center;
|
|
|
+ background: url(/src/assets/images/visa1.png) no-repeat center center;
|
|
|
background-size: cover;
|
|
|
- border-radius: 0.426667rem;
|
|
|
- padding: 0.64rem 0.533333rem 0 0.533333rem;
|
|
|
+ border-radius: 16px;
|
|
|
+ padding: 16px;
|
|
|
color: var(--main-yellow);
|
|
|
- box-shadow: 0 0.106667rem 0.533333rem rgba(214, 255, 0, 0.1);
|
|
|
- border: 1px solid rgba(214, 255, 0, 0.2);
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
display: flex;
|
|
|
justify-content: flex-start;
|
|
|
align-items: baseline;
|
|
|
flex-wrap: wrap;
|
|
|
- transform-style: preserve-3d;
|
|
|
- transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
- flex-direction: column;
|
|
|
+ /* transform-style: preserve-3d;
|
|
|
+ transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1); */
|
|
|
+ /* flex-direction: column; */
|
|
|
+
|
|
|
+ .logo {
|
|
|
+ width: 120px;
|
|
|
+ height: auto;
|
|
|
+ margin-bottom: 16px;
|
|
|
+ }
|
|
|
+ .card-type {
|
|
|
+ width: 74px;
|
|
|
+ height: 39px;
|
|
|
+ position: absolute;
|
|
|
+ bottom: 16px;
|
|
|
+ right: 16px;
|
|
|
+ z-index: 1;
|
|
|
+ }
|
|
|
+ .card-name {
|
|
|
+ position: absolute;
|
|
|
+ top: 16px;
|
|
|
+ right: 16px;
|
|
|
+ font-size: var(--font-size-14);
|
|
|
+ font-weight: 500;
|
|
|
+ color: #fff;
|
|
|
+ font-family: Rubik;
|
|
|
+ }
|
|
|
|
|
|
&.flipping {
|
|
|
transform: rotateX(360deg);
|
|
|
}
|
|
|
+ .zw {
|
|
|
+ position: absolute;
|
|
|
+ left: 16px;
|
|
|
+ bottom: 16px;
|
|
|
+ color: #fff;
|
|
|
+ font-family: Rubik;
|
|
|
+ font-size: 12px;
|
|
|
+ font-style: normal;
|
|
|
+ font-weight: 700;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ }
|
|
|
|
|
|
.card-b {
|
|
|
display: flex;
|
|
|
flex-wrap: wrap;
|
|
|
justify-content: center;
|
|
|
align-items: center;
|
|
|
+ gap: 16px;
|
|
|
span {
|
|
|
display: block;
|
|
|
}
|
|
|
@@ -479,15 +720,37 @@ onMounted(async () => {
|
|
|
font-size: var(--font-size-14);
|
|
|
font-weight: 500;
|
|
|
color: var(--black);
|
|
|
- text-shadow: 0 0 8px rgba(214, 255, 0, 0.2);
|
|
|
gap: 8px;
|
|
|
- padding-right: 30px;
|
|
|
line-height: 20px;
|
|
|
}
|
|
|
.lable {
|
|
|
font-size: var(--font-size-10);
|
|
|
font-weight: 400;
|
|
|
}
|
|
|
+ .cvv {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 8px;
|
|
|
+ font-size: var(--font-size-14);
|
|
|
+ font-weight: 500;
|
|
|
+ color: var(--black);
|
|
|
+ .copy,
|
|
|
+ .icon {
|
|
|
+ display: flex;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .copy {
|
|
|
+ width: 18px;
|
|
|
+ height: 18px;
|
|
|
+ border-radius: 50%;
|
|
|
+ background: rgba(255, 255, 255, 0.6);
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ cursor: pointer;
|
|
|
+ color: #000;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -511,7 +774,6 @@ onMounted(async () => {
|
|
|
font-size: var(--font-size-14);
|
|
|
line-height: 2;
|
|
|
margin-bottom: 8px;
|
|
|
- text-shadow: 0 0 10px rgba(214, 255, 0, 0.3);
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
gap: 8px;
|
|
|
@@ -528,8 +790,7 @@ onMounted(async () => {
|
|
|
font-weight: 500;
|
|
|
line-height: 3;
|
|
|
letter-spacing: 2px;
|
|
|
- margin: 24px 0;
|
|
|
- text-shadow: 0 0 15px rgba(214, 255, 0, 0.4);
|
|
|
+ margin: 20px 0;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
gap: 8px;
|
|
|
@@ -611,7 +872,35 @@ onMounted(async () => {
|
|
|
.transactions {
|
|
|
border-radius: 16px;
|
|
|
margin-bottom: 16px;
|
|
|
- padding: 16px 0;
|
|
|
+ padding-bottom: 16px;
|
|
|
+}
|
|
|
+.tab {
|
|
|
+ display: flex;
|
|
|
+ width: 380px;
|
|
|
+ align-items: center;
|
|
|
+ gap: 16px;
|
|
|
+ .item {
|
|
|
+ display: flex;
|
|
|
+ height: 36px;
|
|
|
+ padding: 8px 16px;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ gap: 10px;
|
|
|
+ border-radius: 50px;
|
|
|
+ border: 1px solid #beb6b6;
|
|
|
+ background: #fff;
|
|
|
+ color: #1a1a1a;
|
|
|
+ font-family: Roboto;
|
|
|
+ font-size: 16px;
|
|
|
+ font-style: normal;
|
|
|
+ font-weight: 600;
|
|
|
+ line-height: 24px;
|
|
|
+ }
|
|
|
+ .active {
|
|
|
+ background: #ff4766;
|
|
|
+ color: #fff;
|
|
|
+ border: none;
|
|
|
+ }
|
|
|
}
|
|
|
.trans-icon {
|
|
|
width: 48px;
|
|
|
@@ -768,16 +1057,21 @@ onMounted(async () => {
|
|
|
}
|
|
|
|
|
|
.card-swiper {
|
|
|
+ width: 90%;
|
|
|
+ margin: 20px 5% 0 5%;
|
|
|
position: relative;
|
|
|
overflow: hidden;
|
|
|
- margin-bottom: 20px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
padding-bottom: 5px;
|
|
|
}
|
|
|
|
|
|
.swiper-container {
|
|
|
position: relative;
|
|
|
width: 100%;
|
|
|
- height: 209px;
|
|
|
+ height: 219px;
|
|
|
touch-action: pan-y pinch-zoom;
|
|
|
user-select: none;
|
|
|
}
|
|
|
@@ -794,7 +1088,7 @@ onMounted(async () => {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
- margin-top: 16px;
|
|
|
+ margin-top: 12px;
|
|
|
gap: 16px;
|
|
|
}
|
|
|
|
|
|
@@ -868,7 +1162,8 @@ onMounted(async () => {
|
|
|
right: 10px;
|
|
|
}
|
|
|
|
|
|
-.balance-content {
|
|
|
+.balance-content1 {
|
|
|
+ margin-bottom: 20px;
|
|
|
font-size: var(--font-size-20);
|
|
|
color: var(--white);
|
|
|
font-weight: bold;
|
|
|
@@ -876,5 +1171,46 @@ onMounted(async () => {
|
|
|
.cwg-btn {
|
|
|
margin-top: 36px;
|
|
|
}
|
|
|
+.global-con-l {
|
|
|
+ display: flex;
|
|
|
+ width: 164px;
|
|
|
+ padding: 12px 16px;
|
|
|
+ align-items: center;
|
|
|
+ gap: 12px;
|
|
|
+ border-radius: 12px;
|
|
|
+ box-shadow: 0px 5px 30px 0px rgba(5, 0, 1, 0.05);
|
|
|
+ color: var(--white);
|
|
|
+ p {
|
|
|
+ color: #000;
|
|
|
+ font-family: Roboto;
|
|
|
+ font-size: 16px;
|
|
|
+ font-style: normal;
|
|
|
+ font-weight: 600;
|
|
|
+ line-height: 24px;
|
|
|
+ }
|
|
|
+ img {
|
|
|
+ width: 36px;
|
|
|
+ height: 36px;
|
|
|
+ border: 1px solid #f4f4f4;
|
|
|
+ border-radius: 50%;
|
|
|
+ }
|
|
|
+}
|
|
|
+.custom-toast {
|
|
|
+ background: rgba(0, 0, 0, 0) !important;
|
|
|
+ color: #fff;
|
|
|
+ font-size: 14px;
|
|
|
+ padding: 10px;
|
|
|
+ border-radius: 8px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 8px;
|
|
|
|
|
|
+ .van-icon {
|
|
|
+ width: 24px;
|
|
|
+ height: 24px;
|
|
|
+ }
|
|
|
+ .van-icon--copy {
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|