naive-ui/demo/pages/home/index.vue

213 lines
4.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<n-layout
:native-scrollbar="false"
:position="isMobile ? 'static' : 'absolute'"
:style="isMobile ? undefined : 'top: var(--header-height);'"
>
<div class="banner" style="overflow: hidden">
<right-image class="right-image" v-if="!(isMobile || isTablet)" />
<n-h1 :style="titleStyle" class="naive-title">
<span
@mouseenter="handleTitleMouseEnter"
@mouseleave="handleTitleMouseLeave"
>Na{{ hover ? 'ï' : 'i' }}ve UI</span
>
</n-h1>
<n-p style="font-size: 16px; margin-top: 0; margin-bottom: 0">
{{ t('intro1') }}
</n-p>
<n-p
style="
font-size: 16px;
margin-bottom: 4px;
margin-top: 4px;
font-weight: 500;
"
>
{{ t('intro2') }}
</n-p>
<n-p style="font-size: 16px; margin-top: 0">
{{ t('intro3') }}
</n-p>
<div>
<n-button
type="default"
size="large"
style="margin-right: 12px"
@click="handleThemeChangeClick"
>
{{ t('intro4') }}
</n-button>
<n-button
type="primary"
:ghost="theme === 'dark'"
size="large"
@click="handleStartClick"
>
{{ t('start') }}
</n-button>
</div>
<left-image class="left-image" />
</div>
<n-layout-footer>
<landing-footer centered />
</n-layout-footer>
</n-layout>
</template>
<script>
import { computed } from 'vue'
import LandingFooter from './Footer.vue'
import leftImage from './Left.vue'
import rightImage from './Right.vue'
import { i18n, useIsMobile, useIsTablet } from '../../utils/composables'
import { useThemeName } from '../../store'
export default {
components: {
LandingFooter,
leftImage,
rightImage
},
setup () {
const isMobileRef = useIsMobile()
return {
isMobile: isMobileRef,
isTablet: useIsTablet(),
theme: useThemeName(),
titleStyle: computed(() => {
if (isMobileRef.value) {
return 'margin-top: 0; font-size: 64px !important'
} else {
return 'margin-top: 0; font-size: 80px !important'
}
}),
...i18n({
'zh-CN': {
start: '开始使用',
intro1: '一个 Vue 3 组件库',
intro2: '比较完整,主题可调,使用 TypeScript不算太慢',
intro3: '有点意思',
intro4: '换个主题'
},
'en-US': {
start: 'Get Started',
intro1: 'A Vue 3 Component Library',
intro2:
'Fairly Complete, Customizable Themes, Uses TypeScript, Not Too Slow',
intro3: 'Kinda Interesting',
intro4: 'Change Theme'
}
})
}
},
data () {
return {
hover: false,
themeOptions: {
dark: {
next: 'light'
},
light: {
next: 'dark'
}
}
}
},
methods: {
handleStartClick () {
this.$router.push(this.$route.path + '/docs/installation')
},
handleTitleMouseEnter () {
this.hover = true
},
handleTitleMouseLeave () {
this.hover = false
},
handleThemeChangeClick () {
this.theme = this.themeOptions[this.theme].next
}
}
}
</script>
<style scoped>
.banner {
height: calc(100vh - 64px);
display: flex;
flex-direction: column;
position: relative;
text-align: center;
justify-content: center;
}
.banner::after {
content: '';
width: 100%;
height: 64px;
}
.naive-title {
line-height: 1;
font-family: Metropolis, sans-serif;
margin-bottom: 18px !important;
}
@media only screen and (max-width: 1920px) {
.left-image {
right: calc(50% + 270px);
width: calc(50% - 270px);
min-width: 440px;
}
.right-image {
left: calc(50% + 270px);
width: calc(50% - 270px);
min-width: 440px;
}
}
@media only screen and (min-width: 1920px) {
.left-image {
left: 0;
width: 700px;
}
.right-image {
right: 0;
width: 700px;
}
}
.left-image {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
.right-image {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
@media only screen and (max-width: 1023px) {
.banner {
position: static;
text-align: left;
padding-left: 16px;
transform: none;
padding-top: 60px;
padding-right: 16px;
min-height: 550px;
height: calc(100vh - 124px);
}
.left-image {
position: relative;
left: -16px;
min-width: unset;
width: 300px;
top: 8px;
transform: none;
}
}
</style>