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>
</ScrollReveal>
<div class="contact-grid">
<!-- Contact Info -->
<div class="contact-info-cards">
<ScrollReveal :delay="100">
<div class="contact-info">
<div class="card contact-info-card">
<h3><i class="fas fa-paper-plane"></i> 联系方式</h3>
<div class="contact-list">
<a
v-for="item in contactItems"
:key="item.label"
:href="item.href"
class="contact-item"
:target="item.external ? '_blank' : '_self'"
:rel="item.external ? 'noopener noreferrer' : undefined"
>
<div class="contact-item-icon">
<i :class="item.icon" aria-hidden="true"></i>
</div>
<div class="contact-item-text">
<span class="contact-item-label">{{ item.label }}</span>
<span class="contact-item-value">{{ item.value }}</span>
</div>
</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 class="card contact-info-card">
<h3><i class="fas fa-paper-plane"></i> 联系方式</h3>
<div class="contact-list">
<a
v-for="item in contactItems"
:key="item.label"
:href="item.href"
class="contact-item"
:target="item.external ? '_blank' : '_self'"
:rel="item.external ? 'noopener noreferrer' : undefined"
>
<div class="contact-item-icon">
<i :class="item.icon" aria-hidden="true"></i>
</div>
<div class="contact-item-text">
<span class="contact-item-label">{{ item.label }}</span>
<span class="contact-item-value">{{ item.value }}</span>
</div>
</a>
</div>
</div>
</ScrollReveal>
<!-- Contact Form -->
<ScrollReveal :delay="200">
<div class="card contact-form-card">
<h3><i class="fas fa-envelope"></i> 发送消息</h3>
<form class="contact-form" @submit.prevent="handleSubmit">
<div class="form-row">
<div class="form-group">
<label for="contact-name">昵称</label>
<input
id="contact-name"
v-model="form.name"
type="text"
placeholder="你的昵称"
required
>
</div>
<div class="form-group">
<label for="contact-email">邮箱</label>
<input
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 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>
</ScrollReveal>
</div>
@@ -118,7 +57,6 @@
</template>
<script>
import { ref, reactive } from 'vue';
import ScrollReveal from './ScrollReveal.vue';
export default {
@@ -137,14 +75,6 @@ export default {
}
},
setup() {
const submitted = ref(false);
const form = reactive({
name: '',
email: '',
subject: '',
message: ''
});
const contactItems = [
{
label: '电子邮箱',
@@ -175,24 +105,9 @@ export default {
{ 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 {
form,
submitted,
contactItems,
socialLinks,
handleSubmit
socialLinks
};
}
};
@@ -203,23 +118,16 @@ export default {
padding: 64px 0;
}
.contact-grid {
.contact-info-cards {
display: grid;
grid-template-columns: 1fr 1.2fr;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
align-items: start;
}
/* Contact Info */
.contact-info {
display: flex;
flex-direction: column;
gap: 16px;
max-width: 800px;
margin: 0 auto;
}
.contact-info-card h3,
.social-card h3,
.contact-form-card h3 {
.social-card h3 {
display: flex;
align-items: center;
gap: 10px;
@@ -227,8 +135,7 @@ export default {
}
.contact-info-card h3 i,
.social-card h3 i,
.contact-form-card h3 i {
.social-card h3 i {
color: var(--accent);
font-size: 16px;
width: 20px;
@@ -323,87 +230,12 @@ export default {
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) {
.contact {
padding: 48px 0;
}
.contact-grid {
grid-template-columns: 1fr;
}
.form-row {
.contact-info-cards {
grid-template-columns: 1fr;
}
+1 -1
View File
@@ -52,7 +52,7 @@ export default {
label: '个人网盘',
description: '访问开源资源、工具软件与文件分享',
icon: 'fas fa-cloud',
url: 'https://drive.nanami.tech',
url: 'https://netdisk.nanami.tech',
external: true,
accent: 'accent-warm'
},