Adds consultation leads, section editors, and the one-time content reset for this release. Co-authored-by: Cursor <cursoragent@cursor.com>
119 lines
6.3 KiB
Vue
119 lines
6.3 KiB
Vue
<template>
|
|
<footer id="contact" class="bg-white dark:bg-[#060a14] border-t border-slate-200/80 dark:border-slate-800/80 pt-16 pb-12 text-right">
|
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-12 gap-10 pb-12 border-b border-slate-100 dark:border-slate-800/80">
|
|
<div class="lg:col-span-3 space-y-3">
|
|
<h2 class="text-sm font-bold text-slate-900 dark:text-white">{{ footer.contactTitle }}</h2>
|
|
<ul class="space-y-3 text-xs text-slate-600 dark:text-slate-400 font-medium">
|
|
<li class="flex items-center gap-2">
|
|
<svg class="w-4 h-4 text-brand-600 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" /></svg>
|
|
<span>{{ settings.phone }}</span>
|
|
</li>
|
|
<li class="flex items-center gap-2">
|
|
<svg class="w-4 h-4 text-brand-600 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" /></svg>
|
|
<span>{{ settings.email }}</span>
|
|
</li>
|
|
<li class="flex items-center gap-2">
|
|
<svg class="w-4 h-4 text-brand-600 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" /><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 11a3 3 0 11-6 0 3 3 0 016 0z" /></svg>
|
|
<span>{{ settings.address }}</span>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="lg:col-span-3 space-y-3">
|
|
<h2 class="text-sm font-bold text-slate-900 dark:text-white">{{ footer.productsTitle }}</h2>
|
|
<ul class="space-y-2 text-xs text-slate-600 dark:text-slate-400 font-medium">
|
|
<li v-for="link in footer.products" :key="link.label">
|
|
<a :href="resolveHref(link.href)" class="hover:text-brand-600 dark:hover:text-brand-400 transition-colors">{{ link.label }}</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="lg:col-span-2 space-y-3">
|
|
<h2 class="text-sm font-bold text-slate-900 dark:text-white">{{ footer.quickLinksTitle }}</h2>
|
|
<ul class="space-y-2 text-xs text-slate-600 dark:text-slate-400 font-medium">
|
|
<li v-for="link in footer.quickLinks" :key="link.label">
|
|
<a :href="resolveHref(link.href)" class="hover:text-brand-600 dark:hover:text-brand-400 transition-colors">{{ link.label }}</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="lg:col-span-4 space-y-4">
|
|
<div class="flex items-center gap-3">
|
|
<div class="flex items-center justify-center w-10 h-10 rounded-xl bg-gradient-to-br from-brand-600 to-sky-400 text-white">
|
|
<svg class="w-6 h-6" viewBox="0 0 32 32" fill="none" aria-hidden="true">
|
|
<path d="M6 22L12 8L16 15L20 8L26 22" stroke="white" stroke-width="3" stroke-linecap="round" />
|
|
</svg>
|
|
</div>
|
|
<div class="flex flex-col">
|
|
<span class="text-xl font-black text-slate-900 dark:text-white">{{ footer.brandTitle }}</span>
|
|
<span class="text-[9px] font-bold text-slate-400 tracking-wider">{{ footer.brandSubtitle }}</span>
|
|
</div>
|
|
</div>
|
|
|
|
<p class="text-xs text-slate-400 dark:text-slate-500 leading-relaxed font-normal">
|
|
<template v-for="(line, i) in footer.descriptionLines" :key="i">
|
|
<br v-if="i > 0">
|
|
{{ line }}
|
|
</template>
|
|
</p>
|
|
|
|
<div class="flex items-center gap-3 pt-2">
|
|
<a
|
|
v-for="social in socials"
|
|
:key="social.kind + social.url"
|
|
:href="social.url"
|
|
:aria-label="social.label"
|
|
:target="social.url.startsWith('http') ? '_blank' : undefined"
|
|
:rel="social.url.startsWith('http') ? 'noopener noreferrer' : undefined"
|
|
class="w-8 h-8 rounded-full bg-slate-100 dark:bg-slate-800 text-slate-600 dark:text-slate-300 hover:bg-brand-600 hover:text-white flex items-center justify-center transition-colors"
|
|
>
|
|
<SocialIcon :kind="social.kind" />
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="pt-8 flex flex-col sm:flex-row items-center justify-between text-xs text-slate-400 dark:text-slate-500 gap-4">
|
|
<div>{{ footer.copyright }}</div>
|
|
<div class="flex items-center gap-6">
|
|
<a
|
|
v-for="link in footer.legalLinks"
|
|
:key="link.label"
|
|
:href="resolveHref(link.href)"
|
|
class="hover:text-slate-600 dark:hover:text-slate-300 transition-colors"
|
|
>{{ link.label }}</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
type SocialKind = "telegram" | "linkedin" | "instagram" | "link";
|
|
|
|
const DEFAULT_SOCIALS: Array<{ kind: SocialKind; label: string; url: string }> = [
|
|
{ kind: "telegram", label: "تلگرام", url: "#" },
|
|
{ kind: "linkedin", label: "لینکدین", url: "#" },
|
|
{ kind: "instagram", label: "اینستاگرام", url: "#" },
|
|
];
|
|
|
|
function detectKind(label: string, url: string): SocialKind {
|
|
const s = `${label} ${url}`.toLowerCase();
|
|
if (s.includes("t.me") || s.includes("telegram") || s.includes("تلگرام")) return "telegram";
|
|
if (s.includes("linkedin") || s.includes("لینکدین")) return "linkedin";
|
|
if (s.includes("instagram") || s.includes("اینستاگرام")) return "instagram";
|
|
return "link";
|
|
}
|
|
|
|
const { section, settings } = useSiteContent();
|
|
const footer = section("footer");
|
|
const resolveHref = useSectionHref();
|
|
|
|
const socials = computed(() => {
|
|
const list = settings.value.socials;
|
|
if (!list.length) return DEFAULT_SOCIALS;
|
|
return list.map((s) => ({ kind: detectKind(s.label, s.url), label: s.label, url: s.url }));
|
|
});
|
|
</script>
|