feat(website): 更新官网至 v0.7.12 并去 AI 味改版

- 版本号/下载链接模板化(VERSION 单点维护),changelog 增 v0.7.12 条目
- 数据修正:模型库 5910 → 7495 / 供应商 212,JSON-LD softwareVersion 同步
- 文案重写:清除一键/开箱即用/一目了然等八股措辞(中英 ~50 处),
  改为具体可验证的说法;英文标题 sentence case
- 视觉降 AI 感:删网格底纹与光晕、主色降饱和、Download 三等宽卡改
  Windows 主推不对称布局、Privacy 改单面板、Features 双列错落
- gh-pages 已随本次改动重新部署
This commit is contained in:
KimiSwitch Dev committed 2026-09-03 10:53:09 +08:00
1 parent 5138a295e0
commit 4de13ad353
12 files changed
+210 -193

No files matched your search

+10 -10
View File
@@ -6,10 +6,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#efebe1" media="(prefers-color-scheme: light)" /> <meta name="theme-color" content="#efebe1" media="(prefers-color-scheme: light)" />
<meta name="theme-color" content="#231f1a" media="(prefers-color-scheme: dark)" /> <meta name="theme-color" content="#231f1a" media="(prefers-color-scheme: dark)" />
<title>Kimi Switch — 多 LLM 供应商统一管理 · 用量监控 · 账单一目了然</title> <title>Kimi Switch — 多 LLM 供应商配置管理 · 用量与账单监控</title>
<meta <meta
name="description" name="description"
content="Kimi Switch / KimiCodeSwitch — Windows 桌面端多 LLM 供应商统一管理器,一键切换 Kimi / 智谱 GLM / MiniMax / DeepSeek / OpenRouter / 基元律动,用量账单实时监控,开源 MIT。" content="Kimi Switch / KimiCodeSwitch — 桌面端 LLM 供应商配置管理器:22 个预设选好即写入 config.toml,用量与账单直读各厂商官方接口。Tauri + Rust,开源 MIT。"
/> />
<meta <meta
name="keywords" name="keywords"
@@ -18,20 +18,20 @@
<!-- Open Graph --> <!-- Open Graph -->
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:title" content="Kimi Switch — 多 LLM 供应商统一管理" /> <meta property="og:title" content="Kimi Switch — 多 LLM 供应商配置管理" />
<meta <meta
property="og:description" property="og:description"
content="一键切换 Kimi / 智谱 GLM / MiniMax / DeepSeek 等供应商,用量与账单一目了然,开源 MIT。" content="把 Kimi Code 的供应商配置搬进图形界面:22 个预设、用量与账单直读官方接口,免费开源 MIT。"
/> />
<meta property="og:url" content="https://billowliu2.github.io/KimiSwitch/" /> <meta property="og:url" content="https://billowliu2.github.io/KimiSwitch/" />
<meta property="og:image" content="https://billowliu2.github.io/KimiSwitch/og.png" /> <meta property="og:image" content="https://billowliu2.github.io/KimiSwitch/og.png" />
<!-- Twitter --> <!-- Twitter -->
<meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Kimi Switch — 多 LLM 供应商统一管理" /> <meta name="twitter:title" content="Kimi Switch — 多 LLM 供应商配置管理" />
<meta <meta
name="twitter:description" name="twitter:description"
content="一键切换 Kimi / 智谱 GLM / MiniMax / DeepSeek 等供应商,用量与账单一目了然,开源 MIT。" content="把 Kimi Code 的供应商配置搬进图形界面:22 个预设、用量与账单直读官方接口,免费开源 MIT。"
/> />
<meta name="twitter:image" content="https://billowliu2.github.io/KimiSwitch/og.png" /> <meta name="twitter:image" content="https://billowliu2.github.io/KimiSwitch/og.png" />
@@ -49,10 +49,10 @@
"alternateName": ["KimiSwitch", "KimiCodeSwitch", "Kimi Switch", "KimiCode Switch"], "alternateName": ["KimiSwitch", "KimiCodeSwitch", "Kimi Switch", "KimiCode Switch"],
"url": "https://billowliu2.github.io/KimiSwitch/", "url": "https://billowliu2.github.io/KimiSwitch/",
"applicationCategory": "DeveloperApplication", "applicationCategory": "DeveloperApplication",
"operatingSystem": "Windows 10, Windows 11", "operatingSystem": "Windows 10, Windows 11, macOS, Linux",
"softwareVersion": "0.6.7", "softwareVersion": "0.7.12",
"dateModified": "2026-08-01", "dateModified": "2026-09-03",
"description": "Windows 桌面端多 LLM 供应商统一管理器,一键切换 Kimi / 智谱 GLM / MiniMax / DeepSeek / OpenRouter / 基元律动,用量账单实时监控,开源 MIT。", "description": "桌面端 LLM 供应商配置管理器:22 个预设选好即写入 config.toml,用量与账单直读各厂商官方接口。Tauri + Rust,开源 MIT。",
"downloadUrl": "https://github.com/billowliu2/KimiSwitch/releases", "downloadUrl": "https://github.com/billowliu2/KimiSwitch/releases",
"softwareHelp": "https://github.com/billowliu2/KimiSwitch", "softwareHelp": "https://github.com/billowliu2/KimiSwitch",
"license": "https://opensource.org/licenses/MIT", "license": "https://opensource.org/licenses/MIT",
+1 -1
View File
@@ -87,7 +87,7 @@ export default function Footer() {
href={link.url} href={link.url}
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"
className="group flex items-start gap-3 rounded-2xl border border-border bg-card p-4 transition-all duration-200 hover:-translate-y-0.5 hover:border-primary/40" className="group flex items-start gap-3 rounded-xl border border-border bg-card p-4 transition-all duration-200 hover:-translate-y-0.5 hover:border-primary/40"
style={{ boxShadow: "var(--shadow-soft)" }} style={{ boxShadow: "var(--shadow-soft)" }}
> >
<div className="flex h-10 w-10 shrink-0 items-center justify-center overflow-hidden rounded-xl border border-border bg-white"> <div className="flex h-10 w-10 shrink-0 items-center justify-center overflow-hidden rounded-xl border border-border bg-white">
+3 -1
View File
@@ -24,7 +24,9 @@ export default function Nav() {
/> />
<span>Kimi Switch</span> <span>Kimi Switch</span>
</NavLink> </NavLink>
<nav className="flex items-center gap-5 overflow-x-auto overflow-y-hidden text-sm text-muted-foreground [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"> <nav
aria-label="Primary"
className="flex items-center gap-5 overflow-x-auto overflow-y-hidden text-sm text-muted-foreground [scrollbar-width:none] [&::-webkit-scrollbar]:hidden">
{links.map((l) => ( {links.map((l) => (
<NavLink <NavLink
key={l.to} key={l.to}
+4 -2
View File
@@ -15,7 +15,7 @@ export default function SectionShell({ id, title, subtitle, children }: SectionS
ref={ref} ref={ref}
id={id} id={id}
aria-labelledby={`${id}-title`} aria-labelledby={`${id}-title`}
className={`py-20 transition-all duration-700 ease-out ${ className={`pt-16 pb-20 transition-all duration-700 ease-out ${
inView inView
? "motion-safe:opacity-100 motion-safe:translate-y-0" ? "motion-safe:opacity-100 motion-safe:translate-y-0"
: "motion-safe:opacity-0 motion-safe:translate-y-6" : "motion-safe:opacity-0 motion-safe:translate-y-6"
@@ -30,7 +30,9 @@ export default function SectionShell({ id, title, subtitle, children }: SectionS
{title} {title}
</h2> </h2>
{subtitle && ( {subtitle && (
<p className="mt-3 text-base leading-relaxed text-muted-foreground">{subtitle}</p> <p className="mt-3 max-w-[68ch] text-base leading-relaxed text-muted-foreground">
{subtitle}
</p>
)} )}
</div> </div>
{children} {children}
+100 -78
View File
@@ -16,43 +16,43 @@ const zh = {
performance: "性能", performance: "性能",
changelog: "更新日志", changelog: "更新日志",
download: "下载", download: "下载",
downloadBtn: "下载 v0.7.4", downloadBtn: "下载 v0.7.12",
}, },
hero: { hero: {
badge: "v0.7.4 · 开源 MIT · Windows / macOS / Linux", badge: "v0.7.12 · 开源 MIT · Windows / macOS / Linux",
titleBefore: "统一管理你的", titleBefore: "统一管理你的",
titleAccent: "AI 供应商", titleAccent: "AI 供应商",
titleAfter: "", titleAfter: "",
subtitle: subtitle:
"一键切换 Kimi / 智谱 GLM / MiniMax / DeepSeek / OpenRouter / 基元律动,用量与账单一目了然。", "Kimi Code 的供应商配置不用再手改 config.toml:22 个预设选好即写入(写入前自动备份),用量与账单直读各厂商官方接口。",
download: "免费下载", download: "免费下载",
source: "查看源码", source: "查看源码",
stats: [ stats: [
{ value: "22", label: "预设供应商" }, { value: "22", label: "预设供应商" },
{ value: "5910", label: "模型价格库" }, { value: "7495", label: "模型价格库" },
{ value: "100%", label: "开源免费" }, { value: "MIT", label: "开源协议" },
], ],
}, },
features: { features: {
title: "核心功能", title: "核心功能",
subtitle: "从多供应商管理到用量监控,一站搞定。", subtitle: "配置、切换、用量、账单、会话——都落在本机那份 ~/.kimi-code/config.toml 上。",
items: [ items: [
{ {
id: "multi-provider", id: "multi-provider",
title: "多供应商管理", title: "多供应商管理",
desc: "Kimi / 智谱 GLM / MiniMax / DeepSeek / OpenRouter / 基元律动等 22 个预设,一键添加与切换。", desc: "Kimi / 智谱 GLM / MiniMax / DeepSeek / OpenRouter / 基元律动等 22 个预设,Base URL 与模型映射已填好,选定即写入配置。",
img: "screenshots/preset-picker.png", img: "screenshots/preset-picker.png",
}, },
{ {
id: "custom-provider", id: "custom-provider",
title: "自定义供应商", title: "自定义供应商",
desc: "自定义 Base URL / API Key / 模型映射,支持 JSON 高级编辑。", desc: "Base URL、API Key、模型别名逐字段编辑,也可切到 JSON 页签直接改;配置里的未知字段原样保留。",
img: "screenshots/edit-provider-basic-managed.png", img: "screenshots/edit-provider-basic-managed.png",
}, },
{ {
id: "usage", id: "usage",
title: "用量与账单监控", title: "用量与账单监控",
desc: "套餐类 5 小时 / 每周用量 + 按量余额,models.dev 真实价格计算成本,卡片直显。", desc: "套餐的 5 小时 / 每周额度与按量余额直接显示在卡片上,成本按 models.dev 牌价折算。",
img: "screenshots/dashboard-light.png", img: "screenshots/dashboard-light.png",
}, },
{ {
@@ -63,7 +63,7 @@ const zh = {
}, },
{ {
id: "kimi-auth", id: "kimi-auth",
title: "Kimi 一键授权登录", title: "Kimi 授权登录",
desc: "应用内置设备码授权(等同 kimi login),浏览器授权即用,15 分钟过期自动续期。", desc: "应用内置设备码授权(等同 kimi login),浏览器授权即用,15 分钟过期自动续期。",
img: "screenshots/kimi-oauth-dialog.png", img: "screenshots/kimi-oauth-dialog.png",
}, },
@@ -75,31 +75,31 @@ const zh = {
}, },
{ {
id: "model-discovery", id: "model-discovery",
title: "智能模型发现", title: "模型自动发现",
desc: "模型能力 / 上下文大小自动从 models.dev 同步,构建时自动拉取,5910 模型覆盖。", desc: "可用模型直接问供应商 API;显示名 / 上下文 / 能力取自 models.dev 快照(当前 7495 个模型、212 家供应商)。",
img: "screenshots/kimi-cli-select-model.png", img: "screenshots/kimi-cli-select-model.png",
}, },
{ {
id: "auto-update", id: "auto-update",
title: "自动更新", title: "自动更新",
desc: "自动检测新版本,一键下载安装,始终保持最新。", desc: "启动时和每 8 小时各查一次新版本(私有镜像优先、GitHub 兜底),应用内下载并引导安装。",
img: "screenshots/settings.png", img: "screenshots/settings.png",
}, },
], ],
}, },
showcase: { showcase: {
title: "界面演示", title: "界面演示",
subtitle: "真实界面截图,所见即所得。", subtitle: "以下截图取自 v0.7.12 实机运行。",
items: [ items: [
{ {
src: "screenshots/usage-config-page.png", src: "screenshots/usage-config-page.png",
title: "配置用量查询", title: "配置用量查询",
desc: "NewAPI 中转站模板、超时与自动刷新、测试查询一屏搞定", desc: "NewAPI 中转站模板、超时与自动刷新、测试查询放在同一页",
}, },
{ {
src: "screenshots/preset-picker.png", src: "screenshots/preset-picker.png",
title: "预设供应商", title: "预设供应商",
desc: "22 个预设开箱即用,一键添加常用厂商", desc: "22 个预设,勾选即可添加常用厂商",
}, },
{ {
src: "screenshots/kimi-oauth-dialog.png", src: "screenshots/kimi-oauth-dialog.png",
@@ -125,7 +125,7 @@ const zh = {
}, },
performance: { performance: {
title: "轻量原生", title: "轻量原生",
subtitle: "Tauri + Rust 内核,WebView2 前端,常驻托盘零负担。", subtitle: "Tauri + Rust,复用系统 WebView2,不打包 Chromium。下面三项是空闲状态实测。",
metrics: [ metrics: [
{ target: 93, suffix: " MB", label: "Working Set", desc: "程序空闲态工作集内存" }, { target: 93, suffix: " MB", label: "Working Set", desc: "程序空闲态工作集内存" },
{ target: 34, suffix: " MB", label: "Private WS", desc: "独占内存(WebView2 共享部分扣除)" }, { target: 34, suffix: " MB", label: "Private WS", desc: "独占内存(WebView2 共享部分扣除)" },
@@ -140,6 +140,17 @@ const zh = {
syncedNote: "数据已同步 GitHub Releases", syncedNote: "数据已同步 GitHub Releases",
fallbackNote: "内置版本记录", fallbackNote: "内置版本记录",
entries: [ entries: [
{
version: "v0.7.12",
date: "2026-09-03",
items: [
"适配 kimi-code 0.40.1:实验 flag 清单更新(新增 file_history / search_worker,secondary-model 默认开启)",
"flag 优先级语义修正:显式配置优先于总开关,总开关不再锁定全部实验开关",
"新增危险命令守卫开关:Auto 模式直接拒绝 rm -rf / shutdown 等危险命令,其它模式强制询问",
"修复 WebUI 首次打开慢时多次点击的竞态报错",
"models-dev 快照更新至 7495 模型 / 212 供应商",
],
},
{ {
version: "v0.7.4", version: "v0.7.4",
date: "2026-08-09", date: "2026-08-09",
@@ -170,7 +181,7 @@ const zh = {
"兼容 kimi-code 0.33+(v2 引擎):循环控制改用新键 max_attempts_per_step,旧配置自动迁移", "兼容 kimi-code 0.33+(v2 引擎):循环控制改用新键 max_attempts_per_step,旧配置自动迁移",
"models.dev 模型列表与价格数据同步更新", "models.dev 模型列表与价格数据同步更新",
"官网企业版视觉升级;出品公司标识统一为 codingplan.site", "官网企业版视觉升级;出品公司标识统一为 codingplan.site",
"macOS 安装优化:Release 附带 install-macos.sh 一键脚本,自动清除下载隔离,免去手动右键打开", "macOS 安装优化:Release 附带 install-macos.sh,自动清除下载隔离,免去手动右键打开",
], ],
}, },
{ {
@@ -201,7 +212,7 @@ const zh = {
version: "v0.6.9", version: "v0.6.9",
date: "2026-08-01", date: "2026-08-01",
items: [ items: [
"最近请求新增缓存命中率列,每次请求命中一目了然", "最近请求新增缓存命中率列,逐条请求的命中情况直接可见",
"中文模式费用按最新汇率换算人民币(¥)显示,英文模式保持美元", "中文模式费用按最新汇率换算人民币(¥)显示,英文模式保持美元",
"仪表盘性能再优化:价格解析记忆化缓存,扫描从秒级降到百毫秒级;右上角新增加载耗时/数据量跟踪", "仪表盘性能再优化:价格解析记忆化缓存,扫描从秒级降到百毫秒级;右上角新增加载耗时/数据量跟踪",
], ],
@@ -229,7 +240,7 @@ const zh = {
version: "v0.6.6", version: "v0.6.6",
date: "2026-08-01", date: "2026-08-01",
items: [ items: [
"模型价格对标 models.dev,覆盖 5910 个模型", "模型价格数据对标 models.dev,快照随版本更新",
"新增基元律动供应商与推荐链接", "新增基元律动供应商与推荐链接",
"设置页文案与参考来源说明优化", "设置页文案与参考来源说明优化",
], ],
@@ -311,34 +322,34 @@ const zh = {
}, },
download: { download: {
title: "下载 Kimi Switch", title: "下载 Kimi Switch",
subtitle: "当前版本 v0.7.4 · Windows / macOS / Linux 三平台已发布", subtitle: "当前版本 v0.7.12 · Windows / macOS / Linux 三平台已发布",
autoUpdate: "应用内置自动检测更新,新版本发布后在设置页一键升级。", autoUpdate: "更新检查跑在启动时和每 8 小时的周期任务里,设置页也可以手动触发。",
ready: "已发布", ready: "已发布",
wip: "开发中", wip: "开发中",
githubBtn: "GitHub 下载", githubBtn: "GitHub 下载",
mirrorBtn: "镜像下载", mirrorBtn: "镜像下载",
items: [ items: [
{ id: "windows", name: "Windows", ready: true, note: ".msi 安装包,系统托盘常驻" }, { id: "windows", name: "Windows", ready: true, note: ".msi 安装包,系统托盘常驻" },
{ id: "macos", name: "macOS", ready: true, note: ".dmg 安装包(Apple Silicon),未签名:下载 install-macos.sh 后运行 bash install-macos.sh 一键安装" }, { id: "macos", name: "macOS", ready: true, note: ".dmg 安装包(Apple Silicon),未签名:下载 Release 附带的 install-macos.sh,运行 bash install-macos.sh 清除隔离属性" },
{ id: "linux", name: "Linux", ready: true, note: ".deb / .AppImage / .rpm 三格式" }, { id: "linux", name: "Linux", ready: true, note: ".deb / .AppImage / .rpm 三格式" },
], ],
}, },
cta: { cta: {
title: "现在就把所有供应商,放进一个应用", title: "把供应商配置、用量和账单收进一个窗口",
subtitle: "免费 · 开源 MIT · 一分钟完成安装", subtitle: "免费 · MIT 开源 · Windows / macOS / Linux",
download: "免费下载", download: "免费下载",
source: "GitHub 源码", source: "GitHub 源码",
}, },
seo: { seo: {
home: { home: {
title: "Kimi Switch — 多 LLM 供应商统一管理 · 用量监控 · 账单一目了然", title: "Kimi Switch — 多 LLM 供应商配置管理 · 用量与账单监控",
description: description:
"Kimi Switch / KimiCodeSwitch — Windows 桌面端多 LLM 供应商统一管理器,一键切换 Kimi / 智谱 GLM / MiniMax / DeepSeek / OpenRouter / 基元律动,用量账单实时监控,开源 MIT。", "Kimi Switch / KimiCodeSwitch — 桌面端 LLM 供应商配置管理器:22 个预设选好即写入 config.toml,用量与账单直读各厂商官方接口。Tauri + Rust,开源 MIT。",
}, },
features: { features: {
title: "核心功能 - Kimi Switch", title: "核心功能 - Kimi Switch",
description: description:
"Kimi Switch 核心功能:多供应商管理、用量与账单监控、Kimi 一键授权登录、智能模型发现与自动更新,22 个预设开箱即用。", "Kimi Switch 功能页:多供应商预设与自定义配置、用量与账单监控、Kimi 设备码授权、模型自动发现与周期更新检查。",
}, },
changelog: { changelog: {
title: "更新日志 - Kimi Switch", title: "更新日志 - Kimi Switch",
@@ -380,116 +391,116 @@ const en: Dict = {
performance: "Performance", performance: "Performance",
changelog: "Changelog", changelog: "Changelog",
download: "Download", download: "Download",
downloadBtn: "Download v0.7.4", downloadBtn: "Download v0.7.12",
}, },
hero: { hero: {
badge: "v0.7.4 · Open source MIT · Windows / macOS / Linux", badge: "v0.7.12 · Open source MIT · Windows / macOS / Linux",
titleBefore: "One app for all your ", titleBefore: "One app for all your ",
titleAccent: "AI providers", titleAccent: "AI providers",
titleAfter: "", titleAfter: "",
subtitle: subtitle:
"Switch between Kimi, Zhipu GLM, MiniMax, DeepSeek, OpenRouter and TokenRhythm in one click, with usage and billing at a glance.", "Stop hand-editing ~/.kimi-code/config.toml. Pick one of 22 provider presets and it goes straight into your config (backed up first); usage and billing read from each vendor's own API.",
download: "Free Download", download: "Free Download",
source: "View Source", source: "View source",
stats: [ stats: [
{ value: "22", label: "Provider presets" }, { value: "22", label: "Provider presets" },
{ value: "5910", label: "Model price DB" }, { value: "7495", label: "Model price DB" },
{ value: "100%", label: "Open source" }, { value: "MIT", label: "License" },
], ],
}, },
features: { features: {
title: "Core Features", title: "Core features",
subtitle: "From multi-provider management to usage monitoring, all in one place.", subtitle: "Configuration, switching, usage, billing and sessions — all against the config.toml on your machine.",
items: [ items: [
{ {
id: "multi-provider", id: "multi-provider",
title: "Multi-Provider Management", title: "Provider presets",
desc: "22 presets including Kimi, Zhipu GLM, MiniMax, DeepSeek, OpenRouter and TokenRhythm. Add and switch in one click.", desc: "22 presets — Kimi, Zhipu GLM, MiniMax, DeepSeek, OpenRouter, TokenRhythm and more — ship with Base URL and model mapping filled in; picking one writes it to your config.",
img: "screenshots/preset-picker.png", img: "screenshots/preset-picker.png",
}, },
{ {
id: "custom-provider", id: "custom-provider",
title: "Custom Providers", title: "Custom providers",
desc: "Custom Base URL, API Key and model mapping, with advanced JSON editing.", desc: "Edit Base URL, API key and model aliases field by field, or switch to the raw JSON tab; unknown fields are passed through untouched.",
img: "screenshots/edit-provider-basic-managed.png", img: "screenshots/edit-provider-basic-managed.png",
}, },
{ {
id: "usage", id: "usage",
title: "Usage & Billing", title: "Usage & billing",
desc: "5-hour / weekly plan quotas plus pay-as-you-go balance, priced with real models.dev rates and shown on cards.", desc: "5-hour / weekly plan quotas and pay-as-you-go balance shown directly on cards, with costs computed at models.dev list prices.",
img: "screenshots/dashboard-light.png", img: "screenshots/dashboard-light.png",
}, },
{ {
id: "sessions", id: "sessions",
title: "Session Manager", title: "Session manager",
desc: "Browse, search and resume past sessions across providers.", desc: "Browse, search and resume past sessions across providers.",
img: "screenshots/sessions-light.png", img: "screenshots/sessions-light.png",
}, },
{ {
id: "kimi-auth", id: "kimi-auth",
title: "One-Click Kimi Login", title: "Kimi device-code login",
desc: "Built-in device-code authorization (same as kimi login). Authorize in the browser; 15-minute expiry auto-renews.", desc: "Built-in device-code authorization (same as kimi login). Authorize in the browser; 15-minute expiry auto-renews.",
img: "screenshots/kimi-oauth-dialog.png", img: "screenshots/kimi-oauth-dialog.png",
}, },
{ {
id: "usage-config", id: "usage-config",
title: "Usage Query Setup", title: "Usage query setup",
desc: "Full-page config: NewAPI relay templates, timeout, auto-refresh interval, and a test query.", desc: "Full-page config: NewAPI relay templates, timeout, auto-refresh interval, and a test query.",
img: "screenshots/usage-config-page.png", img: "screenshots/usage-config-page.png",
}, },
{ {
id: "model-discovery", id: "model-discovery",
title: "Smart Model Discovery", title: "Model discovery",
desc: "Model capabilities and context sizes sync from models.dev at build time, covering 5910 models.", desc: "Model lists are fetched from the provider API itself; display names, context sizes and capabilities come from a build-time models.dev snapshot (7495 models, 212 providers).",
img: "screenshots/kimi-cli-select-model.png", img: "screenshots/kimi-cli-select-model.png",
}, },
{ {
id: "auto-update", id: "auto-update",
title: "Auto Updates", title: "Auto updates",
desc: "Automatically detects new versions and installs them in one click.", desc: "Checks at startup and every 8 hours (private mirror first, GitHub fallback), downloads in-app and walks you through install.",
img: "screenshots/settings.png", img: "screenshots/settings.png",
}, },
], ],
}, },
showcase: { showcase: {
title: "Screenshots", title: "Screenshots",
subtitle: "Real screenshots from the app. What you see is what you get.", subtitle: "All screenshots below are taken from the running v0.7.12 build.",
items: [ items: [
{ {
src: "screenshots/usage-config-page.png", src: "screenshots/usage-config-page.png",
title: "Usage Query Setup", title: "Usage query setup",
desc: "NewAPI relay templates, timeout and auto-refresh, plus a test query, all on one page", desc: "NewAPI relay templates, timeout and auto-refresh, plus a test query, all on one page",
}, },
{ {
src: "screenshots/preset-picker.png", src: "screenshots/preset-picker.png",
title: "Provider Presets", title: "Provider presets",
desc: "22 presets ready out of the box, add popular vendors in one click", desc: "Tick through 22 presets to add popular vendors",
}, },
{ {
src: "screenshots/kimi-oauth-dialog.png", src: "screenshots/kimi-oauth-dialog.png",
title: "Kimi Authorization", title: "Kimi authorization",
desc: "Device-code flow identical to kimi login, auto-renews on expiry", desc: "Device-code flow identical to kimi login, auto-renews on expiry",
}, },
{ {
src: "screenshots/dashboard-daily-detail.png", src: "screenshots/dashboard-daily-detail.png",
title: "Usage Details", title: "Usage details",
desc: "Daily token and cost trends", desc: "Daily token and cost trends",
}, },
{ {
src: "screenshots/sessions-light.png", src: "screenshots/sessions-light.png",
title: "Session Manager", title: "Session manager",
desc: "Browse and resume past sessions across providers", desc: "Browse and resume past sessions across providers",
}, },
{ {
src: "screenshots/kimi-plan-quota-card.png", src: "screenshots/kimi-plan-quota-card.png",
title: "Plan Quota Card", title: "Plan quota card",
desc: "5-hour / weekly quotas at a glance", desc: "5-hour / weekly quotas read straight off the card",
}, },
], ],
}, },
performance: { performance: {
title: "Lightweight & Native", title: "Lightweight and native",
subtitle: "Tauri + Rust core with a WebView2 frontend. Zero tray overhead.", subtitle: "Tauri + Rust on the system WebView2 — no bundled Chromium. The three numbers below are idle-state measurements.",
metrics: [ metrics: [
{ target: 93, suffix: " MB", label: "Working Set", desc: "Idle working-set memory" }, { target: 93, suffix: " MB", label: "Working Set", desc: "Idle working-set memory" },
{ target: 34, suffix: " MB", label: "Private WS", desc: "Private memory (shared WebView2 excluded)" }, { target: 34, suffix: " MB", label: "Private WS", desc: "Private memory (shared WebView2 excluded)" },
@@ -504,6 +515,17 @@ const en: Dict = {
syncedNote: "Synced from GitHub Releases", syncedNote: "Synced from GitHub Releases",
fallbackNote: "Built-in release notes", fallbackNote: "Built-in release notes",
entries: [ entries: [
{
version: "v0.7.12",
date: "2026-09-03",
items: [
"Adapted to kimi-code 0.40.1: experimental flag list updated (adds file_history / search_worker; secondary-model now on by default)",
"Flag priority semantics fixed: explicit configuration takes precedence over the master toggle, which no longer locks every switch",
"New dangerous-command guard toggle: Auto mode rejects rm -rf / shutdown outright, other modes force a confirmation prompt",
"Fix race-condition errors when clicking repeatedly while the WebUI is slow to open for the first time",
"models-dev snapshot updated to 7495 models / 212 providers",
],
},
{ {
version: "v0.7.4", version: "v0.7.4",
date: "2026-08-09", date: "2026-08-09",
@@ -534,7 +556,7 @@ const en: Dict = {
"Compatible with kimi-code 0.33+ (v2 engine): loop control now writes max_attempts_per_step with auto-migration", "Compatible with kimi-code 0.33+ (v2 engine): loop control now writes max_attempts_per_step with auto-migration",
"models.dev model list and pricing snapshot synced", "models.dev model list and pricing snapshot synced",
"Enterprise-style website refresh; publisher identity unified as codingplan.site", "Enterprise-style website refresh; publisher identity unified as codingplan.site",
"macOS install polish: releases now ship install-macos.sh, a one-click script that clears the download quarantine", "macOS install polish: releases now ship install-macos.sh, which clears the download quarantine for you",
], ],
}, },
{ {
@@ -565,7 +587,7 @@ const en: Dict = {
version: "v0.6.9", version: "v0.6.9",
date: "2026-08-01", date: "2026-08-01",
items: [ items: [
"Recent requests gain a cache-hit-rate column, per request at a glance", "Recent requests gain a cache-hit-rate column, shown per request",
"Chinese UI now shows costs in CNY (latest exchange rate); English keeps USD", "Chinese UI now shows costs in CNY (latest exchange rate); English keeps USD",
"Dashboard speedup: memoized price resolution drops the scan from seconds to milliseconds; load time / payload tracking in the top-right corner", "Dashboard speedup: memoized price resolution drops the scan from seconds to milliseconds; load time / payload tracking in the top-right corner",
], ],
@@ -592,7 +614,7 @@ const en: Dict = {
version: "v0.6.6", version: "v0.6.6",
date: "2026-08-01", date: "2026-08-01",
items: [ items: [
"Model pricing aligned with models.dev, covering 5910 models", "Model pricing data aligned with models.dev, snapshot refreshed per release",
"New TokenRhythm provider with referral link", "New TokenRhythm provider with referral link",
"Settings copy and source attribution polish", "Settings copy and source attribution polish",
], ],
@@ -652,56 +674,56 @@ const en: Dict = {
], ],
}, },
privacy: { privacy: {
title: "Your Data Stays on Your Machine", title: "Your data stays on your machine",
subtitle: "Our privacy and open-source commitments in three sentences.", subtitle: "Our privacy and open-source commitments in three sentences.",
items: [ items: [
{ {
id: "local", id: "local",
title: "Local Storage", title: "Local storage",
desc: "Configs and usage data live only in ~/.kimi-switch and config.toml. Nothing is uploaded.", desc: "Configs and usage data live only in ~/.kimi-switch and config.toml. Nothing is uploaded.",
}, },
{ {
id: "direct", id: "direct",
title: "Direct Connections", title: "Direct connections",
desc: "Billing queries go straight to each vendor's official API. No middlemen, no tracking.", desc: "Billing queries go straight to each vendor's official API. No middlemen, no tracking.",
}, },
{ {
id: "open", id: "open",
title: "Open & Auditable", title: "Open & auditable",
desc: "Fully open source under MIT on GitHub. Reviews and contributions welcome.", desc: "Fully open source under MIT on GitHub. Reviews and contributions welcome.",
}, },
], ],
}, },
download: { download: {
title: "Download Kimi Switch", title: "Download Kimi Switch",
subtitle: "Current version v0.7.4 · Windows, macOS and Linux now released", subtitle: "Current version v0.7.12 · Windows, macOS and Linux now released",
autoUpdate: "Built-in update detection: upgrade in one click from Settings when a new version ships.", autoUpdate: "Update checks run at startup and every 8 hours; Settings also has a manual check.",
ready: "Available", ready: "Available",
wip: "In development", wip: "In development",
githubBtn: "Download from GitHub", githubBtn: "Download from GitHub",
mirrorBtn: "China mirror", mirrorBtn: "China mirror",
items: [ items: [
{ id: "windows", name: "Windows", ready: true, note: ".msi installer, lives in the system tray" }, { id: "windows", name: "Windows", ready: true, note: ".msi installer, lives in the system tray" },
{ id: "macos", name: "macOS", ready: true, note: ".dmg installer (Apple Silicon), unsigned: download install-macos.sh and run bash install-macos.sh for one-click install" }, { id: "macos", name: "macOS", ready: true, note: ".dmg installer (Apple Silicon); unsigned — grab install-macos.sh from the release and run bash install-macos.sh to clear the quarantine flag" },
{ id: "linux", name: "Linux", ready: true, note: ".deb / .AppImage / .rpm" }, { id: "linux", name: "Linux", ready: true, note: ".deb / .AppImage / .rpm" },
], ],
}, },
cta: { cta: {
title: "Bring every provider into one app", title: "Put provider config, usage and billing in one window",
subtitle: "Free · Open source MIT · One-minute install", subtitle: "Free · MIT licensed · Windows / macOS / Linux",
download: "Free Download", download: "Free Download",
source: "GitHub Source", source: "GitHub source",
}, },
seo: { seo: {
home: { home: {
title: "Kimi Switch — Unified Management for AI Providers · Usage & Billing", title: "Kimi Switch — LLM provider config, usage and billing in one app",
description: description:
"Kimi Switch / KimiCodeSwitch — a Windows desktop manager for multiple LLM providers. Switch between Kimi, Zhipu GLM, MiniMax, DeepSeek, OpenRouter and TokenRhythm in one click, with usage and billing at a glance. Open source MIT.", "Kimi Switch / KimiCodeSwitch — a desktop manager for LLM provider configuration. 22 presets write straight into ~/.kimi-code/config.toml; usage and billing read from each vendor's own API. Open source MIT.",
}, },
features: { features: {
title: "Core Features - Kimi Switch", title: "Core features - Kimi Switch",
description: description:
"Kimi Switch core features: multi-provider management, usage & billing, one-click Kimi login, smart model discovery and auto updates. 22 presets out of the box.", "Kimi Switch features: provider presets and custom config, usage & billing, Kimi device-code login, model discovery and periodic update checks.",
}, },
changelog: { changelog: {
title: "Changelog - Kimi Switch", title: "Changelog - Kimi Switch",
@@ -715,7 +737,7 @@ const en: Dict = {
}, },
}, },
footer: { footer: {
recommend: "Recommended Providers", recommend: "Recommended providers",
mirror: "China mirror", mirror: "China mirror",
downloads: "Total GitHub downloads: {n}", downloads: "Total GitHub downloads: {n}",
creditBefore: "Dashboard & session management adapted from ", creditBefore: "Dashboard & session management adapted from ",
+10 -33
View File
@@ -23,9 +23,9 @@
--accent: 240 6% 94%; --accent: 240 6% 94%;
--accent-foreground: 240 9% 11%; --accent-foreground: 240 9% 11%;
--border: 240 6% 90%; --border: 240 6% 90%;
--primary: 221 83% 53%; --primary: 221 74% 50%;
--primary-foreground: 0 0% 100%; --primary-foreground: 0 0% 100%;
--ring: 221 83% 53%; --ring: 221 74% 50%;
/* 克制分层阴影(色相一致的 tinted shadow,非荧光发光) */ /* 克制分层阴影(色相一致的 tinted shadow,非荧光发光) */
--shadow-soft: 0 1px 2px hsl(240 9% 11% / 0.05), --shadow-soft: 0 1px 2px hsl(240 9% 11% / 0.05),
0 8px 24px hsl(240 9% 11% / 0.06); 0 8px 24px hsl(240 9% 11% / 0.06);
@@ -44,9 +44,9 @@
--accent: 222 25% 14%; --accent: 222 25% 14%;
--accent-foreground: 220 20% 92%; --accent-foreground: 220 20% 92%;
--border: 222 22% 17%; --border: 222 22% 17%;
--primary: 217 91% 60%; --primary: 216 68% 62%;
--primary-foreground: 0 0% 100%; --primary-foreground: 0 0% 100%;
--ring: 217 91% 60%; --ring: 216 68% 62%;
--shadow-soft: 0 1px 2px hsl(222 47% 2% / 0.5), --shadow-soft: 0 1px 2px hsl(222 47% 2% / 0.5),
0 8px 24px hsl(222 47% 2% / 0.45); 0 8px 24px hsl(222 47% 2% / 0.45);
--shadow-lift: 0 1px 2px hsl(222 47% 2% / 0.5), --shadow-lift: 0 1px 2px hsl(222 47% 2% / 0.5),
@@ -60,24 +60,6 @@
body { body {
@apply bg-background text-foreground antialiased; @apply bg-background text-foreground antialiased;
} }
/* 科技风底纹:固定网格线,极低透明度,不干扰阅读 */
body::before {
content: "";
position: fixed;
inset: 0;
z-index: 0;
pointer-events: none;
background-image:
linear-gradient(to right, hsl(var(--primary) / 0.04) 1px, transparent 1px),
linear-gradient(to bottom, hsl(var(--primary) / 0.04) 1px, transparent 1px);
background-size: 44px 44px;
mask-image: radial-gradient(ellipse 80% 60% at 50% 0%, black 30%, transparent 75%);
}
#root {
position: relative;
z-index: 1;
}
/* 选中色与键盘焦点(无障碍) */ /* 选中色与键盘焦点(无障碍) */
::selection { ::selection {
background: hsl(var(--primary) / 0.16); background: hsl(var(--primary) / 0.16);
@@ -96,19 +78,14 @@
@layer components { @layer components {
.container-page { .container-page {
@apply mx-auto w-full max-w-6xl px-6; @apply mx-auto w-full max-w-7xl px-5 md:px-8;
} }
.btn { .btn {
@apply inline-flex items-center justify-center gap-2 rounded-xl px-5 py-2.5 text-sm font-medium transition-all duration-200; @apply inline-flex items-center justify-center gap-2 rounded-lg px-5 py-2.5 text-sm font-medium transition-all duration-200;
} }
.btn-primary { .btn-primary {
@apply btn bg-primary text-primary-foreground hover:bg-primary/90 hover:-translate-y-px active:translate-y-0 active:scale-[0.98]; @apply btn bg-primary text-primary-foreground hover:bg-primary/90 hover:-translate-y-px active:translate-y-0 active:scale-[0.98];
box-shadow: 0 1px 2px hsl(var(--primary) / 0.3), box-shadow: 0 1px 2px hsl(221 45% 25% / 0.25);
0 6px 16px hsl(var(--primary) / 0.22);
}
.btn-primary:hover {
box-shadow: 0 1px 2px hsl(var(--primary) / 0.3),
0 10px 24px hsl(var(--primary) / 0.3);
} }
.btn-ghost { .btn-ghost {
@apply btn border border-border bg-card/60 text-foreground hover:border-foreground/25 hover:bg-accent active:scale-[0.98]; @apply btn border border-border bg-card/60 text-foreground hover:border-foreground/25 hover:bg-accent active:scale-[0.98];
@@ -126,14 +103,14 @@
} }
/* 截图容器:限定最大宽高,避免撑满页面 */ /* 截图容器:限定最大宽高,避免撑满页面 */
.screenshot { .screenshot {
@apply overflow-hidden rounded-2xl border border-border bg-muted; @apply overflow-hidden rounded-xl border border-border bg-muted;
box-shadow: var(--shadow-lift); box-shadow: var(--shadow-lift);
} }
.screenshot > img { .screenshot > img {
@apply block h-auto w-full; @apply block h-auto w-full;
} }
/* 图标容器:统一的蓝色徽标容器 */ /* 图标容器:中性底、统一描边宽度(Phosphor duotone) */
.icon-chip { .icon-chip {
@apply flex h-10 w-10 items-center justify-center rounded-xl border border-primary/20 bg-primary/10 text-primary; @apply flex h-10 w-10 items-center justify-center rounded-lg border border-border bg-muted text-foreground;
} }
} }
+24 -30
View File
@@ -7,42 +7,36 @@ export default function CTA() {
<section <section
id="cta" id="cta"
aria-labelledby="cta-title" aria-labelledby="cta-title"
className="py-24" className="pt-20 pb-28"
> >
<div className="container-page"> <div className="container-page">
<div className="card relative overflow-hidden p-12 text-center md:p-16"> {/* 左对齐 + 内容错位:不再整块居中 */}
{/* 克制同色系光晕 + 顶部强调线(去紫,保持页面调性) */} <div className="card relative max-w-3xl p-10 md:p-14">
<div <div
aria-hidden="true" aria-hidden="true"
className="pointer-events-none absolute -top-24 left-1/2 h-64 w-[480px] -translate-x-1/2 rounded-full bg-primary/10 blur-3xl" className="absolute inset-x-0 top-0 h-px bg-primary/25"
/> />
<div <h2
aria-hidden="true" id="cta-title"
className="pointer-events-none absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-primary/40 to-transparent" className="text-3xl font-bold tracking-[-0.03em] md:text-4xl"
/> >
<div className="relative"> {t.cta.title}
<h2 </h2>
id="cta-title" <p className="mt-4 max-w-[52ch] text-base text-muted-foreground md:text-lg">
className="text-3xl font-bold tracking-[-0.03em] md:text-5xl" {t.cta.subtitle}
</p>
<div className="mt-8 flex flex-wrap gap-3">
<Link to="/download" className="btn-primary">
{t.cta.download}
</Link>
<a
href="https://github.com/billowliu2/KimiSwitch"
target="_blank"
rel="noreferrer"
className="btn-ghost"
> >
{t.cta.title} {t.cta.source}
</h2> </a>
<p className="mx-auto mt-4 max-w-2xl text-base text-muted-foreground md:text-lg">
{t.cta.subtitle}
</p>
<div className="mt-8 flex flex-wrap justify-center gap-3">
<Link to="/download" className="btn-primary">
{t.cta.download}
</Link>
<a
href="https://github.com/billowliu2/KimiSwitch"
target="_blank"
rel="noreferrer"
className="btn-ghost"
>
{t.cta.source}
</a>
</div>
</div> </div>
</div> </div>
</div> </div>
+36 -20
View File
@@ -8,27 +8,30 @@ const icons: Record<string, Icon> = {
linux: LinuxLogo, linux: LinuxLogo,
}; };
const VERSION = "0.7.4"; const VERSION = "0.7.12";
const GITHUB = "https://github.com/billowliu2/KimiSwitch"; const GITHUB = "https://github.com/billowliu2/KimiSwitch";
const MIRROR_RELEASES = "https://git.codingplan.site/admin/KimiCodeSwitch/releases"; const MIRROR_RELEASES = "https://git.codingplan.site/admin/KimiCodeSwitch/releases";
const dl = (file: string) => `${GITHUB}/releases/download/v${VERSION}/${file}`; const dl = (file: string) => `${GITHUB}/releases/download/v${VERSION}/${file}`;
/** Per-platform download assets for the current release (names match the CI /** Per-platform download assets for the current release (names match the CI
* release workflow exactly — verified against the published v0.7.4 assets: * release workflow exactly — verified against the published v0.7.12 assets:
* tauri-bundler on CI produces `Kimi.Switch_…` (dots) on every platform). */ * tauri-bundler on CI produces `Kimi.Switch_…` (dots) on every platform,
* except the rpm which uses `Kimi.Switch-<version>-1` (hyphens).
* Filenames interpolate VERSION, so a release bump only changes the
* constant above. */
const assets: Record<string, { label: string; href: string }[]> = { const assets: Record<string, { label: string; href: string }[]> = {
windows: [ windows: [
{ label: "MSI", href: dl("Kimi.Switch_0.7.4_x64_en-US.msi") }, { label: "MSI", href: dl(`Kimi.Switch_${VERSION}_x64_en-US.msi`) },
{ label: "镜像", href: MIRROR_RELEASES }, { label: "镜像", href: MIRROR_RELEASES },
], ],
macos: [ macos: [
{ label: "Apple Silicon (.dmg)", href: dl("Kimi.Switch_0.7.4_aarch64.dmg") }, { label: "Apple Silicon (.dmg)", href: dl(`Kimi.Switch_${VERSION}_aarch64.dmg`) },
{ label: "安装脚本", href: dl("install-macos.sh") }, { label: "安装脚本", href: dl("install-macos.sh") },
], ],
linux: [ linux: [
{ label: ".deb", href: dl("Kimi.Switch_0.7.4_amd64.deb") }, { label: ".deb", href: dl(`Kimi.Switch_${VERSION}_amd64.deb`) },
{ label: ".AppImage", href: dl("Kimi.Switch_0.7.4_amd64.AppImage") }, { label: ".AppImage", href: dl(`Kimi.Switch_${VERSION}_amd64.AppImage`) },
{ label: ".rpm", href: dl("Kimi.Switch-0.7.4-1.x86_64.rpm") }, { label: ".rpm", href: dl(`Kimi.Switch-${VERSION}-1.x86_64.rpm`) },
], ],
}; };
@@ -40,23 +43,36 @@ export default function Download() {
title={t.download.title} title={t.download.title}
subtitle={t.download.subtitle} subtitle={t.download.subtitle}
> >
<div className="grid grid-cols-1 gap-4 md:grid-cols-3"> {/* 不对称:Windows 为主推平台,横跨整行;macOS / Linux 两列在下方 */}
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
{t.download.items.map((p) => { {t.download.items.map((p) => {
const Icon = icons[p.id] ?? WindowsLogo; const Icon = icons[p.id] ?? WindowsLogo;
const links = assets[p.id] ?? []; const links = assets[p.id] ?? [];
const featured = p.id === "windows";
return ( return (
<div key={p.id} className="card flex flex-col"> <div
<div className="mb-3 flex items-center justify-between"> key={p.id}
<div className="icon-chip"> className={`card flex flex-col ${
<Icon className="h-5 w-5" weight="duotone" /> featured
? "md:col-span-2 md:flex-row md:items-center md:justify-between md:gap-10"
: ""
}`}
>
<div className="min-w-0">
<div className="mb-3 flex items-center gap-3">
<div className="icon-chip shrink-0">
<Icon className="h-5 w-5" weight="duotone" />
</div>
<h3 className="text-lg font-semibold tracking-tight">{p.name}</h3>
<span className="ml-auto rounded-md border border-primary/20 bg-primary/10 px-2 py-0.5 text-[11px] font-medium tracking-wide text-primary">
{t.download.ready}
</span>
</div> </div>
<span className="rounded-md border border-primary/20 bg-primary/10 px-2 py-0.5 text-[11px] font-medium tracking-wide text-primary"> <p className={`text-sm text-muted-foreground ${featured ? "max-w-[65ch]" : ""}`}>
{t.download.ready} {p.note}
</span> </p>
</div> </div>
<h3 className="mb-2 text-lg font-semibold tracking-tight">{p.name}</h3> <div className="mt-4 flex shrink-0 flex-wrap items-start gap-2 md:mt-0">
<p className="text-sm text-muted-foreground">{p.note}</p>
<div className="mt-4 flex flex-wrap gap-2">
{links.map((l) => ( {links.map((l) => (
<a <a
key={l.label} key={l.label}
@@ -74,7 +90,7 @@ export default function Download() {
})} })}
</div> </div>
<p className="mt-6 flex items-center gap-2 text-sm text-muted-foreground"> <p className="mt-6 flex max-w-[65ch] items-center gap-2 text-sm text-muted-foreground">
<DownloadSimple className="h-4 w-4 text-primary" weight="duotone" /> <DownloadSimple className="h-4 w-4 text-primary" weight="duotone" />
{t.download.autoUpdate} {t.download.autoUpdate}
</p> </p>
+2
View File
@@ -45,6 +45,8 @@ export default function Features() {
key={f.id} key={f.id}
style={{ transitionDelay: `${i * 60}ms` }} style={{ transitionDelay: `${i * 60}ms` }}
className={`card overflow-hidden p-0 transition-all duration-500 ease-out hover:border-primary/50 ${ className={`card overflow-hidden p-0 transition-all duration-500 ease-out hover:border-primary/50 ${
i % 2 === 1 ? "sm:mt-12" : ""
} ${
gridInView gridInView
? "motion-safe:opacity-100 motion-safe:translate-y-0" ? "motion-safe:opacity-100 motion-safe:translate-y-0"
: "motion-safe:opacity-0 motion-safe:translate-y-4" : "motion-safe:opacity-0 motion-safe:translate-y-4"
+1 -10
View File
@@ -23,15 +23,6 @@ export default function Hero() {
aria-labelledby="hero-title" aria-labelledby="hero-title"
className="relative overflow-hidden pt-16 pb-20 md:pt-24" className="relative overflow-hidden pt-16 pb-20 md:pt-24"
> >
{/* 克制的同色系光晕(去紫,统一蓝色 + 中性) */}
<div
aria-hidden="true"
className="pointer-events-none absolute -top-32 right-[-10%] h-[420px] w-[420px] rounded-full bg-primary/10 blur-3xl"
/>
<div
aria-hidden="true"
className="pointer-events-none absolute -left-40 top-1/2 h-[320px] w-[320px] rounded-full bg-primary/5 blur-3xl"
/>
<div className="container-page relative grid grid-cols-1 gap-10 md:grid-cols-2 md:items-center"> <div className="container-page relative grid grid-cols-1 gap-10 md:grid-cols-2 md:items-center">
<div> <div>
<div {...reveal(0)}> <div {...reveal(0)}>
@@ -87,7 +78,7 @@ export default function Hero() {
<div className="screenshot max-h-[420px]"> <div className="screenshot max-h-[420px]">
<img <img
src={asset("screenshots/hero.png")} src={asset("screenshots/hero.png")}
alt="Kimi Switch: multi-LLM provider list with one-click switching" alt="Kimi Switch provider list, active provider pinned to the top"
loading="eager" loading="eager"
/> />
</div> </div>
+12 -7
View File
@@ -16,18 +16,23 @@ export default function Privacy() {
title={t.privacy.title} title={t.privacy.title}
subtitle={t.privacy.subtitle} subtitle={t.privacy.subtitle}
> >
<div className="grid grid-cols-1 gap-4 md:grid-cols-3"> {/* 三条承诺改为一个面板内的三行,图标左置,避免三张等宽卡片 */}
<div className="card divide-y divide-border p-0">
{t.privacy.items.map((it) => { {t.privacy.items.map((it) => {
const Icon = icons[it.id] ?? Database; const Icon = icons[it.id] ?? Database;
return ( return (
<div key={it.id} className="card"> <div key={it.id} className="flex items-start gap-5 p-6 md:p-7">
<div className="icon-chip mb-3"> <div className="icon-chip shrink-0">
<Icon className="h-5 w-5" weight="duotone" /> <Icon className="h-5 w-5" weight="duotone" />
</div> </div>
<h3 className="mb-2 text-lg font-semibold tracking-tight">{it.title}</h3> <div className="min-w-0">
<p className="text-sm leading-relaxed text-muted-foreground"> <h3 className="text-base font-semibold tracking-tight">
{it.desc} {it.title}
</p> </h3>
<p className="mt-1 max-w-[65ch] text-sm leading-relaxed text-muted-foreground">
{it.desc}
</p>
</div>
</div> </div>
); );
})} })}
+7 -1
View File
@@ -21,12 +21,18 @@ export default function Showcase() {
key={s.src} key={s.src}
style={{ transitionDelay: `${i * 60}ms` }} style={{ transitionDelay: `${i * 60}ms` }}
className={`transition-all duration-500 ease-out ${ className={`transition-all duration-500 ease-out ${
i === 0 ? "sm:col-span-2" : ""
} ${
gridInView gridInView
? "motion-safe:opacity-100 motion-safe:translate-y-0" ? "motion-safe:opacity-100 motion-safe:translate-y-0"
: "motion-safe:opacity-0 motion-safe:translate-y-4" : "motion-safe:opacity-0 motion-safe:translate-y-4"
}`} }`}
> >
<div className="screenshot group aspect-[4/3] overflow-hidden"> <div
className={`screenshot group overflow-hidden ${
i === 0 ? "aspect-[16/9]" : "aspect-[4/3]"
}`}
>
<img <img
src={asset(s.src)} src={asset(s.src)}
alt={`Kimi Switch - ${s.title}`} alt={`Kimi Switch - ${s.title}`}