feat(landing): polish docs and hero visuals

This commit is contained in:
777genius 2026-05-04 22:59:01 +03:00
parent 77c1fcc4e8
commit 3d8d2395a4
24 changed files with 258 additions and 68 deletions

View file

@ -8,7 +8,7 @@ const { t, locale } = useI18n();
const downloadStore = useDownloadStore();
const { data: releaseData, resolve } = useReleaseDownloads();
const { trackDownloadClick } = useAnalytics();
const { releaseDownloadUrl } = useGithubRepo();
const { repoUrl, releaseDownloadUrl } = useGithubRepo();
onMounted(() => downloadStore.init());
@ -62,6 +62,13 @@ const releaseDate = computed(() => {
day: 'numeric',
});
});
const devBranchUrl = computed(() => `${repoUrl.value}/tree/dev`);
const devBranchNote = computed(() =>
locale.value === 'ru'
? 'Самая свежая версия доступна в ветке dev - можно развернуть локально.'
: 'Freshest version is available on the dev branch - clone and run it locally.',
);
</script>
<template>
@ -133,6 +140,15 @@ const releaseDate = computed(() => {
</div>
</div>
<a
class="download-section__dev-note"
:href="devBranchUrl"
target="_blank"
rel="noopener"
>
{{ devBranchNote }}
</a>
<p v-if="releaseVersion" class="download-section__release-info">
v{{ releaseVersion }} · {{ releaseDate }}
</p>
@ -374,6 +390,38 @@ const releaseDate = computed(() => {
font-family: 'JetBrains Mono', monospace;
}
.download-section__dev-note {
display: flex;
width: fit-content;
max-width: min(620px, calc(100vw - 32px));
margin: 18px auto 0;
padding: 8px 12px;
border: 1px solid rgba(0, 240, 255, 0.12);
border-radius: 10px;
background: rgba(0, 240, 255, 0.035);
color: #00f0ff;
font-family: 'JetBrains Mono', monospace;
font-size: 0.76rem;
line-height: 1.55;
text-align: center;
text-decoration: none;
opacity: 0.82;
position: relative;
z-index: 1;
transition:
border-color 0.2s ease,
background 0.2s ease,
color 0.2s ease,
opacity 0.2s ease;
}
.download-section__dev-note:hover {
border-color: rgba(57, 255, 20, 0.24);
background: rgba(57, 255, 20, 0.045);
color: #39ff14;
opacity: 1;
}
@keyframes downloadFadeUp {
from {
opacity: 0;
@ -423,6 +471,12 @@ const releaseDate = computed(() => {
color: #94a3b8;
}
.v-theme--light .download-section__dev-note {
background: rgba(8, 145, 178, 0.06);
border-color: rgba(8, 145, 178, 0.16);
color: #0891b2;
}
.v-theme--light .download-section__card-indicator {
color: #16a34a;
}

View file

@ -2,12 +2,13 @@
import { mdiRobotOutline, mdiViewDashboardOutline, mdiOpenSourceInitiative } from '@mdi/js';
const { content } = useLandingContent();
const { t } = useI18n();
const { t, locale } = useI18n();
const { baseURL } = useRuntimeConfig().app;
const workflowVideoSrc = 'https://github.com/user-attachments/assets/35e27989-726d-4059-8662-bae610e46b42';
const downloadStore = useDownloadStore();
const { resolve, data: releaseData } = useReleaseDownloads();
const { latestReleaseUrl, releaseDownloadUrl } = useGithubRepo();
const { repoUrl, latestReleaseUrl, releaseDownloadUrl } = useGithubRepo();
const releaseVersion = computed(() => releaseData.value?.version || null);
const releaseDate = computed(() => {
@ -28,10 +29,33 @@ const heroDownloadUrl = computed(() => {
const arch = asset.os === 'macos' ? downloadStore.macArch : asset.arch;
return resolve(asset.os, arch)?.url || releaseDownloadUrl(asset.fileName);
});
const devBranchUrl = computed(() => `${repoUrl.value}/tree/dev`);
const devBranchNote = computed(() =>
locale.value === 'ru'
? 'Самая свежая версия в ветке dev - можно развернуть локально.'
: 'Freshest version is on the dev branch - clone and run it locally.',
);
</script>
<template>
<section id="hero" class="hero-section section anchor-offset">
<div class="hero-section__video-bg" aria-hidden="true">
<video
class="hero-section__video-bg-player"
autoplay
muted
loop
playsinline
preload="metadata"
:poster="`${baseURL}screenshots/1.jpg`"
>
<source :src="workflowVideoSrc" type="video/mp4">
</video>
<div class="hero-section__video-bg-wash" />
<div class="hero-section__video-bg-edge" />
</div>
<v-container class="hero-section__container">
<v-row align="center" justify="space-between">
<!-- Left: Text content -->
@ -71,6 +95,15 @@ const heroDownloadUrl = computed(() => {
</v-btn>
</div>
<a
class="hero-section__dev-note"
:href="devBranchUrl"
target="_blank"
rel="noopener"
>
{{ devBranchNote }}
</a>
<!-- Release version badge -->
<div v-if="releaseVersion" class="hero-section__release-badge">
v{{ releaseVersion }}<template v-if="releaseDate"> · {{ releaseDate }}</template>
@ -123,15 +156,63 @@ const heroDownloadUrl = computed(() => {
min-height: 85vh;
display: flex;
align-items: center;
isolation: isolate;
}
.hero-section__video-bg {
position: absolute;
inset: -120px 0 -110px;
z-index: 0;
overflow: hidden;
pointer-events: none;
}
.hero-section__video-bg-player {
position: absolute;
inset: 0;
display: block;
width: 100%;
height: 100%;
object-fit: cover;
filter: blur(1px) saturate(1.22) contrast(1.08);
opacity: 0.95;
mix-blend-mode: normal;
transform: scale(1.04);
}
.hero-section__video-bg-wash {
position: absolute;
inset: 0;
background:
linear-gradient(90deg, rgb(var(--v-theme-background)) 0%, rgba(var(--v-theme-background), 0.82) 34%, rgba(var(--v-theme-background), 0.08) 64%, rgba(var(--v-theme-background), 0.34) 100%),
linear-gradient(180deg, rgba(var(--v-theme-background), 0.28) 0%, rgba(var(--v-theme-background), 0.52) 58%, rgb(var(--v-theme-background)) 96%);
}
.hero-section__video-bg-edge {
position: absolute;
inset: auto 0 0;
height: 42%;
background: linear-gradient(180deg, transparent, rgb(var(--v-theme-background)));
}
.v-theme--light .hero-section__video-bg-player {
mix-blend-mode: multiply;
}
.v-theme--light .hero-section__video-bg-wash {
background:
linear-gradient(90deg, rgb(var(--v-theme-background)) 0%, rgba(var(--v-theme-background), 0.86) 34%, rgba(var(--v-theme-background), 0.16) 64%, rgba(var(--v-theme-background), 0.36) 100%),
linear-gradient(180deg, rgba(var(--v-theme-background), 0.36) 0%, rgba(var(--v-theme-background), 0.54) 58%, rgb(var(--v-theme-background)) 96%);
}
.hero-section__container {
position: relative;
z-index: 1;
z-index: 2;
}
.hero-section__content {
animation: heroFadeIn 0.8s ease both;
text-shadow: 0 2px 18px rgba(0, 0, 0, 0.55);
}
/* ─── Title ─── */
@ -169,8 +250,8 @@ const heroDownloadUrl = computed(() => {
.hero-section__subtitle {
font-size: 1.2rem;
line-height: 1.7;
color: #8892b0;
opacity: 0.9;
color: #aeb8d4;
opacity: 0.96;
max-width: 480px;
margin-bottom: 36px;
animation: heroFadeIn 0.8s ease both;
@ -182,11 +263,33 @@ const heroDownloadUrl = computed(() => {
display: flex;
gap: 14px;
flex-wrap: wrap;
margin-bottom: 16px;
margin-bottom: 12px;
animation: heroFadeIn 0.8s ease both;
animation-delay: 0.4s;
}
.hero-section__dev-note {
display: inline-flex;
max-width: 460px;
margin-bottom: 14px;
font-family: 'JetBrains Mono', monospace;
font-size: 0.74rem;
line-height: 1.55;
color: #00f0ff;
opacity: 0.78;
text-decoration: none;
transition:
color 0.2s ease,
opacity 0.2s ease;
animation: heroFadeIn 0.8s ease both;
animation-delay: 0.43s;
}
.hero-section__dev-note:hover {
color: #39ff14;
opacity: 1;
}
/* ─── Release badge ─── */
.hero-section__release-badge {
font-size: 0.78rem;
@ -346,6 +449,20 @@ const heroDownloadUrl = computed(() => {
padding-top: 40px;
}
.hero-section__video-bg {
inset: -90px 0 -90px;
}
.hero-section__video-bg-player {
opacity: 0.82;
}
.hero-section__video-bg-wash {
background:
linear-gradient(90deg, rgb(var(--v-theme-background)) 0%, rgba(var(--v-theme-background), 0.9) 50%, rgba(var(--v-theme-background), 0.54) 100%),
linear-gradient(180deg, rgba(var(--v-theme-background), 0.42) 0%, rgba(var(--v-theme-background), 0.72) 58%, rgb(var(--v-theme-background)) 96%);
}
.hero-section__title {
font-size: 2rem;
white-space: nowrap;
@ -372,6 +489,11 @@ const heroDownloadUrl = computed(() => {
}
@media (max-width: 600px) {
.hero-section__content {
flex: 0 0 calc(100vw - 48px);
max-width: calc(100vw - 48px);
}
.hero-section__title {
font-size: 1.6rem;
white-space: nowrap;
@ -387,10 +509,21 @@ const heroDownloadUrl = computed(() => {
.hero-section__subtitle {
font-size: 0.95rem;
margin-bottom: 28px;
width: 100%;
max-width: 330px;
word-break: normal;
overflow-wrap: normal;
hyphens: none;
}
.hero-section__actions {
margin-bottom: 28px;
margin-bottom: 12px;
}
.hero-section__dev-note {
max-width: 320px;
margin-bottom: 20px;
font-size: 0.7rem;
}
.hero-section__trust {

View file

@ -40,7 +40,7 @@ function onGetStarted() {
<h3 class="pricing-card__name">{{ plan.name }}</h3>
<div class="pricing-card__price-wrap">
<span class="pricing-card__price">{{ plan.price }}</span>
<span class="pricing-card__period">/ {{ plan.period }}</span>
<span v-if="plan.period" class="pricing-card__period">/ {{ plan.period }}</span>
</div>
<p class="pricing-card__description">{{ plan.description }}</p>
</div>

View file

@ -44,7 +44,7 @@
{
"id": "isFree",
"question": "هل هو مجاني فعلاً؟",
"answer": "نعم. التطبيق مجاني 100% ومفتوح المصدر. التطبيق نفسه لا يملك خطة مدفوعة. لتشغيل الوكلاء تحتاج فقط إلى وصول إلى مزود أو runtime مدعوم مثل Anthropic أو Codex."
"answer": "نعم. التطبيق مجاني ومفتوح المصدر. التطبيق نفسه لا يملك خطة مدفوعة. لتشغيل الوكلاء تحتاج فقط إلى وصول إلى مزود أو runtime مدعوم مثل Anthropic أو Codex."
},
{
"id": "platforms",
@ -82,9 +82,9 @@
"pricing": [
{
"id": "free",
"name": "مجاني للأبد",
"name": "مجاني",
"price": "$0",
"period": "للأبد",
"period": "",
"description": "كل شيء متضمن. بدون حدود، بدون مفاتيح API، بدون بطاقة ائتمان.",
"features": [
"فرق وكلاء غير محدودة",

View file

@ -44,7 +44,7 @@
{
"id": "isFree",
"question": "Ist es wirklich kostenlos?",
"answer": "Ja. Die App ist 100% kostenlos und Open Source. Die App selbst hat kein Bezahlmodell. Um Agenten auszuführen, brauchen Sie nur Zugriff auf einen unterstützten Provider bzw. Runtime wie Anthropic oder Codex."
"answer": "Ja. Die App ist kostenlos und Open Source. Die App selbst hat kein Bezahlmodell. Um Agenten auszuführen, brauchen Sie nur Zugriff auf einen unterstützten Provider bzw. Runtime wie Anthropic oder Codex."
},
{
"id": "platforms",
@ -82,9 +82,9 @@
"pricing": [
{
"id": "free",
"name": "Für immer kostenlos",
"name": "Kostenlos",
"price": "0€",
"period": "für immer",
"period": "",
"description": "Alles inklusive. Keine Limits, keine API-Schlüssel, keine Kreditkarte.",
"features": [
"Unbegrenzte Agenten-Teams",

View file

@ -44,7 +44,7 @@
{
"id": "isFree",
"question": "Is it really free?",
"answer": "Yes. The app itself is 100% free and open source. The app has no paid tier of its own. To run agents, you only need access to a supported provider/runtime, such as Anthropic or Codex."
"answer": "Yes. The app itself is free and open source. The app has no paid tier of its own. To run agents, you only need access to a supported provider/runtime, such as Anthropic or Codex."
},
{
"id": "platforms",
@ -82,9 +82,9 @@
"pricing": [
{
"id": "free",
"name": "Free Forever",
"name": "Free",
"price": "$0",
"period": "forever",
"period": "",
"description": "Everything included. No limits, no API keys, no credit card.",
"features": [
"Unlimited agent teams",

View file

@ -44,7 +44,7 @@
{
"id": "isFree",
"question": "¿Es realmente gratis?",
"answer": "Sí. La app es 100% gratuita y de código abierto. La app no tiene un plan de pago propio. Para ejecutar agentes solo necesitas acceso a un proveedor/runtime compatible, como Anthropic o Codex."
"answer": "Sí. La app es gratuita y de código abierto. La app no tiene un plan de pago propio. Para ejecutar agentes solo necesitas acceso a un proveedor/runtime compatible, como Anthropic o Codex."
},
{
"id": "platforms",
@ -82,9 +82,9 @@
"pricing": [
{
"id": "free",
"name": "Gratis para siempre",
"name": "Gratis",
"price": "$0",
"period": "para siempre",
"period": "",
"description": "Todo incluido. Sin límites, sin claves API, sin tarjeta de crédito.",
"features": [
"Equipos de agentes ilimitados",

View file

@ -44,7 +44,7 @@
{
"id": "isFree",
"question": "C'est vraiment gratuit ?",
"answer": "Oui. L'application est 100% gratuite et open source. L'application n'a pas d'offre payante. Pour exécuter des agents, vous avez seulement besoin d'un accès à un provider/runtime pris en charge, comme Anthropic ou Codex."
"answer": "Oui. L'application est gratuite et open source. L'application n'a pas d'offre payante. Pour exécuter des agents, vous avez seulement besoin d'un accès à un provider/runtime pris en charge, comme Anthropic ou Codex."
},
{
"id": "platforms",
@ -82,9 +82,9 @@
"pricing": [
{
"id": "free",
"name": "Gratuit pour toujours",
"name": "Gratuit",
"price": "0€",
"period": "pour toujours",
"period": "",
"description": "Tout inclus. Sans limites, sans clés API, sans carte bancaire.",
"features": [
"Équipes d'agents illimitées",

View file

@ -44,7 +44,7 @@
{
"id": "isFree",
"question": "क्या यह सच में मुफ़्त है?",
"answer": "हाँ। ऐप 100% मुफ़्त और ओपन सोर्स है। ऐप का अपना कोई paid plan नहीं है। agents चलाने के लिए आपको सिर्फ़ किसी supported provider/runtime, जैसे Anthropic या Codex, का access चाहिए।"
"answer": "हाँ। ऐप मुफ़्त और ओपन सोर्स है। ऐप का अपना कोई paid plan नहीं है। agents चलाने के लिए आपको सिर्फ़ किसी supported provider/runtime, जैसे Anthropic या Codex, का access चाहिए।"
},
{
"id": "platforms",
@ -82,9 +82,9 @@
"pricing": [
{
"id": "free",
"name": "हमेशा मुफ़्त",
"name": "मुफ़्त",
"price": "$0",
"period": "हमेशा",
"period": "",
"description": "सब कुछ शामिल। कोई लिमिट नहीं, कोई API कुंजी नहीं, कोई क्रेडिट कार्ड नहीं।",
"features": [
"असीमित एजेंट टीमें",

View file

@ -44,7 +44,7 @@
{
"id": "isFree",
"question": "本当に無料ですか?",
"answer": "はい。アプリは100%無料のオープンソースです。アプリ自体に有料プランはありません。エージェントを実行するには、Anthropic や Codex など対応する provider/runtime へのアクセスだけが必要です。"
"answer": "はい。アプリは無料のオープンソースです。アプリ自体に有料プランはありません。エージェントを実行するには、Anthropic や Codex など対応する provider/runtime へのアクセスだけが必要です。"
},
{
"id": "platforms",
@ -82,9 +82,9 @@
"pricing": [
{
"id": "free",
"name": "永久無料",
"name": "無料",
"price": "¥0",
"period": "永久",
"period": "",
"description": "すべて含まれています。制限なし、APIキー不要、クレジットカード不要。",
"features": [
"無制限のエージェントチーム",

View file

@ -44,7 +44,7 @@
{
"id": "isFree",
"question": "É realmente grátis?",
"answer": "Sim. O app é 100% gratuito e open source. O app não tem plano pago próprio. Para rodar agentes, você só precisa de acesso a um provider/runtime compatível, como Anthropic ou Codex."
"answer": "Sim. O app é gratuito e open source. O app não tem plano pago próprio. Para rodar agentes, você só precisa de acesso a um provider/runtime compatível, como Anthropic ou Codex."
},
{
"id": "platforms",
@ -82,9 +82,9 @@
"pricing": [
{
"id": "free",
"name": "Grátis para sempre",
"name": "Grátis",
"price": "$0",
"period": "para sempre",
"period": "",
"description": "Tudo incluído. Sem limites, sem chaves de API, sem cartão de crédito.",
"features": [
"Equipes de agentes ilimitadas",

View file

@ -82,9 +82,9 @@
"pricing": [
{
"id": "free",
"name": "Бесплатно навсегда",
"name": "Бесплатно",
"price": "$0",
"period": "навсегда",
"period": "",
"description": "Всё включено. Без лимитов, без API-ключей, без кредитной карты.",
"features": [
"Безлимитные команды агентов",

View file

@ -44,7 +44,7 @@
{
"id": "isFree",
"question": "真的免费吗?",
"answer": "是的。应用本身 100% 免费且开源。应用没有自己的付费方案。要运行智能体,你只需要接入受支持的 provider/runtime例如 Anthropic 或 Codex。"
"answer": "是的。应用本身免费且开源。应用没有自己的付费方案。要运行智能体,你只需要接入受支持的 provider/runtime例如 Anthropic 或 Codex。"
},
{
"id": "platforms",
@ -82,9 +82,9 @@
"pricing": [
{
"id": "free",
"name": "永久免费",
"name": "免费",
"price": "$0",
"period": "永久",
"period": "",
"description": "全部功能。无限制,无需 API 密钥,无需信用卡。",
"features": [
"无限智能体团队",

View file

@ -44,8 +44,8 @@
"sectionTitle": "مجاني 100%. بدون شروط.",
"sectionSubtitle": "مفتوح المصدر، بدون مفاتيح API، بدون إعدادات. فقط ثبّت وابدأ.",
"getStarted": "حمّل الآن",
"popular": "مجاني للأبد",
"note": "مفتوح المصدر 100%. بدون مفاتيح API. بدون إعدادات. يعمل محلياً بالكامل."
"popular": "مجاني",
"note": "مفتوح المصدر. بدون مفاتيح API. بدون إعدادات. يعمل محلياً بالكامل."
},
"testimonials": {
"sectionTitle": "ماذا يقول المطورون",

View file

@ -44,8 +44,8 @@
"sectionTitle": "100% Kostenlos. Ohne Haken.",
"sectionSubtitle": "Open Source, keine API-Schlüssel, keine Konfiguration. Einfach installieren und loslegen.",
"getStarted": "Herunterladen",
"popular": "Für immer kostenlos",
"note": "100% Open Source. Keine API-Schlüssel. Keine Konfiguration. Läuft vollständig lokal."
"popular": "Kostenlos",
"note": "Open Source. Keine API-Schlüssel. Keine Konfiguration. Läuft vollständig lokal."
},
"testimonials": {
"sectionTitle": "Was Entwickler sagen",

View file

@ -44,8 +44,8 @@
"sectionTitle": "100% Free. No strings attached.",
"sectionSubtitle": "Open source, no API keys, no configuration. Just install and go.",
"getStarted": "Download Now",
"popular": "Free Forever",
"note": "100% open source. No API keys. No configuration. Runs entirely locally."
"popular": "Free",
"note": "Open source. No API keys. No configuration. Runs entirely locally."
},
"testimonials": {
"sectionTitle": "What developers say",

View file

@ -44,8 +44,8 @@
"sectionTitle": "100% Gratis. Sin letra pequeña.",
"sectionSubtitle": "Código abierto, sin claves API, sin configuración. Instala y empieza.",
"getStarted": "Descargar ahora",
"popular": "Gratis para siempre",
"note": "100% código abierto. Sin claves API. Sin configuración. Funciona completamente en local."
"popular": "Gratis",
"note": "Código abierto. Sin claves API. Sin configuración. Funciona completamente en local."
},
"testimonials": {
"sectionTitle": "Lo que dicen los desarrolladores",

View file

@ -44,8 +44,8 @@
"sectionTitle": "100% Gratuit. Sans conditions.",
"sectionSubtitle": "Open source, sans clé API, sans configuration. Installez et c'est parti.",
"getStarted": "Télécharger",
"popular": "Gratuit pour toujours",
"note": "100% open source. Sans clé API. Sans configuration. Fonctionne entièrement en local."
"popular": "Gratuit",
"note": "Open source. Sans clé API. Sans configuration. Fonctionne entièrement en local."
},
"testimonials": {
"sectionTitle": "Ce que disent les développeurs",

View file

@ -44,8 +44,8 @@
"sectionTitle": "100% मुफ़्त। कोई शर्त नहीं।",
"sectionSubtitle": "ओपन सोर्स, कोई API कुंजी नहीं, कोई कॉन्फ़िगरेशन नहीं। बस इंस्टॉल करें और शुरू करें।",
"getStarted": "अभी डाउनलोड करें",
"popular": "हमेशा मुफ़्त",
"note": "100% ओपन सोर्स। कोई API कुंजी नहीं। कोई कॉन्फ़िगरेशन नहीं। पूरी तरह लोकल चलता है।"
"popular": "मुफ़्त",
"note": "ओपन सोर्स। कोई API कुंजी नहीं। कोई कॉन्फ़िगरेशन नहीं। पूरी तरह लोकल चलता है।"
},
"testimonials": {
"sectionTitle": "डेवलपर्स क्या कहते हैं",

View file

@ -44,8 +44,8 @@
"sectionTitle": "100%無料。制約なし。",
"sectionSubtitle": "オープンソース、APIキー不要、設定不要。インストールするだけ。",
"getStarted": "ダウンロード",
"popular": "永久無料",
"note": "100%オープンソース。APIキー不要。設定不要。完全にローカルで動作。"
"popular": "無料",
"note": "オープンソース。APIキー不要。設定不要。完全にローカルで動作。"
},
"testimonials": {
"sectionTitle": "開発者の声",

View file

@ -44,8 +44,8 @@
"sectionTitle": "100% Grátis. Sem pegadinhas.",
"sectionSubtitle": "Código aberto, sem chaves de API, sem configuração. Instale e comece.",
"getStarted": "Baixar agora",
"popular": "Grátis para sempre",
"note": "100% código aberto. Sem chaves de API. Sem configuração. Roda totalmente local."
"popular": "Grátis",
"note": "Código aberto. Sem chaves de API. Sem configuração. Roda totalmente local."
},
"testimonials": {
"sectionTitle": "O que os desenvolvedores dizem",

View file

@ -44,8 +44,8 @@
"sectionTitle": "100% Бесплатно. Без подвоха.",
"sectionSubtitle": "Открытый код, без API-ключей, без конфигурации. Просто установите и работайте.",
"getStarted": "Скачать",
"popular": "Бесплатно навсегда",
"note": "100% открытый код. Без API-ключей. Без конфигурации. Работает полностью локально."
"popular": "Бесплатно",
"note": "Открытый код. Без API-ключей. Без конфигурации. Работает полностью локально."
},
"testimonials": {
"sectionTitle": "Что говорят разработчики",

View file

@ -44,8 +44,8 @@
"sectionTitle": "100% 免费,没有附加条件。",
"sectionSubtitle": "开源,无需 API 密钥,无需配置。安装即用。",
"getStarted": "立即下载",
"popular": "永久免费",
"note": "100% 开源。无需 API 密钥。无需配置。完全本地运行。"
"popular": "免费",
"note": "开源。无需 API 密钥。无需配置。完全本地运行。"
},
"testimonials": {
"sectionTitle": "开发者怎么说",

View file

@ -1,5 +1,7 @@
<script setup lang="ts">
import { withBase } from "vitepress";
const workflowVideoSrc = "https://github.com/user-attachments/assets/35e27989-726d-4059-8662-bae610e46b42";
</script>
<template>
@ -13,7 +15,7 @@ import { withBase } from "vitepress";
preload="metadata"
:poster="withBase('/screenshots/1.jpg')"
>
<source :src="withBase('/video/demo.mp4')" type="video/mp4">
<source :src="workflowVideoSrc" type="video/mp4">
</video>
<div class="docs-hero-visual__wash" />
<div class="docs-hero-visual__edge" />
@ -35,8 +37,8 @@ import { withBase } from "vitepress";
width: 100%;
height: 100%;
object-fit: cover;
filter: blur(14px) saturate(1.32) contrast(1.14);
opacity: 0.62;
filter: blur(1px) saturate(1.22) contrast(1.08);
opacity: 0.95;
mix-blend-mode: multiply;
transform: scale(1.04);
}
@ -45,8 +47,8 @@ import { withBase } from "vitepress";
position: absolute;
inset: 0;
background:
linear-gradient(90deg, var(--vp-c-bg) 0%, color-mix(in srgb, var(--vp-c-bg) 84%, transparent) 34%, color-mix(in srgb, var(--vp-c-bg) 24%, transparent) 64%, color-mix(in srgb, var(--vp-c-bg) 50%, transparent) 100%),
linear-gradient(180deg, color-mix(in srgb, var(--vp-c-bg) 52%, transparent) 0%, color-mix(in srgb, var(--vp-c-bg) 64%, transparent) 58%, var(--vp-c-bg) 96%);
linear-gradient(90deg, var(--vp-c-bg) 0%, color-mix(in srgb, var(--vp-c-bg) 82%, transparent) 34%, color-mix(in srgb, var(--vp-c-bg) 8%, transparent) 64%, color-mix(in srgb, var(--vp-c-bg) 26%, transparent) 100%),
linear-gradient(180deg, color-mix(in srgb, var(--vp-c-bg) 32%, transparent) 0%, color-mix(in srgb, var(--vp-c-bg) 44%, transparent) 58%, var(--vp-c-bg) 96%);
}
.docs-hero-visual__edge {
@ -57,15 +59,15 @@ import { withBase } from "vitepress";
}
.dark .docs-hero-visual__video {
opacity: 0.52;
filter: blur(16px) saturate(1.38) contrast(1.14);
opacity: 0.95;
filter: blur(1px) saturate(1.24) contrast(1.08);
mix-blend-mode: normal;
}
.dark .docs-hero-visual__wash {
background:
linear-gradient(90deg, var(--vp-c-bg) 0%, color-mix(in srgb, var(--vp-c-bg) 78%, transparent) 34%, color-mix(in srgb, var(--vp-c-bg) 26%, transparent) 64%, color-mix(in srgb, var(--vp-c-bg) 58%, transparent) 100%),
linear-gradient(180deg, color-mix(in srgb, var(--vp-c-bg) 50%, transparent) 0%, color-mix(in srgb, var(--vp-c-bg) 68%, transparent) 58%, var(--vp-c-bg) 96%);
linear-gradient(90deg, var(--vp-c-bg) 0%, color-mix(in srgb, var(--vp-c-bg) 76%, transparent) 34%, color-mix(in srgb, var(--vp-c-bg) 8%, transparent) 64%, color-mix(in srgb, var(--vp-c-bg) 34%, transparent) 100%),
linear-gradient(180deg, color-mix(in srgb, var(--vp-c-bg) 28%, transparent) 0%, color-mix(in srgb, var(--vp-c-bg) 52%, transparent) 58%, var(--vp-c-bg) 96%);
}
@media (max-width: 768px) {
@ -74,7 +76,8 @@ import { withBase } from "vitepress";
}
.docs-hero-visual__video {
opacity: 0.16;
opacity: 0.95;
filter: blur(1px) saturate(1.2) contrast(1.06);
}
}
</style>