Skip to content

Commit 18d6c78

Browse files
committed
feat: enhance documentation and translations to include ed2k support
1 parent c8a547f commit 18d6c78

12 files changed

Lines changed: 115 additions & 69 deletions

File tree

app/[lang]/(home)/page.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ export async function generateMetadata({
2929
const t = (key: string) => getTranslation(locale, key);
3030

3131
return {
32-
title: t("site.title"),
32+
title: {
33+
absolute: t("site.title"),
34+
},
3335
description: t("site.description"),
3436
keywords: t("seo.keywords.en"),
3537
alternates: pageAlternates(locale, "/"),

app/[lang]/(home)/store/[id]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export async function generateMetadata({
5656
`${displayTitle} by ${authorName} — Gopeed Extension`,
5757
alternates: pageAlternates(locale, `/store/${encodeURIComponent(id)}`),
5858
openGraph: {
59-
title: `${displayTitle}Gopeed ${getTranslation(locale, "store.title")}`,
59+
title: `${displayTitle}${getTranslation(locale, "store.title")} | Gopeed`,
6060
description:
6161
extension.description ||
6262
`${displayTitle} by ${authorName} — Gopeed Extension`,

components/home/Hero.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export function Hero({ version, releaseAssets }: HeroProps) {
102102

103103
<div className="max-w-7xl mx-auto px-6 sm:px-8 lg:px-16 py-12 lg:py-20 relative">
104104
<div className="max-w-6xl mx-auto">
105-
<div className="flex flex-col lg:grid lg:grid-cols-2 gap-3 lg:gap-8 items-stretch">
105+
<div className="flex flex-col lg:grid lg:grid-cols-2 gap-3 lg:gap-12 xl:gap-16 items-stretch">
106106
{/* Text Content - Order 1 */}
107107
<motion.div
108108
initial={{ opacity: 0, x: -20 }}
@@ -202,7 +202,7 @@ export function Hero({ version, releaseAssets }: HeroProps) {
202202
initial={{ opacity: 0, x: 20 }}
203203
animate={{ opacity: 1, x: 0 }}
204204
transition={{ duration: 0.5, delay: 0.2 }}
205-
className="relative w-full lg:scale-[1.2] origin-center order-2"
205+
className="relative w-full lg:pl-6 xl:pl-8 lg:scale-[1.2] origin-center order-2"
206206
>
207207
<motion.div
208208
animate={{ y: [0, -10, 0] }}

components/store/ExtensionDetailClient.tsx

Lines changed: 67 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -144,53 +144,74 @@ export function ExtensionDetailClient({
144144
</motion.div>
145145

146146
{/* Hero Section */}
147-
<div className="flex flex-col md:flex-row gap-8 md:gap-12 items-start mb-16 relative">
147+
<div className="flex flex-col md:flex-row gap-6 md:gap-12 items-start mb-10 md:mb-16 relative w-full">
148148
{/* Background Glow */}
149149
<div className="absolute top-1/2 left-0 -translate-y-1/2 -ml-20 w-64 h-64 bg-primary-500/10 rounded-full blur-[80px] pointer-events-none" />
150150

151-
<motion.div
152-
initial={{ opacity: 0, scale: 0.9 }}
153-
animate={{ opacity: 1, scale: 1 }}
154-
transition={{ duration: 0.5, delay: 0.1 }}
155-
className="shrink-0 relative z-10"
156-
>
157-
<div className="w-28 h-28 sm:w-40 sm:h-40 rounded-[32px] bg-white dark:bg-[#111111] border border-gray-200 dark:border-white/10 shadow-sm flex items-center justify-center p-4 relative overflow-hidden group">
158-
{extension.icon && !iconError ? (
159-
<Image
160-
src={extension.icon}
161-
alt={displayTitle}
162-
width={128}
163-
height={128}
164-
className="w-full h-full object-contain group-hover:scale-105 transition-transform duration-500"
165-
onError={() => setIconError(true)}
166-
/>
167-
) : (
168-
<svg
169-
aria-hidden="true"
170-
className="w-12 h-12 text-gray-300 dark:text-gray-600"
171-
fill="none"
172-
viewBox="0 0 24 24"
173-
stroke="currentColor"
174-
>
175-
<path
176-
strokeLinecap="round"
177-
strokeLinejoin="round"
178-
strokeWidth={1.5}
179-
d="M17 14v6m-3-3h6M6 10h2a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v2a2 2 0 002 2zm10 0h2a2 2 0 002-2V6a2 2 0 00-2-2h-2a2 2 0 00-2 2v2a2 2 0 002 2zM6 20h2a2 2 0 002-2v-2a2 2 0 00-2-2H6a2 2 0 00-2 2v2a2 2 0 002 2z"
151+
{/* Icon & Mobile Title Wrapper */}
152+
<div className="flex flex-row items-center md:items-start gap-4 md:gap-0 w-full md:w-auto relative z-10 shrink-0">
153+
<motion.div
154+
initial={{ opacity: 0, scale: 0.9 }}
155+
animate={{ opacity: 1, scale: 1 }}
156+
transition={{ duration: 0.5, delay: 0.1 }}
157+
className="shrink-0 relative z-10"
158+
>
159+
<div className="w-20 h-20 sm:w-28 sm:h-28 md:w-40 md:h-40 rounded-[20px] sm:rounded-[28px] md:rounded-[32px] bg-white dark:bg-[#111111] border border-gray-200 dark:border-white/10 shadow-sm flex items-center justify-center p-3 md:p-4 relative overflow-hidden group">
160+
{extension.icon && !iconError ? (
161+
<Image
162+
src={extension.icon}
163+
alt={displayTitle}
164+
width={128}
165+
height={128}
166+
className="w-full h-full object-contain group-hover:scale-105 transition-transform duration-500"
167+
onError={() => setIconError(true)}
180168
/>
181-
</svg>
182-
)}
183-
<div className="absolute inset-0 border border-black/5 dark:border-white/5 rounded-[32px] pointer-events-none" />
184-
</div>
185-
</motion.div>
169+
) : (
170+
<svg
171+
aria-hidden="true"
172+
className="w-10 h-10 md:w-12 md:h-12 text-gray-300 dark:text-gray-600"
173+
fill="none"
174+
viewBox="0 0 24 24"
175+
stroke="currentColor"
176+
>
177+
<path
178+
strokeLinecap="round"
179+
strokeLinejoin="round"
180+
strokeWidth={1.5}
181+
d="M17 14v6m-3-3h6M6 10h2a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v2a2 2 0 002 2zm10 0h2a2 2 0 002-2V6a2 2 0 00-2-2h-2a2 2 0 00-2 2v2a2 2 0 002 2zM6 20h2a2 2 0 002-2v-2a2 2 0 00-2-2H6a2 2 0 00-2 2v2a2 2 0 002 2z"
182+
/>
183+
</svg>
184+
)}
185+
<div className="absolute inset-0 border border-black/5 dark:border-white/5 rounded-[20px] sm:rounded-[28px] md:rounded-[32px] pointer-events-none" />
186+
</div>
187+
</motion.div>
188+
189+
{/* Mobile Title */}
190+
<motion.div
191+
initial={{ opacity: 0, y: 15 }}
192+
animate={{ opacity: 1, y: 0 }}
193+
transition={{ duration: 0.5, delay: 0.2 }}
194+
className="flex-1 min-w-0 md:hidden"
195+
>
196+
<div className="flex flex-col gap-1.5">
197+
<h1 className="text-[20px] sm:text-[24px] font-extrabold text-gray-900 dark:text-white tracking-tight leading-tight line-clamp-2">
198+
{displayTitle}
199+
</h1>
200+
<span className="self-start px-2 py-0.5 rounded-full text-[12px] font-mono font-bold bg-primary-50 text-primary-600 dark:bg-primary-500/10 dark:text-primary-400 border border-primary-100 dark:border-primary-500/20">
201+
v{extension.version}
202+
</span>
203+
</div>
204+
</motion.div>
205+
</div>
186206

187207
<motion.div
188208
initial={{ opacity: 0, y: 20 }}
189209
animate={{ opacity: 1, y: 0 }}
190210
transition={{ duration: 0.5, delay: 0.2 }}
191-
className="flex-1 min-w-0 pt-2 relative z-10"
211+
className="flex-1 min-w-0 md:pt-2 relative z-10 w-full"
192212
>
193-
<div className="flex flex-wrap items-center gap-4 mb-4">
213+
{/* Desktop Title */}
214+
<div className="hidden md:flex flex-wrap items-center gap-4 mb-4">
194215
<h1 className="text-3xl sm:text-4xl font-extrabold text-gray-900 dark:text-white tracking-tight leading-tight">
195216
{displayTitle}
196217
</h1>
@@ -199,12 +220,14 @@ export function ExtensionDetailClient({
199220
</span>
200221
</div>
201222

202-
<div className="flex flex-wrap items-center gap-x-4 gap-y-2 text-[14px] font-medium mb-6">
223+
<div className="flex flex-wrap items-center gap-x-3 gap-y-2 md:gap-x-4 text-[13px] md:text-[14px] font-medium mb-5 md:mb-6">
203224
<div className="flex items-center gap-1.5 text-gray-700 dark:text-gray-300">
204225
<span className="text-gray-400 dark:text-gray-500">
205226
{t.author}
206227
</span>
207-
{authorName}
228+
<span className="truncate max-w-[120px] sm:max-w-none">
229+
{authorName}
230+
</span>
208231
</div>
209232
<span className="text-gray-300 dark:text-gray-700"></span>
210233
<div
@@ -252,18 +275,18 @@ export function ExtensionDetailClient({
252275
</div>
253276

254277
{extension.description && (
255-
<p className="text-[16px] sm:text-[17px] text-gray-600 dark:text-gray-400 leading-relaxed mb-8 max-w-2xl">
278+
<p className="text-[15px] sm:text-[17px] text-gray-600 dark:text-gray-400 leading-relaxed mb-6 md:mb-8 max-w-2xl">
256279
{extension.description}
257280
</p>
258281
)}
259282

260-
<div className="flex flex-wrap items-center gap-3">
283+
<div className="flex flex-col sm:flex-row sm:flex-wrap items-stretch sm:items-center gap-3">
261284
<motion.button
262285
type="button"
263286
onClick={handleInstall}
264287
disabled={installing}
265288
whileTap={{ scale: 0.98 }}
266-
className="h-12 px-8 rounded-2xl bg-primary-500 hover:bg-primary-600 text-white font-semibold text-[15px] shadow-lg shadow-primary-500/25 transition-all flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed"
289+
className="h-12 w-full sm:w-auto px-8 rounded-2xl bg-primary-500 hover:bg-primary-600 text-white font-semibold text-[15px] shadow-lg shadow-primary-500/25 transition-all flex items-center justify-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed"
267290
>
268291
{installing ? (
269292
<svg
@@ -309,7 +332,7 @@ export function ExtensionDetailClient({
309332
type="button"
310333
onClick={handleCopy}
311334
whileTap={{ scale: 0.98 }}
312-
className="h-12 px-6 rounded-2xl bg-gray-50 hover:bg-gray-100 dark:bg-white/5 dark:hover:bg-white/10 text-gray-700 dark:text-gray-200 font-medium text-[15px] border border-gray-200 dark:border-white/10 transition-all flex items-center gap-2"
335+
className="h-12 w-full sm:w-auto px-6 rounded-2xl bg-gray-50 hover:bg-gray-100 dark:bg-white/5 dark:hover:bg-white/10 text-gray-700 dark:text-gray-200 font-medium text-[15px] border border-gray-200 dark:border-white/10 transition-all flex items-center justify-center gap-2"
313336
>
314337
{copied ? (
315338
<svg
@@ -350,7 +373,7 @@ export function ExtensionDetailClient({
350373
target="_blank"
351374
rel="noopener noreferrer"
352375
whileTap={{ scale: 0.98 }}
353-
className="h-12 px-6 rounded-2xl bg-gray-50 hover:bg-gray-100 dark:bg-white/5 dark:hover:bg-white/10 text-gray-700 dark:text-gray-200 font-medium text-[15px] border border-gray-200 dark:border-white/10 transition-all flex items-center gap-2"
376+
className="h-12 w-full sm:w-auto px-6 rounded-2xl bg-gray-50 hover:bg-gray-100 dark:bg-white/5 dark:hover:bg-white/10 text-gray-700 dark:text-gray-200 font-medium text-[15px] border border-gray-200 dark:border-white/10 transition-all flex items-center justify-center gap-2"
354377
>
355378
<svg
356379
aria-hidden="true"

content/docs/index.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
title: Introduction
33
---
44

5-
Gopeed (full name Go Speed) is a high-speed downloader developed by `Golang` + `Flutter`, which supports (HTTP, BitTorrent, Magnet) protocol download, and supports all platforms, including:
5+
Gopeed (full name Go Speed) is a high-speed downloader developed by `Golang` + `Flutter`, which supports `HTTP`, `BitTorrent`, `Magnet`, and `ed2k` downloads, and supports all platforms, including:
66

77
- [x] **Windows**
88
- [x] **Macos**
@@ -20,7 +20,7 @@ As a modern downloader, Gopeed has many features, here is a brief introduction.
2020
### Basic
2121

2222
- Support HTTP & HTTPS
23-
- Support BitTorrent & Magnet
23+
- Support BitTorrent, Magnet & ed2k
2424
- Seed, DHT, PEX, uTP, Webtorrent, Upnp
2525
- Update tracker list every day automatically
2626
- Internationalization

content/docs/install.mdx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,3 +255,9 @@ Download a magnet link:
255255
```sh
256256
gopeed magnet:?xt=urn:btih:xxxx
257257
```
258+
259+
Download an ed2k link:
260+
261+
```sh
262+
gopeed 'ed2k://|file|example.iso|123456789|0123456789ABCDEF0123456789ABCDEF|/'
263+
```

content/docs/zh-TW/index.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
title: 介紹
33
---
44

5-
Gopeed(全名為Go Speed),直譯過來中文名叫做`夠快下載器`(不是狗屁下載器!),是一款由`Golang` + `Flutter` 開發的高速下載器,支援HTTPBitTorrentMagnet協定下載,並且支援所有平台使用,支援的平台有:
5+
Gopeed(全名為Go Speed),直譯過來中文名叫做`夠快下載器`(不是狗屁下載器!),是一款由`Golang` + `Flutter` 開發的高速下載器,支援 `HTTP``BitTorrent``Magnet``ed2k` 協定下載,並且支援所有平台使用,支援的平台有:
66

77
- [x] **Windows**
88
- [x] **Macos**
@@ -20,7 +20,7 @@ Gopeed(全名為Go Speed),直譯過來中文名叫做`夠快下載器`(
2020
### 基本功能
2121

2222
- HTTP & HTTPS 多重協程下載
23-
- Torrent & Magnet 下載
23+
- Torrent、Magnet 和 ed2k 下載
2424
- 每日自動更新 tracker 列表
2525
- Seed, DHT, PEX, uTP, Webtorrent, Upnp
2626
- 國際化

content/docs/zh-TW/install.mdx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,3 +272,9 @@ gopeed D:/Downloads/file.torrent
272272
```sh
273273
gopeed magnet:?xt=urn:btih:xxxx
274274
```
275+
276+
下載一個 ed2k 連結:
277+
278+
```sh
279+
gopeed 'ed2k://|file|example.iso|123456789|0123456789ABCDEF0123456789ABCDEF|/'
280+
```

content/docs/zh/index.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
title: 介绍
33
---
44

5-
Gopeed(全称 Go Speed),直译过来中文名叫做`够快下载器`(不是狗屁下载器!),是一款由 `Golang` + `Flutter` 开发的高速下载器,支持HTTPBitTorrentMagnet协议下载,并且支持所有平台使用,支持的平台有:
5+
Gopeed(全称 Go Speed),直译过来中文名叫做`够快下载器`(不是狗屁下载器!),是一款由 `Golang` + `Flutter` 开发的高速下载器,支持 `HTTP``BitTorrent``Magnet``ed2k` 协议下载,并且支持所有平台使用,支持的平台有:
66

77
- [x] **Windows**
88
- [x] **Macos**
@@ -20,7 +20,7 @@ Gopeed(全称 Go Speed),直译过来中文名叫做`够快下载器`(不
2020
### 基本功能
2121

2222
- HTTP & HTTPS 多协程下载
23-
- Torrent & Magnet 下载
23+
- Torrent、Magnet 和 ed2k 下载
2424
- 每日自动更新 tracker 列表
2525
- Seed, DHT, PEX, uTP, Webtorrent, Upnp
2626
- 国际化

content/docs/zh/install.mdx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,3 +254,9 @@ gopeed D:/Downloads/file.torrent
254254
```sh
255255
gopeed magnet:?xt=urn:btih:xxxx
256256
```
257+
258+
下载一个 ed2k 链接:
259+
260+
```sh
261+
gopeed 'ed2k://|file|example.iso|123456789|0123456789ABCDEF0123456789ABCDEF|/'
262+
```

0 commit comments

Comments
 (0)