diff --git a/apps/vidl/messages/en.json b/apps/vidl/messages/en.json index fc572186..63491a9f 100644 --- a/apps/vidl/messages/en.json +++ b/apps/vidl/messages/en.json @@ -12,6 +12,19 @@ "footer": { "copyright": "Copyright © 2025-PRESENT |" }, + "console": { + "callsign": "Signal Capture Deck", + "privacy": "Browser-side · Zero upload", + "inputTitle": "Input Signal", + "inputHint": "Paste a stream URL — capture runs entirely on this device", + "channelSingle": "Single", + "channelBatch": "Batch", + "caps": { + "formats": "M3U8 / HLS / MP4", + "decrypt": "AES-128 decrypt", + "memory": "Near-zero memory" + } + }, "tool": { "title": "Video Downloader", "description": "Supports M3U8/HLS, MP4, and other video formats with range download, streaming, AES decryption, MP4 conversion" diff --git a/apps/vidl/messages/zh.json b/apps/vidl/messages/zh.json index e3e85632..b772b093 100644 --- a/apps/vidl/messages/zh.json +++ b/apps/vidl/messages/zh.json @@ -12,6 +12,19 @@ "footer": { "copyright": "Copyright © 2025-PRESENT |" }, + "console": { + "callsign": "信号捕获终端", + "privacy": "纯浏览器处理 · 零上传", + "inputTitle": "输入信号", + "inputHint": "粘贴流媒体链接 — 全程在本机捕获", + "channelSingle": "单条", + "channelBatch": "批量", + "caps": { + "formats": "M3U8 / HLS / MP4", + "decrypt": "AES-128 解密", + "memory": "近零内存占用" + } + }, "tool": { "title": "视频在线下载工具", "description": "支持 M3U8/HLS、MP4 等视频格式,范围下载、流式下载、AES 解密、转 MP4" diff --git a/apps/vidl/next.config.ts b/apps/vidl/next.config.ts index 695e3ca6..037ae173 100644 --- a/apps/vidl/next.config.ts +++ b/apps/vidl/next.config.ts @@ -13,6 +13,7 @@ const nextConfig: NextConfig = { env: { BUILD_TIME: new Date().toLocaleString(), }, + allowedDevOrigins: ['vidl.a.wd.ds.cc'], images: { unoptimized: true, formats: ['image/avif', 'image/webp'], diff --git a/apps/vidl/src/app/[locale]/layout.tsx b/apps/vidl/src/app/[locale]/layout.tsx index e5a1dd6f..b0ad2dfd 100644 --- a/apps/vidl/src/app/[locale]/layout.tsx +++ b/apps/vidl/src/app/[locale]/layout.tsx @@ -2,28 +2,37 @@ import { Toaster } from '@cdlab996/ui/components/sonner' import type { Metadata } from 'next' -import { Geist, Geist_Mono } from 'next/font/google' +import { + Bricolage_Grotesque, + IBM_Plex_Mono, + IBM_Plex_Sans, +} from 'next/font/google' import { notFound } from 'next/navigation' import type { Locale } from 'next-intl' import { hasLocale, NextIntlClientProvider } from 'next-intl' import { getMessages, setRequestLocale } from 'next-intl/server' import '@cdlab996/ui/globals.css' -import { IKHeader } from '@cdlab996/ui/IK' -import { - ClientProviders, - LanguageSelector, - ThemeToggle, -} from '@/components/layout' +import '../theme.css' +import { ClientProviders, SiteHeader } from '@/components/layout' import { routing } from '@/i18n/routing' -const geistSans = Geist({ - variable: '--font-geist-sans', +const plexSans = IBM_Plex_Sans({ + variable: '--font-plex-sans', + weight: ['400', '500', '600', '700'], subsets: ['latin'], }) -const geistMono = Geist_Mono({ +// keep the `--font-geist-mono` name so existing `font-mono` utilities resolve +const plexMono = IBM_Plex_Mono({ variable: '--font-geist-mono', + weight: ['400', '500', '600'], + subsets: ['latin'], +}) + +const bricolage = Bricolage_Grotesque({ + variable: '--font-bricolage', + weight: ['600', '700', '800'], subsets: ['latin'], }) @@ -324,17 +333,11 @@ export default async function LocaleLayout({ /> - - - - + {children} diff --git a/apps/vidl/src/app/[locale]/page.tsx b/apps/vidl/src/app/[locale]/page.tsx index 9f2af57e..be5f3eef 100644 --- a/apps/vidl/src/app/[locale]/page.tsx +++ b/apps/vidl/src/app/[locale]/page.tsx @@ -7,7 +7,7 @@ import { TabsTrigger, } from '@cdlab996/ui/components/tabs' import { IKPageContainer } from '@cdlab996/ui/IK' -import { ListPlus, Video } from 'lucide-react' +import { ListPlus, Lock, Radio, Video, Zap } from 'lucide-react' import Script from 'next/script' import { useTranslations } from 'next-intl' import { useEffect, useState } from 'react' @@ -45,26 +45,6 @@ export default function VideoDownloaderPage() { const busy = isDownloading || batch.isBatchRunning - const cardAction = ( -
- - - - - - - - -
- ) - return (