feat: 移动端适配
BIN
src/assets/images/award/close-menu.png
Normal file
|
After Width: | Height: | Size: 407 B |
BIN
src/assets/images/award/drawer-arrow.png
Normal file
|
After Width: | Height: | Size: 323 B |
BIN
src/assets/images/award/drawer-mail.png
Normal file
|
After Width: | Height: | Size: 369 B |
|
Before Width: | Height: | Size: 494 B After Width: | Height: | Size: 1.8 KiB |
BIN
src/assets/images/award/menu.png
Normal file
|
After Width: | Height: | Size: 326 B |
|
Before Width: | Height: | Size: 816 KiB After Width: | Height: | Size: 1.0 MiB |
BIN
src/assets/images/pad_version/banner_pad.mp4
Normal file
BIN
src/assets/images/pad_version/banner_pad_chinese.mp4
Normal file
@@ -80,12 +80,12 @@ export default {
|
|||||||
panelOfJudges: 'Panel of Judges',
|
panelOfJudges: 'Panel of Judges',
|
||||||
expertise: 'Expertise',
|
expertise: 'Expertise',
|
||||||
judgesHat: {
|
judgesHat: {
|
||||||
jae: 'Code-Create\nKorea Branch Director\nBesfxxk creative director',
|
jae: 'Code-Create Branch Director\nBesfxxk creative director\n(Korea)',
|
||||||
diego: 'Co-founder & Chief Father\nOfficer of OnTheList\n(Hong Kong)',
|
diego: 'Co-founder & Chief Father\nOfficer of OnTheList\n(Hong Kong)',
|
||||||
gregory: 'Senior Designer at\nGabriela Heasrst (Italy)',
|
gregory: 'Senior Designer at\nGabriela Hearst (Italy)',
|
||||||
vincenzo: 'Cheif Editor of SCMP Style\n(Hong Kong)',
|
vincenzo: 'Cheif Editor of SCMP Style\n(Hong Kong)',
|
||||||
tim: 'Group Fashion Direction of\n Modern Media Group\n(Shanghai)',
|
tim: 'Group Fashion Direction of\n Modern Media Group\n(Shanghai)',
|
||||||
desmond: 'Cheif Editor of Vogue\n(Singapore)'
|
desmond: 'Chief Editor of Vogue\n(Singapore)'
|
||||||
},
|
},
|
||||||
awardPrizes: 'Award & Prizes',
|
awardPrizes: 'Award & Prizes',
|
||||||
recognition: 'Recognition',
|
recognition: 'Recognition',
|
||||||
@@ -136,7 +136,7 @@ export default {
|
|||||||
receivingOutfits: 'Receiving Outfits',
|
receivingOutfits: 'Receiving Outfits',
|
||||||
fromFinalistsLabel: 'from Finallists',
|
fromFinalistsLabel: 'from Finallists',
|
||||||
timeOctober: 'October',
|
timeOctober: 'October',
|
||||||
receivingOutfitsDesc: 'AiDA receives physical\noutfits from all 20\nfinalists.',
|
receivingOutfitsDesc: 'Finalists send one physical outfit to Code-Create (address to advise)',
|
||||||
awardCeremony: 'Award',
|
awardCeremony: 'Award',
|
||||||
ceremonyLabel: 'Ceremony',
|
ceremonyLabel: 'Ceremony',
|
||||||
timeNov12: 'Nov 12',
|
timeNov12: 'Nov 12',
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ export default {
|
|||||||
receivingOutfits: '入围者',
|
receivingOutfits: '入围者',
|
||||||
fromFinalistsLabel: '提交成衣',
|
fromFinalistsLabel: '提交成衣',
|
||||||
timeOctober: '10月',
|
timeOctober: '10月',
|
||||||
receivingOutfitsDesc: 'AiDA 接收每位入围\n的1套实物服装',
|
receivingOutfitsDesc: '入围者需向Code-Create寄送一套实物服装(地址另行通知)',
|
||||||
awardCeremony: '奖项颁发仪式',
|
awardCeremony: '奖项颁发仪式',
|
||||||
ceremonyLabel: '',
|
ceremonyLabel: '',
|
||||||
timeNov12: '11月12日',
|
timeNov12: '11月12日',
|
||||||
|
|||||||
@@ -402,7 +402,7 @@ ul {
|
|||||||
// width: 46.8rem;
|
// width: 46.8rem;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #585858;
|
color: #585858;
|
||||||
font-family: 'Arial';
|
font-family: 'Instrument';
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
line-height: 3rem;
|
line-height: 3rem;
|
||||||
font-size: 2.4rem;
|
font-size: 2.4rem;
|
||||||
@@ -581,6 +581,7 @@ ul {
|
|||||||
padding: 0 6rem;
|
padding: 0 6rem;
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -652,7 +653,7 @@ ul {
|
|||||||
.step-4 {
|
.step-4 {
|
||||||
margin-top: 4rem;
|
margin-top: 4rem;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
.desc-lists li{
|
.desc-lists li {
|
||||||
white-space: initial !important;
|
white-space: initial !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -211,6 +211,7 @@ p {
|
|||||||
padding: 0 8.5vw;
|
padding: 0 8.5vw;
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
line-height: 3rem;
|
line-height: 3rem;
|
||||||
|
white-space: normal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&.pad {
|
&.pad {
|
||||||
|
|||||||
@@ -229,6 +229,7 @@ onBeforeUnmount(() => {
|
|||||||
line-height: 7.6rem;
|
line-height: 7.6rem;
|
||||||
&.smaller {
|
&.smaller {
|
||||||
font-size: 3.6rem;
|
font-size: 3.6rem;
|
||||||
|
line-height: 3.8rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.prize-name {
|
.prize-name {
|
||||||
@@ -265,7 +266,7 @@ onBeforeUnmount(() => {
|
|||||||
.right {
|
.right {
|
||||||
.prize-item {
|
.prize-item {
|
||||||
width: 29.2rem;
|
width: 29.2rem;
|
||||||
height: 27rem;
|
height: auto;
|
||||||
padding: 5rem 3rem;
|
padding: 5rem 3rem;
|
||||||
row-gap: 1.8rem;
|
row-gap: 1.8rem;
|
||||||
&,
|
&,
|
||||||
|
|||||||
@@ -167,6 +167,8 @@ onBeforeUnmount(() => {
|
|||||||
color: #e0e0e0;
|
color: #e0e0e0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
white-space: pre-line;
|
white-space: pre-line;
|
||||||
|
line-height: 3rem;
|
||||||
|
width: 28.2rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -174,7 +176,7 @@ onBeforeUnmount(() => {
|
|||||||
height: auto;
|
height: auto;
|
||||||
padding: 6rem 0 13rem;
|
padding: 6rem 0 13rem;
|
||||||
background: url('@/assets/images/mobile_version_background/section_bg.png') no-repeat;
|
background: url('@/assets/images/mobile_version_background/section_bg.png') no-repeat;
|
||||||
background-size: 100% 100%;
|
background-size: cover;
|
||||||
.title {
|
.title {
|
||||||
font-size: 3.2rem;
|
font-size: 3.2rem;
|
||||||
margin-bottom: 0.8rem;
|
margin-bottom: 0.8rem;
|
||||||
@@ -193,10 +195,11 @@ onBeforeUnmount(() => {
|
|||||||
.item {
|
.item {
|
||||||
width: initial;
|
width: initial;
|
||||||
height: initial;
|
height: initial;
|
||||||
|
|
||||||
&:nth-of-type(3) {
|
&:nth-of-type(3) {
|
||||||
width: 30rem;
|
width: 30rem;
|
||||||
height: 36.8rem;
|
height: auto;
|
||||||
padding: 3.2rem 0;
|
padding: 3.2rem 0;
|
||||||
}
|
}
|
||||||
.icon {
|
.icon {
|
||||||
width: 16rem;
|
width: 16rem;
|
||||||
@@ -206,6 +209,10 @@ onBeforeUnmount(() => {
|
|||||||
font-size: 2.4rem;
|
font-size: 2.4rem;
|
||||||
margin: 0.8rem 0 1.2rem;
|
margin: 0.8rem 0 1.2rem;
|
||||||
}
|
}
|
||||||
|
.desc {
|
||||||
|
width: 23rem;
|
||||||
|
line-height: 2.4rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<nav class="step-bar" role="tablist" :aria-label="t('AwardApply.applicationForm')">
|
<nav
|
||||||
|
class="step-bar flex align-center space-between"
|
||||||
|
role="tablist"
|
||||||
|
:aria-label="t('AwardApply.applicationForm')"
|
||||||
|
>
|
||||||
<button
|
<button
|
||||||
v-for="(key, index) in tabKeys"
|
v-for="(key, index) in tabKeys"
|
||||||
:key="key"
|
:key="key"
|
||||||
@@ -11,7 +15,7 @@
|
|||||||
:tabindex="modelValue === index ? 0 : -1"
|
:tabindex="modelValue === index ? 0 : -1"
|
||||||
@click="onSelect(index)"
|
@click="onSelect(index)"
|
||||||
>
|
>
|
||||||
<div class="step-cluster">
|
<div class="step-cluster flex flex-center">
|
||||||
<div class="step-head">
|
<div class="step-head">
|
||||||
<span class="step-badge">{{ index + 1 }}</span>
|
<span class="step-badge">{{ index + 1 }}</span>
|
||||||
<span class="step-label">{{ t(`AwardApply.${key}`) }}</span>
|
<span class="step-label">{{ t(`AwardApply.${key}`) }}</span>
|
||||||
@@ -56,17 +60,14 @@ function onSelect(index: number) {
|
|||||||
@label-inactive: #9e9e9e;
|
@label-inactive: #9e9e9e;
|
||||||
@badge-inactive-bg: #dcdcdc;
|
@badge-inactive-bg: #dcdcdc;
|
||||||
@badge-inactive-text: #9f9f9f;
|
@badge-inactive-text: #9f9f9f;
|
||||||
@bar-height: 0.4rem;
|
@bar-height: 0.6rem;
|
||||||
|
|
||||||
.step-bar {
|
.step-bar {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: flex;
|
|
||||||
align-items: stretch;
|
|
||||||
justify-content: space-between;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-bottom: 1px solid #e5e5e5;
|
border-bottom: 0.1rem solid #dcdcdc;
|
||||||
padding: 0 3rem;
|
padding: 0 3.8rem;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,88 +76,65 @@ function onSelect(index: number) {
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
min-width: 0;
|
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 1.6rem 0.4rem 0;
|
|
||||||
border: none;
|
border: none;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
cursor: pointer;
|
position: relative;
|
||||||
font: inherit;
|
height: 100%;
|
||||||
color: inherit;
|
|
||||||
-webkit-tap-highlight-color: transparent;
|
|
||||||
|
|
||||||
&:focus-visible {
|
&:focus-visible {
|
||||||
outline: 2px solid @active-red;
|
outline: 2px solid @active-red;
|
||||||
outline-offset: 2px;
|
outline-offset: 2px;
|
||||||
}
|
}
|
||||||
}
|
.step-cluster {
|
||||||
|
height: 100%;
|
||||||
|
.step-head {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 1.2rem;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.step-cluster {
|
.step-badge {
|
||||||
display: inline-flex;
|
font-family: 'Poppins';
|
||||||
flex-direction: column;
|
font-weight: 400;
|
||||||
align-items: center;
|
font-size: 2.4rem;
|
||||||
max-width: 100%;
|
color: #9f9f9f;
|
||||||
}
|
}
|
||||||
|
|
||||||
.step-head {
|
.step-label {
|
||||||
display: inline-flex;
|
font-family: 'Poppins';
|
||||||
align-items: center;
|
font-weight: 400;
|
||||||
gap: 1rem;
|
font-size: 2.4rem;
|
||||||
max-width: 100%;
|
color: @label-inactive;
|
||||||
}
|
white-space: nowrap;
|
||||||
|
color: #9f9f9f;
|
||||||
.step-badge {
|
}
|
||||||
flex-shrink: 0;
|
.step-indicator {
|
||||||
width: 3.2rem;
|
width: 100%;
|
||||||
height: 3.2rem;
|
height: @bar-height;
|
||||||
border-radius: 50%;
|
position: absolute;
|
||||||
display: flex;
|
bottom: 0;
|
||||||
align-items: center;
|
left: 0;
|
||||||
justify-content: center;
|
.step-indicator-bar {
|
||||||
font-family: 'ArialBold';
|
display: block;
|
||||||
font-weight: 700;
|
height: @bar-height;
|
||||||
font-size: 1.8rem;
|
width: 100%;
|
||||||
line-height: 1;
|
// min-width: 0;
|
||||||
background: @badge-inactive-bg;
|
background: @active-red;
|
||||||
color: @badge-inactive-text;
|
border-radius: 1rem;
|
||||||
transition: background 0.2s ease, color 0.2s ease;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.step-label {
|
|
||||||
font-family: 'Poppins';
|
|
||||||
font-weight: 400;
|
|
||||||
font-size: 1.6rem;
|
|
||||||
color: @label-inactive;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.step-item.active {
|
|
||||||
.step-badge {
|
|
||||||
background: @active-red;
|
|
||||||
color: #fff;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.step-label {
|
&.active {
|
||||||
color: @label-active;
|
.step-badge,
|
||||||
|
.step-label {
|
||||||
|
color: #c7342c;
|
||||||
|
font-family: 'PoppinsBold';
|
||||||
|
font-weight: 700;
|
||||||
|
// background: @active-red;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.step-indicator {
|
|
||||||
width: 120%;
|
|
||||||
min-height: @bar-height;
|
|
||||||
margin-top: 1.2rem;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 略宽于上方徽章+文案(与 step-head 同宽基准 + 左右扩展) */
|
|
||||||
.step-indicator-bar {
|
|
||||||
display: block;
|
|
||||||
height: @bar-height;
|
|
||||||
width: calc(100% + 1.2rem);
|
|
||||||
min-width: 0;
|
|
||||||
background: @active-red;
|
|
||||||
border-radius: 0.1rem 0.1rem 0 0;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -2,13 +2,17 @@
|
|||||||
<div
|
<div
|
||||||
ref="containerRef"
|
ref="containerRef"
|
||||||
class="timeline-container container flex flex-col align-center"
|
class="timeline-container container flex flex-col align-center"
|
||||||
:class="{ mobile: isMobile && !isPad, vertical: isMobile && !isPad ,'is-pad': isPad}"
|
:class="{ mobile: isMobile && !isPad, vertical: isMobile && !isPad, 'is-pad': isPad }"
|
||||||
>
|
>
|
||||||
<div class="timeline-title">{{ $t('AwardsPage.competitionTimeline') }}</div>
|
<div class="timeline-title">{{ $t('AwardsPage.competitionTimeline') }}</div>
|
||||||
<div class="desc">{{ $t('AwardsPage.shapingTheFuture') }}</div>
|
<div class="desc">{{ $t('AwardsPage.shapingTheFuture') }}</div>
|
||||||
|
|
||||||
<!-- 纵向时间线:移动端(排除平板) -->
|
<!-- 纵向时间线:移动端(排除平板) -->
|
||||||
<div v-if="isMobile && !isPad" class="timeline-point timeline-vertical flex flex-col" ref="timelineRef">
|
<div
|
||||||
|
v-if="isMobile && !isPad"
|
||||||
|
class="timeline-point timeline-vertical flex flex-col"
|
||||||
|
ref="timelineRef"
|
||||||
|
>
|
||||||
<div class="vertical-line"></div>
|
<div class="vertical-line"></div>
|
||||||
<div v-for="(item, index) in points" :key="'vertical-' + item.time" class="vertical-item">
|
<div v-for="(item, index) in points" :key="'vertical-' + item.time" class="vertical-item">
|
||||||
<div class="vertical-node">
|
<div class="vertical-node">
|
||||||
@@ -16,7 +20,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="vertical-content">
|
<div class="vertical-content">
|
||||||
<div class="vertical-time">{{ $t(item.time) }}</div>
|
<div class="vertical-time">{{ $t(item.time) }}</div>
|
||||||
<div class="vertical-label">{{ $t(item.label) }}</div>
|
<div class="vertical-label">
|
||||||
|
{{ $t(item.label)
|
||||||
|
}}<template v-if="item.subLabel">
|
||||||
|
{{ $t(item.subLabel) }}
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
<div class="vertical-desc">{{ $t(item.desc) }}</div>
|
<div class="vertical-desc">{{ $t(item.desc) }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -64,7 +73,7 @@ import { nextTick, onBeforeUnmount, onMounted, ref, computed, inject } from 'vue
|
|||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { gsap } from 'gsap'
|
import { gsap } from 'gsap'
|
||||||
|
|
||||||
const { t } = useI18n()
|
// const { t } = useI18n()
|
||||||
|
|
||||||
const isMobile = inject<boolean>('isMobile')
|
const isMobile = inject<boolean>('isMobile')
|
||||||
const isPad = inject<boolean>('isPad')
|
const isPad = inject<boolean>('isPad')
|
||||||
@@ -188,9 +197,10 @@ const playAnimation = () => {
|
|||||||
|
|
||||||
// 行内内容:桌面端用 .grid-cell,纵向用 .vertical-item
|
// 行内内容:桌面端用 .grid-cell,纵向用 .vertical-item
|
||||||
// 纵向时,每个 item 从上方落下 + 渐显
|
// 纵向时,每个 item 从上方落下 + 渐显
|
||||||
const textItems = isMobile.value && !isPad.value
|
const textItems =
|
||||||
? containerRef.value.querySelectorAll('.vertical-item')
|
isMobile.value && !isPad.value
|
||||||
: containerRef.value.querySelectorAll('.grid-cell')
|
? containerRef.value.querySelectorAll('.vertical-item')
|
||||||
|
: containerRef.value.querySelectorAll('.grid-cell')
|
||||||
if (textItems && textItems.length) {
|
if (textItems && textItems.length) {
|
||||||
if (isMobile.value && !isPad.value) {
|
if (isMobile.value && !isPad.value) {
|
||||||
// 纵向:每个 item 从上方落下 + 渐显
|
// 纵向:每个 item 从上方落下 + 渐显
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<div class="header-left">
|
<div class="header-left">
|
||||||
<img src="@/assets/images/award/code_create_logo.png" class="logo" />
|
<img src="@/assets/images/award/code_create_logo.png" class="logo" />
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right flex align-center">
|
<div class="header-right flex align-center" v-if="!isMobile">
|
||||||
<div class="contact flex align-center" @click="handleContactClick">
|
<div class="contact flex align-center" @click="handleContactClick">
|
||||||
<img src="@/assets/images/award/mail.png" class="contact-icon" />
|
<img src="@/assets/images/award/mail.png" class="contact-icon" />
|
||||||
<div class="text" v-if="!isMobile">{{ $t('AwardsPage.contactUs') }}</div>
|
<div class="text" v-if="!isMobile">{{ $t('AwardsPage.contactUs') }}</div>
|
||||||
@@ -34,11 +34,25 @@
|
|||||||
<img src="@/assets/images/award/arrow.png" alt="" class="arrow" />
|
<img src="@/assets/images/award/arrow.png" alt="" class="arrow" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else class="header-right mobile">
|
||||||
|
<img
|
||||||
|
v-show="!showDrawer"
|
||||||
|
src="@/assets/images/award/menu.png"
|
||||||
|
class="menu-icon"
|
||||||
|
@click="handleChangeDrawer"
|
||||||
|
/>
|
||||||
|
<img
|
||||||
|
v-show="showDrawer"
|
||||||
|
src="@/assets/images/award/close-menu.png"
|
||||||
|
class="menu-icon close"
|
||||||
|
@click="handleChangeDrawer"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-placeholder"></div>
|
<div class="header-placeholder"></div>
|
||||||
</div>
|
</div>
|
||||||
<router-view />
|
<router-view />
|
||||||
<div class="footer flex space-between align-center">
|
<div class="footer flex space-between align-center" :class="{ mobile: isMobile || isTablet }">
|
||||||
<div class="social-list flex">
|
<div class="social-list flex">
|
||||||
<a href="https://xhslink.com/m/5Ony2FapizV" target="_blank">
|
<a href="https://xhslink.com/m/5Ony2FapizV" target="_blank">
|
||||||
<img src="@/assets/images/award/xiaohongshu.svg" alt="" />
|
<img src="@/assets/images/award/xiaohongshu.svg" alt="" />
|
||||||
@@ -72,6 +86,7 @@
|
|||||||
<div class="code-title" :class="{ 'flex space-between': isMobile }">
|
<div class="code-title" :class="{ 'flex space-between': isMobile }">
|
||||||
<span>{{ $t('AwardsPage.wechatTitle') }}</span>
|
<span>{{ $t('AwardsPage.wechatTitle') }}</span>
|
||||||
<img
|
<img
|
||||||
|
v-if="isMobile"
|
||||||
src="@/assets/images/award/close.svg"
|
src="@/assets/images/award/close.svg"
|
||||||
class="close mobile"
|
class="close mobile"
|
||||||
@click="handleCloseQRcode"
|
@click="handleCloseQRcode"
|
||||||
@@ -113,8 +128,9 @@
|
|||||||
<div class="mail-address">awards2026@code-createcom.hk</div>
|
<div class="mail-address">awards2026@code-createcom.hk</div>
|
||||||
<img src="@/assets/images/award/copy.png" class="copy-icon" @click="handleClickCopyEmail" />
|
<img src="@/assets/images/award/copy.png" class="copy-icon" @click="handleClickCopyEmail" />
|
||||||
</div>
|
</div>
|
||||||
<div class="send-btn" @click="handleContactUs">
|
<div class="send-btn flex flex-center" @click="handleContactUs">
|
||||||
{{ $t('AwardsPage.sendEmail') }}
|
<img v-if="isMobile" src="@/assets/images/award/mail.png" class="contact-icon" />
|
||||||
|
<span>{{ $t('AwardsPage.sendEmail') }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="isMobile" class="send-btn copy" @click="handleClickCopyEmail">
|
<div v-if="isMobile" class="send-btn copy" @click="handleClickCopyEmail">
|
||||||
{{ $t('AwardsPage.copyMailAddress') }}
|
{{ $t('AwardsPage.copyMailAddress') }}
|
||||||
@@ -122,6 +138,41 @@
|
|||||||
</div>
|
</div>
|
||||||
<!-- <div class="contact-modal-mobile-wrapper"></div> -->
|
<!-- <div class="contact-modal-mobile-wrapper"></div> -->
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
class="drawer-mask"
|
||||||
|
:class="{ 'drawer-closing': drawerClosing }"
|
||||||
|
v-if="showDrawer || drawerClosing"
|
||||||
|
>
|
||||||
|
<div class="drawer-wrapper" @animationend="handleDrawerAnimationEnd">
|
||||||
|
<div class="drawer-item flex align-center space-between" @click="handleBtnClick">
|
||||||
|
<span class="text">{{ t('AwardsPage.submitApplication') }}</span>
|
||||||
|
<img src="@/assets/images/award/drawer-arrow.png" class="drawer-icon arrow" />
|
||||||
|
</div>
|
||||||
|
<div class="gap" />
|
||||||
|
<div class="drawer-item flex align-center space-between" @click="handleContactClick">
|
||||||
|
<span class="text">{{ $t('AwardsPage.contactUs') }}</span>
|
||||||
|
<img src="@/assets/images/award/drawer-mail.png" class="drawer-icon mail" />
|
||||||
|
</div>
|
||||||
|
<div class="gap" />
|
||||||
|
<div class="drawer-item language flex align-center">
|
||||||
|
<div
|
||||||
|
class="text"
|
||||||
|
:class="{ active: locale === 'CHINESE_SIMPLIFIED' }"
|
||||||
|
@click="handleChangeLanguage('CHINESE_SIMPLIFIED')"
|
||||||
|
>
|
||||||
|
中文
|
||||||
|
</div>
|
||||||
|
<span class="line">/</span>
|
||||||
|
<div
|
||||||
|
class="text"
|
||||||
|
:class="{ active: locale === 'ENGLISH' }"
|
||||||
|
@click="handleChangeLanguage('ENGLISH')"
|
||||||
|
>
|
||||||
|
EN
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
@@ -161,20 +212,11 @@ const handleCloseQRcode = () => {
|
|||||||
type BtnType = 'index' | 'form'
|
type BtnType = 'index' | 'form'
|
||||||
const btnType = ref<BtnType>('index')
|
const btnType = ref<BtnType>('index')
|
||||||
const btnText = computed(() => {
|
const btnText = computed(() => {
|
||||||
if (isMobile.value) {
|
if (btnType.value === 'index') {
|
||||||
if (btnType.value === 'index') {
|
return t('AwardsPage.submitApplication')
|
||||||
return t('AwardsPage.submitMobile')
|
}
|
||||||
}
|
if (btnType.value === 'form') {
|
||||||
if (btnType.value === 'form') {
|
return t('AwardApply.backToIntroduction')
|
||||||
return locale.value === 'CHINESE_SIMPLIFIED' ? '赛事介绍' : 'Back'
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (btnType.value === 'index') {
|
|
||||||
return t('AwardsPage.submitApplication')
|
|
||||||
}
|
|
||||||
if (btnType.value === 'form') {
|
|
||||||
return locale.value === 'CHINESE_SIMPLIFIED' ? '赛事介绍' : 'Back to Introduction'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -192,8 +234,28 @@ watch(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const showDrawer = ref(false)
|
||||||
|
const drawerClosing = ref(false)
|
||||||
|
const handleChangeDrawer = () => {
|
||||||
|
if (showDrawer.value) {
|
||||||
|
drawerClosing.value = true
|
||||||
|
} else {
|
||||||
|
drawerClosing.value = false
|
||||||
|
showDrawer.value = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const handleDrawerAnimationEnd = () => {
|
||||||
|
if (drawerClosing.value) {
|
||||||
|
showDrawer.value = false
|
||||||
|
drawerClosing.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const showContactModal = ref(false)
|
const showContactModal = ref(false)
|
||||||
const handleContactClick = () => {
|
const handleContactClick = () => {
|
||||||
|
if (showDrawer.value) {
|
||||||
|
handleChangeDrawer()
|
||||||
|
}
|
||||||
showContactModal.value = true
|
showContactModal.value = true
|
||||||
}
|
}
|
||||||
const handleContactUs = () => {
|
const handleContactUs = () => {
|
||||||
@@ -357,6 +419,12 @@ const handleBtnClick = () => {
|
|||||||
height: 2.4rem;
|
height: 2.4rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
&.mobile {
|
||||||
|
.menu-icon {
|
||||||
|
width: 5rem;
|
||||||
|
height: 5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -379,6 +447,77 @@ const handleBtnClick = () => {
|
|||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
}
|
}
|
||||||
|
&.mobile {
|
||||||
|
padding: 0 6.6rem;
|
||||||
|
img {
|
||||||
|
width: 4rem;
|
||||||
|
height: 4rem;
|
||||||
|
}
|
||||||
|
.copyright {
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.drawer-mask {
|
||||||
|
position: fixed;
|
||||||
|
top: 8rem;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background-color: #00000033;
|
||||||
|
z-index: 8;
|
||||||
|
.drawer-wrapper {
|
||||||
|
padding: 7.8rem 6.6rem 8.2rem;
|
||||||
|
background-color: #fff;
|
||||||
|
font-family: 'PoppinsBold';
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 2.4rem;
|
||||||
|
border-bottom-left-radius: 2.4rem;
|
||||||
|
border-bottom-right-radius: 2.4rem;
|
||||||
|
animation: drawer-in 0.3s ease-in-out;
|
||||||
|
.drawer-item {
|
||||||
|
&.language {
|
||||||
|
column-gap: 0.8rem;
|
||||||
|
// padding: 0 1.25rem;
|
||||||
|
color: #c0c0c0;
|
||||||
|
.line {
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
.text {
|
||||||
|
&.active {
|
||||||
|
color: #232323;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.gap {
|
||||||
|
border: 1px solid #d5d5d5;
|
||||||
|
margin: 3.2rem 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes drawer-in {
|
||||||
|
0% {
|
||||||
|
transform: translateY(-100%);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes drawer-out {
|
||||||
|
0% {
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateY(-100%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.drawer-closing {
|
||||||
|
background-color: transparent;
|
||||||
|
.drawer-wrapper {
|
||||||
|
animation: drawer-out 0.3s ease-in-out forwards;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.qrcode-mask {
|
.qrcode-mask {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
@@ -430,15 +569,15 @@ const handleBtnClick = () => {
|
|||||||
border-top-right-radius: 2.4rem;
|
border-top-right-radius: 2.4rem;
|
||||||
padding: 4.8rem 3.2rem 10rem;
|
padding: 4.8rem 3.2rem 10rem;
|
||||||
}
|
}
|
||||||
.code-title{
|
.code-title {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-bottom: 1px solid #E0E0E0;
|
border-bottom: 1px solid #e0e0e0;
|
||||||
padding-bottom: 1.6rem;
|
padding-bottom: 1.6rem;
|
||||||
}
|
}
|
||||||
.qrcode{
|
.qrcode {
|
||||||
margin: 7.4rem 0 2rem;
|
margin: 7.4rem 0 2rem;
|
||||||
}
|
}
|
||||||
.tips{
|
.tips {
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -521,7 +660,11 @@ const handleBtnClick = () => {
|
|||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
border-top-left-radius: 2.4rem;
|
border-top-left-radius: 2.4rem;
|
||||||
border-top-right-radius: 2.4rem;
|
border-top-right-radius: 2.4rem;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
.header {
|
.header {
|
||||||
|
width: 100%;
|
||||||
border-bottom: 1px solid #e0e0e0;
|
border-bottom: 1px solid #e0e0e0;
|
||||||
// height: 9.6rem;
|
// height: 9.6rem;
|
||||||
padding-top: 4.8rem;
|
padding-top: 4.8rem;
|
||||||
@@ -543,10 +686,22 @@ const handleBtnClick = () => {
|
|||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
}
|
}
|
||||||
.desc {
|
.desc {
|
||||||
|
width: 46rem;
|
||||||
font-size: 2.2rem;
|
font-size: 2.2rem;
|
||||||
line-height: 3rem;
|
line-height: 3rem;
|
||||||
margin-bottom: 11rem;
|
margin-bottom: 11rem;
|
||||||
}
|
}
|
||||||
|
.send-btn {
|
||||||
|
width: 100%;
|
||||||
|
height: 8rem;
|
||||||
|
line-height: 8rem;
|
||||||
|
font-size: 2.4rem;
|
||||||
|
column-gap: 0.8rem;
|
||||||
|
.contact-icon{
|
||||||
|
width: 2.4rem;
|
||||||
|
// height: 1.8rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
.send-btn.copy {
|
.send-btn.copy {
|
||||||
background-color: #f1f1f1;
|
background-color: #f1f1f1;
|
||||||
color: #969696;
|
color: #969696;
|
||||||
@@ -574,10 +729,10 @@ const handleBtnClick = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.footer {
|
// .footer {
|
||||||
row-gap: 0.8rem;
|
// row-gap: 0.8rem;
|
||||||
flex-direction: column;
|
// flex-direction: column;
|
||||||
justify-content: center;
|
// justify-content: center;
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
v-if="!isCompleted && !isExpired"
|
v-if="!isCompleted && !isExpired"
|
||||||
:class="{ mobile: isMobile, tablet: isTablet }"
|
:class="{ mobile: isMobile, tablet: isTablet }"
|
||||||
>
|
>
|
||||||
<div class="form-header" v-if="showStep(0) && isMobile || isTablet">
|
<div class="form-header" v-if="showStep(0) && (isMobile || isTablet)">
|
||||||
<div class="form-title poppins-bold">
|
<div class="form-title poppins-bold">
|
||||||
{{ t('AwardApply.emailVerification') }}
|
{{ t('AwardApply.emailVerification') }}
|
||||||
</div>
|
</div>
|
||||||
@@ -340,7 +340,7 @@
|
|||||||
{{ t('AwardApply.submitYourDesign') }}
|
{{ t('AwardApply.submitYourDesign') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="desc">
|
<div class="desc">
|
||||||
{{ t('AwardApply.unfinishedFormTip') }}
|
{{ t('AwardApply.stepTips') }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1264,7 +1264,7 @@ onUnmounted(() => {
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
}
|
}
|
||||||
.steps-container {
|
.steps-container {
|
||||||
height: 6.8rem;
|
height: 10rem;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
@@ -1676,7 +1676,7 @@ onUnmounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
:deep(.ant-checkbox-wrapper) {
|
:deep(.ant-checkbox-wrapper) {
|
||||||
line-height:initial;
|
line-height: initial;
|
||||||
.ant-checkbox-inner {
|
.ant-checkbox-inner {
|
||||||
width: 2rem;
|
width: 2rem;
|
||||||
height: 2rem;
|
height: 2rem;
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="award-page" :class="{ 'is-zh': isZh, mobile: isMobile }">
|
<div class="award-page" :class="{ 'is-zh': isZh, mobile: isMobile }">
|
||||||
<div class="banner" :class="{ mobile: isMobile }">
|
<div class="banner" :class="{ mobile: isMobile, tablet: isTablet }">
|
||||||
<video
|
<video
|
||||||
:src="bannerUrl"
|
:src="bannerUrl"
|
||||||
|
class="banner-video"
|
||||||
autoplay
|
autoplay
|
||||||
muted
|
muted
|
||||||
loop
|
loop
|
||||||
class="banner-video"
|
|
||||||
playsinline
|
playsinline
|
||||||
webkit-playsinline
|
webkit-playsinline
|
||||||
x5-playsinline
|
x5-playsinline
|
||||||
|
:controls="false"
|
||||||
></video>
|
></video>
|
||||||
<div class="submit-btn flex flex-center" @click="handleSubmitApplication">
|
<div class="submit-btn flex flex-center" @click="handleSubmitApplication">
|
||||||
<div>{{ $t('AwardsPage.submitApplication') }}</div>
|
<div>{{ $t('AwardsPage.submitApplication') }}</div>
|
||||||
@@ -43,6 +44,8 @@ import banner from '@/assets/images/award/banner.mp4'
|
|||||||
import bannerMobile from '@/assets/images/award/banner_mobile.mp4'
|
import bannerMobile from '@/assets/images/award/banner_mobile.mp4'
|
||||||
import bannerZh from '@/assets/images/award/banner_chinese.mp4'
|
import bannerZh from '@/assets/images/award/banner_chinese.mp4'
|
||||||
import bannerZhMobile from '@/assets/images/award/banner_mobile_chinese.mp4'
|
import bannerZhMobile from '@/assets/images/award/banner_mobile_chinese.mp4'
|
||||||
|
import bannerPad from '@/assets/images/pad_version/banner_pad.mp4'
|
||||||
|
import bannerPadZh from '@/assets/images/pad_version/banner_pad_chinese.mp4'
|
||||||
import { useIsMobile, useIsTablet } from '@/utils/isMobile'
|
import { useIsMobile, useIsTablet } from '@/utils/isMobile'
|
||||||
const { isMobile } = useIsMobile()
|
const { isMobile } = useIsMobile()
|
||||||
const { isTablet } = useIsTablet()
|
const { isTablet } = useIsTablet()
|
||||||
@@ -53,17 +56,14 @@ provide('isMobile', isMobile)
|
|||||||
|
|
||||||
provide('isPad', isTablet)
|
provide('isPad', isTablet)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
router.replace('/')
|
router.replace('/')
|
||||||
setTimeout(() => {
|
// setTimeout(() => {
|
||||||
console.log('是否平板-------', isTablet.value)
|
// console.log('是否平板-------', isTablet.value)
|
||||||
console.log('是否移动端-------', isMobile.value)
|
// console.log('是否移动端-------', isMobile.value)
|
||||||
}, 1000)
|
// }, 1000)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
const isZh = computed(() => {
|
const isZh = computed(() => {
|
||||||
return locale.value === 'CHINESE_SIMPLIFIED'
|
return locale.value === 'CHINESE_SIMPLIFIED'
|
||||||
})
|
})
|
||||||
@@ -72,10 +72,11 @@ const bannerUrl = computed(() => {
|
|||||||
let url = null
|
let url = null
|
||||||
if (isMobile.value) {
|
if (isMobile.value) {
|
||||||
url = isZh.value ? bannerZhMobile : bannerMobile
|
url = isZh.value ? bannerZhMobile : bannerMobile
|
||||||
|
} else if (isTablet.value) {
|
||||||
|
url = isZh.value ? bannerPadZh : bannerPad
|
||||||
} else {
|
} else {
|
||||||
url = isZh.value ? bannerZh : banner
|
url = isZh.value ? bannerZh : banner
|
||||||
}
|
}
|
||||||
|
|
||||||
return url
|
return url
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -153,13 +154,33 @@ const handleSubmitApplication = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.banner.mobile {
|
.banner.mobile {
|
||||||
height: auto;
|
height: 123.4rem;
|
||||||
|
|
||||||
.submit-btn {
|
.submit-btn {
|
||||||
top: 52%;
|
top: 52%;
|
||||||
left: 8%;
|
left: 8%;
|
||||||
width: 41rem;
|
width: 46.1rem;
|
||||||
font-size: 2.4rem;
|
font-size: 2.6rem;
|
||||||
column-gap: 1rem;
|
column-gap: 1rem;
|
||||||
|
letter-spacing: 0%;
|
||||||
|
.arrow{
|
||||||
|
width: 4rem;
|
||||||
|
height: 4rem;
|
||||||
|
}
|
||||||
|
.ddl {
|
||||||
|
white-space: pre-line;
|
||||||
|
text-align: left;
|
||||||
|
padding-left: 4rem;
|
||||||
|
bottom: -6rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.banner.tablet {
|
||||||
|
height: 136vw;
|
||||||
|
.submit-btn{
|
||||||
|
top: 74vw;
|
||||||
|
left: 11vw;
|
||||||
|
width: 46.1rem;
|
||||||
.ddl {
|
.ddl {
|
||||||
white-space: pre-line;
|
white-space: pre-line;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
|||||||