feat(landing): polish docs and hero visuals
This commit is contained in:
parent
77c1fcc4e8
commit
3d8d2395a4
24 changed files with 258 additions and 68 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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": [
|
||||
"فرق وكلاء غير محدودة",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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": [
|
||||
"असीमित एजेंट टीमें",
|
||||
|
|
|
|||
|
|
@ -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": [
|
||||
"無制限のエージェントチーム",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -82,9 +82,9 @@
|
|||
"pricing": [
|
||||
{
|
||||
"id": "free",
|
||||
"name": "Бесплатно навсегда",
|
||||
"name": "Бесплатно",
|
||||
"price": "$0",
|
||||
"period": "навсегда",
|
||||
"period": "",
|
||||
"description": "Всё включено. Без лимитов, без API-ключей, без кредитной карты.",
|
||||
"features": [
|
||||
"Безлимитные команды агентов",
|
||||
|
|
|
|||
|
|
@ -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": [
|
||||
"无限智能体团队",
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@
|
|||
"sectionTitle": "مجاني 100%. بدون شروط.",
|
||||
"sectionSubtitle": "مفتوح المصدر، بدون مفاتيح API، بدون إعدادات. فقط ثبّت وابدأ.",
|
||||
"getStarted": "حمّل الآن",
|
||||
"popular": "مجاني للأبد",
|
||||
"note": "مفتوح المصدر 100%. بدون مفاتيح API. بدون إعدادات. يعمل محلياً بالكامل."
|
||||
"popular": "مجاني",
|
||||
"note": "مفتوح المصدر. بدون مفاتيح API. بدون إعدادات. يعمل محلياً بالكامل."
|
||||
},
|
||||
"testimonials": {
|
||||
"sectionTitle": "ماذا يقول المطورون",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@
|
|||
"sectionTitle": "100% मुफ़्त। कोई शर्त नहीं।",
|
||||
"sectionSubtitle": "ओपन सोर्स, कोई API कुंजी नहीं, कोई कॉन्फ़िगरेशन नहीं। बस इंस्टॉल करें और शुरू करें।",
|
||||
"getStarted": "अभी डाउनलोड करें",
|
||||
"popular": "हमेशा मुफ़्त",
|
||||
"note": "100% ओपन सोर्स। कोई API कुंजी नहीं। कोई कॉन्फ़िगरेशन नहीं। पूरी तरह लोकल चलता है।"
|
||||
"popular": "मुफ़्त",
|
||||
"note": "ओपन सोर्स। कोई API कुंजी नहीं। कोई कॉन्फ़िगरेशन नहीं। पूरी तरह लोकल चलता है।"
|
||||
},
|
||||
"testimonials": {
|
||||
"sectionTitle": "डेवलपर्स क्या कहते हैं",
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@
|
|||
"sectionTitle": "100%無料。制約なし。",
|
||||
"sectionSubtitle": "オープンソース、APIキー不要、設定不要。インストールするだけ。",
|
||||
"getStarted": "ダウンロード",
|
||||
"popular": "永久無料",
|
||||
"note": "100%オープンソース。APIキー不要。設定不要。完全にローカルで動作。"
|
||||
"popular": "無料",
|
||||
"note": "オープンソース。APIキー不要。設定不要。完全にローカルで動作。"
|
||||
},
|
||||
"testimonials": {
|
||||
"sectionTitle": "開発者の声",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@
|
|||
"sectionTitle": "100% Бесплатно. Без подвоха.",
|
||||
"sectionSubtitle": "Открытый код, без API-ключей, без конфигурации. Просто установите и работайте.",
|
||||
"getStarted": "Скачать",
|
||||
"popular": "Бесплатно навсегда",
|
||||
"note": "100% открытый код. Без API-ключей. Без конфигурации. Работает полностью локально."
|
||||
"popular": "Бесплатно",
|
||||
"note": "Открытый код. Без API-ключей. Без конфигурации. Работает полностью локально."
|
||||
},
|
||||
"testimonials": {
|
||||
"sectionTitle": "Что говорят разработчики",
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@
|
|||
"sectionTitle": "100% 免费,没有附加条件。",
|
||||
"sectionSubtitle": "开源,无需 API 密钥,无需配置。安装即用。",
|
||||
"getStarted": "立即下载",
|
||||
"popular": "永久免费",
|
||||
"note": "100% 开源。无需 API 密钥。无需配置。完全本地运行。"
|
||||
"popular": "免费",
|
||||
"note": "开源。无需 API 密钥。无需配置。完全本地运行。"
|
||||
},
|
||||
"testimonials": {
|
||||
"sectionTitle": "开发者怎么说",
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue