update link for personal cloud storage in LinksSection.vue

This commit is contained in:
2026-07-24 15:08:02 +08:00
parent 332f9c3c7f
commit fdc863c064
2 changed files with 46 additions and 214 deletions
+45 -213
View File
@@ -6,110 +6,49 @@
<p class="section-subtitle">{{ subtitle }}</p> <p class="section-subtitle">{{ subtitle }}</p>
</ScrollReveal> </ScrollReveal>
<div class="contact-grid"> <div class="contact-info-cards">
<!-- Contact Info -->
<ScrollReveal :delay="100"> <ScrollReveal :delay="100">
<div class="contact-info"> <div class="card contact-info-card">
<div class="card contact-info-card"> <h3><i class="fas fa-paper-plane"></i> 联系方式</h3>
<h3><i class="fas fa-paper-plane"></i> 联系方式</h3> <div class="contact-list">
<div class="contact-list"> <a
<a v-for="item in contactItems"
v-for="item in contactItems" :key="item.label"
:key="item.label" :href="item.href"
:href="item.href" class="contact-item"
class="contact-item" :target="item.external ? '_blank' : '_self'"
:target="item.external ? '_blank' : '_self'" :rel="item.external ? 'noopener noreferrer' : undefined"
:rel="item.external ? 'noopener noreferrer' : undefined" >
> <div class="contact-item-icon">
<div class="contact-item-icon"> <i :class="item.icon" aria-hidden="true"></i>
<i :class="item.icon" aria-hidden="true"></i> </div>
</div> <div class="contact-item-text">
<div class="contact-item-text"> <span class="contact-item-label">{{ item.label }}</span>
<span class="contact-item-label">{{ item.label }}</span> <span class="contact-item-value">{{ item.value }}</span>
<span class="contact-item-value">{{ item.value }}</span> </div>
</div> </a>
</a>
</div>
</div>
<div class="card social-card">
<h3><i class="fas fa-share-nodes"></i> 社交媒体</h3>
<div class="social-grid">
<a
v-for="social in socialLinks"
:key="social.label"
:href="social.url"
:aria-label="social.label"
:title="social.label"
class="social-item"
target="_blank"
rel="noopener noreferrer"
>
<i :class="social.icon" aria-hidden="true"></i>
<span>{{ social.label }}</span>
</a>
</div>
</div> </div>
</div> </div>
</ScrollReveal> </ScrollReveal>
<!-- Contact Form -->
<ScrollReveal :delay="200"> <ScrollReveal :delay="200">
<div class="card contact-form-card"> <div class="card social-card">
<h3><i class="fas fa-envelope"></i> 发送消息</h3> <h3><i class="fas fa-share-nodes"></i> 社交媒体</h3>
<form class="contact-form" @submit.prevent="handleSubmit"> <div class="social-grid">
<div class="form-row"> <a
<div class="form-group"> v-for="social in socialLinks"
<label for="contact-name">昵称</label> :key="social.label"
<input :href="social.url"
id="contact-name" :aria-label="social.label"
v-model="form.name" :title="social.label"
type="text" class="social-item"
placeholder="你的昵称" target="_blank"
required rel="noopener noreferrer"
> >
</div> <i :class="social.icon" aria-hidden="true"></i>
<div class="form-group"> <span>{{ social.label }}</span>
<label for="contact-email">邮箱</label> </a>
<input </div>
id="contact-email"
v-model="form.email"
type="email"
placeholder="your@email.com"
required
>
</div>
</div>
<div class="form-group">
<label for="contact-subject">主题</label>
<input
id="contact-subject"
v-model="form.subject"
type="text"
placeholder="消息主题"
required
>
</div>
<div class="form-group">
<label for="contact-message">内容</label>
<textarea
id="contact-message"
v-model="form.message"
rows="5"
placeholder="写下你想说的内容..."
required
></textarea>
</div>
<button type="submit" class="btn btn-primary" :disabled="submitted">
<i :class="submitted ? 'fas fa-check' : 'fas fa-paper-plane'"></i>
{{ submitted ? '已发送' : '发送消息' }}
</button>
<p v-if="submitted" class="form-note success">感谢你的消息!我会尽快回复。</p>
<p class="form-note hint">
<i class="fas fa-info-circle"></i>
或直接发送邮件至 <a href="mailto:i@nanami.tech">i@nanami.tech</a>
</p>
</form>
</div> </div>
</ScrollReveal> </ScrollReveal>
</div> </div>
@@ -118,7 +57,6 @@
</template> </template>
<script> <script>
import { ref, reactive } from 'vue';
import ScrollReveal from './ScrollReveal.vue'; import ScrollReveal from './ScrollReveal.vue';
export default { export default {
@@ -137,14 +75,6 @@ export default {
} }
}, },
setup() { setup() {
const submitted = ref(false);
const form = reactive({
name: '',
email: '',
subject: '',
message: ''
});
const contactItems = [ const contactItems = [
{ {
label: '电子邮箱', label: '电子邮箱',
@@ -175,24 +105,9 @@ export default {
{ label: 'Email', icon: 'fas fa-envelope', url: 'mailto:contact@nanami.tech' } { label: 'Email', icon: 'fas fa-envelope', url: 'mailto:contact@nanami.tech' }
]; ];
const handleSubmit = () => {
// Static form — show success state since no backend
submitted.value = true;
setTimeout(() => {
submitted.value = false;
form.name = '';
form.email = '';
form.subject = '';
form.message = '';
}, 5000);
};
return { return {
form,
submitted,
contactItems, contactItems,
socialLinks, socialLinks
handleSubmit
}; };
} }
}; };
@@ -203,23 +118,16 @@ export default {
padding: 64px 0; padding: 64px 0;
} }
.contact-grid { .contact-info-cards {
display: grid; display: grid;
grid-template-columns: 1fr 1.2fr; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px; gap: 20px;
align-items: start; max-width: 800px;
} margin: 0 auto;
/* Contact Info */
.contact-info {
display: flex;
flex-direction: column;
gap: 16px;
} }
.contact-info-card h3, .contact-info-card h3,
.social-card h3, .social-card h3 {
.contact-form-card h3 {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
@@ -227,8 +135,7 @@ export default {
} }
.contact-info-card h3 i, .contact-info-card h3 i,
.social-card h3 i, .social-card h3 i {
.contact-form-card h3 i {
color: var(--accent); color: var(--accent);
font-size: 16px; font-size: 16px;
width: 20px; width: 20px;
@@ -323,87 +230,12 @@ export default {
text-align: center; text-align: center;
} }
/* Form */
.contact-form {
display: flex;
flex-direction: column;
gap: 16px;
}
.form-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
.form-group {
display: flex;
flex-direction: column;
gap: 6px;
}
.form-group label {
font-size: 13px;
font-weight: 600;
color: var(--text-secondary);
transition: color 0.3s;
}
.form-group input,
.form-group textarea {
font-family: 'SF Pro Text', 'SF Pro Icons', 'Helvetica Neue', Helvetica, Arial, sans-serif;
padding: 10px 14px;
border: 2px solid var(--border-color);
border-radius: 8px;
font-size: 15px;
line-height: 1.47;
background: var(--surface-light);
color: var(--text-color);
transition: all 0.3s;
resize: vertical;
}
.form-group input:focus,
.form-group textarea:focus {
outline: none;
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-subtle);
}
.form-group input::placeholder,
.form-group textarea::placeholder {
color: var(--text-tertiary);
}
.form-note {
font-size: 13px;
margin: 0;
transition: color 0.3s;
}
.form-note.success {
color: var(--accent);
font-weight: 500;
}
.form-note.hint {
color: var(--text-tertiary);
}
.form-note.hint a {
color: var(--accent);
}
@media (max-width: 768px) { @media (max-width: 768px) {
.contact { .contact {
padding: 48px 0; padding: 48px 0;
} }
.contact-grid { .contact-info-cards {
grid-template-columns: 1fr;
}
.form-row {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
+1 -1
View File
@@ -52,7 +52,7 @@ export default {
label: '个人网盘', label: '个人网盘',
description: '访问开源资源、工具软件与文件分享', description: '访问开源资源、工具软件与文件分享',
icon: 'fas fa-cloud', icon: 'fas fa-cloud',
url: 'https://drive.nanami.tech', url: 'https://netdisk.nanami.tech',
external: true, external: true,
accent: 'accent-warm' accent: 'accent-warm'
}, },